diff --git a/.rubocop.yml b/.rubocop.yml index 342cf1dcb5..93e22d3a3f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -26,10 +26,12 @@ inherit_mode: merge: - Exclude -require: +plugins: - rubocop-rails - rubocop-rspec - - rubocop-rspec_rails - rubocop-performance + +require: + - rubocop-rspec_rails - rubocop-capybara - ./lib/linter/rubocop_middle_dot diff --git a/.rubocop/rails.yml b/.rubocop/rails.yml index ae31c1f266..bbd172e656 100644 --- a/.rubocop/rails.yml +++ b/.rubocop/rails.yml @@ -2,6 +2,9 @@ Rails/BulkChangeTable: Enabled: false # Conflicts with strong_migrations features +Rails/Delegate: + Enabled: false + Rails/FilePath: EnforcedStyle: arguments diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 14774acde0..45a8719e76 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,6 +1,6 @@ # This configuration was generated by # `rubocop --auto-gen-config --auto-gen-only-exclude --no-offense-counts --no-auto-gen-timestamp` -# using RuboCop version 1.70.0. +# using RuboCop version 1.72.2. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new diff --git a/.ruby-version b/.ruby-version index 47b322c971..4d9d11cf50 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.4.1 +3.4.2 diff --git a/Dockerfile b/Dockerfile index 4e1bb24ff8..28a77e460b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ ARG BASE_REGISTRY="docker.io" # Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.4.x"] # renovate: datasource=docker depName=docker.io/ruby -ARG RUBY_VERSION="3.4.1" +ARG RUBY_VERSION="3.4.2" # # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"] # renovate: datasource=node-version depName=node ARG NODE_MAJOR_VERSION="22" diff --git a/Gemfile b/Gemfile index 4b702260d4..9f8c69267a 100644 --- a/Gemfile +++ b/Gemfile @@ -145,9 +145,6 @@ group :test do # Used to mock environment variables gem 'climate_control' - # Add back helpers functions removed in Rails 5.1 - gem 'rails-controller-testing', '~> 1.0' - # Validate schemas in specs gem 'json-schema', '~> 5.0' diff --git a/Gemfile.lock b/Gemfile.lock index 520bfbc8cc..b2b53c5eaf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -90,7 +90,7 @@ GEM public_suffix (>= 2.0.2, < 7.0) aes_key_wrap (1.1.0) android_key_attestation (0.3.0) - annotaterb (4.13.0) + annotaterb (4.14.0) ast (2.4.2) attr_required (1.0.2) aws-eventstream (1.3.0) @@ -194,7 +194,7 @@ GEM devise_pam_authenticatable2 (9.2.0) devise (>= 4.0.0) rpam2 (~> 4.0) - diff-lcs (1.5.1) + diff-lcs (1.6.0) discard (1.4.0) activerecord (>= 4.2, < 9.0) docile (1.4.1) @@ -383,10 +383,11 @@ GEM railties (>= 6.1) rexml link_header (0.0.8) + lint_roller (1.1.0) llhttp-ffi (0.5.0) ffi-compiler (~> 1.0) rake (~> 13.0) - logger (1.6.5) + logger (1.6.6) lograge (0.14.0) actionpack (>= 4) activesupport (>= 4) @@ -408,11 +409,11 @@ GEM mime-types (3.6.0) logger mime-types-data (~> 3.2015) - mime-types-data (3.2025.0204) + mime-types-data (3.2025.0220) mini_mime (1.1.5) mini_portile2 (2.8.8) minitest (5.25.4) - msgpack (1.7.5) + msgpack (1.8.0) multi_json (1.15.0) mutex_m (0.3.0) net-http (0.6.0) @@ -428,7 +429,7 @@ GEM net-smtp (0.5.1) net-protocol nio4r (2.7.4) - nokogiri (1.18.2) + nokogiri (1.18.3) mini_portile2 (~> 2.8.2) racc (~> 1.4) oj (3.16.9) @@ -640,10 +641,6 @@ GEM activesupport (= 8.0.1) bundler (>= 1.15.0) railties (= 8.0.1) - rails-controller-testing (1.0.5) - actionpack (>= 5.0.1.rc1) - actionview (>= 5.0.1.rc1) - activesupport (>= 5.0.1.rc1) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -686,7 +683,7 @@ GEM responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) - rexml (3.4.0) + rexml (3.4.1) rotp (6.3.0) rouge (4.5.1) rpam2 (4.0.2) @@ -722,9 +719,10 @@ GEM rspec-mocks (~> 3.0) sidekiq (>= 5, < 8) rspec-support (3.13.2) - rubocop (1.71.2) + rubocop (1.72.2) json (~> 2.3) - language_server-protocol (>= 3.17.0) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) @@ -736,16 +734,19 @@ GEM parser (>= 3.3.1.0) rubocop-capybara (2.21.0) rubocop (~> 1.41) - rubocop-performance (1.23.1) - rubocop (>= 1.48.1, < 2.0) - rubocop-ast (>= 1.31.1, < 2.0) - rubocop-rails (2.29.1) + rubocop-performance (1.24.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) + rubocop-rails (2.30.1) activesupport (>= 4.2.0) + lint_roller (~> 1.1) rack (>= 1.1) - rubocop (>= 1.52.0, < 2.0) - rubocop-ast (>= 1.31.1, < 2.0) - rubocop-rspec (3.4.0) - rubocop (~> 1.61) + rubocop (>= 1.72.1, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) + rubocop-rspec (3.5.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-rspec_rails (2.30.0) rubocop (~> 1.61) rubocop-rspec (~> 3, >= 3.0.1) @@ -769,7 +770,7 @@ GEM activerecord (>= 4.0.0) railties (>= 4.0.0) securerandom (0.4.1) - selenium-webdriver (4.28.0) + selenium-webdriver (4.29.1) base64 (~> 0.2) logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) @@ -809,7 +810,7 @@ GEM stackprof (0.2.27) stoplight (4.1.1) redlock (~> 1.0) - stringio (3.1.2) + stringio (3.1.4) strong_migrations (2.2.0) activerecord (>= 7) swd (1.3.0) @@ -863,7 +864,7 @@ GEM public_suffix warden (1.2.9) rack (>= 2.0.9) - webauthn (3.3.0) + webauthn (3.4.0) android_key_attestation (~> 0.3.0) bindata (~> 2.4) cbor (~> 0.5.9) @@ -893,7 +894,7 @@ GEM xorcist (1.1.3) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.7.1) + zeitwerk (2.7.2) PLATFORMS ruby @@ -1004,7 +1005,6 @@ DEPENDENCIES rack-cors (~> 2.0) rack-test (~> 2.1) rails (~> 8.0) - rails-controller-testing (~> 1.0) rails-i18n (~> 8.0) rdf-normalize (~> 0.5) redcarpet (~> 3.6) @@ -1054,4 +1054,4 @@ RUBY VERSION ruby 3.4.1p0 BUNDLED WITH - 2.6.3 + 2.6.5 diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 30d7105184..13bf2db5b6 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -592,7 +592,6 @@ "poll_button.remove_poll": "إزالة استطلاع الرأي", "privacy.change": "اضبط خصوصية المنشور", "privacy.direct.long": "كل من ذُكر في المنشور", - "privacy.direct.short": "أشخاص محددون", "privacy.private.long": "متابعيك فقط", "privacy.private.short": "للمتابِعين", "privacy.public.long": "أي شخص على أو خارج ماستدون", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 85f053111d..440ae88895 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -422,7 +422,6 @@ "poll_button.add_poll": "Amestar una encuesta", "poll_button.remove_poll": "Quitar la encuesta", "privacy.change": "Configurar la privacidá del artículu", - "privacy.direct.short": "Perfiles específicos", "privacy.private.short": "Siguidores", "privacy.public.short": "Artículu públicu", "privacy_policy.last_updated": "Data del últimu anovamientu: {date}", diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json index a71344ffe6..6a52c706b4 100644 --- a/app/javascript/mastodon/locales/az.json +++ b/app/javascript/mastodon/locales/az.json @@ -305,6 +305,9 @@ "empty_column.explore_statuses": "Hal-hazırda trenddə heç yoxdur. Daha sonra yenidən yoxlayın!", "empty_column.favourited_statuses": "Bəyəndiyiniz paylaşımlar yoxdur. Birini bəyəndikdə burada görünəcək.", "empty_column.favourites": "Bu paylaşımı hələ ki, heç kim bəyənməyib. Bəyənildikdə burada görünəcək.", + "empty_column.follow_requests": "İzləmə sorğularınız yoxdur. Qəbul etdikdə burada görəcəksiniz.", + "empty_column.followed_tags": "Heç bir heşteq izləmirsiniz. İzlədikdə burada görünəcək.", + "empty_column.hashtag": "Bu heşteqdə hələ ki, heç nə yoxdur.", "follow_suggestions.hints.friends_of_friends": "Bu profil izlədiyiniz insanlar arasında populyardır.", "follow_suggestions.hints.most_followed": "Bu profil {domain} serverində ən çox izlənilənlərdən biridir." } diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 7bdf138d92..bc669a89c6 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -642,7 +642,6 @@ "poll_button.remove_poll": "Выдаліць апытанне", "privacy.change": "Змяніць прыватнасць допісу", "privacy.direct.long": "Усе згаданыя ў допісе", - "privacy.direct.short": "Канкрэтныя людзі", "privacy.private.long": "Толькі вашыя падпісчыкі", "privacy.private.short": "Падпісчыкі", "privacy.public.long": "Усе, хто ёсць і каго няма ў Mastodon", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index e01f6dd448..aebf906f94 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -697,7 +697,6 @@ "poll_button.remove_poll": "Премахване на анкета", "privacy.change": "Промяна на поверителността на публикация", "privacy.direct.long": "Споменатите в публикацията", - "privacy.direct.short": "Определени хора", "privacy.private.long": "Само последователите ви", "privacy.private.short": "Последователи", "privacy.public.long": "Всеки във и извън Mastodon", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index f551cd5654..9829986174 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -436,7 +436,6 @@ "poll_button.add_poll": "Ouzhpennañ ur sontadeg", "poll_button.remove_poll": "Dilemel ar sontadeg", "privacy.change": "Cheñch prevezded an embannadur", - "privacy.direct.short": "Tud resis", "privacy.private.short": "Heulierien", "privacy.public.short": "Publik", "privacy_policy.last_updated": "Hizivadenn ziwezhañ {date}", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 27683a0933..2e29b4e91b 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -696,7 +696,6 @@ "poll_button.remove_poll": "Elimina l'enquesta", "privacy.change": "Canvia la privacitat del tut", "privacy.direct.long": "Tothom mencionat a la publicació", - "privacy.direct.short": "Persones concretes", "privacy.private.long": "Només els vostres seguidors", "privacy.private.short": "Seguidors", "privacy.public.long": "Tothom dins o fora Mastodon", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 62df3be279..8210d31cb5 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Odebrat anketu", "privacy.change": "Změnit soukromí příspěvku", "privacy.direct.long": "Všichni zmínění v příspěvku", - "privacy.direct.short": "Vybraní lidé", + "privacy.direct.short": "Soukromá zmínka", "privacy.private.long": "Jen vaši sledující", "privacy.private.short": "Sledující", "privacy.public.long": "Kdokoliv na Mastodonu i mimo něj", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 1a7930bf8e..f2b0024306 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -696,7 +696,6 @@ "poll_button.remove_poll": "Tynnu pleidlais", "privacy.change": "Addasu preifatrwdd y post", "privacy.direct.long": "Pawb sydd â sôn amdanyn nhw yn y postiad", - "privacy.direct.short": "Pobl benodol", "privacy.private.long": "Eich dilynwyr yn unig", "privacy.private.short": "Dilynwyr", "privacy.public.long": "Unrhyw ar ac oddi ar Mastodon", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 3fa92cd53e..d250c5390e 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -697,12 +697,12 @@ "poll_button.remove_poll": "Fjern afstemning", "privacy.change": "Tilpas indlægsfortrolighed", "privacy.direct.long": "Alle omtalt i indlægget", - "privacy.direct.short": "Bestemte personer", + "privacy.direct.short": "Privat omtale", "privacy.private.long": "Kun dine følgere", "privacy.private.short": "Følgere", "privacy.public.long": "Alle på og udenfor Mastodon", "privacy.public.short": "Offentlig", - "privacy.unlisted.additional": "Dette er præcis som offentlig adfærd, dog vises indlægget ikke i realtids-strømme/etiketter, udforsk eller Mastodon-søgning, selv hvis valget gælder hele kontoen.", + "privacy.unlisted.additional": "Dette er præcis som offentlig adfærd, dog vises indlægget ikke i tidslinjer, under etiketter, udforsk eller Mastodon-søgning, selv hvis du ellers har sagt at dine opslag godt må være søgbare.", "privacy.unlisted.long": "Færre algoritmiske fanfarer", "privacy.unlisted.short": "Stille offentligt", "privacy_policy.last_updated": "Senest opdateret {date}", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index e7499cac8d..734a07a5a2 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Umfrage entfernen", "privacy.change": "Sichtbarkeit anpassen", "privacy.direct.long": "Alle in diesem Beitrag erwähnten Profile", - "privacy.direct.short": "Ausgewählte Profile", + "privacy.direct.short": "Private Erwähnung", "privacy.private.long": "Nur deine Follower", "privacy.private.short": "Follower", "privacy.public.long": "Alle in und außerhalb von Mastodon", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 45f23dbe84..0f6bd93e0e 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Αφαίρεση δημοσκόπησης", "privacy.change": "Προσαρμογή ιδιωτικότητας ανάρτησης", "privacy.direct.long": "Όλοι όσοι αναφέρθηκαν στη δημοσίευση", - "privacy.direct.short": "Συγκεκριμένα άτομα", + "privacy.direct.short": "Ιδιωτική επισήμανση", "privacy.private.long": "Μόνο οι ακόλουθοί σας", "privacy.private.short": "Ακόλουθοι", "privacy.public.long": "Όλοι εντός και εκτός του Mastodon", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 1974d1e62b..54dda38db2 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -697,7 +697,6 @@ "poll_button.remove_poll": "Remove poll", "privacy.change": "Change post privacy", "privacy.direct.long": "Everyone mentioned in the post", - "privacy.direct.short": "Specific people", "privacy.private.long": "Only your followers", "privacy.private.short": "Followers", "privacy.public.long": "Anyone on and off Mastodon", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 7720f6cbc7..28a88c9c03 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -870,7 +870,7 @@ "privacy.circle.long": "Circle members only", "privacy.circle.short": "Circle", "privacy.direct.long": "Everyone mentioned in the post", - "privacy.direct.short": "Specific people", + "privacy.direct.short": "Private mention", "privacy.limited.short": "Limited", "privacy.login.long": "Visible for login users only", "privacy.login.short": "Login only", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index ac0ca0d6a0..0f4b7f8e02 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -219,7 +219,7 @@ "confirmations.logout.message": "Ĉu vi certas, ke vi volas elsaluti?", "confirmations.logout.title": "Ĉu elsaluti?", "confirmations.missing_alt_text.confirm": "Aldoni alttekston", - "confirmations.missing_alt_text.message": "Via afiŝo enhavas aŭdvidaĵon sen anstataŭa teksto. Aldono de priskriboj helpas fari vian enhavon alirebla por pli da homoj.", + "confirmations.missing_alt_text.message": "Via afiŝo enhavas aŭdvidaĵon sen alternativa teksto. Aldono de priskriboj helpas fari vian enhavon alirebla por pli da homoj.", "confirmations.missing_alt_text.secondary": "Afiŝi ĉiuokaze", "confirmations.missing_alt_text.title": "Ĉu aldoni alttekston?", "confirmations.mute.confirm": "Silentigi", @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Forigi balotenketon", "privacy.change": "Ŝanĝu afiŝan privatecon", "privacy.direct.long": "Ĉiuj menciitaj en la afiŝo", - "privacy.direct.short": "Specifaj homoj", + "privacy.direct.short": "Privata mencio", "privacy.private.long": "Nur viaj sekvantoj", "privacy.private.short": "Sekvantoj", "privacy.public.long": "Ĉiujn ajn ĉe kaj ekster Mastodon", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index d39b778f27..0b60852b02 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Quitar encuesta", "privacy.change": "Configurar privacidad del mensaje", "privacy.direct.long": "Todas las cuentas mencionadas en el mensaje", - "privacy.direct.short": "Cuentas específicas", + "privacy.direct.short": "Mención privada", "privacy.private.long": "Solo tus seguidores", "privacy.private.short": "Seguidores", "privacy.public.long": "Cualquier persona dentro y fuera de Mastodon", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 899a85e2cc..43e4df5a3c 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Eliminar encuesta", "privacy.change": "Ajustar privacidad", "privacy.direct.long": "Todos los mencionados en la publicación", - "privacy.direct.short": "Personas específicas", + "privacy.direct.short": "Mención privada", "privacy.private.long": "Sólo tus seguidores", "privacy.private.short": "Seguidores", "privacy.public.long": "Cualquiera dentro y fuera de Mastodon", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 41edbf6800..5da59f57d8 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Eliminar encuesta", "privacy.change": "Ajustar privacidad", "privacy.direct.long": "Visible únicamente por los mencionados en la publicación", - "privacy.direct.short": "Personas específicas", + "privacy.direct.short": "Mención privada", "privacy.private.long": "Visible únicamente por tus seguidores", "privacy.private.short": "Seguidores", "privacy.public.long": "Visible por todo el mundo, dentro y fuera de Mastodon", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 7f73874e63..43983e502f 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -696,7 +696,6 @@ "poll_button.remove_poll": "Eemalda küsitlus", "privacy.change": "Muuda postituse nähtavust", "privacy.direct.long": "Kõik postituses mainitud", - "privacy.direct.short": "Määratud kasutajad", "privacy.private.long": "Ainult jälgijad", "privacy.private.short": "Jälgijad", "privacy.public.long": "Nii kasutajad kui mittekasutajad", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index b26815f2a4..cf6c297b54 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -644,7 +644,6 @@ "poll_button.remove_poll": "Kendu inkesta", "privacy.change": "Aldatu bidalketaren pribatutasuna", "privacy.direct.long": "Argitalpen honetan aipatutako denak", - "privacy.direct.short": "Jende jakina", "privacy.private.long": "Soilik jarraitzaileak", "privacy.private.short": "Jarraitzaileak", "privacy.public.long": "Mastodonen dagoen edo ez dagoen edonor", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 625acc01a9..f934277a28 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -693,7 +693,6 @@ "poll_button.remove_poll": "برداشتن نظرسنجی", "privacy.change": "تغییر محرمانگی فرسته", "privacy.direct.long": "هرکسی که در فرسته نام برده شده", - "privacy.direct.short": "افراد مشخّص", "privacy.private.long": "تنها پی‌گیرندگانتان", "privacy.private.short": "پی‌گیرندگان", "privacy.public.long": "هرکسی در و بیرون از ماستودون", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index fab5775e90..b1a82eaffb 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -35,8 +35,8 @@ "account.followers": "Seuraajat", "account.followers.empty": "Kukaan ei seuraa tätä käyttäjää vielä.", "account.followers_counter": "{count, plural, one {{counter} seuraaja} other {{counter} seuraajaa}}", - "account.following": "Seuratut", - "account.following_counter": "{count, plural, one {{counter} seurattu} other {{counter} seurattua}}", + "account.following": "Seurattavat", + "account.following_counter": "{count, plural, one {{counter} seurattava} other {{counter} seurattavaa}}", "account.follows.empty": "Tämä käyttäjä ei vielä seuraa ketään.", "account.go_to_profile": "Siirry profiiliin", "account.hide_reblogs": "Piilota käyttäjän @{name} tehostukset", @@ -260,8 +260,8 @@ "domain_block_modal.they_cant_follow": "Kukaan tältä palvelimelta ei voi seurata sinua.", "domain_block_modal.they_wont_know": "Hän ei saa tietää tulleensa estetyksi.", "domain_block_modal.title": "Estetäänkö verkkotunnus?", - "domain_block_modal.you_will_lose_num_followers": "Menetät {followersCount, plural, one {{followersCountDisplay} seuraajasi} other {{followersCountDisplay} seuraajaasi}} ja {followingCount, plural, one {{followingCountDisplay} seurattusi} other {{followingCountDisplay} seurattuasi}}.", - "domain_block_modal.you_will_lose_relationships": "Menetät kaikki tämän palvelimen seuraajasi ja seurattusi.", + "domain_block_modal.you_will_lose_num_followers": "Menetät {followersCount, plural, one {{followersCountDisplay} seuraajasi} other {{followersCountDisplay} seuraajaasi}} ja {followingCount, plural, one {{followingCountDisplay} seurattavasi} other {{followingCountDisplay} seurattavaasi}}.", + "domain_block_modal.you_will_lose_relationships": "Menetät kaikki tämän palvelimen seuraajasi ja seurattavasi.", "domain_block_modal.you_wont_see_posts": "Et enää näe julkaisuja etkä ilmoituksia tämän palvelimen käyttäjiltä.", "domain_pill.activitypub_lets_connect": "Sen avulla voit muodostaa yhteyden ja olla vuorovaikutuksessa ihmisten kanssa, ei vain Mastodonissa vaan myös muissa sosiaalisissa sovelluksissa.", "domain_pill.activitypub_like_language": "ActivityPub on kuin kieli, jota Mastodon puhuu muiden sosiaalisten verkostojen kanssa.", @@ -365,7 +365,7 @@ "follow_suggestions.similar_to_recently_followed_longer": "Samankaltainen kuin äskettäin seuraamasi profiilit", "follow_suggestions.view_all": "Näytä kaikki", "follow_suggestions.who_to_follow": "Ehdotuksia seurattavaksi", - "followed_tags": "Seuratut aihetunnisteet", + "followed_tags": "Seurattavat aihetunnisteet", "footer.about": "Tietoja", "footer.directory": "Profiilihakemisto", "footer.get_app": "Hanki sovellus", @@ -393,10 +393,10 @@ "hashtag.unfollow": "Lopeta aihetunnisteen seuraaminen", "hashtags.and_other": "…ja {count, plural, other {# lisää}}", "hints.profiles.followers_may_be_missing": "Tämän profiilin seuraajia saattaa puuttua.", - "hints.profiles.follows_may_be_missing": "Tämän profiilin seurattuja saattaa puuttua.", + "hints.profiles.follows_may_be_missing": "Tämän profiilin seurattavia saattaa puuttua.", "hints.profiles.posts_may_be_missing": "Tämän profiilin julkaisuja saattaa puuttua.", "hints.profiles.see_more_followers": "Näytä lisää seuraajia palvelimella {domain}", - "hints.profiles.see_more_follows": "Näytä lisää seurattuja palvelimella {domain}", + "hints.profiles.see_more_follows": "Näytä lisää seurattavia palvelimella {domain}", "hints.profiles.see_more_posts": "Näytä lisää julkaisuja palvelimella {domain}", "hints.threads.replies_may_be_missing": "Muiden palvelinten vastauksia saattaa puuttua.", "hints.threads.see_more": "Näytä lisää vastauksia palvelimella {domain}", @@ -503,7 +503,7 @@ "lists.no_members_yet": "Ei vielä jäseniä.", "lists.no_results_found": "Tuloksia ei löytynyt.", "lists.remove_member": "Poista", - "lists.replies_policy.followed": "Jokaiselle seuratulle käyttäjälle", + "lists.replies_policy.followed": "Jokaiselle seurattavalle käyttäjälle", "lists.replies_policy.list": "Listan jäsenille", "lists.replies_policy.none": "Ei kellekään", "lists.save": "Tallenna", @@ -536,8 +536,8 @@ "navigation_bar.favourites": "Suosikit", "navigation_bar.filters": "Mykistetyt sanat", "navigation_bar.follow_requests": "Seurantapyynnöt", - "navigation_bar.followed_tags": "Seuratut aihetunnisteet", - "navigation_bar.follows_and_followers": "Seuratut ja seuraajat", + "navigation_bar.followed_tags": "Seurattavat aihetunnisteet", + "navigation_bar.follows_and_followers": "Seurattavat ja seuraajat", "navigation_bar.lists": "Listat", "navigation_bar.logout": "Kirjaudu ulos", "navigation_bar.moderation": "Moderointi", @@ -588,9 +588,9 @@ "notification.reblog.name_and_others_with_link": "{name} ja {count, plural, one {# muu} other {# muuta}} tehostivat julkaisuasi", "notification.relationships_severance_event": "Menetettiin yhteydet palvelimeen {name}", "notification.relationships_severance_event.account_suspension": "Palvelimen {from} ylläpitäjä on jäädyttänyt palvelimen {target} vuorovaikutuksen. Enää et voi siis vastaanottaa päivityksiä heiltä tai olla yhteyksissä heidän kanssaan.", - "notification.relationships_severance_event.domain_block": "Palvelimen {from} ylläpitäjä on estänyt palvelimen {target} vuorovaikutuksen – mukaan lukien {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.", + "notification.relationships_severance_event.domain_block": "Palvelimen {from} ylläpitäjä on estänyt palvelimen {target} vuorovaikutuksen – mukaan lukien {followersCount} seuraajistasi ja {followingCount, plural, one {# seurattavistasi} other {# seurattavistasi}}.", "notification.relationships_severance_event.learn_more": "Lue lisää", - "notification.relationships_severance_event.user_domain_block": "Olet estänyt verkkotunnuksen {target}, mikä poisti {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.", + "notification.relationships_severance_event.user_domain_block": "Olet estänyt palvelimen {target}, mikä poisti {followersCount} seuraajistasi ja {followingCount, plural, one {# seurattavistasi} other {# seurattavistasi}}.", "notification.status": "{name} julkaisi juuri", "notification.update": "{name} muokkasi julkaisua", "notification_requests.accept": "Hyväksy", @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Poista äänestys", "privacy.change": "Muuta julkaisun näkyvyyttä", "privacy.direct.long": "Kaikki tässä julkaisussa mainitut", - "privacy.direct.short": "Tietyt käyttäjät", + "privacy.direct.short": "Yksityismaininta", "privacy.private.long": "Vain seuraajasi", "privacy.private.short": "Seuraajat", "privacy.public.long": "Kuka tahansa Mastodonissa ja sen ulkopuolella", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 00499b3c24..7a46ae2f07 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Strika atkvøðugreiðslu", "privacy.change": "Broyt privatverju av posti", "privacy.direct.long": "Øll, sum eru nevnd í postinum", - "privacy.direct.short": "Ávís fólk", + "privacy.direct.short": "Privat umrøða", "privacy.private.long": "Einans tey, ið fylgja tær", "privacy.private.short": "Fylgjarar", "privacy.public.long": "Øll í og uttanfyri Mastodon", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 5f6445985c..55d5480157 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -1,6 +1,6 @@ { "about.blocks": "Serveurs modérés", - "about.contact": "Contact:", + "about.contact": "Contact :", "about.disclaimer": "Mastodon est un logiciel open-source gratuit et une marque déposée de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Raison non disponible", "about.domain_blocks.preamble": "Mastodon vous permet généralement de visualiser le contenu et d'interagir avec des comptes de n'importe quel serveur dans le fediverse. Voici les exceptions qui ont été faites sur ce serveur en particulier.", @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Supprimer le sondage", "privacy.change": "Changer la confidentialité des messages", "privacy.direct.long": "Toutes les personnes mentionnées dans le post", - "privacy.direct.short": "Personnes spécifiques", + "privacy.direct.short": "Mention privée", "privacy.private.long": "Seulement vos abonnés", "privacy.private.short": "Abonnés", "privacy.public.long": "Tout le monde sur et en dehors de Mastodon", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index aeca0aaeab..8034c1696e 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Supprimer le sondage", "privacy.change": "Ajuster la confidentialité du message", "privacy.direct.long": "Toutes les personnes mentionnées dans le post", - "privacy.direct.short": "Personnes spécifiques", + "privacy.direct.short": "Mention privée", "privacy.private.long": "Seulement vos abonnés", "privacy.private.short": "Abonnés", "privacy.public.long": "Tout le monde sur et en dehors de Mastodon", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index aafef2a41d..ec70c87c76 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -682,7 +682,6 @@ "poll_button.remove_poll": "Enkête fuortsmite", "privacy.change": "Sichtberheid fan berjocht oanpasse", "privacy.direct.long": "Elkenien dy’ yn it berjocht fermeld wurdt", - "privacy.direct.short": "Bepaalde minsken", "privacy.private.long": "Allinnich jo folgers", "privacy.private.short": "Folgers", "privacy.public.long": "Elkenien op Mastodon en dêrbûten", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 54bc7fd380..1a5b1c499f 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -697,7 +697,6 @@ "poll_button.remove_poll": "Bain suirbhé", "privacy.change": "Athraigh príobháideacht postála", "privacy.direct.long": "Luaigh gach duine sa phost", - "privacy.direct.short": "Daoine ar leith", "privacy.private.long": "Do leanúna amháin", "privacy.private.short": "Leantóirí", "privacy.public.long": "Duine ar bith ar agus amach Mastodon", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index b2b6e6f9b3..af2dfee1c3 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -633,7 +633,6 @@ "poll_button.remove_poll": "Thoir air falbh an cunntas-bheachd", "privacy.change": "Cuir gleus air prìobhaideachd a’ phuist", "privacy.direct.long": "A h-uile duine air a bheil iomradh sa phost", - "privacy.direct.short": "Daoine àraidh", "privacy.private.long": "An luchd-leantainn agad a-mhàin", "privacy.private.short": "Luchd-leantainn", "privacy.public.long": "Duine sam bith taobh a-staigh no a-muigh Mhastodon", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index b26e977609..83fe316a28 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Eliminar enquisa", "privacy.change": "Axustar privacidade", "privacy.direct.long": "Todas as mencionadas na publicación", - "privacy.direct.short": "Persoas mencionadas", + "privacy.direct.short": "Mención privada", "privacy.private.long": "Só para seguidoras", "privacy.private.short": "Seguidoras", "privacy.public.long": "Para todas dentro e fóra de Mastodon", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 2358d7bd2a..c3310e4af7 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "הסרת סקר", "privacy.change": "שינוי פרטיות ההודעה", "privacy.direct.long": "כל המוזכרים בהודעה", - "privacy.direct.short": "א.נשים מסוימים", + "privacy.direct.short": "אזכור פרטי", "privacy.private.long": "לעוקביך בלבד", "privacy.private.short": "עוקבים", "privacy.public.long": "כל הגולשים, מחוברים למסטודון או לא", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 960f6b535b..ef5287a395 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Szavazás eltávolítása", "privacy.change": "Bejegyzés láthatóságának módosítása", "privacy.direct.long": "Mindenki, akit a bejegyzés említ", - "privacy.direct.short": "Megadott személyek", + "privacy.direct.short": "Privát említés", "privacy.private.long": "Csak a követőid", "privacy.private.short": "Követők", "privacy.public.long": "Bárki a Mastodonon és azon kívül", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 90032b46ad..848a2c9d77 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Remover un sondage", "privacy.change": "Cambiar le confidentialitate del message", "privacy.direct.long": "Tote le personas mentionate in le message", - "privacy.direct.short": "Personas specific", + "privacy.direct.short": "Mention private", "privacy.private.long": "Solmente tu sequitores", "privacy.private.short": "Sequitores", "privacy.public.long": "Quicunque, sur Mastodon o non", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index b04c951de6..cbc6b01a47 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -522,7 +522,6 @@ "poll_button.remove_poll": "Remover balotation", "privacy.change": "Changear li privatie del posta", "privacy.direct.long": "Omnes mentionat in li posta", - "privacy.direct.short": "Specific persones", "privacy.private.long": "Solmen tui sequitores", "privacy.private.short": "Sequitores", "privacy.public.long": "Quicunc in e ex Mastodon", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index c69c5b801a..2c3795d35a 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -606,7 +606,6 @@ "poll_button.remove_poll": "Efacez votposto", "privacy.change": "Aranjar privateso di mesaji", "privacy.direct.long": "Omnu quan mencionesis en la posto", - "privacy.direct.short": "Specifika personi", "privacy.private.long": "Nur vua sequanti", "privacy.private.short": "Sequanti", "privacy.public.long": "Ulu de e ne de Mastodon", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 7feac4b063..dfc227fb77 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Fjarlægja könnun", "privacy.change": "Aðlaga gagnaleynd færslu", "privacy.direct.long": "Allir sem minnst er á í færslunni", - "privacy.direct.short": "Tilteknir aðilar", + "privacy.direct.short": "Einkaspjall", "privacy.private.long": "Einungis þeir sem fylgjast með þér", "privacy.private.short": "Fylgjendur", "privacy.public.long": "Hver sem er, á og utan Mastodon", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 67acddb446..cb7c3bfea4 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Rimuovi il sondaggio", "privacy.change": "Modifica privacy del post", "privacy.direct.long": "Tutti quelli menzionati nel post", - "privacy.direct.short": "Persone specifiche", + "privacy.direct.short": "Menzione privata", "privacy.private.long": "Solo i tuoi follower", "privacy.private.short": "Follower", "privacy.public.long": "Chiunque dentro e fuori Mastodon", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 52a02db44d..a9c10c19ac 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -848,7 +848,7 @@ "privacy.circle.long": "サークルメンバーのみ閲覧可", "privacy.circle.short": "サークル (投稿時点)", "privacy.direct.long": "本文で指定した相手のみ", - "privacy.direct.short": "特定の人", + "privacy.direct.short": "非公開の返信", "privacy.limited.short": "限定投稿", "privacy.login.long": "ログインユーザーのみ閲覧可、公開", "privacy.login.short": "ログインユーザーのみ", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 53a714d7a5..9fc6157b92 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -5,7 +5,7 @@ "about.domain_blocks.no_reason_available": "Ulac taɣẓint", "about.domain_blocks.preamble": "Maṣṭudun s umata yeḍmen-ak ad teẓreḍ agbur, ad tesdemreḍ akked yimseqdacen-nniḍen seg yal aqeddac deg fedivers. Ha-tent-an ɣur-k tsuraf i yellan deg uqeddac-agi.", "about.domain_blocks.silenced.title": "Ɣur-s talast", - "about.domain_blocks.suspended.title": "Yeḥbes", + "about.domain_blocks.suspended.title": "Yettwaḥbes", "about.not_available": "Talɣut-a ur tettwabder ara deg uqeddac-a.", "about.powered_by": "Azeṭṭa inmetti yettwasɣelsen sɣur {mastodon}", "about.rules": "Ilugan n uqeddac", @@ -264,6 +264,7 @@ "footer.privacy_policy": "Tasertit tabaḍnit", "footer.source_code": "Wali tangalt taɣbalut", "footer.status": "Addad", + "footer.terms_of_service": "Tiwtilin n useqdec", "generic.saved": "Yettwasekles", "getting_started.heading": "Bdu", "hashtag.column_header.tag_mode.all": "d {additional}", @@ -483,7 +484,6 @@ "poll_button.remove_poll": "Kkes asenqed", "privacy.change": "Seggem tabaḍnit n yizen", "privacy.direct.long": "Wid akk i d-yettwabdaren deg tsuffeɣt", - "privacy.direct.short": "Imdanen yettwafernen", "privacy.private.long": "Ala wid i k·m-yeṭṭafaṛen", "privacy.private.short": "Imeḍfaren", "privacy.public.long": "Kra n win yellan deg Masṭudun neɣ berra-s", @@ -623,6 +623,7 @@ "subscribed_languages.save": "Sekles ibeddilen", "tabs_bar.home": "Agejdan", "tabs_bar.notifications": "Alɣuten", + "terms_of_service.title": "Tiwtilin n useqdec", "time_remaining.days": "Mazal {number, plural, one {# wass} other {# wussan}}", "time_remaining.hours": "Mazal {number, plural, one {# usarag} other {# yisragen}}", "time_remaining.minutes": "Mazal {number, plural, one {# n tesdat} other {# n tesdatin}}", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index df61294e33..e3812f43f5 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "설문 제거", "privacy.change": "게시물의 프라이버시 설정을 변경", "privacy.direct.long": "이 게시물에서 언급된 모두", - "privacy.direct.short": "특정 인물", + "privacy.direct.short": "개인 멘션", "privacy.private.long": "내 팔로워만", "privacy.private.short": "팔로워", "privacy.public.long": "마스토돈 내외 모두", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index 3e543e938a..2587a7f009 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -11,13 +11,16 @@ "about.not_available": "Ev zanyarî li ser vê rajekarê nehatine peydakirin.", "about.powered_by": "Medyaya civakî ya nenavendî bi hêzdariya {mastodon}", "about.rules": "Rêbazên rajekar", + "account.account_note_header": "Nîşeyên kesane", "account.add_or_remove_from_list": "Li lîsteyan zêde bike yan jî rake", "account.badges.bot": "Bot", "account.badges.group": "Kom", "account.block": "@{name} asteng bike", "account.block_domain": "Navpera {domain} asteng bike", + "account.block_short": "Asteng bike", "account.blocked": "Astengkirî", "account.cancel_follow_request": "Daxwaza şopandinê vekişîne", + "account.copy": "Girêdanê bo profîlê jê bigire", "account.direct": "Bi taybetî qale @{name} bike", "account.disable_notifications": "Êdî min agahdar neke gava @{name} diweşîne", "account.domain_blocked": "Navper hate astengkirin", @@ -28,9 +31,12 @@ "account.featured_tags.last_status_never": "Şandî tune ne", "account.featured_tags.title": "{name}'s hashtagên taybet", "account.follow": "Bişopîne", + "account.follow_back": "Bişopîne", "account.followers": "Şopîner", "account.followers.empty": "Kesekî hin ev bikarhêner neşopandiye.", + "account.followers_counter": "{count, plural, one {{counter} şopîner} other {{counter} şopîner}}", "account.following": "Dişopîne", + "account.following_counter": "{count, plural, one {{counter} dişopîne} other {{counter} dişopîne}}", "account.follows.empty": "Ev bikarhêner hin kesekî heya niha neşopandiye.", "account.go_to_profile": "Biçe bo profîlê", "account.hide_reblogs": "Bilindkirinên ji @{name} veşêre", @@ -43,7 +49,11 @@ "account.mention": "Qal @{name} bike", "account.moved_to": "{name} diyar kir ku ajimêra nû ya wan niha ev e:", "account.mute": "@{name} bêdeng bike", + "account.mute_notifications_short": "Agahdariyan bêdeng bike", + "account.mute_short": "Bêdeng bike", "account.muted": "Bêdengkirî", + "account.mutual": "Hevpar", + "account.no_bio": "Ti danasîn nehatiye tevlîkirin.", "account.open_original_page": "Rûpela resen veke", "account.posts": "Şandî", "account.posts_with_replies": "Şandî û bersiv", @@ -52,12 +62,14 @@ "account.requested_follow": "{name} dixwaze te bişopîne", "account.share": "Profîla @{name} parve bike", "account.show_reblogs": "Bilindkirinên ji @{name} nîşan bike", + "account.statuses_counter": "{count, plural,one {{counter} şandî}other {{counter} şandî}}", "account.unblock": "Astengê li ser @{name} rake", "account.unblock_domain": "Astengê li ser navperê {domain} rake", "account.unblock_short": "Astengiyê rake", "account.unendorse": "Li ser profîl nîşan neke", "account.unfollow": "Neşopîne", "account.unmute": "@{name} bêdeng neke", + "account.unmute_notifications_short": "Agahdariyan bêdeng bike", "account.unmute_short": "Bêdeng neke", "account_note.placeholder": "Bitikîne bo nîşeyekê tevlî bikî", "admin.dashboard.daily_retention": "Rêjeya ragirtina bikarhêner bi roj piştî tomarkirinê", @@ -69,9 +81,18 @@ "alert.rate_limited.title": "Rêje sînorkirî ye", "alert.unexpected.message": "Çewtiyeke bêhêvî çê bû.", "alert.unexpected.title": "Wey li min!", + "alt_text_modal.cancel": "Têk bibe", + "alt_text_modal.change_thumbnail": "Wêneyê biçûk biguherîne", + "alt_text_modal.done": "Qediya", "announcement.announcement": "Daxuyanî", + "annual_report.summary.followers.followers": "şopîner", + "annual_report.summary.followers.total": "{count} tevahî", + "annual_report.summary.new_posts.new_posts": "şandiyên nû", "attachments_list.unprocessed": "(bêpêvajo)", "audio.hide": "Dengê veşêre", + "block_modal.show_less": "Kêmtir nîşan bide", + "block_modal.show_more": "Bêtir nîşan bide", + "block_modal.title": "Bikarhêner asteng bike?", "boost_modal.combo": "Ji bo derbas bî carekî din de pêlê {combo} bike", "bundle_column_error.copy_stacktrace": "Rapora çewtiyê jê bigire", "bundle_column_error.error.body": "Rûpela xwestî nehate pêşkêşkirin. Dibe ku ew ji ber şaşetiyeke koda me, an jî pirsgirêkeke lihevhatina gerokê be.", @@ -141,10 +162,12 @@ "confirmations.logout.message": "Ma tu dixwazî ku derkevî?", "confirmations.mute.confirm": "Bêdeng bike", "confirmations.redraft.confirm": "Jê bibe & ji nû ve serrast bike", + "confirmations.redraft.message": "Bi rastî tu dixwazî şandî ye jê bibî û ji nû ve reşnivîsek çê bikî? Bijarte û şandî wê wenda bibin û bersivên ji bo şandiyê resen wê sêwî bimînin.", "confirmations.reply.confirm": "Bersivê bide", "confirmations.reply.message": "Bersiva niha li ser peyama ku tu niha berhev dikî dê binivsîne. Ma pê bawer î ku tu dixwazî bidomînî?", "confirmations.unfollow.confirm": "Neşopîne", "confirmations.unfollow.message": "Ma tu dixwazî ku dev ji şopa {name} berdî?", + "content_warning.show_more": "Bêtir nîşan bide", "conversation.delete": "Axaftinê jê bibe", "conversation.mark_as_read": "Wekî xwendî nîşan bide", "conversation.open": "Axaftinê nîşan bide", @@ -158,6 +181,9 @@ "disabled_account_banner.text": "Ajimêrê te {disabledAccount} niha neçalak e.", "dismissable_banner.community_timeline": "Ev şandiyên giştî yên herî dawî ji kesên ku ajimêrê wan ji aliyê {domain} ve têne pêşkêşkirin.", "dismissable_banner.dismiss": "Paşguh bike", + "domain_block_modal.block": "Rajekar asteng bike", + "domain_pill.server": "Rajekar", + "domain_pill.username": "Navê bikarhêner", "embed.instructions": "Bi jêgirtina koda jêrîn vê şandiyê li ser malpera xwe bi cih bike.", "embed.preview": "Ew ê çawa xuya bibe li vir tê nîşandan:", "emoji_button.activity": "Çalakî", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index ed91aaccfe..101d8b10cc 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -86,6 +86,9 @@ "alert.unexpected.message": "Afito un yerro no asperado.", "alert.unexpected.title": "Atyo!", "alt_text_badge.title": "Teksto alternativo", + "alt_text_modal.cancel": "Anula", + "alt_text_modal.change_thumbnail": "Troka minyatura", + "alt_text_modal.done": "Fecho", "announcement.announcement": "Pregon", "annual_report.summary.archetype.pollster": "El anketero", "annual_report.summary.followers.followers": "suivantes", @@ -129,9 +132,11 @@ "column.blocks": "Utilizadores blokados", "column.bookmarks": "Markadores", "column.community": "Linya lokala", + "column.create_list": "Kriya lista", "column.direct": "Enmentaduras privadas", "column.directory": "Eksplora profiles", "column.domain_blocks": "Domenos blokados", + "column.edit_list": "Edita lista", "column.favourites": "Te plazen", "column.firehose": "Linyas en bivo", "column.follow_requests": "Solisitudes de segimiento", @@ -148,6 +153,7 @@ "column_header.pin": "Fiksa", "column_header.show_settings": "Amostra opsyones", "column_header.unpin": "Defiksar", + "column_search.cancel": "Anula", "column_subheading.settings": "Opsyones", "community.column_settings.local_only": "Solo lokalas", "community.column_settings.media_only": "Solo multimedia", @@ -219,6 +225,8 @@ "disabled_account_banner.text": "Tu kuento {disabledAccount} esta aktualmente inkapasitado.", "dismissable_banner.community_timeline": "Estas son las publikasyones publikas mas resientes de las personas kualos kuentos estan balabayados en {domain}.", "dismissable_banner.dismiss": "Kita", + "dismissable_banner.explore_statuses": "Estas publikasyones del fediverso estan agora popularas. Publikasyones mas muevas, kon mas repartajasiones i favoritadas por mas djente aparesen primero.", + "dismissable_banner.public_timeline": "Estas son las publikasyones publikas mas resientes de personas en el fediverso a las kualas la djente de {domain} sige.", "domain_block_modal.block": "Bloka sirvidor", "domain_block_modal.block_account_instead": "Bloka @{name} en su lugar", "domain_block_modal.they_can_interact_with_old_posts": "Las personas de este sirvidor pueden enteraktuar kon tus puvlikasyones viejas.", @@ -327,6 +335,7 @@ "footer.status": "Estado", "generic.saved": "Guadrado", "getting_started.heading": "Primos pasos", + "hashtag.admin_moderation": "Avre la enterfaz de moderasyon para #{name}", "hashtag.column_header.tag_mode.all": "i {additional}", "hashtag.column_header.tag_mode.any": "o {additional}", "hashtag.column_header.tag_mode.none": "sin {additional}", @@ -415,11 +424,17 @@ "link_preview.author": "Publikasyon de {name}", "link_preview.more_from_author": "Mas de {name}", "link_preview.shares": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}}", + "lists.add_member": "Adjusta", + "lists.add_to_list": "Adjusta a lista", + "lists.create_list": "Kriya lista", "lists.delete": "Efasa lista", + "lists.done": "Fecho", "lists.edit": "Edita lista", "lists.replies_policy.followed": "Kualseker utilizador segido", "lists.replies_policy.list": "Miembros de la lista", "lists.replies_policy.none": "Dinguno", + "lists.save": "Guadra", + "lists.search": "Bushka", "load_pending": "{count, plural, one {# muevo elemento} other {# muevos elementos}}", "loading_indicator.label": "Eskargando…", "media_gallery.hide": "Eskonde", @@ -544,7 +559,10 @@ "notifications_permission_banner.enable": "Kapasita avizos de ensimameza", "notifications_permission_banner.how_to_control": "Para risivir avizos kuando Mastodon no esta avierto, kapasita avizos de ensimameza. Puedes kontrolar presizamente kualos tipos de enteraksiones djeneren avizos de ensimameza kon el boton {icon} arriva kuando esten kapasitadas.", "notifications_permission_banner.title": "Nunkua te piedres niente", + "onboarding.follows.back": "Atras", + "onboarding.follows.done": "Fecho", "onboarding.follows.empty": "Malorozamente, no se pueden amostrar rezultados en este momento. Puedes aprovar uzar la bushkeda o navigar por la pajina de eksplorasyon para topar personas a las que segir, o aprovarlo de muevo mas tadre.", + "onboarding.follows.search": "Bushka", "onboarding.profile.discoverable": "Faz ke mi profil apareska en bushkedas", "onboarding.profile.discoverable_hint": "Kuando permites ke tu profil sea diskuvriravle en Mastodon, tus publikasyones podran apareser en rezultados de bushkedas i trendes i tu profil podra ser sujerido a personas kon intereses similares a los tuyos.", "onboarding.profile.display_name": "Nombre amostrado", @@ -570,7 +588,6 @@ "poll_button.remove_poll": "Kita anketa", "privacy.change": "Troka privasita de publikasyon", "privacy.direct.long": "Todos enmentados en la publikasyon", - "privacy.direct.short": "Djente espesifika", "privacy.private.long": "Solo para tus suivantes", "privacy.private.short": "Suivantes", "privacy.public.long": "Todos en i afuera de Mastodon", @@ -667,6 +684,7 @@ "search_results.hashtags": "Etiketas", "search_results.see_all": "Ve todo", "search_results.statuses": "Publikasyones", + "search_results.title": "Bushka por \"{q}\"", "server_banner.about_active_users": "Utilizadores aktivos en este sirvidor durante los ultimos 30 diyas (utilizadores aktivos mensuales)", "server_banner.active_users": "utilizadores aktivos", "server_banner.administered_by": "Administrado por:", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 17541985fd..182c052ac7 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -684,7 +684,7 @@ "poll_button.remove_poll": "Pašalinti apklausą", "privacy.change": "Keisti įrašo privatumą", "privacy.direct.long": "Visus, paminėtus įraše", - "privacy.direct.short": "Konkretūs žmonės", + "privacy.direct.short": "Privatus paminėjimas", "privacy.private.long": "Tik sekėjams", "privacy.private.short": "Sekėjai", "privacy.public.long": "Bet kas iš Mastodon ir ne Mastodon", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 0db471f19a..726d9541a3 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -545,7 +545,6 @@ "poll_button.remove_poll": "Noņemt aptauju", "privacy.change": "Mainīt ieraksta privātumu", "privacy.direct.long": "Visi ierakstā pieminētie", - "privacy.direct.short": "Noteikti cilvēki", "privacy.private.long": "Tikai Tavi sekotāji", "privacy.private.short": "Sekotāji", "privacy.public.long": "Jebkurš Mastodon un ārpus tā", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index b934c3ea63..5fded1ac4c 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -447,7 +447,6 @@ "poll_button.remove_poll": "Buang undian", "privacy.change": "Ubah privasi hantaran", "privacy.direct.long": "Semua orang yang disebutkan dalam siaran", - "privacy.direct.short": "Orang tertentu", "privacy.private.long": "Pengikut anda sahaja", "privacy.private.short": "Pengikut", "privacy.public.short": "Awam", diff --git a/app/javascript/mastodon/locales/nan.json b/app/javascript/mastodon/locales/nan.json index f32399e832..88514555ba 100644 --- a/app/javascript/mastodon/locales/nan.json +++ b/app/javascript/mastodon/locales/nan.json @@ -250,9 +250,30 @@ "disabled_account_banner.text": "Lí ê口座 {disabledAccount} tsit-má hōo lâng停止使用。", "dismissable_banner.community_timeline": "Tsia sī uì 口座hē tī {domain} ê lâng,最近所公開PO ê。", "dismissable_banner.dismiss": "Mài kā tshah", + "dismissable_banner.explore_links": "Tsiah ê新聞故事是kín-á日tī Fediverse hōo lâng分享上tsē pái ê。Hōo koh khah tsē lâng 分享ê khah新ê新聞故事,名次koh khah kuân。", + "dismissable_banner.explore_statuses": "Tsiah ê tuì Fediverse來ê PO文kín-á日有真tsē關注。Khah新ê,有khah tsē轉送kap收藏ê,名次koh khah kuân。", + "dismissable_banner.explore_tags": "Tsiah ê hashtag kín-á日tī Fediverse 有真tsē關注。Khah tsē無kâng ê lâng leh用ê hashtag,名次koh khah kuân。", + "dismissable_banner.public_timeline": "Tsiah ê是 {domain} 內底ê lâng 佇 Fediverse所跟tuè ê ê,上新ê公開PO文。.", "domain_block_modal.block": "封鎖服侍器", "domain_block_modal.block_account_instead": "改做封鎖 @{name}", "domain_block_modal.they_can_interact_with_old_posts": "Uì tsit ê服侍器來ê,通kap lí khah早ê PO交流。", + "domain_block_modal.they_cant_follow": "Tuì tsit ê服侍器來ê 通跟tuè lí。", + "domain_block_modal.they_wont_know": "In buē知影in受封鎖。", + "domain_block_modal.title": "Kám beh封鎖域名?", + "domain_block_modal.you_will_lose_num_followers": "Lí ē失去 {followersCount, plural, other {{followersCountDisplay} ê lâng跟tuè}} kap {followingCount, plural, other {{followingCountDisplay} ê lí所tuè ê 口座}}。", + "domain_block_modal.you_will_lose_relationships": "Lí ē失去逐ê佇tsit ê服侍器跟tuè lí ê,kap lí所跟tuè ê。", + "domain_block_modal.you_wont_see_posts": "Lí buē看見tsit ê服侍器ê用者所送ê PO文kap通知。", + "domain_pill.activitypub_lets_connect": "伊ē hōo lí kap Mastodon ê lâng連結kap互動,其他社交應用程式ê lâng mā ē使。", + "domain_pill.activitypub_like_language": "ActivityPub親像Mastodon kap其他社交應用程式所講ê語言。", + "domain_pill.server": "服侍器", + "domain_pill.their_handle": "In ê口座:", + "domain_pill.their_server": "In數位ê tau,in所有ê PO文lóng tī tsia。", + "domain_pill.their_username": "In佇tsit ê服侍器獨一ê稱呼。佇無kâng ê服侍器有可能tshuē著kāng名ê用者。", + "domain_pill.username": "用者ê名", + "domain_pill.whats_in_a_handle": "口座是siánn-mih?", + "domain_pill.who_they_are": "因為口座(handle)表示tsit ê lâng是siáng kap tī toh,lí ē當佇. ê社交網路kap lâng交流。", + "domain_pill.who_you_are": "因為口座(handle)表示lí是siáng kap tī toh,lâng ē當佇. ê社交網路kap lí交流。", + "domain_pill.your_handle": "Lí ê口座:", "embed.preview": "伊e án-ne顯示:\n", "emoji_button.activity": "活動", "emoji_button.clear": "清掉", @@ -273,6 +294,70 @@ "empty_column.account_suspended": "口座已經受停止", "empty_column.account_timeline": "Tsia無PO文!", "empty_column.account_unavailable": "個人資料bē當看", + "errors.unexpected_crash.copy_stacktrace": "Khóo-pih stacktrace kàu剪貼pang-á", + "errors.unexpected_crash.report_issue": "報告問題", + "explore.suggested_follows": "用者", + "explore.title": "探索", + "explore.trending_links": "新聞", + "filter_modal.added.expired_title": "過期ê過濾器", + "filter_modal.added.review_and_configure": "Beh審視kap進前設定tsit ê過濾器ê類別,請kàu {settings_link}。", + "filter_modal.added.review_and_configure_title": "過濾器ê設定", + "filter_modal.added.settings_link": "設定頁", + "filter_modal.added.short_explanation": "Tsit ê PO文已經加添kàu下kha ê過濾器類別:{title}。", + "filter_modal.added.title": "過濾器加添ah!", + "filter_modal.select_filter.context_mismatch": "Mài用tī tsit ê內文", + "filter_modal.select_filter.expired": "過期ah", + "filter_modal.select_filter.prompt_new": "新ê類別:{name}", + "filter_modal.select_filter.search": "Tshiau-tshuē á是加添", + "filter_modal.select_filter.subtitle": "用有ê類別á是建立新ê", + "filter_modal.select_filter.title": "過濾tsit ê PO文", + "filter_modal.title.status": "過濾PO文", + "filter_warning.matches_filter": "合過濾器「{title}」", + "filtered_notifications_banner.pending_requests": "Tuì lí可能熟sāi ê {count, plural, =0 {0 ê人} other {# ê人}}", + "filtered_notifications_banner.title": "過濾ê通知", + "firehose.all": "Kui ê", + "firehose.local": "Tsit ê服侍器", + "firehose.remote": "別ê服侍器", + "follow_request.authorize": "授權", + "follow_request.reject": "拒絕", + "follow_requests.unlocked_explanation": "就算lí ê口座無hőng鎖,{domain} ê管理員leh想,lí可能beh手動審查tuì tsiah ê口座送ê跟tuè請求。", + "follow_suggestions.curated_suggestion": "精選ê內容", + "follow_suggestions.dismiss": "Mài koh顯示。", + "follow_suggestions.featured_longer": "{domain} 團隊所揀ê", + "follow_suggestions.friends_of_friends_longer": "時行佇lí所tuè ê lâng", + "follow_suggestions.personalized_suggestion": "個人化ê推薦", + "follow_suggestions.popular_suggestion": "流行ê推薦", + "follow_suggestions.popular_suggestion_longer": "佇{domain} 足有lâng緣", + "follow_suggestions.similar_to_recently_followed_longer": "Kap lí最近跟tuè ê相siâng", + "follow_suggestions.view_all": "看全部", + "follow_suggestions.who_to_follow": "Thang tuè ê", + "followed_tags": "跟tuè ê hashtag", + "footer.about": "概要", + "footer.directory": "個人資料ê目錄", + "footer.get_app": "The̍h著app", + "footer.keyboard_shortcuts": "鍵盤kiu-té khí (shortcut)", + "footer.privacy_policy": "隱私權政策", + "footer.source_code": "看原始碼", + "footer.status": "狀態", + "footer.terms_of_service": "服務規定", + "generic.saved": "儲存ah", + "getting_started.heading": "開始用", + "hashtag.admin_moderation": "Phah開 #{name} ê管理界面", + "hashtag.column_header.tag_mode.all": "kap {additional}", + "hashtag.column_header.tag_mode.any": "á是 {additional}", + "hashtag.column_header.tag_mode.none": "無需要 {additional}", + "hashtag.column_settings.select.no_options_message": "Tshuē無建議", + "hashtag.column_settings.select.placeholder": "請輸入hashtag……", + "hashtag.column_settings.tag_mode.all": "Kui ê", + "hashtag.column_settings.tag_mode.any": "任何tsi̍t ê", + "hashtag.column_settings.tag_mode.none": "Lóng mài", + "hashtag.column_settings.tag_toggle": "Kā追加ê標籤加添kàu tsit ê欄", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} ê} other {{counter} ê}}參與ê", + "hashtag.counter_by_uses": "{count, plural, one {{counter} ê} other {{counter} ê}} PO文", + "hashtag.counter_by_uses_today": "Kin-á日有 {count, plural, one {{counter} ê} other {{counter} ê}} PO文", + "hashtag.follow": "跟tuè hashtag", + "hashtag.unfollow": "取消跟tuè hashtag", + "hashtags.and_other": "……kap 其他 {count, plural, other {# ê}}", "notification.favourite_pm": "{name} kah意lí ê私人提起", "notification.favourite_pm.name_and_others_with_link": "{name} kap{count, plural, other {另外 # ê lâng}}kah意lí ê私人提起", "search_popout.language_code": "ISO語言代碼", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index b9ee243705..60481f8cca 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -697,7 +697,6 @@ "poll_button.remove_poll": "Fjern rundspørjing", "privacy.change": "Endre personvernet på innlegg", "privacy.direct.long": "Alle nemnde i innlegget", - "privacy.direct.short": "Spesifikke folk", "privacy.private.long": "Berre dei som fylgjer deg", "privacy.private.short": "Fylgjarar", "privacy.public.long": "Kven som helst på og av Mastodon", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 7e19eb06a3..229e292aba 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -85,7 +85,14 @@ "alert.rate_limited.title": "Hastighetsbegrenset", "alert.unexpected.message": "En uventet feil oppstod.", "alert.unexpected.title": "Ups!", + "alt_text_badge.title": "Alternativ tekst", + "alt_text_modal.cancel": "Avbryt", + "alt_text_modal.change_thumbnail": "Endre miniatyrbilde", + "alt_text_modal.done": "Ferdig", "announcement.announcement": "Kunngjøring", + "annual_report.summary.followers.followers": "følgere", + "annual_report.summary.most_used_hashtag.none": "Ingen", + "annual_report.summary.new_posts.new_posts": "nye innlegg", "attachments_list.unprocessed": "(ubehandlet)", "audio.hide": "Skjul lyd", "block_modal.remote_users_caveat": "Vi vil be serveren {domain} om å respektere din beslutning. Det er imidlertid ingen garanti at det blir overholdt, siden noen servere kan håndtere blokkeringer på forskjellig vis. Offentlige innlegg kan fortsatt være synlige for ikke-innloggede brukere.", @@ -122,6 +129,7 @@ "column.direct": "Private omtaler", "column.directory": "Bla gjennom profiler", "column.domain_blocks": "Skjulte domener", + "column.edit_list": "Rediger listen", "column.favourites": "Favoritter", "column.firehose": "Tidslinjer", "column.follow_requests": "Følgeforespørsler", @@ -138,6 +146,7 @@ "column_header.pin": "Fest", "column_header.show_settings": "Vis innstillinger", "column_header.unpin": "Løsne", + "column_search.cancel": "Avbryt", "column_subheading.settings": "Innstillinger", "community.column_settings.local_only": "Kun lokalt", "community.column_settings.media_only": "Media only", @@ -182,6 +191,7 @@ "confirmations.logout.confirm": "Logg ut", "confirmations.logout.message": "Er du sikker på at du vil logge ut?", "confirmations.logout.title": "Logg ut?", + "confirmations.missing_alt_text.secondary": "Legg ut likevel", "confirmations.mute.confirm": "Demp", "confirmations.redraft.confirm": "Slett og skriv på nytt", "confirmations.redraft.message": "Er du sikker på at du vil slette dette innlegget og lagre det på nytt? Favoritter og fremhevinger vil gå tapt, og svar til det originale innlegget vil bli foreldreløse.", @@ -194,6 +204,7 @@ "confirmations.unfollow.title": "Slutt å følge bruker?", "content_warning.hide": "Skjul innlegg", "content_warning.show": "Vis likevel", + "content_warning.show_more": "Vis mer", "conversation.delete": "Slett samtalen", "conversation.mark_as_read": "Marker som lest", "conversation.open": "Vis samtale", @@ -368,6 +379,9 @@ "ignore_notifications_modal.not_followers_title": "Overse varsler fra folk som ikke følger deg?", "ignore_notifications_modal.not_following_title": "Overse varsler fra folk du ikke følger?", "ignore_notifications_modal.private_mentions_title": "Overse varsler fra uoppfordrede private omtaler?", + "info_button.label": "Hjelp", + "interaction_modal.go": "Gå", + "interaction_modal.no_account_yet": "Har du ikke en konto ennå?", "interaction_modal.on_another_server": "På en annen server", "interaction_modal.on_this_server": "På denne serveren", "interaction_modal.title.favourite": "Favorittmarker innlegget til {name}", @@ -419,13 +433,22 @@ "link_preview.author": "Av {name}", "link_preview.more_from_author": "Mer fra {name}", "link_preview.shares": "{count, plural, one {{counter} innlegg} other {{counter} innlegg}}", + "lists.add_member": "Legg til", + "lists.add_to_list": "Legg til i listen", + "lists.create": "Opprett", "lists.delete": "Slett listen", + "lists.done": "Ferdig", "lists.edit": "Rediger listen", + "lists.no_results_found": "Ingen treff.", + "lists.remove_member": "Fjern", "lists.replies_policy.followed": "Enhver fulgt bruker", "lists.replies_policy.list": "Medlemmer i listen", "lists.replies_policy.none": "Ingen", + "lists.save": "Lagre", + "lists.search": "Søk", "load_pending": "{count, plural,one {# ny gjenstand} other {# nye gjenstander}}", "loading_indicator.label": "Laster…", + "media_gallery.hide": "Skjul", "moved_to_account_banner.text": "Din konto {disabledAccount} er for øyeblikket deaktivert fordi du flyttet til {movedToAccount}.", "mute_modal.hide_from_notifications": "Ikke varsle", "mute_modal.hide_options": "Skjul alternativer", @@ -470,10 +493,20 @@ "notification.favourite": "{name} favorittmarkerte innlegget ditt", "notification.follow": "{name} fulgte deg", "notification.follow_request": "{name} har bedt om å få følge deg", + "notification.label.mention": "Nevn", + "notification.label.reply": "Svar", + "notification.mention": "Nevn", + "notification.mentioned_you": "{name} nevnte deg", + "notification.moderation-warning.learn_more": "Lær mer", "notification.own_poll": "Avstemningen din er ferdig", "notification.reblog": "{name} fremhevet ditt innlegg", + "notification.relationships_severance_event.learn_more": "Lær mer", "notification.status": "{name} la nettopp ut", "notification.update": "{name} redigerte et innlegg", + "notification_requests.accept": "Aksepter", + "notification_requests.dismiss": "Lukk", + "notification_requests.edit_selection": "Redigér", + "notification_requests.exit_selection": "Ferdig", "notification_requests.minimize_banner": "Minimer banneret for filtrerte varsler", "notification_requests.view": "Vis varsler", "notifications.clear": "Fjern varsler", @@ -486,6 +519,7 @@ "notifications.column_settings.filter_bar.category": "Hurtigfiltreringslinje", "notifications.column_settings.follow": "Nye følgere:", "notifications.column_settings.follow_request": "Nye følgerforespørsler:", + "notifications.column_settings.group": "Gruppe", "notifications.column_settings.mention": "Nevnt:", "notifications.column_settings.poll": "Avstemningsresultater:", "notifications.column_settings.push": "Push varsler", @@ -529,7 +563,10 @@ "notifications_permission_banner.enable": "Skru på skrivebordsvarsler", "notifications_permission_banner.how_to_control": "For å motta varsler når Mastodon ikke er åpne, aktiver desktop varsler. Du kan kontrollere nøyaktig hvilke typer interaksjoner genererer skrivebordsvarsler gjennom {icon} -knappen ovenfor når de er aktivert.", "notifications_permission_banner.title": "Aldri gå glipp av noe", + "onboarding.follows.back": "Tilbake", + "onboarding.follows.done": "Ferdig", "onboarding.follows.empty": "Dessverre kan ingen resultater vises akkurat nå. Du kan prøve å bruke søk eller bla gjennom utforske-siden for å finne folk å følge, eller prøve igjen senere.", + "onboarding.follows.search": "Søk", "onboarding.profile.discoverable": "Gjør min profil synlig", "onboarding.profile.display_name": "Visningsnavn", "onboarding.profile.display_name_hint": "Ditt fulle navn eller ditt morsomme navn…", @@ -554,7 +591,6 @@ "poll_button.remove_poll": "Fjern avstemningen", "privacy.change": "Juster synlighet", "privacy.direct.long": "Alle nevnt i innlegget", - "privacy.direct.short": "Spesifikke folk", "privacy.private.long": "Bare følgerne dine", "privacy.private.short": "Følgere", "privacy.public.long": "Alle på og utenfor Mastodon", @@ -622,6 +658,7 @@ "report_notification.attached_statuses": "{count, plural,one {{count} innlegg} other {{count} innlegg}} vedlagt", "report_notification.categories.legal": "Juridiske", "report_notification.categories.other": "Annet", + "report_notification.categories.other_sentence": "annet", "report_notification.categories.spam": "Søppelpost", "report_notification.categories.violation": "Regelbrudd", "report_notification.open": "Åpne rapport", @@ -644,6 +681,7 @@ "search_results.accounts": "Profiler", "search_results.all": "Alle", "search_results.hashtags": "Emneknagger", + "search_results.no_results": "Ingen resultater.", "search_results.see_all": "Se alle", "search_results.statuses": "Innlegg", "server_banner.about_active_users": "Personer som har brukt denne serveren i løpet av de siste 30 dagene (aktive brukere månedlig)", @@ -709,6 +747,7 @@ "subscribed_languages.target": "Endre abonnerte språk for {target}", "tabs_bar.home": "Hjem", "tabs_bar.notifications": "Varslinger", + "terms_of_service.title": "Bruksvilkår", "time_remaining.days": "{number, plural,one {# dag} other {# dager}} igjen", "time_remaining.hours": "{number, plural, one {# time} other {# timer}} igjen", "time_remaining.minutes": "{number, plural, one {# minutt} other {# minutter}} igjen", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index e3850fed39..68e5ec66b4 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -437,7 +437,6 @@ "poll.voted": "ਤੁਸੀਂ ਇਸ ਜਵਾਬ ਲਈ ਵੋਟ ਕੀਤਾ", "privacy.change": "ਪੋਸਟ ਦੀ ਪਰਦੇਦਾਰੀ ਨੂੰ ਬਦਲੋ", "privacy.direct.long": "ਪੋਸਟ ਵਿੱਚ ਜ਼ਿਕਰ ਕੀਤੇ ਹਰ ਕੋਈ", - "privacy.direct.short": "ਖਾਸ ਲੋਕ", "privacy.private.long": "ਸਿਰਫ਼ ਤੁਹਾਡੇ ਫ਼ਾਲੋਅਰ ਹੀ", "privacy.private.short": "ਫ਼ਾਲੋਅਰ", "privacy.public.short": "ਜਨਤਕ", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index e48b02aaf3..8ae276711a 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -52,7 +52,7 @@ "account.mute_notifications_short": "Wycisz powiadomienia", "account.mute_short": "Wycisz", "account.muted": "Wyciszony", - "account.mutual": "Przyjaciele", + "account.mutual": "Znajomi", "account.no_bio": "Brak opisu.", "account.open_original_page": "Otwórz stronę oryginalną", "account.posts": "Wpisy", @@ -697,7 +697,6 @@ "poll_button.remove_poll": "Usuń ankietę", "privacy.change": "Dostosuj widoczność wpisów", "privacy.direct.long": "Wszyscy wzmiankowani w tym wpisie", - "privacy.direct.short": "Wzmianki bezpośrednie", "privacy.private.long": "Tylko obserwujący", "privacy.private.short": "Obserwujący", "privacy.public.long": "Każdy na i poza Mastodon", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index a3f138f1b7..5f29da7ecd 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -697,7 +697,6 @@ "poll_button.remove_poll": "Remover enquete", "privacy.change": "Alterar privacidade do toot", "privacy.direct.long": "Todos mencionados na publicação", - "privacy.direct.short": "Pessoas específicas", "privacy.private.long": "Apenas seus seguidores", "privacy.private.short": "Seguidores", "privacy.public.long": "Qualquer um dentro ou fora do Mastodon", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index aaa36704d7..d3279d1f43 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -697,7 +697,6 @@ "poll_button.remove_poll": "Remover sondagem", "privacy.change": "Alterar a privacidade da publicação", "privacy.direct.long": "Todos os mencionados na publicação", - "privacy.direct.short": "Pessoas específicas", "privacy.private.long": "Apenas os teus seguidores", "privacy.private.short": "Seguidores", "privacy.public.long": "Qualquer pessoa no Mastodon ou não", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index ca3798c731..0e5f7c735f 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -697,7 +697,6 @@ "poll_button.remove_poll": "Удалить опрос", "privacy.change": "Изменить видимость поста", "privacy.direct.long": "Все упомянутые в посте", - "privacy.direct.short": "Определённые люди", "privacy.private.long": "Только ваши подписчики", "privacy.private.short": "Подписчики", "privacy.public.long": "Любой, находящийся на Mastodon и вне его", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index 27080aaa9e..93130b663e 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -538,7 +538,6 @@ "poll_button.remove_poll": "Cantzella su sondàgiu", "privacy.change": "Modìfica s'istadu de riservadesa", "privacy.direct.long": "Totu is utentes mentovados in sa publicatzione", - "privacy.direct.short": "Persones ispetzìficas", "privacy.private.long": "Isceti chie ti sighit", "privacy.private.short": "Sighiduras", "privacy.public.long": "Cale si siat persone a intro o a foras de Mastodon", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 6ca6b0e329..3bc422e97e 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -379,6 +379,7 @@ "ignore_notifications_modal.filter_to_act_users": "Stále budeš môcť akceptovať, odmietnuť, alebo nahlásiť užívateľov", "ignore_notifications_modal.filter_to_avoid_confusion": "Triedenie pomáha vyvarovať sa možnému zmäteniu", "ignore_notifications_modal.ignore": "Ignoruj upozornenia", + "ignore_notifications_modal.limited_accounts_title": "Ignorovať oboznámenia z obmedzených účtov?", "ignore_notifications_modal.new_accounts_title": "Nevšímať si oznámenia z nových účtov?", "ignore_notifications_modal.not_followers_title": "Nevšímať si oznámenia od ľudí, ktorí ťa nenasledujú?", "ignore_notifications_modal.not_following_title": "Nevšímať si oznámenia od ľudí, ktorých nenasleduješ?", @@ -629,7 +630,6 @@ "poll_button.remove_poll": "Odstrániť anketu", "privacy.change": "Zmeniť nastavenia súkromia príspevku", "privacy.direct.long": "Všetci spomenutí v príspevku", - "privacy.direct.short": "Konkrétni ľudia", "privacy.private.long": "Iba vaši sledovatelia", "privacy.private.short": "Sledovatelia", "privacy.public.long": "Ktokoľvek na Mastodone aj mimo neho", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 3fcb1f9dbc..f2ead1e117 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -610,7 +610,6 @@ "poll_button.remove_poll": "Odstrani anketo", "privacy.change": "Spremeni zasebnost objave", "privacy.direct.long": "Vsem omenjenim v objavi", - "privacy.direct.short": "Določenim ljudem", "privacy.private.long": "Samo vašim sledilcem", "privacy.private.short": "Sledilcem", "privacy.public.long": "Vsem, ki so ali niso na Mastodonu", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 29b8a8263a..60eb0bcd84 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -692,7 +692,7 @@ "poll_button.remove_poll": "Hiqe pyetësorin", "privacy.change": "Rregulloni privatësi mesazhesh", "privacy.direct.long": "Gjithkënd i përmendur te postimi", - "privacy.direct.short": "Persona të veçantë", + "privacy.direct.short": "Përmendje private", "privacy.private.long": "Vetëm ndjekësit tuaj", "privacy.private.short": "Ndjekës", "privacy.public.long": "Cilido që hyn e del në Mastodon", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 36a7ed760b..071dab2d90 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -527,7 +527,6 @@ "poll_button.remove_poll": "Ukloni anketu", "privacy.change": "Promeni privatnost objave", "privacy.direct.long": "Svi pomenuti u objavi", - "privacy.direct.short": "Određeni ljudi", "privacy.private.long": "Samo vaši pratioci", "privacy.private.short": "Pratioci", "privacy.public.long": "Bilo ko na Mastodon-u i van njega", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index f248a29da0..819e06e759 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -527,7 +527,6 @@ "poll_button.remove_poll": "Уклони анкету", "privacy.change": "Промени приватност објаве", "privacy.direct.long": "Сви поменути у објави", - "privacy.direct.short": "Одређени људи", "privacy.private.long": "Само ваши пратиоци", "privacy.private.short": "Пратиоци", "privacy.public.long": "Било ко на Mastodon-у и ван њега", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 21a620b3ec..c69483a182 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -219,6 +219,9 @@ "confirmations.logout.message": "Är du säker på att du vill logga ut?", "confirmations.logout.title": "Logga ut?", "confirmations.missing_alt_text.confirm": "Lägg till alt-text", + "confirmations.missing_alt_text.message": "Ditt inlägg innehåller media utan alt-text. Om du lägger till beskrivningar blir ditt innehåll tillgängligt för fler personer.", + "confirmations.missing_alt_text.secondary": "Posta ändå", + "confirmations.missing_alt_text.title": "Lägg till alt-text?", "confirmations.mute.confirm": "Tysta", "confirmations.redraft.confirm": "Radera & gör om", "confirmations.redraft.message": "Är du säker på att du vill radera detta inlägg och göra om det? Favoritmarkeringar, boostar och svar till det ursprungliga inlägget kommer förlora sitt sammanhang.", @@ -416,6 +419,7 @@ "ignore_notifications_modal.not_following_title": "Vill du blockera aviseringar från personer som du inte följer dig?", "ignore_notifications_modal.private_mentions_title": "Vill du ignorera aviseringar från oombedda privata omnämnanden?", "info_button.label": "Hjälp", + "info_button.what_is_alt_text": "

Vad är alt-text?

alt-text ger bildbeskrivningar för personer med synnedsättning, anslutningar med låg bandbredd eller de som söker extra sammanhang.

Du kan förbättra tillgängligheten och förståelsen för alla genom att skriva en tydlig, koncis och objektiv alt-text.

", "interaction_modal.action.favourite": "För att fortsätta, måste du favoritmarkera från ditt konto.", "interaction_modal.action.follow": "För att fortsätta, måste du följa från ditt konto.", "interaction_modal.action.reblog": "För att fortsätta, måste du boosta från ditt konto.", @@ -693,7 +697,7 @@ "poll_button.remove_poll": "Ta bort omröstning", "privacy.change": "Ändra inläggsintegritet", "privacy.direct.long": "Alla som nämns i inlägget", - "privacy.direct.short": "Särskilda personer", + "privacy.direct.short": "Privat omnämnande", "privacy.private.long": "Endast dina följare", "privacy.private.short": "Följare", "privacy.public.long": "Alla på och utanför Mastodon", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 2959572ebc..77e22f5e3b 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -86,6 +86,13 @@ "alert.unexpected.message": "เกิดข้อผิดพลาดที่ไม่คาดคิด", "alert.unexpected.title": "อุปส์!", "alt_text_badge.title": "ข้อความแสดงแทน", + "alt_text_modal.add_alt_text": "เพิ่มข้อความแสดงแทน", + "alt_text_modal.add_text_from_image": "เพิ่มข้อความจากภาพ", + "alt_text_modal.cancel": "ยกเลิก", + "alt_text_modal.change_thumbnail": "เปลี่ยนภาพขนาดย่อ", + "alt_text_modal.describe_for_people_with_hearing_impairments": "อธิบายสิ่งนี้สำหรับผู้คนที่มีความบกพร่องทางการได้ยิน…", + "alt_text_modal.describe_for_people_with_visual_impairments": "อธิบายสิ่งนี้สำหรับผู้คนที่มีความบกพร่องทางการมองเห็น…", + "alt_text_modal.done": "เสร็จสิ้น", "announcement.announcement": "ประกาศ", "annual_report.summary.archetype.booster": "ผู้ล่าความเจ๋ง", "annual_report.summary.archetype.lurker": "ผู้ซุ่มอ่านข่าว", @@ -208,6 +215,10 @@ "confirmations.logout.confirm": "ออกจากระบบ", "confirmations.logout.message": "คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบ?", "confirmations.logout.title": "ออกจากระบบ?", + "confirmations.missing_alt_text.confirm": "เพิ่มข้อความแสดงแทน", + "confirmations.missing_alt_text.message": "โพสต์ของคุณมีสื่อที่ไม่มีข้อความแสดงแทน การเพิ่มคำอธิบายช่วยทำให้เนื้อหาของคุณเข้าถึงผู้คนได้มากขึ้น", + "confirmations.missing_alt_text.secondary": "โพสต์ต่อไป", + "confirmations.missing_alt_text.title": "เพิ่มข้อความแสดงแทน?", "confirmations.mute.confirm": "ซ่อน", "confirmations.redraft.confirm": "ลบแล้วร่างใหม่", "confirmations.redraft.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้แล้วร่างโพสต์ใหม่? รายการโปรดและการดันจะสูญหาย และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน", @@ -400,6 +411,7 @@ "ignore_notifications_modal.not_followers_title": "เพิกเฉยการแจ้งเตือนจากผู้คนที่ไม่ได้ติดตามคุณ?", "ignore_notifications_modal.not_following_title": "เพิกเฉยการแจ้งเตือนจากผู้คนที่คุณไม่ได้ติดตาม?", "ignore_notifications_modal.private_mentions_title": "เพิกเฉยการแจ้งเตือนจากการกล่าวถึงแบบส่วนตัวที่ไม่พึงประสงค์?", + "info_button.label": "ช่วยเหลือ", "interaction_modal.action.favourite": "เพื่อดำเนินการต่อ คุณจำเป็นต้องชื่นชอบจากบัญชีของคุณ", "interaction_modal.action.follow": "เพื่อดำเนินการต่อ คุณจำเป็นต้องติดตามจากบัญชีของคุณ", "interaction_modal.action.reblog": "เพื่อดำเนินการต่อ คุณจำเป็นต้องดันจากบัญชีของคุณ", @@ -676,7 +688,6 @@ "poll_button.remove_poll": "เอาการสำรวจความคิดเห็นออก", "privacy.change": "เปลี่ยนความเป็นส่วนตัวของโพสต์", "privacy.direct.long": "ทุกคนที่กล่าวถึงในโพสต์", - "privacy.direct.short": "ผู้คนที่เฉพาะเจาะจง", "privacy.private.long": "เฉพาะผู้ติดตามของคุณเท่านั้น", "privacy.private.short": "ผู้ติดตาม", "privacy.public.long": "ใครก็ตามที่อยู่ในและนอก Mastodon", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 589037af4d..3bea3bb89f 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -148,7 +148,7 @@ "column.bookmarks": "Yer İşaretleri", "column.community": "Yerel ağ akışı", "column.create_list": "Liste oluştur", - "column.direct": "Özel değinmeler", + "column.direct": "Özel mesajlar", "column.directory": "Profillere göz at", "column.domain_blocks": "Engellenen alan adları", "column.edit_list": "Listeyi düzenle", @@ -444,7 +444,7 @@ "keyboard_shortcuts.column": "Sütunlardan birindeki duruma odaklanmak için", "keyboard_shortcuts.compose": "Yazma alanına odaklanmak için", "keyboard_shortcuts.description": "Açıklama", - "keyboard_shortcuts.direct": "özel değinmeler sütununu açmak için", + "keyboard_shortcuts.direct": "özel mesajlar sütununu açmak için", "keyboard_shortcuts.down": "Listede aşağıya inmek için", "keyboard_shortcuts.enter": "Gönderiyi açınız", "keyboard_shortcuts.favourite": "Gönderiyi favorilerine ekle", @@ -529,7 +529,7 @@ "navigation_bar.bookmarks": "Yer İşaretleri", "navigation_bar.community_timeline": "Yerel ağ akışı", "navigation_bar.compose": "Yeni gönderi yaz", - "navigation_bar.direct": "Özel değinmeler", + "navigation_bar.direct": "Özel mesajlar", "navigation_bar.discover": "Keşfet", "navigation_bar.domain_blocks": "Engellenen alan adları", "navigation_bar.explore": "Keşfet", @@ -662,10 +662,10 @@ "notifications.policy.filter_not_following_hint": "Onları manuel olarak onaylayana kadar", "notifications.policy.filter_not_following_title": "Takip etmediğin kullanıcılar", "notifications.policy.filter_private_mentions_hint": "Kendi değinmenize yanıt veya takip ettiğiniz kullanıcıdan değilse filtrelenir", - "notifications.policy.filter_private_mentions_title": "İstenmeyen özel değinmeler", + "notifications.policy.filter_private_mentions_title": "İstenmeyen özel mesajlar", "notifications.policy.title": "Şundan bildirimleri yönet…", "notifications_permission_banner.enable": "Masaüstü bildirimlerini etkinleştir", - "notifications_permission_banner.how_to_control": "Mastodon açık olmadığında bildirim almak için masaüstü bildirimlerini etkinleştirin. Etkinleştirildikten sonra yukarıdaki {icon} düğmesini kullanarak hangi etkileşim türlerinin masaüstü bildirimleri oluşturduğunu tam olarak kontrol edebilirsiniz.", + "notifications_permission_banner.how_to_control": "Mastodon açık olmadığında bildirim almak için masaüstü bildirimlerini etkinleştirin. Etkinleştirildikten sonra, yukarıdaki{icon} düğmesi aracılığıyla hangi etkileşim türlerinin masaüstü bildirimi oluşturacağını tam olarak kontrol edebilirsiniz.", "notifications_permission_banner.title": "Hiçbir şeyi kaçırmayın", "onboarding.follows.back": "Geri", "onboarding.follows.done": "Tamamlandı", @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Anketi kaldır", "privacy.change": "Gönderi gizliliğini değiştir", "privacy.direct.long": "Gönderide değinilen herkes", - "privacy.direct.short": "Belirli kişiler", + "privacy.direct.short": "Özel bahsetme", "privacy.private.long": "Sadece takipçileriniz", "privacy.private.short": "Takipçiler", "privacy.public.long": "Mastodon'da olan olmayan herkes", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index b56d959752..62d2291601 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Видалити опитування", "privacy.change": "Змінити видимість допису", "privacy.direct.long": "Усі згадані в дописі", - "privacy.direct.short": "Певні люди", + "privacy.direct.short": "Особиста згадка", "privacy.private.long": "Лише ваші підписники", "privacy.private.short": "Підписники", "privacy.public.long": "Усі з Mastodon", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 88e926ffb1..43fede5dd0 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "Xóa bình chọn", "privacy.change": "Chọn kiểu tút", "privacy.direct.long": "Những người được nhắc trong tút", - "privacy.direct.short": "Người cụ thể", + "privacy.direct.short": "Nhắn riêng", "privacy.private.long": "Chỉ người theo dõi", "privacy.private.short": "Người theo dõi", "privacy.public.long": "Bất cứ ai", @@ -743,12 +743,12 @@ "report.mute_explanation": "Bạn sẽ không còn thấy tút của người này. Họ vẫn có thể thấy tút của bạn hoặc theo dõi bạn. Họ không biết là bạn đã chặn họ.", "report.next": "Tiếp theo", "report.placeholder": "Thêm lưu ý", - "report.reasons.dislike": "Tôi không thích nó", - "report.reasons.dislike_description": "Đó không phải là thứ gì mà bạn muốn thấy", + "report.reasons.dislike": "Tôi không thích", + "report.reasons.dislike_description": "Đây không phải thứ mà bạn muốn thấy", "report.reasons.legal": "Vi phạm pháp luật", "report.reasons.legal_description": "Vi phạm pháp luật ở nơi đặt máy chủ hoặc nước bạn", - "report.reasons.other": "Một lý do khác", - "report.reasons.other_description": "Vấn đề không nằm trong những mục trên", + "report.reasons.other": "Lý do khác", + "report.reasons.other_description": "Vấn đề không thuộc những mục trên", "report.reasons.spam": "Đây là spam", "report.reasons.spam_description": "Liên kết độc hại, giả tương tác hoặc trả lời lặp đi lặp lại", "report.reasons.violation": "Vi phạm nội quy máy chủ", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index a096db73da..5c470cf2c4 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -78,8 +78,8 @@ "admin.dashboard.retention.cohort": "注册月份", "admin.dashboard.retention.cohort_size": "新用户", "admin.impact_report.instance_accounts": "将被删除的账号", - "admin.impact_report.instance_followers": "本实例用户即将丢失的关注者", - "admin.impact_report.instance_follows": "对方实例用户将会丢失的关注者", + "admin.impact_report.instance_followers": "本站用户即将丢失的关注者", + "admin.impact_report.instance_follows": "对方站点用户即将丢失的关注者", "admin.impact_report.title": "影响摘要", "alert.rate_limited.message": "请在 {retry_time, time, medium} 后重试。", "alert.rate_limited.title": "频率受限", @@ -219,7 +219,7 @@ "confirmations.logout.message": "确定要退出登录吗?", "confirmations.logout.title": "确定要退出登录?", "confirmations.missing_alt_text.confirm": "添加替代文本", - "confirmations.missing_alt_text.message": "您的帖子包含没有添加替代文本的媒体。添加描述有助于使更多人访问您的内容。", + "confirmations.missing_alt_text.message": "你的帖子包含没有替代文本的媒体。添加描述有助于使更多用户理解你的内容。", "confirmations.missing_alt_text.secondary": "就这样发布", "confirmations.missing_alt_text.title": "添加替代文本?", "confirmations.mute.confirm": "隐藏", @@ -298,7 +298,7 @@ "empty_column.account_timeline": "这里没有嘟文!", "empty_column.account_unavailable": "个人资料不可用", "empty_column.blocks": "你还未屏蔽任何用户。", - "empty_column.bookmarked_statuses": "你还没有收藏任何嘟文。收藏后嘟文就会显示在这里。", + "empty_column.bookmarked_statuses": "你还没有给任何嘟文添加书签。添加书签后的嘟文会显示在这里。", "empty_column.community": "本站时间线还没有内容,写点什么并公开发布,让它活跃起来吧!", "empty_column.direct": "你还未使用过私下提及。当你发出或者收到私下提及时,它将显示在此。", "empty_column.domain_blocks": "暂且没有被屏蔽的站点。", @@ -697,7 +697,7 @@ "poll_button.remove_poll": "移除投票", "privacy.change": "设置嘟文的可见范围", "privacy.direct.long": "嘟文中提到的每个人", - "privacy.direct.short": "特定的人", + "privacy.direct.short": "私下提及", "privacy.private.long": "仅限你的关注者", "privacy.private.short": "关注者", "privacy.public.long": "", @@ -813,7 +813,7 @@ "status.admin_domain": "打开 {domain} 的管理界面", "status.admin_status": "在管理界面查看此嘟文", "status.block": "屏蔽 @{name}", - "status.bookmark": "收藏", + "status.bookmark": "添加到书签", "status.cancel_reblog_private": "取消转嘟", "status.cannot_reblog": "不能转嘟这条嘟文", "status.continued_thread": "上接嘟文串", @@ -849,7 +849,7 @@ "status.reblogs": "{count, plural, other {次转嘟}}", "status.reblogs.empty": "没有人转嘟过此条嘟文。如果有人转嘟了,就会显示在这里。", "status.redraft": "删除并重新编辑", - "status.remove_bookmark": "取消收藏", + "status.remove_bookmark": "移除书签", "status.remove_favourite": "从喜欢列表中移除", "status.replied_in_thread": "回复嘟文串", "status.replied_to": "回复 {name}", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 264a75fefd..2b6179ae9c 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -533,7 +533,6 @@ "poll_button.remove_poll": "移除投票", "privacy.change": "調整私隱設定", "privacy.direct.long": "帖文提及的人", - "privacy.direct.short": "特定的人", "privacy.private.long": "只有你的追蹤者", "privacy.private.short": "追蹤者", "privacy.public.long": "Mastodon 內外的任何人", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index a91778a9fb..46f874697b 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -697,7 +697,7 @@ "poll_button.remove_poll": "移除投票", "privacy.change": "調整嘟文隱私狀態", "privacy.direct.long": "此嘟文提及之所有人", - "privacy.direct.short": "指定使用者", + "privacy.direct.short": "私訊", "privacy.private.long": "只有跟隨您之使用者能看到", "privacy.private.short": "跟隨者", "privacy.public.long": "所有人 (無論在 Mastodon 上與否)", diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 50e5bf001d..9eadbbafcd 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -4,6 +4,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity include FormattingHelper include NgRuleHelper + LINK_MEDIA_TYPES = ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].freeze + def perform @account.schedule_refresh_if_stale! @@ -645,8 +647,6 @@ class ActivityPub::Activity::Create < ActivityPub::Activity @quote ||= quote_from_tags || @object['quote'] || @object['quoteUrl'] || @object['quoteURL'] || @object['_misskey_quote'] end - LINK_MEDIA_TYPES = ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].freeze - def quote_from_tags return @quote_from_tags if defined?(@quote_from_tags) diff --git a/app/lib/activitypub/parser/status_parser.rb b/app/lib/activitypub/parser/status_parser.rb index 89e94d168b..1968f18468 100644 --- a/app/lib/activitypub/parser/status_parser.rb +++ b/app/lib/activitypub/parser/status_parser.rb @@ -5,6 +5,9 @@ class ActivityPub::Parser::StatusParser NORMALIZED_LOCALE_NAMES = LanguagesHelper::SUPPORTED_LOCALES.keys.index_by(&:downcase).freeze + SCAN_SEARCHABILITY_RE = /\[searchability:(public|followers|reactors|private)\]/ + SCAN_SEARCHABILITY_FEDIBIRD_RE = /searchable_by_(all_users|followers_only|reacted_users_only|nobody)/ + # @param [Hash] json # @param [Hash] options # @option options [String] :followers_collection @@ -182,9 +185,6 @@ class ActivityPub::Parser::StatusParser %i(public unlisted).include?(visibility) ? :public : :limited end - SCAN_SEARCHABILITY_RE = /\[searchability:(public|followers|reactors|private)\]/ - SCAN_SEARCHABILITY_FEDIBIRD_RE = /searchable_by_(all_users|followers_only|reacted_users_only|nobody)/ - def default_searchability_from_bio? note = @account.note return false if note.blank? diff --git a/app/lib/request.rb b/app/lib/request.rb index 4e0ba77833..8fda86f0e8 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -260,7 +260,7 @@ class Request outer_e = nil port = args.first - addresses = [] # rubocop:disable Lint/UselessAssignment # TODO: https://github.com/rubocop/rubocop/issues/13395 + addresses = [] # rubocop:disable Lint/UselessAssignment -- TODO: https://github.com/rubocop/rubocop/issues/13395 begin addresses = [IPAddr.new(host)] rescue IPAddr::InvalidAddressError diff --git a/app/models/status.rb b/app/models/status.rb index 59ce718c92..12960f16f2 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -425,7 +425,7 @@ class Status < ApplicationRecord end emoji_reaction['count'] = emoji_reaction['account_ids'].size - public_emoji_reactions << emoji_reaction if (emoji_reaction['count']).positive? + public_emoji_reactions << emoji_reaction if emoji_reaction['count'].positive? end public_emoji_reactions diff --git a/app/services/backup_service.rb b/app/services/backup_service.rb index 8bc90968b7..0bf5a2ecbb 100644 --- a/app/services/backup_service.rb +++ b/app/services/backup_service.rb @@ -6,6 +6,8 @@ class BackupService < BaseService include Payloadable include ContextHelper + CHUNK_SIZE = 1.megabyte + attr_reader :account, :backup def call(backup) @@ -181,8 +183,6 @@ class BackupService < BaseService ).as_json end - CHUNK_SIZE = 1.megabyte - def download_to_zip(zipfile, attachment, filename) adapter = Paperclip.io_adapters.for(attachment) diff --git a/config/initializers/webauthn.rb b/config/initializers/webauthn.rb index 40dfeb8317..ad8af3876c 100644 --- a/config/initializers/webauthn.rb +++ b/config/initializers/webauthn.rb @@ -3,7 +3,7 @@ WebAuthn.configure do |config| # This value needs to match `window.location.origin` evaluated by # the User Agent during registration and authentication ceremonies. - config.origin = "#{Rails.configuration.x.use_https ? 'https' : 'http'}://#{Rails.configuration.x.web_domain}" + config.allowed_origins = ["#{Rails.configuration.x.use_https ? 'https' : 'http'}://#{Rails.configuration.x.web_domain}"] # Relying Party name for display purposes config.rp_name = 'Mastodon' diff --git a/config/locales/activerecord.fi.yml b/config/locales/activerecord.fi.yml index 619f2cd584..8601a84026 100644 --- a/config/locales/activerecord.fi.yml +++ b/config/locales/activerecord.fi.yml @@ -44,7 +44,7 @@ fi: attributes: account_id: taken: on jo listassa - must_be_following: on oltava seurattu tili + must_be_following: on oltava seurattava tili status: attributes: reblog: diff --git a/config/locales/activerecord.no.yml b/config/locales/activerecord.no.yml index 5abe3fdc38..b79a5bcccb 100644 --- a/config/locales/activerecord.no.yml +++ b/config/locales/activerecord.no.yml @@ -15,6 +15,9 @@ user/invite_request: text: Årsak errors: + attributes: + domain: + invalid: er ikke et gyldig domenenavn models: account: attributes: diff --git a/config/locales/devise.az.yml b/config/locales/devise.az.yml index e9ba86bc79..6a02cd7e49 100644 --- a/config/locales/devise.az.yml +++ b/config/locales/devise.az.yml @@ -1 +1,46 @@ +--- az: + devise: + confirmations: + confirmed: E-poçt ünvanınız uğurla təsdiqləndi. + send_instructions: Bir neçə dəqiqə ərzində e-poçt ünvanınızı necə təsdiqləyəcəyinizə dair təlimatları olan bir e-məktub alacaqsınız. Bu e-məktubu almamısınızsa, spam qovluğunuzu yoxlayın. + send_paranoid_instructions: E-poçt ünvanınız verilənlər bazamızda varsa, bir neçə dəqiqədən sonra e-poçt ünvanınızı necə təsdiqləyəcəyinizə dair təlimatları olan bir e-məktub alacaqsınız. Bu e-məktubu almamısınızsa, spam qovluğunuzu yoxlayın. + failure: + already_authenticated: Siz artıq daxil olmusunuz. + inactive: Hesabınız hələ aktivləşdirilməyib. + invalid: Səhv %{authentication_keys} və ya parol. + last_attempt: Hesabınız blok olmamışdan əvvəl bir dəfə də cəhdiniz var. + locked: Hesabınız bloklandı. + not_found_in_database: Səhv %{authentication_keys} və ya parol. + omniauth_user_creation_failure: Bu kimlik üçün hesab yaradarkən xəta. + pending: Hesabınız hələ yoxlanışdadır. + timeout: Sessiyanın vaxtı bitdi. Xahiş edirik davam etmək üçün yenidən daxil olun. + unauthenticated: Davam etmək üçün daxil olmaq və ya qeydiyyatdan keçmək lazımdır. + unconfirmed: Davam etmək üçün e-poçt ünvanınızı təsdiqləməlisiniz. + mailer: + confirmation_instructions: + action: E-poçt ünvanını təsdiqlə + action_with_app: Təsdiqlə və %{app}-a geri qayıt + explanation: Siz %{host} saytında bu e-poçt ilə hesab yaratmısınız. Onu aktivləşdirməkdən bir klik uzaqlıqdasınız. Əgər bu siz olmamısınızsa, zəhmət olmasa, bu e-məktuba məhəl qoymayın. + explanation_when_pending: Bu e-poçt ünvanı ilə %{host} saytına dəvət üçün müraciət etmisiniz. Siz e-poçt ünvanınızı təsdiqlədikdən sonra müraciətinizi nəzərdən keçirəcəyik. Siz məlumatlarınızı dəyişdirmək və ya hesabınızı silmək üçün daxil ola bilərsiniz, lakin hesabınız təsdiqlənənə qədər əksər funksiyaları istifadə edə bilməzsiniz. Müraciətiniz rədd edilərsə, məlumatlarınız silinəcək, buna görə də sizdən heç bir tədbir tələb olunmayacaq. Əgər bu siz deyildinizsə, zəhmət, bu e-məktuba məhəl qoymayın. + extra_html: Həmçinin zəhmət olmasa, serverin qaydalarınıistifadə şərtlərini oxuyun. + subject: 'Mastodon: %{instance} üçün təsdiqlənmə təlimatları' + title: E-poçt ünvanını təsdiqlə + email_changed: + explanation: 'Hesabınız üçün e-poçt ünvanı buna dəyişdirilir:' + extra: E-poçtunuzu dəyişməmisinizsə, çox güman ki, kimsə hesabınıza giriş əldə edib. Zəhmət olmasa, parolunuzu dərhal dəyişdirin və ya hesabınıza daxil ola bilməyəcəksinizsə, server admini ilə əlaqə saxlayın. + subject: 'Mastodon: E-poçt dəyişdirildi' + title: Yeni e-poçt ünvanı + password_change: + explanation: Hesabınızın parolu dəyişdirilib. + extra: Parolunuzu dəyişməmisinizsə, çox güman ki, kimsə hesabınıza giriş əldə edib. Zəhmət olmasa, parolunuzu dərhal dəyişdirin və ya hesabınıza daxil ola bilməyəcəksinizsə, server admini ilə əlaqə saxlayın. + subject: 'Mastodon: Parol dəyişdirildi' + title: Parol dəyişdirildi + reconfirmation_instructions: + explanation: E-poçtunuzu dəyişdirmək üçün yeni ünvanı təsdiqləyin. + extra: Əgər bu dəyişiklik sizin tərəfinizdən deyilsə, zəhmət olmasa, bu e-məktuba məhəl qoymayın. Siz yuxarıdakı linkə daxil olana qədər Mastodon hesabının e-poçt ünvanı dəyişməyəcək. + subject: 'Mastodon: %{instance} üçün e-poçtu təsdiqlə' + title: E-poçt ünvanını təsdiqlə + reset_password_instructions: + action: Parolu dəyiş + explanation: Siz hesabınız üçün yeni parol tələb etmisiniz. diff --git a/config/locales/doorkeeper.fi.yml b/config/locales/doorkeeper.fi.yml index 38f88943bf..ddaff5b93a 100644 --- a/config/locales/doorkeeper.fi.yml +++ b/config/locales/doorkeeper.fi.yml @@ -130,8 +130,8 @@ fi: crypto: Päästä päähän -salaus favourites: Suosikit filters: Suodattimet - follow: Seuratut, mykistykset ja estot - follows: Seuratut + follow: Seurattavat, mykistykset ja estot + follows: Seurattavat lists: Listat media: Medialiitteet mutes: Mykistykset @@ -175,7 +175,7 @@ fi: read:bookmarks: katso kirjanmerkkejäsi read:favourites: katso suosikkejasi read:filters: katso suodattimiasi - read:follows: katso seurattujasi + read:follows: katso seurattaviasi read:lists: katso listojasi read:mutes: katso mykistyksiäsi read:notifications: katso ilmoituksiasi diff --git a/config/locales/doorkeeper.zh-CN.yml b/config/locales/doorkeeper.zh-CN.yml index 256ecbb776..2c096720c2 100644 --- a/config/locales/doorkeeper.zh-CN.yml +++ b/config/locales/doorkeeper.zh-CN.yml @@ -185,7 +185,7 @@ zh-CN: write: 修改你的账号数据 write:accounts: 修改你的个人资料 write:blocks: 屏蔽账号与站点 - write:bookmarks: 收藏嘟文 + write:bookmarks: 将嘟文加入书签 write:conversations: 静音并删除会话 write:favourites: 喜欢嘟文 write:filters: 创建过滤规则 diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 98930d11ba..6947d240f8 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1777,7 +1777,7 @@ eo: migrate: Konta migrado notifications: Retpoŝtaj sciigoj preferences: Preferoj - profile: Profilo + profile: Publika profilo relationships: Sekvatoj kaj sekvantoj severed_relationships: Finitaj rilatoj statuses_cleanup: Automata mesaĝforigo diff --git a/config/locales/fi.yml b/config/locales/fi.yml index c7148772b8..772028f1fa 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -10,7 +10,7 @@ fi: followers: one: seuraaja other: seuraajaa - following: seurattu(a) + following: Seurattavat instance_actor_flash: Tämä tili on virtuaalinen toimija, jota käytetään edustamaan itse palvelinta eikä yksittäistä käyttäjää. Sitä käytetään federointitarkoituksiin, eikä sitä tule jäädyttää. last_active: viimeksi aktiivinen link_verified_on: Tämän linkin omistus on tarkastettu %{date} @@ -74,7 +74,7 @@ fi: enabled: Käytössä enabled_msg: Käyttäjän %{username} tilin jäädytys kumottiin onnistuneesti followers: Seuraajat - follows: Seuratut + follows: Seurattavat header: Otsakekuva inbox_url: Postilaatikon osoite invite_request_text: Syitä liittymiseen @@ -1466,18 +1466,18 @@ fi: blocking: Tuodaan estettyjä tilejä bookmarks: Tuodaan kirjanmerkkejä domain_blocking: Tuodaan estettyjä verkkotunnuksia - following: Tuodaan seurattuja tilejä + following: Tuodaan seurattavia tilejä lists: Tuodaan listoja muting: Tuodaan mykistettyjä tilejä type: Tuontityyppi type_groups: - constructive: Seuratut ja kirjanmerkit + constructive: Seurattavat ja kirjanmerkit destructive: Estot ja mykistykset types: blocking: Estoluettelo bookmarks: Kirjanmerkit domain_blocking: Verkkotunnusten estoluettelo - following: Seurattujen luettelo + following: Seurattavien luettelo lists: Listat muting: Mykistysluettelo upload: Lähetä @@ -1683,7 +1683,7 @@ fi: follow_failure: Joitain valittuja tilejä ei voitu seurata. follow_selected_followers: Seuraa valittuja seuraajia followers: Seuraajat - following: Seuratut + following: Seurattavat invited: Kutsutut last_active: Viimeksi aktiivinen most_recent: Tuorein @@ -1776,7 +1776,7 @@ fi: notifications: Sähköposti-ilmoitukset preferences: Asetukset profile: Julkinen profiili - relationships: Seuratut ja seuraajat + relationships: Seurattavat ja seuraajat severed_relationships: Katkenneet suhteet statuses_cleanup: Julkaisujen automaattipoisto strikes: Moderointivaroitukset @@ -1789,8 +1789,8 @@ fi: domain_block: Palvelimen jäädytys (%{target_name}) user_domain_block: Estit käyttäjän %{target_name} lost_followers: Menetetyt seuraajat - lost_follows: Menetetyt seuratut - preamble: Voit menettää seurattusi ja seuraajasi, kun estät verkkotunnuksen tai kun moderaattorisi päättävät jäädyttää etäpalvelimen. Kun näin tapahtuu, voit ladata luetteloita katkenneista seurantasuhteista, jotta voit tarkastella niitä ja mahdollisesti viedä ne toiselle palvelimelle. + lost_follows: Menetetyt seurattavat + preamble: Voit menettää seurattavasi ja seuraajasi, kun estät verkkotunnuksen tai kun moderaattorisi päättävät jäädyttää etäpalvelimen. Kun näin tapahtuu, voit ladata luetteloita katkenneista seurantasuhteista, jotta voit tarkastella niitä ja mahdollisesti viedä ne toiselle palvelimelle. purged: Palvelimesi ylläpitäjät ovat tyhjentäneet tämän palvelimen tiedot. type: Tapahtuma statuses: diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 838acfd4d6..70cbd3b647 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -1657,7 +1657,7 @@ ia: posting_defaults: Parametros de publication predefinite public_timelines: Chronologias public privacy: - hint_html: "Personalisa como tu vole que tu profilo e tu messages es trovate. Un varietate de functiones in Mastodon pote adjutar te a attinger un plus grande publico quando activate. Prende un momento pro revider iste parametros pro assecurar te que illos se adapta a tu besonios." + hint_html: "Personalisa como tu vole que le gente trova tu profilo e tu messages. Un varietate de functiones in Mastodon pote adjutar te a attinger un plus grande publico si tu los activa. Prende un momento pro revider iste parametros pro assecurar te que illos se adapta a tu besonios." privacy: Confidentialitate privacy_hint_html: Controla quanto tu vole divulgar pro le beneficio de alteres. Le gente discoperi profilos e applicationes interessante percurrente le profilos sequite per altere personas e vidente a partir de qual applicationes illos publica lor messages, ma tu pote preferer de mantener tal information private. reach: Portata diff --git a/config/locales/kab.yml b/config/locales/kab.yml index 6232a7eba4..b65109df1a 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -71,7 +71,7 @@ kab: active: Yermed all: Akk pending: Yettraǧu - suspended: Yeḥbes + suspended: Yettwaḥbes title: Aseɣyed moderation_notes: Tamawin n useɣyed most_recent_activity: Armud aneggaru @@ -109,7 +109,7 @@ kab: silenced: Yettwasgugem statuses: Tisuffaɣ subscribe: Jerred - suspended: Yeḥbes + suspended: Yettwaḥbes title: Imiḍanen unconfirmed_email: Imayl ur yettwasentem ara undo_silenced: Kkes asgugem @@ -434,9 +434,12 @@ kab: search: Anadi title: Ihacṭagen terms_of_service: + changelog: Amaynut draft: Arewway + history: Amazray publish: Asuffeɣ save_draft: Sekles arewway + title: Tiwtilin n useqdec title: Tadbelt trends: allow: Sireg @@ -832,6 +835,8 @@ kab: '7889238': 3 n wayyuren stream_entries: sensitive_content: Agbur amḥulfu + terms_of_service: + title: Tiwtilin n useqdec themes: contrast: Maṣṭudun (agnil awriran) default: Maṣṭudun (Aberkan) @@ -854,6 +859,8 @@ kab: user_mailer: appeal_approved: action: Iɣewwaṛen n umiḍan + terms_of_service_changed: + sign_off: Agraw n %{domain} warning: categories: spam: Aspam diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 939a8826b2..86dbc668c0 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -812,6 +812,7 @@ lad: batch: remove_from_report: Kita del raporto report: Raporto + contents: Kontenidos deleted: Efasado favourites: Favoritos history: Estoria de versiones @@ -901,6 +902,9 @@ lad: search: Bushka title: Etiketas updated_msg: Konfigurasyon de etiketas aktualizada kon sukseso + terms_of_service: + live: En bivo + publish: Publika title: Administrasyon trends: allow: Permete @@ -1129,6 +1133,7 @@ lad: title: Konektate kon %{domain} sign_up: manual_review: Las enrejistrasyones en %{domain} pasan por la revizyon manuala de muestros moderadores. Para ayudarmos a prosesar tu enrejistrasyon, eskrive un poko sovre ti i por ke keres un kuento en %{domain}. + preamble: Kon un kuento en este sirvidor de Mastodon, podras segir a kualkier otra persona en el fediverso, endependientemente del sirvidor en el ke se tope. title: Kriya kuento de Mastodon en %{domain}. status: account_status: Estado del kuento diff --git a/config/locales/no.yml b/config/locales/no.yml index 2529fafb4a..d70e60df0a 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -773,6 +773,7 @@ batch: remove_from_report: Fjern fra rapport report: Rapport + contents: Innhold deleted: Slettet favourites: Favoritter history: Versjonshistorikk @@ -841,8 +842,25 @@ action: Sjekk her for mer informasjon message_html: "Objektlagringen din er feilkonfigurert. Personvernet til brukerne dine er i fare." tags: + moderation: + pending_review: Avventer gjennomgang + reviewed: Gjennomgått + title: Status + name: Navn + newest: Nyeste + oldest: Eldst + reset: Tilbakestill review: Gjennomgangsstatus + search: Søk + title: Emneknagger updated_msg: Emneknagg innstillinger vellykket oppdatert + terms_of_service: + changelog: Hva har blitt endret + current: Nåværende + draft: Kladd + history: Historikk + publish: Publiser + title: Bruksvilkår title: Administrasjon trends: allow: Tillat @@ -1034,6 +1052,7 @@ migrate_account_html: Hvis du ønsker å henvise denne kontoen til en annen, kan du konfigurere det her. or_log_in_with: Eller logg inn med progress: + confirm: Bekreft E-postadressen details: Dine opplysninger review: Vår gjennomgang rules: Godta regler @@ -1569,6 +1588,7 @@ import: Importér import_and_export: Importer og eksporter migrate: Kontomigrering + notifications: E-postbeskjeder preferences: Innstillinger profile: Profil relationships: Følginger og følgere @@ -1576,6 +1596,8 @@ strikes: Modereringsadvarsler two_factor_authentication: Tofaktorautentisering webauthn_authentication: Sikkerhetsnøkler + severed_relationships: + type: Hendelse statuses: attached: audio: @@ -1654,6 +1676,8 @@ too_late: Det er for sent å anke denne advarselen tags: does_not_match_previous_name: samsvarer ikke med det forrige navnet + terms_of_service: + title: Bruksvilkår themes: contrast: Mastodon (Høykontrast) default: Mastodon @@ -1762,6 +1786,7 @@ follows_view_more: Vis flere personer å følge hashtags_title: Populære emneknagger hashtags_view_more: Vis flere populære emneknagger + post_action: Sett sammen post_step: Si hallo til verdenen med tekst, bilder, videoer, eller meningsmålinger. post_title: Lag ditt første innlegg share_action: Del diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 4b6cc80a12..f7a4b5e855 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -233,6 +233,7 @@ el: setting_display_media_show_all: Εμφάνιση όλων setting_expand_spoilers: Μόνιμη ανάπτυξη των τουτ με προειδοποίηση περιεχομένου setting_hide_network: Κρύψε τις διασυνδέσεις σου + setting_missing_alt_text_modal: Εμφάνιση διαλόγου επιβεβαίωσης πριν από την δημοσίευση πολυμέσων χωρίς alt κείμενο setting_reduce_motion: Μείωση κίνησης κινουμένων στοιχείων setting_system_font_ui: Χρήση της προεπιλεγμένης γραμματοσειράς του συστήματος setting_system_scrollbars_ui: Χρήση προκαθορισμένης γραμμής κύλισης του συστήματος diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 8103f73929..b0b8e4e4d7 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -193,7 +193,7 @@ eo: text: Klarigu kial ĉi tiu decido devas inversigitis defaults: autofollow: Inviti al sekvi vian konton - avatar: Rolfiguro + avatar: Profilbildo bot: Ĉi tio estas aŭtomata konto chosen_languages: Filtri lingvojn confirm_new_password: Konfirmi novan pasvorton diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 83b32636dc..278b94e514 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -9,7 +9,7 @@ fi: fields: Verkkosivustosi, pronominisi, ikäsi ja mitä ikinä haluatkaan ilmoittaa. indexable: Julkiset julkaisusi voivat näkyä Mastodonin hakutuloksissa. Käyttäjät, jotka ovat olleet vuorovaikutuksessa julkaisujesi kanssa, voivat etsiä niitä asetuksesta riippumatta. note: 'Voit @mainita muita käyttäjiä tai #aihetunnisteita.' - show_collections: Käyttäjät voivat selata seurattujasi ja seuraajiasi. Käyttäjät, joita seuraat, näkevät joka tapauksessa, että seuraat heitä. + show_collections: Käyttäjät voivat selata seurattaviasi ja seuraajiasi. Käyttäjät, joita seuraat, näkevät joka tapauksessa, että seuraat heitä. unlocked: Käyttäjät voivat seurata sinua pyytämättä hyväksyntääsi. Poista valinta, jos haluat tarkistaa sekä hyväksyä tai hylätä vastaanottamasi seurantapyynnöt. account_alias: acct: Määrittele sen tilin käyttäjänimi@verkkotunnus, josta haluat muuttaa @@ -162,7 +162,7 @@ fi: name: Nimike value: Sisältö indexable: Sisällytä julkiset julkaisut hakutuloksiin - show_collections: Näytä seuratut ja seuraajat profiilissa + show_collections: Näytä seurattavat ja seuraajat profiilissa unlocked: Hyväksy uudet seuraajat automaattisesti account_alias: acct: Vanhan tilin käyttäjätunnus diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 1c3fa2278d..412e0eb03d 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -281,7 +281,7 @@ gl: site_terms: Política de Privacidade site_title: Nome do servidor status_page_url: URL da páxina do estado - theme: Decorado por defecto + theme: Decorado predeterminado thumbnail: Icona do servidor timeline_preview: Permitir acceso á cronoloxía pública sen autenticación trendable_by_default: Permitir tendencias sen aprobación previa diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 1b236b9356..442e27f35a 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -137,7 +137,10 @@ hu: admin_email: A jogi közlemények közé tartoznak az ellenkeresetek, a bírósági végzések, az eltávolítási kérelmek és a bűnüldöző szervek kérelmei is. arbitration_address: Lehet a fent használt valós cím, vagy e-mail használata esetén „N/A” arbitration_website: Lehet webes űrlap, vagy e-mail használata esetén „N/A” + dmca_address: Amerikai üzemeltető esetén használja a DMCA Designated Agent Directory jegyzékében regisztrált címet. Közvetlen kérésre postafiók-jegyzék is rendelkezésre áll, használja a DMCA Designated Agent Directory postafiókról való lemondás iránti kérelmét a Copyright Office-nak küldött e-mailben, és írja le, hogy Ön egy otthoni tartalommoderátor, aki bosszútól vagy megtorlástól tart a tevékenységi miatt, és ezért egy postafiókra van szüksége, hogy ne legyen nyilvános az otthoni címe. + dmca_email: Megegyezhet a fenti „E-mail-cím a jogi nyilatkozatok benyújtásához” mezővel domain: A nyújtott online szolgáltatás egyedi azonosítója. + jurisdiction: Adja meg az országot, ahol a számlafizető él. Ha ez egy vállalat vagy más szervezet, adja meg az országot, ahol bejegyezték, valamint adott esetben a várost, régiót, területet vagy államot. user: chosen_languages: Ha aktív, csak a kiválasztott nyelvű bejegyzések jelennek majd meg a nyilvános idővonalon role: A szerep szabályozza, hogy a felhasználó milyen jogosultságokkal rendelkezik. diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml index ff041b257b..c14f6376a0 100644 --- a/config/locales/simple_form.kab.yml +++ b/config/locales/simple_form.kab.yml @@ -141,6 +141,8 @@ kab: text: Alugen tag: name: Ahacṭag + terms_of_service: + text: Tiwtilin n useqdec user: role: Tamlilt time_zone: Tamnaḍt tasragant diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index de37005312..6fef9f7422 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -308,6 +308,8 @@ lad: name: Etiketa trendable: Permite ke esta etiketa apareska en trendes usable: Permite ke publikasyones uzen esta etiketa lokalmente + terms_of_service_generator: + domain: Domeno user: role: Rolo time_zone: Zona de tiempo diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index fb7a808876..c93c4d40bc 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -234,6 +234,7 @@ warn: Skjul med en advarsel form_admin_settings: activity_api_enabled: Publiser samlet statistikk om brukeraktivitet i API + app_icon: App-ikon backups_retention_period: Brukers oppbevaringsperiode for arkiv bootstrap_timeline_accounts: Anbefaler alltid disse kontoene til nye brukere closed_registrations_message: Egendefinert melding når registrering ikke er tilgjengelig @@ -301,6 +302,10 @@ listable: Tillat denne emneknaggen å vises i søk og på profilmappen name: Emneknagg trendable: Tillat denne emneknaggen til å vises under trender + terms_of_service: + text: Bruksvilkår + terms_of_service_generator: + domain: Domene user: role: Rolle time_zone: Tidssone diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index e35eba36c9..1c66030b4e 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -3,6 +3,7 @@ sv: simple_form: hints: account: + attribution_domains: En per rad. Skyddar mot falska attributioner. discoverable: Dina offentliga inlägg och din profil kan komma att presenteras eller rekommenderas inom olika områden av Mastodon och din profil kan komma att föreslås till andra användare. display_name: Ditt fullständiga namn eller ditt roliga namn. fields: Din hemsida, ditt pronomen, din ålder, vadhelst du vill. diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index db9518759a..dfaa61e0cc 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -3,6 +3,7 @@ th: simple_form: hints: account: + attribution_domains: หนึ่งรายการต่อบรรทัด ปกป้องจากการระบุแหล่งที่มาที่ผิด discoverable: อาจแสดงหรือแนะนำโพสต์และโปรไฟล์สาธารณะของคุณในพื้นที่ต่าง ๆ ของ Mastodon และอาจเสนอแนะโปรไฟล์ของคุณให้กับผู้ใช้อื่น ๆ display_name: ชื่อเต็มของคุณหรือชื่อแบบสนุกสนานของคุณ fields: หน้าแรก, สรรพนาม, อายุของคุณ สิ่งใดก็ตามที่คุณต้องการ @@ -143,6 +144,7 @@ th: url: ที่ซึ่งจะส่งเหตุการณ์ไปยัง labels: account: + attribution_domains: เว็บไซต์ที่ได้รับอนุญาตให้ให้เครดิตคุณ discoverable: แสดงโปรไฟล์และโพสต์ในอัลกอริทึมการค้นพบ fields: name: ป้ายชื่อ @@ -219,6 +221,7 @@ th: setting_display_media_show_all: แสดงทั้งหมด setting_expand_spoilers: ขยายโพสต์ที่มีการทำเครื่องหมายด้วยคำเตือนเนื้อหาเสมอ setting_hide_network: ซ่อนกราฟทางสังคมของคุณ + setting_missing_alt_text_modal: แสดงกล่องโต้ตอบการยืนยันก่อนที่จะโพสต์สื่อโดยไม่มีข้อความแสดงแทน setting_reduce_motion: ลดการเคลื่อนไหวในภาพเคลื่อนไหว setting_system_font_ui: ใช้แบบอักษรเริ่มต้นของระบบ setting_system_scrollbars_ui: ใช้แถบเลื่อนเริ่มต้นของระบบ diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 7855c911d1..551c48f970 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -1209,6 +1209,7 @@ sv: too_fast: Formuläret har skickats för snabbt, försök igen. use_security_key: Använd säkerhetsnyckel user_agreement_html: Jag har läst och godkänner användarvillkoren och integritetspolicy + user_privacy_agreement_html: Jag har läst och godkänner integritetspolicyn author_attribution: example_title: Exempeltext hint_html: Skriver du nyheter eller bloggartiklar utanför Mastodon? Kontrollera hur du får krediteras när de delas på Mastodon. diff --git a/config/locales/th.yml b/config/locales/th.yml index b945ee8650..2f8d03eec4 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1177,6 +1177,7 @@ th: view_strikes: ดูการดำเนินการที่ผ่านมาต่อบัญชีของคุณ too_fast: ส่งแบบฟอร์มเร็วเกินไป ลองอีกครั้ง use_security_key: ใช้กุญแจความปลอดภัย + user_privacy_agreement_html: ฉันได้อ่านและเห็นด้วยกับ นโยบายความเป็นส่วนตัว author_attribution: example_title: ข้อความตัวอย่าง hint_html: คุณกำลังเขียนข่าวหรือบทความบล็อกภายนอก Mastodon หรือไม่? ควบคุมวิธีที่คุณได้รับเครดิตเมื่อมีการแบ่งปันข่าวหรือบทความบล็อกใน Mastodon diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index a7fbfa3de2..1b4b39fb98 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1303,7 +1303,7 @@ zh-CN: request: 请求你的存档 size: 大小 blocks: 屏蔽的用户 - bookmarks: 收藏 + bookmarks: 书签 csv: CSV domain_blocks: 站点屏蔽列表 lists: 列表 @@ -1426,18 +1426,18 @@ zh-CN: time_started: 开始于 titles: blocking: 正在导入被屏蔽的账号 - bookmarks: 正在导入收藏 + bookmarks: 正在导入书签 domain_blocking: 正在导入站点屏蔽列表 following: 正在导入关注的账号 lists: 导入列表 muting: 正在导入隐藏的账号 type: 导入类型 type_groups: - constructive: 关注与收藏 + constructive: 关注和书签 destructive: 屏蔽与隐藏 types: blocking: 屏蔽列表 - bookmarks: 收藏 + bookmarks: 书签 domain_blocking: 站点屏蔽列表 following: 关注列表 lists: 列表 @@ -1803,8 +1803,8 @@ zh-CN: keep_pinned_hint: 不会删除你的任何置顶嘟文 keep_polls: 保留投票 keep_polls_hint: 不删除你的任何投票 - keep_self_bookmark: 保存被你加入书签的嘟文 - keep_self_bookmark_hint: 如果你已将自己的嘟文添加书签,就不会删除这些嘟文 + keep_self_bookmark: 保留你加入书签的嘟文 + keep_self_bookmark_hint: 不删除书签中你自己的嘟文 keep_self_fav: 保留你喜欢的嘟文 keep_self_fav_hint: 如果你喜欢了自己的嘟文,则不会删除这些嘟文 min_age: diff --git a/lib/mastodon/cli/media.rb b/lib/mastodon/cli/media.rb index 68420fb15d..84ec13eaab 100644 --- a/lib/mastodon/cli/media.rb +++ b/lib/mastodon/cli/media.rb @@ -289,6 +289,16 @@ module Mastodon::CLI fail_with_message 'Invalid URL' end + PRELOADED_MODELS = %w( + Account + Backup + CustomEmoji + Import + MediaAttachment + PreviewCard + SiteUpload + ).freeze + private def object_storage_summary @@ -310,16 +320,6 @@ module Mastodon::CLI SQL end - PRELOADED_MODELS = %w( - Account - Backup - CustomEmoji - Import - MediaAttachment - PreviewCard - SiteUpload - ).freeze - def preload_records_from_mixed_objects(objects) preload_map = Hash.new { |hash, key| hash[key] = [] } diff --git a/spec/controllers/admin/domain_blocks_controller_spec.rb b/spec/controllers/admin/domain_blocks_controller_spec.rb index f3f08c7940..bf3737bdb3 100644 --- a/spec/controllers/admin/domain_blocks_controller_spec.rb +++ b/spec/controllers/admin/domain_blocks_controller_spec.rb @@ -69,7 +69,8 @@ RSpec.describe Admin::DomainBlocksController do expect(DomainBlockWorker).to_not have_received(:perform_async) - expect(response).to render_template :new + expect(response.parsed_body.title) + .to match(I18n.t('admin.domain_blocks.new.title')) end end @@ -84,7 +85,8 @@ RSpec.describe Admin::DomainBlocksController do expect(DomainBlockWorker).to_not have_received(:perform_async) - expect(response).to render_template :confirm_suspension + expect(response.parsed_body.title) + .to match(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com')) end end @@ -119,7 +121,8 @@ RSpec.describe Admin::DomainBlocksController do expect(DomainBlockWorker).to_not have_received(:perform_async) - expect(response).to render_template :confirm_suspension + expect(response.parsed_body.title) + .to match(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com')) end end diff --git a/spec/controllers/admin/export_domain_blocks_controller_spec.rb b/spec/controllers/admin/export_domain_blocks_controller_spec.rb index b8e0696e55..1e748e34b6 100644 --- a/spec/controllers/admin/export_domain_blocks_controller_spec.rb +++ b/spec/controllers/admin/export_domain_blocks_controller_spec.rb @@ -44,11 +44,11 @@ RSpec.describe Admin::ExportDomainBlocksController do end it 'renders page with extended domain blocks' do - expect(assigns(:domain_blocks).map { |block| [block.domain, block.reject_favourite, block.reject_friend] }).to contain_exactly( - ['bad.domain', false, false], - ['worse.domain', false, false], - ['reject.media', false, false], - ['little.spam', true, false] + expect(mapped_batch_table_rows_with_expanded_params).to contain_exactly( + ['bad.domain', false], + ['worse.domain', false], + ['reject.media', false], + ['little.spam', true] ) end @@ -73,6 +73,10 @@ RSpec.describe Admin::ExportDomainBlocksController do batch_table_rows.map { |row| [row.at_css('[id$=_domain]')['value'], row.at_css('[id$=_severity]')['value'].to_sym] } end + def mapped_batch_table_rows_with_expanded_params + batch_table_rows.map { |row| [row.at_css('[id$=_domain]')['value'], row.at_css('[id$=_reject_favourite]')['value'] == 'true'] } + end + def batch_table_rows response.parsed_body.css('body div.batch-table__row') end diff --git a/spec/controllers/admin/roles_controller_spec.rb b/spec/controllers/admin/roles_controller_spec.rb deleted file mode 100644 index 173a89e5d5..0000000000 --- a/spec/controllers/admin/roles_controller_spec.rb +++ /dev/null @@ -1,235 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Admin::RolesController do - render_views - - let(:permissions) { UserRole::Flags::NONE } - let(:current_role) { UserRole.create(name: 'Foo', permissions: permissions, position: 10) } - let(:current_user) { Fabricate(:user, role: current_role) } - - before do - sign_in current_user, scope: :user - end - - describe 'GET #index' do - before do - get :index - end - - context 'when user does not have permission to manage roles' do - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - context 'when user has permission to manage roles' do - let(:permissions) { UserRole::FLAGS[:manage_roles] } - - it 'returns http success' do - expect(response).to have_http_status(:success) - end - end - end - - describe 'GET #new' do - before do - get :new - end - - context 'when user does not have permission to manage roles' do - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - context 'when user has permission to manage roles' do - let(:permissions) { UserRole::FLAGS[:manage_roles] } - - it 'returns http success' do - expect(response).to have_http_status(:success) - end - end - end - - describe 'POST #create' do - let(:selected_position) { 1 } - let(:selected_permissions_as_keys) { %w(manage_roles) } - - before do - post :create, params: { user_role: { name: 'Bar', position: selected_position, permissions_as_keys: selected_permissions_as_keys } } - end - - context 'when user has permission to manage roles' do - let(:permissions) { UserRole::FLAGS[:manage_roles] } - - context 'when new role\'s does not elevate above the user\'s role' do - let(:selected_position) { 1 } - let(:selected_permissions_as_keys) { %w(manage_roles) } - - it 'redirects to roles page and creates role' do - expect(response).to redirect_to(admin_roles_path) - - expect(UserRole.find_by(name: 'Bar')).to_not be_nil - end - end - - context 'when new role\'s position is higher than user\'s role' do - let(:selected_position) { 100 } - let(:selected_permissions_as_keys) { %w(manage_roles) } - - it 'renders new template and does not create role' do - expect(response).to render_template(:new) - - expect(UserRole.find_by(name: 'Bar')).to be_nil - end - end - - context 'when new role has permissions the user does not have' do - let(:selected_position) { 1 } - let(:selected_permissions_as_keys) { %w(manage_roles manage_users manage_reports) } - - it 'renders new template and does not create role' do - expect(response).to render_template(:new) - - expect(UserRole.find_by(name: 'Bar')).to be_nil - end - end - - context 'when user has administrator permission' do - let(:permissions) { UserRole::FLAGS[:administrator] } - - let(:selected_position) { 1 } - let(:selected_permissions_as_keys) { %w(manage_roles manage_users manage_reports) } - - it 'redirects to roles page and creates new role' do - expect(response).to redirect_to(admin_roles_path) - - expect(UserRole.find_by(name: 'Bar')).to_not be_nil - end - end - end - end - - describe 'GET #edit' do - let(:role_position) { 8 } - let(:role) { UserRole.create(name: 'Bar', permissions: UserRole::FLAGS[:manage_users], position: role_position) } - - before do - get :edit, params: { id: role.id } - end - - context 'when user does not have permission to manage roles' do - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - context 'when user has permission to manage roles' do - let(:permissions) { UserRole::FLAGS[:manage_roles] } - - context 'when user outranks the role' do - it 'returns http success' do - expect(response).to have_http_status(:success) - end - end - - context 'when role outranks user' do - let(:role_position) { current_role.position + 1 } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - end - end - - describe 'PUT #update' do - let(:role_position) { 8 } - let(:role_permissions) { UserRole::FLAGS[:manage_users] } - let(:role) { UserRole.create(name: 'Bar', permissions: role_permissions, position: role_position) } - - let(:selected_position) { 8 } - let(:selected_permissions_as_keys) { %w(manage_users) } - - before do - put :update, params: { id: role.id, user_role: { name: 'Baz', position: selected_position, permissions_as_keys: selected_permissions_as_keys } } - end - - context 'when user does not have permission to manage roles' do - it 'returns http forbidden and does not update role' do - expect(response).to have_http_status(403) - - expect(role.reload.name).to eq 'Bar' - end - end - - context 'when user has permission to manage roles' do - let(:permissions) { UserRole::FLAGS[:manage_roles] } - - context 'when role has permissions the user doesn\'t' do - it 'renders edit template and does not update role' do - expect(response).to render_template(:edit) - - expect(role.reload.name).to eq 'Bar' - end - end - - context 'when user has all permissions of the role' do - let(:permissions) { UserRole::FLAGS[:manage_roles] | UserRole::FLAGS[:manage_users] } - - context 'when user outranks the role' do - it 'redirects to roles page and updates role' do - expect(response).to redirect_to(admin_roles_path) - - expect(role.reload.name).to eq 'Baz' - end - end - - context 'when role outranks user' do - let(:role_position) { current_role.position + 1 } - - it 'returns http forbidden and does not update role' do - expect(response).to have_http_status(403) - - expect(role.reload.name).to eq 'Bar' - end - end - end - end - end - - describe 'DELETE #destroy' do - let(:role_position) { 8 } - let(:role) { UserRole.create(name: 'Bar', permissions: UserRole::FLAGS[:manage_users], position: role_position) } - - before do - delete :destroy, params: { id: role.id } - end - - context 'when user does not have permission to manage roles' do - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - context 'when user has permission to manage roles' do - let(:permissions) { UserRole::FLAGS[:manage_roles] } - - context 'when user outranks the role' do - it 'redirects to roles page' do - expect(response).to redirect_to(admin_roles_path) - end - end - - context 'when role outranks user' do - let(:role_position) { current_role.position + 1 } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - end - end -end diff --git a/spec/controllers/admin/users/roles_controller_spec.rb b/spec/controllers/admin/users/roles_controller_spec.rb deleted file mode 100644 index a7d59181d6..0000000000 --- a/spec/controllers/admin/users/roles_controller_spec.rb +++ /dev/null @@ -1,77 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Admin::Users::RolesController do - render_views - - let(:current_role) { UserRole.create(name: 'Foo', permissions: UserRole::FLAGS[:manage_roles], position: 10) } - let(:current_user) { Fabricate(:user, role: current_role) } - - let(:previous_role) { nil } - let(:user) { Fabricate(:user, role: previous_role) } - - before do - sign_in current_user, scope: :user - end - - describe 'GET #show' do - before do - get :show, params: { user_id: user.id } - end - - it 'returns http success' do - expect(response).to have_http_status(:success) - end - - context 'when target user is higher ranked than current user' do - let(:previous_role) { UserRole.create(name: 'Baz', permissions: UserRole::FLAGS[:administrator], position: 100) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - end - - describe 'PUT #update' do - let(:selected_role) { UserRole.create(name: 'Bar', permissions: permissions, position: position) } - - before do - put :update, params: { user_id: user.id, user: { role_id: selected_role.id } } - end - - context 'with manage roles permissions' do - let(:permissions) { UserRole::FLAGS[:manage_roles] } - let(:position) { 1 } - - it 'updates user role and redirects' do - expect(user.reload.role_id).to eq selected_role&.id - - expect(response).to redirect_to(admin_account_path(user.account_id)) - end - end - - context 'when selected role has higher position than current user\'s role' do - let(:permissions) { UserRole::FLAGS[:administrator] } - let(:position) { 100 } - - it 'does not update user role and renders edit' do - expect(user.reload.role_id).to eq previous_role&.id - - expect(response).to render_template(:show) - end - end - - context 'when target user is higher ranked than current user' do - let(:previous_role) { UserRole.create(name: 'Baz', permissions: UserRole::FLAGS[:administrator], position: 100) } - let(:permissions) { UserRole::FLAGS[:manage_roles] } - let(:position) { 1 } - - it 'does not update user role and returns http forbidden' do - expect(user.reload.role_id).to eq previous_role&.id - - expect(response).to have_http_status(403) - end - end - end -end diff --git a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb index 224310b7ef..45c5e77323 100644 --- a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb @@ -5,14 +5,14 @@ require 'rails_helper' RSpec.describe Settings::TwoFactorAuthentication::ConfirmationsController do render_views - shared_examples 'renders :new' do - it 'renders the new view' do + shared_examples 'renders expected page' do + it 'renders the new view with QR code' do subject expect(response).to have_http_status(200) - expect(response).to render_template(:new) expect(response.body) .to include(qr_code_markup) + .and include(I18n.t('settings.two_factor_authentication')) end def qr_code_markup @@ -34,7 +34,7 @@ RSpec.describe Settings::TwoFactorAuthentication::ConfirmationsController do get :new, session: { challenge_passed_at: Time.now.utc, new_otp_secret: 'thisisasecretforthespecofnewview' } end - include_examples 'renders :new' + include_examples 'renders expected page' end it 'redirects if a new otp_secret has not been set in the session' do @@ -66,10 +66,13 @@ RSpec.describe Settings::TwoFactorAuthentication::ConfirmationsController do expect { post_create_with_options } .to change { user.reload.otp_secret }.to 'thisisasecretforthespecofnewview' - expect(flash[:notice]).to eq 'Two-factor authentication successfully enabled' - expect(response).to have_http_status(200) - expect(response).to render_template('settings/two_factor_authentication/recovery_codes/index') - expect(response.body).to include(*otp_backup_codes) + expect(flash[:notice]) + .to eq(I18n.t('two_factor_authentication.enabled_success')) + expect(response) + .to have_http_status(200) + expect(response.body) + .to include(*otp_backup_codes) + .and include(I18n.t('settings.two_factor_authentication')) end end @@ -86,10 +89,12 @@ RSpec.describe Settings::TwoFactorAuthentication::ConfirmationsController do it 'renders page with error message' do subject - expect(response.body).to include 'The entered code was invalid! Are server time and device time correct?' + + expect(response.body) + .to include(I18n.t('otp_authentication.wrong_code')) end - include_examples 'renders :new' + include_examples 'renders expected page' end private @@ -116,18 +121,4 @@ RSpec.describe Settings::TwoFactorAuthentication::ConfirmationsController do end end end - - context 'when not signed in' do - it 'redirects on POST to create' do - post :create, params: { form_two_factor_confirmation: { otp_attempt: '123456' } } - - expect(response).to redirect_to('/auth/sign_in') - end - - it 'redirects on GET to new' do - get :new - - expect(response).to redirect_to('/auth/sign_in') - end - end end diff --git a/spec/controllers/statuses_controller_spec.rb b/spec/controllers/statuses_controller_spec.rb deleted file mode 100644 index 9f45afe693..0000000000 --- a/spec/controllers/statuses_controller_spec.rb +++ /dev/null @@ -1,192 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe StatusesController do - render_views - - describe 'GET #show' do - let(:account) { Fabricate(:account) } - let(:status) { Fabricate(:status, account: account) } - - context 'when signed-in' do - let(:user) { Fabricate(:user) } - - before do - sign_in(user) - end - - context 'when status is public' do - before do - get :show, params: { account_username: status.account.username, id: status.id, format: format } - end - - context 'with HTML' do - let(:format) { 'html' } - - it 'renders status successfully', :aggregate_failures do - expect(response) - .to have_http_status(200) - .and render_template(:show) - expect(response.headers).to include( - 'Vary' => 'Accept, Accept-Language, Cookie', - 'Cache-Control' => include('private'), - 'Link' => include('activity+json') - ) - expect(response.body).to include status.text - end - end - - context 'with JSON' do - let(:format) { 'json' } - - it 'renders ActivityPub Note object successfully', :aggregate_failures do - expect(response) - .to have_http_status(200) - expect(response.headers).to include( - 'Vary' => 'Accept, Accept-Language, Cookie', - 'Cache-Control' => include('private'), - 'Content-Type' => include('application/activity+json'), - 'Link' => include('activity+json') - ) - expect(response.parsed_body) - .to include(content: include(status.text)) - end - end - end - - context 'when status is private' do - let(:status) { Fabricate(:status, account: account, visibility: :private) } - - context 'when user is authorized to see it' do - before do - user.account.follow!(account) - get :show, params: { account_username: status.account.username, id: status.id, format: format } - end - - context 'with HTML' do - let(:format) { 'html' } - - it 'renders status successfully', :aggregate_failures do - expect(response) - .to have_http_status(200) - .and render_template(:show) - - expect(response.headers).to include( - 'Vary' => 'Accept, Accept-Language, Cookie', - 'Cache-Control' => include('private'), - 'Link' => include('activity+json') - ) - expect(response.body).to include status.text - end - end - - context 'with JSON' do - let(:format) { 'json' } - - it 'renders ActivityPub Note object successfully', :aggregate_failures do - expect(response) - .to have_http_status(200) - expect(response.headers).to include( - 'Vary' => 'Accept, Accept-Language, Cookie', - 'Cache-Control' => include('private'), - 'Content-Type' => include('application/activity+json'), - 'Link' => include('activity+json') - ) - expect(response.parsed_body) - .to include(content: include(status.text)) - end - end - end - - context 'when user is not authorized to see it' do - before do - get :show, params: { account_username: status.account.username, id: status.id, format: format } - end - - context 'with JSON' do - let(:format) { 'json' } - - it 'returns http not found' do - expect(response).to have_http_status(404) - end - end - - context 'with HTML' do - let(:format) { 'html' } - - it 'returns http not found' do - expect(response).to have_http_status(404) - end - end - end - end - - context 'when status is direct' do - let(:status) { Fabricate(:status, account: account, visibility: :direct) } - - context 'when user is authorized to see it' do - before do - Fabricate(:mention, account: user.account, status: status) - get :show, params: { account_username: status.account.username, id: status.id, format: format } - end - - context 'with HTML' do - let(:format) { 'html' } - - it 'renders status successfully', :aggregate_failures do - expect(response) - .to have_http_status(200) - .and render_template(:show) - expect(response.headers).to include( - 'Vary' => 'Accept, Accept-Language, Cookie', - 'Cache-Control' => include('private'), - 'Link' => include('activity+json') - ) - expect(response.body).to include status.text - end - end - - context 'with JSON' do - let(:format) { 'json' } - - it 'renders ActivityPub Note object successfully' do - expect(response) - .to have_http_status(200) - expect(response.headers).to include( - 'Vary' => 'Accept, Accept-Language, Cookie', - 'Cache-Control' => include('private'), - 'Content-Type' => include('application/activity+json'), - 'Link' => include('activity+json') - ) - expect(response.parsed_body) - .to include(content: include(status.text)) - end - end - end - - context 'when user is not authorized to see it' do - before do - get :show, params: { account_username: status.account.username, id: status.id, format: format } - end - - context 'with JSON' do - let(:format) { 'json' } - - it 'returns http not found' do - expect(response).to have_http_status(404) - end - end - - context 'with HTML' do - let(:format) { 'html' } - - it 'returns http not found' do - expect(response).to have_http_status(404) - end - end - end - end - end - end -end diff --git a/spec/requests/admin/roles_spec.rb b/spec/requests/admin/roles_spec.rb index 785da5a0ff..21853eb203 100644 --- a/spec/requests/admin/roles_spec.rb +++ b/spec/requests/admin/roles_spec.rb @@ -3,14 +3,142 @@ require 'rails_helper' RSpec.describe 'Admin Roles' do - describe 'POST /admin/roles' do + context 'when signed in as lower permissions user' do + let(:user_role) { Fabricate(:user_role, permissions: UserRole::Flags::NONE) } + + before { sign_in Fabricate(:user, role: user_role) } + + describe 'GET /admin/roles' do + it 'returns http forbidden' do + get admin_roles_path + + expect(response) + .to have_http_status(403) + end + end + + describe 'GET /admin/roles/new' do + it 'returns http forbidden' do + get new_admin_role_path + + expect(response) + .to have_http_status(403) + end + end + + describe 'GET /admin/roles/:id/edit' do + let(:role) { Fabricate(:user_role) } + + it 'returns http forbidden' do + get edit_admin_role_path(role) + + expect(response) + .to have_http_status(403) + end + end + + describe 'PUT /admin/roles/:id' do + let(:role) { Fabricate(:user_role) } + + it 'returns http forbidden' do + put admin_role_path(role) + + expect(response) + .to have_http_status(403) + end + end + + describe 'DELETE /admin/roles/:id' do + let(:role) { Fabricate(:user_role) } + + it 'returns http forbidden' do + delete admin_role_path(role) + + expect(response) + .to have_http_status(403) + end + end + end + + context 'when user has permissions to manage roles' do + let(:user_role) { Fabricate(:user_role, permissions: UserRole::FLAGS[:manage_users]) } + + before { sign_in Fabricate(:user, role: user_role) } + + context 'when target role permission outranks user' do + let(:role) { Fabricate(:user_role, position: user_role.position + 1) } + + describe 'GET /admin/roles/:id/edit' do + it 'returns http forbidden' do + get edit_admin_role_path(role) + + expect(response) + .to have_http_status(403) + end + end + + describe 'PUT /admin/roles/:id' do + it 'returns http forbidden' do + put admin_role_path(role) + + expect(response) + .to have_http_status(403) + end + end + + describe 'DELETE /admin/roles/:id' do + it 'returns http forbidden' do + delete admin_role_path(role) + + expect(response) + .to have_http_status(403) + end + end + end + end + + context 'when attempting to add permissions the user does not have' do + let(:user_role) { Fabricate(:user_role, permissions: UserRole::FLAGS[:manage_roles], position: 5) } + + before { sign_in Fabricate(:user, role: user_role) } + + describe 'POST /admin/roles' do + subject { post admin_roles_path, params: { user_role: { name: 'Bar', position: 2, permissions_as_keys: %w(manage_roles manage_users manage_reports) } } } + + it 'does not create role' do + expect { subject } + .to_not change(UserRole, :count) + + expect(response.body) + .to include(I18n.t('admin.roles.add_new')) + end + end + + describe 'PUT /admin/roles/:id' do + subject { put admin_role_path(role), params: { user_role: { position: 2, permissions_as_keys: %w(manage_roles manage_users manage_reports) } } } + + let(:role) { Fabricate(:user_role, name: 'Bar') } + + it 'does not create role' do + expect { subject } + .to_not(change { role.reload.permissions }) + + expect(response.parsed_body.title) + .to match(I18n.t('admin.roles.edit', name: 'Bar')) + end + end + end + + context 'when signed in as admin' do before { sign_in Fabricate(:admin_user) } - it 'gracefully handles invalid nested params' do - post admin_roles_path(user_role: 'invalid') + describe 'POST /admin/roles' do + it 'gracefully handles invalid nested params' do + post admin_roles_path(user_role: 'invalid') - expect(response) - .to have_http_status(400) + expect(response) + .to have_http_status(400) + end end end end diff --git a/spec/requests/admin/users/roles_spec.rb b/spec/requests/admin/users/roles_spec.rb index b39e3f8bae..fb88e4c87a 100644 --- a/spec/requests/admin/users/roles_spec.rb +++ b/spec/requests/admin/users/roles_spec.rb @@ -3,6 +3,34 @@ require 'rails_helper' RSpec.describe 'Admin Users Roles' do + context 'when target user is higher ranked than current user' do + let(:current_role) { UserRole.create(name: 'Foo', permissions: UserRole::FLAGS[:manage_roles], position: 10) } + let(:current_user) { Fabricate(:user, role: current_role) } + + let(:previous_role) { UserRole.create(name: 'Baz', permissions: UserRole::FLAGS[:administrator], position: 100) } + let(:user) { Fabricate(:user, role: previous_role) } + + before { sign_in(current_user) } + + describe 'GET /admin/users/:user_id/role' do + it 'returns http forbidden' do + get admin_user_role_path(user.id) + + expect(response) + .to have_http_status(403) + end + end + + describe 'PUT /admin/users/:user_id/role' do + it 'returns http forbidden' do + put admin_user_role_path(user.id) + + expect(response) + .to have_http_status(403) + end + end + end + describe 'PUT /admin/users/:user_id/role' do before { sign_in Fabricate(:admin_user) } diff --git a/spec/requests/settings/two_factor_authentication/confirmations_spec.rb b/spec/requests/settings/two_factor_authentication/confirmations_spec.rb index bf443a5e62..532fbe61ea 100644 --- a/spec/requests/settings/two_factor_authentication/confirmations_spec.rb +++ b/spec/requests/settings/two_factor_authentication/confirmations_spec.rb @@ -16,4 +16,20 @@ RSpec.describe 'Settings 2FA Confirmations' do .to have_http_status(400) end end + + context 'when not signed in' do + it 'redirects on POST to create' do + post settings_two_factor_authentication_confirmation_path(form_two_factor_confirmation: { otp_attempt: '123456' }) + + expect(response) + .to redirect_to(new_user_session_path) + end + + it 'redirects on GET to new' do + get new_settings_two_factor_authentication_confirmation_path + + expect(response) + .to redirect_to(new_user_session_path) + end + end end diff --git a/spec/requests/statuses_spec.rb b/spec/requests/statuses_spec.rb index e3bf15540a..a5e4482dfa 100644 --- a/spec/requests/statuses_spec.rb +++ b/spec/requests/statuses_spec.rb @@ -59,7 +59,6 @@ RSpec.describe 'Statuses' do expect(response) .to have_http_status(200) - .and render_template(:show) expect(response.headers).to include( 'Vary' => 'Accept, Accept-Language, Cookie', 'Cache-Control' => include('public'), @@ -114,9 +113,11 @@ RSpec.describe 'Statuses' do end context 'when signed in' do + subject { get short_account_status_path(account_username: account.username, id: status.id, format: format) } + let(:user) { Fabricate(:user) } - before { sign_in(user) } + before { sign_in_with_session(user) } context 'when account blocks user' do before { account.block!(user.account) } @@ -128,6 +129,167 @@ RSpec.describe 'Statuses' do .to have_http_status(404) end end + + context 'when status is public' do + context 'with HTML' do + let(:format) { 'html' } + + it 'renders status successfully', :aggregate_failures do + subject + + expect(response) + .to have_http_status(200) + expect(response.headers).to include( + 'Vary' => 'Accept, Accept-Language, Cookie', + 'Cache-Control' => include('private'), + 'Link' => include('activity+json') + ) + expect(response.body) + .to include(status.text) + end + end + + context 'with JSON' do + let(:format) { 'json' } + + it 'renders ActivityPub Note object successfully', :aggregate_failures do + subject + + expect(response) + .to have_http_status(200) + expect(response.headers).to include( + 'Vary' => 'Accept, Accept-Language, Cookie', + 'Cache-Control' => include('private'), + 'Content-Type' => include('application/activity+json'), + 'Link' => include('activity+json') + ) + expect(response.parsed_body) + .to include(content: include(status.text)) + end + end + end + + context 'when status is private' do + let(:status) { Fabricate(:status, account: account, visibility: :private) } + + context 'when user is authorized to see it' do + before { user.account.follow!(account) } + + context 'with HTML' do + let(:format) { 'html' } + + it 'renders status successfully', :aggregate_failures do + subject + + expect(response) + .to have_http_status(200) + + expect(response.headers).to include( + 'Vary' => 'Accept, Accept-Language, Cookie', + 'Cache-Control' => include('private'), + 'Link' => include('activity+json') + ) + expect(response.body) + .to include(status.text) + end + end + + context 'with JSON' do + let(:format) { 'json' } + + it 'renders ActivityPub Note object successfully', :aggregate_failures do + subject + + expect(response) + .to have_http_status(200) + expect(response.headers).to include( + 'Vary' => 'Accept, Accept-Language, Cookie', + 'Cache-Control' => include('private'), + 'Content-Type' => include('application/activity+json'), + 'Link' => include('activity+json') + ) + expect(response.parsed_body) + .to include(content: include(status.text)) + end + end + end + + context 'when user is not authorized to see it' do + let(:format) { 'html' } + + it 'returns http not found' do + subject + + expect(response) + .to have_http_status(404) + end + end + end + + context 'when status is direct' do + let(:status) { Fabricate(:status, account: account, visibility: :direct) } + + context 'when user is authorized to see it' do + before { Fabricate(:mention, account: user.account, status: status) } + + context 'with HTML' do + let(:format) { 'html' } + + it 'renders status successfully', :aggregate_failures do + subject + + expect(response) + .to have_http_status(200) + expect(response.headers).to include( + 'Vary' => 'Accept, Accept-Language, Cookie', + 'Cache-Control' => include('private'), + 'Link' => include('activity+json') + ) + expect(response.body) + .to include(status.text) + end + end + + context 'with JSON' do + let(:format) { 'json' } + + it 'renders ActivityPub Note object successfully' do + subject + + expect(response) + .to have_http_status(200) + expect(response.headers).to include( + 'Vary' => 'Accept, Accept-Language, Cookie', + 'Cache-Control' => include('private'), + 'Content-Type' => include('application/activity+json'), + 'Link' => include('activity+json') + ) + expect(response.parsed_body) + .to include(content: include(status.text)) + end + end + end + + context 'when user is not authorized to see it' do + let(:format) { 'html' } + + it 'returns http not found' do + subject + + expect(response) + .to have_http_status(404) + end + end + end + + private + + def sign_in_with_session(user) + # The regular `sign_in` helper does not actually set session cookies + # The endpoint responses here rely on cookie/session checks to set cache privacy headers + # To enable that, perform a full sign in which will establish those cookies for subsequent spec requests + post user_session_path, params: { user: { email: user.email, password: user.password } } + end end context 'with "HTTP Signature" access signed by a remote account' do diff --git a/spec/system/admin/roles_spec.rb b/spec/system/admin/roles_spec.rb new file mode 100644 index 0000000000..2a82d80b71 --- /dev/null +++ b/spec/system/admin/roles_spec.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Admin::Roles' do + context 'when user has administrator permissions' do + let(:user_role) { Fabricate(:user_role, permissions: UserRole::FLAGS[:administrator], position: 10) } + + before { sign_in Fabricate(:user, role: user_role) } + + it 'creates new user role' do + visit new_admin_role_path + + fill_in 'user_role_name', with: 'Baz' + fill_in 'user_role_position', with: '1' + check 'user_role_permissions_as_keys_manage_reports' + check 'user_role_permissions_as_keys_manage_roles' + + expect { click_on I18n.t('admin.roles.add_new') } + .to change(UserRole, :count) + expect(page) + .to have_title(I18n.t('admin.roles.title')) + end + end + + context 'when user has permissions to manage roles' do + let(:user_role) { Fabricate(:user_role, permissions: UserRole::FLAGS[:manage_roles], position: 10) } + + before { sign_in Fabricate(:user, role: user_role) } + + it 'Creates user roles' do + visit admin_roles_path + expect(page) + .to have_title(I18n.t('admin.roles.title')) + + click_on I18n.t('admin.roles.add_new') + expect(page) + .to have_title(I18n.t('admin.roles.add_new')) + + # Position too high + fill_in 'user_role_name', with: 'Baz' + fill_in 'user_role_position', with: '100' + expect { click_on I18n.t('admin.roles.add_new') } + .to_not change(UserRole, :count) + expect(page) + .to have_content(I18n.t('activerecord.errors.models.user_role.attributes.position.elevated')) + + # Valid submission + fill_in 'user_role_name', with: 'Baz' + fill_in 'user_role_position', with: '5' # Lower than user + check 'user_role_permissions_as_keys_manage_roles' # User has permission + expect { click_on I18n.t('admin.roles.add_new') } + .to change(UserRole, :count) + expect(page) + .to have_title(I18n.t('admin.roles.title')) + end + + it 'Manages existing user roles' do + role = Fabricate :user_role, name: 'Baz' + + visit edit_admin_role_path(role) + expect(page) + .to have_title(I18n.t('admin.roles.edit', name: 'Baz')) + + # Update role attribute + fill_in 'user_role_position', with: '5' # Lower than user + expect { click_on submit_button } + .to(change { role.reload.position }) + + # Destroy the role + visit edit_admin_role_path(role) + expect { click_on I18n.t('admin.roles.delete') } + .to change(UserRole, :count).by(-1) + expect(page) + .to have_title(I18n.t('admin.roles.title')) + end + end +end diff --git a/spec/system/admin/users/roles_spec.rb b/spec/system/admin/users/roles_spec.rb new file mode 100644 index 0000000000..8b163c4d79 --- /dev/null +++ b/spec/system/admin/users/roles_spec.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Admin Users Roles' do + let(:current_role) { UserRole.create(name: 'Foo', permissions: UserRole::FLAGS[:manage_roles], position: 10) } + let(:current_user) { Fabricate(:user, role: current_role) } + + let(:previous_role) { nil } + let(:user) { Fabricate(:user, role: previous_role) } + + before do + sign_in current_user, scope: :user + end + + describe 'Managing user roles' do + let!(:too_high_role) { UserRole.create(name: 'TooHigh', permissions: UserRole::FLAGS[:administrator], position: 100) } + let!(:usable_role) { UserRole.create(name: 'Usable', permissions: UserRole::FLAGS[:manage_roles], position: 1) } + + it 'selects and updates user roles' do + visit admin_user_role_path(user) + expect(page) + .to have_title I18n.t('admin.accounts.change_role.title', username: user.account.username) + + # Fails to assign not allowed role + select too_high_role.name, from: 'user_role_id' + expect { click_on submit_button } + .to_not(change { user.reload.role_id }) + expect(page) + .to have_title I18n.t('admin.accounts.change_role.title', username: user.account.username) + + # Assigns allowed role + select usable_role.name, from: 'user_role_id' + expect { click_on submit_button } + .to(change { user.reload.role_id }.to(usable_role.id)) + end + end +end diff --git a/spec/system/statuses_spec.rb b/spec/system/statuses_spec.rb new file mode 100644 index 0000000000..704cae03f2 --- /dev/null +++ b/spec/system/statuses_spec.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Status page' do + let(:status) { Fabricate :status } + + it 'visits the status page and renders the web app' do + visit short_account_status_path(account_username: status.account.username, id: status.id) + + expect(page) + .to have_css('noscript', text: /Mastodon/) + .and have_css('body', class: 'app-body') + end +end diff --git a/streaming/index.js b/streaming/index.js index 4b6817d8fd..ff3ef1c7ba 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -689,7 +689,7 @@ const startServer = async () => { // filtering of statuses: // Filter based on language: - if (Array.isArray(req.chosenLanguages) && payload.language !== null && req.chosenLanguages.indexOf(payload.language) === -1) { + if (Array.isArray(req.chosenLanguages) && req.chosenLanguages.indexOf(payload.language) === -1) { log.debug(`Message ${payload.id} filtered by language (${payload.language})`); return; } diff --git a/yarn.lock b/yarn.lock index 62df8db858..886b0bba40 100644 --- a/yarn.lock +++ b/yarn.lock @@ -97,7 +97,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.26.8, @babel/generator@npm:^7.7.2": +"@babel/generator@npm:^7.26.8": version: 7.26.8 resolution: "@babel/generator@npm:7.26.8" dependencies: @@ -110,6 +110,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.26.9, @babel/generator@npm:^7.7.2": + version: 7.26.9 + resolution: "@babel/generator@npm:7.26.9" + dependencies: + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/6b78872128205224a9a9761b9ea7543a9a7902a04b82fc2f6801ead4de8f59056bab3fd17b1f834ca7b049555fc4c79234b9a6230dd9531a06525306050becad + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" @@ -314,7 +327,18 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.26.8": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/parser@npm:7.26.9" + dependencies: + "@babel/types": "npm:^7.26.9" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/4b9ef3c9a0d4c328e5e5544f50fe8932c36f8a2c851e7f14a85401487cd3da75cad72c2e1bcec1eac55599a6bbb2fdc091f274c4fcafa6bdd112d4915ff087fc + languageName: node + linkType: hard + +"@babel/parser@npm:^7.26.8": version: 7.26.8 resolution: "@babel/parser@npm:7.26.8" dependencies: @@ -1412,7 +1436,18 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.25.9, @babel/template@npm:^7.26.8, @babel/template@npm:^7.3.3": +"@babel/template@npm:^7.25.9, @babel/template@npm:^7.26.9, @babel/template@npm:^7.3.3": + version: 7.26.9 + resolution: "@babel/template@npm:7.26.9" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + checksum: 10c0/019b1c4129cc01ad63e17529089c2c559c74709d225f595eee017af227fee11ae8a97a6ab19ae6768b8aa22d8d75dcb60a00b28f52e9fa78140672d928bc1ae9 + languageName: node + linkType: hard + +"@babel/template@npm:^7.26.8": version: 7.26.8 resolution: "@babel/template@npm:7.26.8" dependencies: @@ -1424,21 +1459,31 @@ __metadata: linkType: hard "@babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/traverse@npm:7.26.8" + version: 7.26.9 + resolution: "@babel/traverse@npm:7.26.9" dependencies: "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.8" - "@babel/parser": "npm:^7.26.8" - "@babel/template": "npm:^7.26.8" - "@babel/types": "npm:^7.26.8" + "@babel/generator": "npm:^7.26.9" + "@babel/parser": "npm:^7.26.9" + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/0771d1ce0351628ad2e8dac56f0d59f706eb125c83fbcc039bde83088ba0a1477244ad5fb060802f90366cc4d7fa871e5009a292aef6205bcf83f2e01d1a0a5d + checksum: 10c0/51dd57fa39ea34d04816806bfead04c74f37301269d24c192d1406dc6e244fea99713b3b9c5f3e926d9ef6aa9cd5c062ad4f2fc1caa9cf843d5e864484ac955e languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.7, @babel/types@npm:^7.26.8, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.26.9 + resolution: "@babel/types@npm:7.26.9" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/999c56269ba00e5c57aa711fbe7ff071cd6990bafd1b978341ea7572cc78919986e2aa6ee51dacf4b6a7a6fa63ba4eb3f1a03cf55eee31b896a56d068b895964 + languageName: node + linkType: hard + +"@babel/types@npm:^7.26.7, @babel/types@npm:^7.26.8": version: 7.26.8 resolution: "@babel/types@npm:7.26.8" dependencies: @@ -1472,26 +1517,33 @@ __metadata: languageName: node linkType: hard -"@csstools/css-calc@npm:^2.1.1": - version: 2.1.1 - resolution: "@csstools/css-calc@npm:2.1.1" +"@csstools/color-helpers@npm:^5.0.2": + version: 5.0.2 + resolution: "@csstools/color-helpers@npm:5.0.2" + checksum: 10c0/bebaddb28b9eb58b0449edd5d0c0318fa88f3cb079602ee27e88c9118070d666dcc4e09a5aa936aba2fde6ba419922ade07b7b506af97dd7051abd08dfb2959b + languageName: node + linkType: hard + +"@csstools/css-calc@npm:^2.1.1, @csstools/css-calc@npm:^2.1.2": + version: 2.1.2 + resolution: "@csstools/css-calc@npm:2.1.2" peerDependencies: "@csstools/css-parser-algorithms": ^3.0.4 "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/857c8dac40eb6ba8810408dad141bbcad060b28bce69dfd3bcf095a060fcaa23d5c4dbf52be88fcb57e12ce32c666e855dc68de1d8020851f6b432e3f9b29950 + checksum: 10c0/34ced30553968ef5d5f9e00e3b90b48c47480cf130e282e99d57ec9b09f803aab8bc06325683e72a1518b5e7180a3da8b533f1b462062757c21989a53b482e1a languageName: node linkType: hard "@csstools/css-color-parser@npm:^3.0.7": - version: 3.0.7 - resolution: "@csstools/css-color-parser@npm:3.0.7" + version: 3.0.8 + resolution: "@csstools/css-color-parser@npm:3.0.8" dependencies: - "@csstools/color-helpers": "npm:^5.0.1" - "@csstools/css-calc": "npm:^2.1.1" + "@csstools/color-helpers": "npm:^5.0.2" + "@csstools/css-calc": "npm:^2.1.2" peerDependencies: "@csstools/css-parser-algorithms": ^3.0.4 "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/b81780e6c50f0b0605776bd39bbd6203780231a561601853a9835cc70788560e7a281d0fbfe47ebe8affcb07dd64b0b1dcd4b67552520cfbe0e5088df158f12c + checksum: 10c0/90722c5a62ca94e9d578ddf59be604a76400b932bd3d4bd23cb1ae9b7ace8fcf83c06995d2b31f96f4afef24a7cefba79beb11ed7ee4999d7ecfec3869368359 languageName: node linkType: hard