From a021dee64214fcc662c0c36ad4e44dc1deaba65f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 9 Sep 2024 17:28:54 +0200 Subject: [PATCH 01/89] Change labels on thread indicators in web UI (#31806) --- app/javascript/mastodon/components/status.jsx | 17 +++---- .../components/status_thread_label.tsx | 50 +++++++++++++++++++ app/javascript/mastodon/locales/en.json | 2 + .../styles/mastodon/components.scss | 22 ++++++-- 4 files changed, 76 insertions(+), 15 deletions(-) create mode 100644 app/javascript/mastodon/components/status_thread_label.tsx diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 7236c9633d..6c32fd245d 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -12,7 +12,6 @@ import { HotKeys } from 'react-hotkeys'; import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; import PushPinIcon from '@/material-icons/400-24px/push_pin.svg?react'; import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; -import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; import { ContentWarning } from 'mastodon/components/content_warning'; import { FilterWarning } from 'mastodon/components/filter_warning'; import { Icon } from 'mastodon/components/icon'; @@ -34,6 +33,7 @@ import { getHashtagBarForStatus } from './hashtag_bar'; import { RelativeTimestamp } from './relative_timestamp'; import StatusActionBar from './status_action_bar'; import StatusContent from './status_content'; +import { StatusThreadLabel } from './status_thread_label'; import { VisibilityIcon } from './visibility_icon'; const domParser = new DOMParser(); @@ -413,7 +413,7 @@ class Status extends ImmutablePureComponent { if (featured) { prepend = (
-
+
); @@ -422,7 +422,7 @@ class Status extends ImmutablePureComponent { prepend = (
-
+
}} />
); @@ -434,18 +434,13 @@ class Status extends ImmutablePureComponent { } else if (status.get('visibility') === 'direct') { prepend = (
-
+
); - } else if (showThread && status.get('in_reply_to_id') && status.get('in_reply_to_account_id') === status.getIn(['account', 'id'])) { - const display_name_html = { __html: status.getIn(['account', 'display_name_html']) }; - + } else if (showThread && status.get('in_reply_to_id')) { prepend = ( -
-
- }} /> -
+ ); } diff --git a/app/javascript/mastodon/components/status_thread_label.tsx b/app/javascript/mastodon/components/status_thread_label.tsx new file mode 100644 index 0000000000..b18aca6dcb --- /dev/null +++ b/app/javascript/mastodon/components/status_thread_label.tsx @@ -0,0 +1,50 @@ +import { FormattedMessage } from 'react-intl'; + +import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; +import { Icon } from 'mastodon/components/icon'; +import { DisplayedName } from 'mastodon/features/notifications_v2/components/displayed_name'; +import { useAppSelector } from 'mastodon/store'; + +export const StatusThreadLabel: React.FC<{ + accountId: string; + inReplyToAccountId: string; +}> = ({ accountId, inReplyToAccountId }) => { + const inReplyToAccount = useAppSelector((state) => + state.accounts.get(inReplyToAccountId), + ); + + let label; + + if (accountId === inReplyToAccountId) { + label = ( + + ); + } else if (inReplyToAccount) { + label = ( + }} + /> + ); + } else { + label = ( + + ); + } + + return ( +
+
+ +
+ {label} +
+ ); +}; diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 4321acef4b..7c1d7f126d 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -780,6 +780,7 @@ "status.bookmark": "Bookmark", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", + "status.continued_thread": "Continued thread", "status.copy": "Copy link to post", "status.delete": "Delete", "status.detailed_status": "Detailed conversation view", @@ -813,6 +814,7 @@ "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.", "status.redraft": "Delete & re-draft", "status.remove_bookmark": "Remove bookmark", + "status.replied_in_thread": "Replied in thread", "status.replied_to": "Replied to {name}", "status.reply": "Reply", "status.replyAll": "Reply to thread", diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 0b7c9ac903..92d2034633 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1607,15 +1607,29 @@ body > [data-popper-placement] { .status__prepend { padding: 16px; padding-bottom: 0; - display: inline-flex; - gap: 10px; + display: flex; + align-items: center; + gap: 8px; font-size: 15px; line-height: 22px; font-weight: 500; color: $dark-text-color; - .status__display-name strong { - color: $dark-text-color; + &__icon { + display: flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + + .icon { + width: 16px; + height: 16px; + } + } + + a { + color: inherit; + text-decoration: none; } > span { From d0ab94c4d256d8239d0708c5a1e1d694607dae71 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 9 Sep 2024 15:57:19 -0400 Subject: [PATCH 02/89] Add `FeaturedTag` coverage, use `pick` in model (#31828) --- app/models/featured_tag.rb | 4 +- spec/models/featured_tag_spec.rb | 130 +++++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+), 2 deletions(-) diff --git a/app/models/featured_tag.rb b/app/models/featured_tag.rb index cdd97205eb..a4e7b7cf6f 100644 --- a/app/models/featured_tag.rb +++ b/app/models/featured_tag.rb @@ -45,7 +45,7 @@ class FeaturedTag < ApplicationRecord end def decrement(deleted_status_id) - update(statuses_count: [0, statuses_count - 1].max, last_status_at: visible_tagged_account_statuses.where.not(id: deleted_status_id).select(:created_at).first&.created_at) + update(statuses_count: [0, statuses_count - 1].max, last_status_at: visible_tagged_account_statuses.where.not(id: deleted_status_id).pick(:created_at)) end private @@ -56,7 +56,7 @@ class FeaturedTag < ApplicationRecord def reset_data self.statuses_count = visible_tagged_account_statuses.count - self.last_status_at = visible_tagged_account_statuses.select(:created_at).first&.created_at + self.last_status_at = visible_tagged_account_statuses.pick(:created_at) end def validate_featured_tags_limit diff --git a/spec/models/featured_tag_spec.rb b/spec/models/featured_tag_spec.rb index 6056e645e0..0f5ead8f97 100644 --- a/spec/models/featured_tag_spec.rb +++ b/spec/models/featured_tag_spec.rb @@ -8,4 +8,134 @@ RSpec.describe FeaturedTag do it { is_expected.to normalize(:name).from(' #hashtag ').to('hashtag') } end end + + describe 'Validations' do + context 'when account already has a featured tag' do + subject { Fabricate.build :featured_tag, account: account } + + before { Fabricate :featured_tag, account: account, name: 'Test' } + + let(:account) { Fabricate :account } + + it { is_expected.to_not allow_value('Test').for(:name) } + + context 'when account has hit limit' do + before { stub_const 'FeaturedTag::LIMIT', 1 } + + context 'with a local account' do + let(:account) { Fabricate :account, domain: nil } + + it { is_expected.to_not allow_value(account).for(:account).against(:base).with_message(I18n.t('featured_tags.errors.limit')) } + end + + context 'with a remote account' do + let(:account) { Fabricate :account, domain: 'host.example' } + + it { is_expected.to allow_value(account).for(:account) } + end + end + end + end + + describe 'Callback to set the tag' do + context 'with no matching tag' do + it 'creates a new tag' do + expect { Fabricate :featured_tag, name: 'tag' } + .to change(Tag, :count).by(1) + end + end + + context 'with a matching tag' do + it 'creates a new tag' do + tag = Fabricate :tag, name: 'tag' + + expect { Fabricate :featured_tag, name: 'tag' } + .to_not change(Tag, :count) + + expect(described_class.last.tag) + .to eq(tag) + end + end + end + + describe 'Callback to set the stats' do + context 'when no statuses are relevant' do + it 'sets values to nil' do + featured_tag = Fabricate :featured_tag + + expect(featured_tag) + .to have_attributes( + statuses_count: 0, + last_status_at: be_nil + ) + end + end + + context 'when some statuses are relevant' do + it 'sets values to nil' do + tag = Fabricate :tag, name: 'test' + status = Fabricate :status, visibility: :public, created_at: 10.days.ago + status.tags << tag + + featured_tag = Fabricate :featured_tag, name: 'test', account: status.account + + expect(featured_tag) + .to have_attributes( + statuses_count: 1, + last_status_at: be_within(0.1).of(status.created_at) + ) + end + end + end + + describe '#sign?' do + it { is_expected.to be_sign } + end + + describe '#display_name' do + subject { Fabricate.build :featured_tag, name: name, tag: tag } + + context 'with a name value present' do + let(:name) { 'Test' } + let(:tag) { nil } + + it 'uses name value' do + expect(subject.display_name).to eq('Test') + end + end + + context 'with a missing name value but a present tag' do + let(:name) { nil } + let(:tag) { Fabricate.build :tag, name: 'Tester' } + + it 'uses name value' do + expect(subject.display_name).to eq('Tester') + end + end + end + + describe '#increment' do + it 'increases the count and updates the last_status_at timestamp' do + featured_tag = Fabricate :featured_tag + timestamp = 5.days.ago + + expect { featured_tag.increment(timestamp) } + .to change(featured_tag, :statuses_count).from(0).to(1) + .and change(featured_tag, :last_status_at).from(nil).to(be_within(0.1).of(timestamp)) + end + end + + describe '#decrement' do + it 'decreases the count and updates the last_status_at timestamp' do + tag = Fabricate :tag, name: 'test' + status = Fabricate :status, visibility: :public, created_at: 10.days.ago + status.tags << tag + + featured_tag = Fabricate :featured_tag, name: 'test', account: status.account + + expect { featured_tag.decrement(status.id) } + .to change(featured_tag, :statuses_count).from(1).to(0) + .and change(featured_tag, :last_status_at).to(nil) + end + end end From 592a7af27f7699d4751d2bea7785149d3c0e5d58 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 9 Sep 2024 21:57:52 +0200 Subject: [PATCH 03/89] =?UTF-8?q?Fix=20translatable=20source=20string=20us?= =?UTF-8?q?ing=20=E2=80=9Csilenced=E2=80=9D=20instead=20of=20=E2=80=9Climi?= =?UTF-8?q?ted=E2=80=9D=20(#31822)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index e8c9010486..980bd481b1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -25,7 +25,7 @@ en: admin: account_actions: action: Perform action - already_silenced: This account has already been silenced. + already_silenced: This account has already been limited. already_suspended: This account has already been suspended. title: Perform moderation action on %{acct} account_moderation_notes: From 9ea710e5438ba862f135e972185a932910511715 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 09:59:18 +0200 Subject: [PATCH 04/89] Update dependency oj to v3.16.6 (#31831) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 48fd05b1ac..de541edfbd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -458,7 +458,7 @@ GEM nokogiri (1.16.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) - oj (3.16.5) + oj (3.16.6) bigdecimal (>= 3.0) ostruct (>= 0.2) omniauth (2.1.2) From 5b995143f1ba3278e799e46b76646a9878977677 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 10 Sep 2024 04:03:45 -0400 Subject: [PATCH 05/89] Use `with_options` for shared Account validation option value (#31827) --- app/models/account.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/models/account.rb b/app/models/account.rb index d773d33441..4a7c752e7c 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -111,10 +111,12 @@ class Account < ApplicationRecord validates :display_name, length: { maximum: DISPLAY_NAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_display_name? } validates :note, note_length: { maximum: NOTE_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_note? } validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? } - validates :uri, absence: true, if: :local?, on: :create - validates :inbox_url, absence: true, if: :local?, on: :create - validates :shared_inbox_url, absence: true, if: :local?, on: :create - validates :followers_url, absence: true, if: :local?, on: :create + with_options on: :create do + validates :uri, absence: true, if: :local? + validates :inbox_url, absence: true, if: :local? + validates :shared_inbox_url, absence: true, if: :local? + validates :followers_url, absence: true, if: :local? + end normalizes :username, with: ->(username) { username.squish } From 5260233b81c301cf7b0c79b179858748b693460b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 11:22:49 +0200 Subject: [PATCH 06/89] New Crowdin Translations (automated) (#31835) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ca.json | 2 + app/javascript/mastodon/locales/da.json | 2 + app/javascript/mastodon/locales/de.json | 2 + app/javascript/mastodon/locales/es-AR.json | 2 + app/javascript/mastodon/locales/fi.json | 4 +- app/javascript/mastodon/locales/gl.json | 12 +- app/javascript/mastodon/locales/he.json | 2 + app/javascript/mastodon/locales/hu.json | 2 + app/javascript/mastodon/locales/lt.json | 2 + app/javascript/mastodon/locales/nl.json | 2 + app/javascript/mastodon/locales/pl.json | 2 + app/javascript/mastodon/locales/pt-PT.json | 2 +- app/javascript/mastodon/locales/tr.json | 2 + app/javascript/mastodon/locales/uk.json | 1 + app/javascript/mastodon/locales/zh-CN.json | 4 +- app/javascript/mastodon/locales/zh-TW.json | 2 + config/locales/ca.yml | 29 ++- config/locales/cy.yml | 1 - config/locales/da.yml | 2 +- config/locales/de.yml | 1 - config/locales/es-AR.yml | 2 +- config/locales/et.yml | 1 - config/locales/fi.yml | 2 +- config/locales/fo.yml | 1 - config/locales/fr-CA.yml | 1 - config/locales/fr.yml | 1 - config/locales/ga.yml | 1 - config/locales/gd.yml | 1 - config/locales/gl.yml | 4 +- config/locales/he.yml | 3 + config/locales/hu.yml | 1 - config/locales/ia.yml | 1 - config/locales/is.yml | 1 - config/locales/it.yml | 2 +- config/locales/ko.yml | 1 - config/locales/lt.yml | 3 + config/locales/nn.yml | 1 + config/locales/pl.yml | 1 - config/locales/pt-PT.yml | 207 ++++++++++++--------- config/locales/simple_form.he.yml | 1 + config/locales/simple_form.lt.yml | 1 + config/locales/simple_form.pl.yml | 1 + config/locales/simple_form.pt-PT.yml | 9 +- config/locales/simple_form.tr.yml | 1 + config/locales/sq.yml | 1 - config/locales/sv.yml | 1 + config/locales/th.yml | 1 - config/locales/tr.yml | 4 + config/locales/uk.yml | 1 + config/locales/vi.yml | 1 - config/locales/zh-CN.yml | 2 +- config/locales/zh-TW.yml | 4 +- 52 files changed, 210 insertions(+), 131 deletions(-) diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index d99b5c7375..5981c1df84 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -780,6 +780,7 @@ "status.bookmark": "Marca", "status.cancel_reblog_private": "Desfés l'impuls", "status.cannot_reblog": "No es pot impulsar aquest tut", + "status.continued_thread": "Continuació del fil", "status.copy": "Copia l'enllaç al tut", "status.delete": "Elimina", "status.detailed_status": "Vista detallada de la conversa", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Encara no ha impulsat ningú aquest tut. Quan algú ho faci, apareixerà aquí.", "status.redraft": "Esborra i reescriu", "status.remove_bookmark": "Elimina el marcador", + "status.replied_in_thread": "Respost al fil", "status.replied_to": "En resposta a {name}", "status.reply": "Respon", "status.replyAll": "Respon al fil", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 732e4a100e..4155dc9fc5 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -780,6 +780,7 @@ "status.bookmark": "Bogmærk", "status.cancel_reblog_private": "Fjern boost", "status.cannot_reblog": "Dette indlæg kan ikke fremhæves", + "status.continued_thread": "Fortsat tråd", "status.copy": "Kopiér link til indlæg", "status.delete": "Slet", "status.detailed_status": "Detaljeret samtalevisning", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Ingen har endnu fremhævet dette indlæg. Når nogen gør, vil det fremgå hér.", "status.redraft": "Slet og omformulér", "status.remove_bookmark": "Fjern bogmærke", + "status.replied_in_thread": "Svaret i tråd", "status.replied_to": "Besvarede {name}", "status.reply": "Besvar", "status.replyAll": "Besvar alle", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 3c180f9f5c..e37a595469 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -780,6 +780,7 @@ "status.bookmark": "Beitrag als Lesezeichen setzen", "status.cancel_reblog_private": "Beitrag nicht mehr teilen", "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden", + "status.continued_thread": "Fortgeführter Thread", "status.copy": "Link zum Beitrag kopieren", "status.delete": "Beitrag löschen", "status.detailed_status": "Detaillierte Ansicht der Unterhaltung", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Diesen Beitrag hat bisher noch niemand geteilt. Sobald es jemand tut, wird das Profil hier erscheinen.", "status.redraft": "Löschen und neu erstellen", "status.remove_bookmark": "Lesezeichen entfernen", + "status.replied_in_thread": "Antwortete im Thread", "status.replied_to": "Antwortete {name}", "status.reply": "Antworten", "status.replyAll": "Allen antworten", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index c3915c9b74..20d93ed011 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -780,6 +780,7 @@ "status.bookmark": "Marcar", "status.cancel_reblog_private": "Quitar adhesión", "status.cannot_reblog": "No se puede adherir a este mensaje", + "status.continued_thread": "Continuación de hilo", "status.copy": "Copiar enlace al mensaje", "status.delete": "Eliminar", "status.detailed_status": "Vista de conversación detallada", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Todavía nadie adhirió a este mensaje. Cuando alguien lo haga, se mostrará acá.", "status.redraft": "Eliminar mensaje original y editarlo", "status.remove_bookmark": "Quitar marcador", + "status.replied_in_thread": "Respuesta en hilo", "status.replied_to": "Respondió a {name}", "status.reply": "Responder", "status.replyAll": "Responder al hilo", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 79ca95a58c..8f9cc5fe4d 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -1,6 +1,6 @@ { "about.blocks": "Moderoidut palvelimet", - "about.contact": "Yhteystiedot:", + "about.contact": "Yhteydenotto:", "about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon gGmbH:n tavaramerkki.", "about.domain_blocks.no_reason_available": "Syy ei ole tiedossa", "about.domain_blocks.preamble": "Mastodonin avulla voi yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.", @@ -780,6 +780,7 @@ "status.bookmark": "Lisää kirjanmerkki", "status.cancel_reblog_private": "Peru tehostus", "status.cannot_reblog": "Tätä julkaisua ei voi tehostaa", + "status.continued_thread": "Jatkoi ketjua", "status.copy": "Kopioi linkki julkaisuun", "status.delete": "Poista", "status.detailed_status": "Yksityiskohtainen keskustelunäkymä", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Kukaan ei ole vielä tehostanut tätä julkaisua. Kun joku tekee niin, tulee hän tähän näkyviin.", "status.redraft": "Poista ja palauta muokattavaksi", "status.remove_bookmark": "Poista kirjanmerkki", + "status.replied_in_thread": "Vastasi ketjuun", "status.replied_to": "Vastaus käyttäjälle {name}", "status.reply": "Vastaa", "status.replyAll": "Vastaa ketjuun", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 5a5ac1dd38..df477fe9e2 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -223,7 +223,7 @@ "domain_block_modal.title": "Bloquear dominio?", "domain_block_modal.you_will_lose_followers": "Vanse eliminar todas as túas seguidoras deste servidor.", "domain_block_modal.you_wont_see_posts": "Non verás publicacións ou notificacións das usuarias deste servidor.", - "domain_pill.activitypub_lets_connect": "Permíteche conectar e interactuar con persoas non só de Mastodon, se non tamén con outras apps sociais.", + "domain_pill.activitypub_lets_connect": "Permíteche conectar e interactuar con persoas non só de Mastodon, se non tamén con outras sociais.", "domain_pill.activitypub_like_language": "ActivityPub é algo así como o idioma que Mastodon fala con outras redes sociais.", "domain_pill.server": "Servidor", "domain_pill.their_handle": "O seu alcume:", @@ -231,8 +231,8 @@ "domain_pill.their_username": "O seu identificador único no seu servidor. É posible atopar usuarias co mesmo nome de usuaria en diferentes servidores.", "domain_pill.username": "Nome de usuaria", "domain_pill.whats_in_a_handle": "As partes do alcume?", - "domain_pill.who_they_are": "O alcume dinos quen é esa persoa e onde está, para que poidas interactuar con ela en toda a web social de .", - "domain_pill.who_you_are": "Como o teu alcume informa de quen es e onde estás, as persoas poden interactuar contigo desde toda a web social de .", + "domain_pill.who_they_are": "O alcume dinos quen é esa persoa e onde está, para que poidas interactuar con ela en toda a web social das .", + "domain_pill.who_you_are": "Como o teu alcume informa de quen es e onde estás, as persoas poden interactuar contigo desde toda a web social das .", "domain_pill.your_handle": "O teu alcume:", "domain_pill.your_server": "O teu fogar dixital, onde están as túas publicacións. Non é do teu agrado? Podes cambiar de servidor cando queiras levando as túas seguidoras contigo.", "domain_pill.your_username": "O teu identificador único neste servidor. É posible que atopes usuarias co mesmo nome de usuaria en outros servidores.", @@ -272,7 +272,7 @@ "empty_column.list": "Aínda non hai nada nesta listaxe. Cando as usuarias incluídas na listaxe publiquen mensaxes, amosaranse aquí.", "empty_column.lists": "Aínda non tes listaxes. Cando crees unha, amosarase aquí.", "empty_column.mutes": "Aínda non silenciaches a ningúnha usuaria.", - "empty_column.notification_requests": "Todo ben! Nada por aquí. Cando recibas novas notificación aparecerán aquí seguindo o criterio dos teus axustes.", + "empty_column.notification_requests": "Todo ben! Nada por aquí. Cando recibas novas notificacións aparecerán aquí seguindo o criterio dos teus axustes.", "empty_column.notifications": "Aínda non tes notificacións. Aparecerán cando outras persoas interactúen contigo.", "empty_column.public": "Nada por aquí! Escribe algo de xeito público, ou segue de xeito manual usuarias doutros servidores para ir enchéndoo", "error.unexpected_crash.explanation": "Debido a un erro no noso código ou a unha compatilidade co teu navegador, esta páxina non pode ser amosada correctamente.", @@ -641,7 +641,7 @@ "onboarding.steps.publish_status.title": "Escribe a túa primeira publicación", "onboarding.steps.setup_profile.body": "Ao engadir información ao teu perfil é máis probable que teñas máis interaccións.", "onboarding.steps.setup_profile.title": "Personaliza o perfil", - "onboarding.steps.share_profile.body": "Dille ás amizades como poden atoparte en Mastodon!", + "onboarding.steps.share_profile.body": "Dille ás amizades como poden atoparte en Mastodon.", "onboarding.steps.share_profile.title": "Comparte o teu perfil en Mastodon", "onboarding.tips.2fa": "Sabes que? Podes protexer a túa conta configurando un segundo factor de autenticación nos axustes. Funciona con calquera app TOTP, non precisas un número de teléfono!", "onboarding.tips.accounts_from_other_servers": "Sabes que? Como Mastodon é descentralizado, algúns perfís que atopes estarán en servidores diferentes ao teu. Pero podes interactuar igualmente con eles! O seu servidor é o que ven despois da @ no seu identificador!", @@ -780,6 +780,7 @@ "status.bookmark": "Marcar", "status.cancel_reblog_private": "Desfacer compartido", "status.cannot_reblog": "Esta publicación non pode ser promovida", + "status.continued_thread": "Continua co fío", "status.copy": "Copiar ligazón á publicación", "status.delete": "Eliminar", "status.detailed_status": "Vista detallada da conversa", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Aínda ninguén promoveu esta publicación. Cando alguén o faga, amosarase aquí.", "status.redraft": "Eliminar e reescribir", "status.remove_bookmark": "Eliminar marcador", + "status.replied_in_thread": "Respondeu nun fío", "status.replied_to": "Respondeu a {name}", "status.reply": "Responder", "status.replyAll": "Responder ao tema", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 44c95d64c6..47fc444e88 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -780,6 +780,7 @@ "status.bookmark": "סימניה", "status.cancel_reblog_private": "הסרת הדהוד", "status.cannot_reblog": "לא ניתן להדהד חצרוץ זה", + "status.continued_thread": "שרשור מתמשך", "status.copy": "העתק/י קישור להודעה זו", "status.delete": "מחיקה", "status.detailed_status": "תצוגת שיחה מפורטת", @@ -813,6 +814,7 @@ "status.reblogs.empty": "עוד לא הידהדו את ההודעה הזו. כאשר זה יקרה, ההדהודים יופיעו כאן.", "status.redraft": "מחיקה ועריכה מחדש", "status.remove_bookmark": "הסרת סימניה", + "status.replied_in_thread": "תגובה לשרשור", "status.replied_to": "בתגובה לחשבון {name}", "status.reply": "תגובה", "status.replyAll": "תגובה לשרשור", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index d55a85ee33..f0f08ca50c 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -780,6 +780,7 @@ "status.bookmark": "Könyvjelzőzés", "status.cancel_reblog_private": "Megtolás visszavonása", "status.cannot_reblog": "Ezt a bejegyzést nem lehet megtolni", + "status.continued_thread": "Folytatott szál", "status.copy": "Link másolása bejegyzésbe", "status.delete": "Törlés", "status.detailed_status": "Részletes beszélgetési nézet", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Senki sem tolta még meg ezt a bejegyzést. Ha valaki megteszi, itt fog megjelenni.", "status.redraft": "Törlés és újraírás", "status.remove_bookmark": "Könyvjelző eltávolítása", + "status.replied_in_thread": "Válaszolva a szálban", "status.replied_to": "Megválaszolva {name} számára", "status.reply": "Válasz", "status.replyAll": "Válasz a beszélgetésre", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index f58c405f28..55ef2afce8 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -770,6 +770,7 @@ "status.bookmark": "Pridėti į žymės", "status.cancel_reblog_private": "Nebepakelti", "status.cannot_reblog": "Šis įrašas negali būti pakeltas.", + "status.continued_thread": "Tęsiama gijoje", "status.copy": "Kopijuoti nuorodą į įrašą", "status.delete": "Ištrinti", "status.detailed_status": "Išsami pokalbio peržiūra", @@ -802,6 +803,7 @@ "status.reblogs.empty": "Šio įrašo dar niekas nepakėlė. Kai kas nors tai padarys, jie bus rodomi čia.", "status.redraft": "Ištrinti ir parengti iš naujo", "status.remove_bookmark": "Pašalinti žymę", + "status.replied_in_thread": "Atsakyta gijoje", "status.replied_to": "Atsakyta į {name}", "status.reply": "Atsakyti", "status.replyAll": "Atsakyti į giją", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 3526568249..7956435361 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -780,6 +780,7 @@ "status.bookmark": "Bladwijzer toevoegen", "status.cancel_reblog_private": "Niet langer boosten", "status.cannot_reblog": "Dit bericht kan niet geboost worden", + "status.continued_thread": "Vervolgt het gesprek", "status.copy": "Link naar bericht kopiëren", "status.delete": "Verwijderen", "status.detailed_status": "Uitgebreide gespreksweergave", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Niemand heeft dit bericht nog geboost. Wanneer iemand dit doet, valt dat hier te zien.", "status.redraft": "Verwijderen en herschrijven", "status.remove_bookmark": "Bladwijzer verwijderen", + "status.replied_in_thread": "Reageerde in gesprek", "status.replied_to": "Reageerde op {name}", "status.reply": "Reageren", "status.replyAll": "Op iedereen reageren", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 09ac636185..6bf6252d70 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -780,6 +780,7 @@ "status.bookmark": "Dodaj zakładkę", "status.cancel_reblog_private": "Cofnij podbicie", "status.cannot_reblog": "Ten wpis nie może zostać podbity", + "status.continued_thread": "Ciąg dalszy wątku", "status.copy": "Skopiuj odnośnik do wpisu", "status.delete": "Usuń", "status.detailed_status": "Szczegółowy widok konwersacji", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Nikt nie podbił jeszcze tego wpisu. Gdy ktoś to zrobi, pojawi się tutaj.", "status.redraft": "Usuń i przeredaguj", "status.remove_bookmark": "Usuń zakładkę", + "status.replied_in_thread": "Odpowiedź w wątku", "status.replied_to": "Odpowiedź do wpisu użytkownika {name}", "status.reply": "Odpowiedz", "status.replyAll": "Odpowiedz na wątek", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 2d0013d607..fd811d6833 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -278,7 +278,7 @@ "error.unexpected_crash.explanation": "Devido a um erro no nosso código ou a um problema de compatibilidade do navegador, esta página não pôde ser apresentada corretamente.", "error.unexpected_crash.explanation_addons": "Esta página não pôde ser exibida corretamente. Este erro provavelmente é causado por um complemento do navegador ou ferramentas de tradução automática.", "error.unexpected_crash.next_steps": "Tente atualizar a página. Se isso não ajudar, pode usar o Mastodon através de um navegador diferente ou uma aplicação nativa.", - "error.unexpected_crash.next_steps_addons": "Tente desabilitá-los e atualizar a página. Se isso não ajudar, você ainda poderá usar o Mastodon por meio de um navegador diferente ou de um aplicativo nativo.", + "error.unexpected_crash.next_steps_addons": "Tente desativá-los e atualizar a página. Se isso não ajudar, poderá ainda ser possível utilizar o Mastodon através de um navegador diferente ou de uma aplicação nativa.", "errors.unexpected_crash.copy_stacktrace": "Copiar a stacktrace para o clipboard", "errors.unexpected_crash.report_issue": "Reportar problema", "explore.search_results": "Resultados da pesquisa", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 9b94ede76a..4873fa943e 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -780,6 +780,7 @@ "status.bookmark": "Yer işareti ekle", "status.cancel_reblog_private": "Yeniden paylaşımı geri al", "status.cannot_reblog": "Bu gönderi yeniden paylaşılamaz", + "status.continued_thread": "Devam eden akış", "status.copy": "Gönderi bağlantısını kopyala", "status.delete": "Sil", "status.detailed_status": "Ayrıntılı sohbet görünümü", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Henüz hiç kimse bu gönderiyi yeniden paylaşmadı. Herhangi bir kullanıcı yeniden paylaştığında burada görüntülenecek.", "status.redraft": "Sil,Düzenle ve Yeniden paylaş", "status.remove_bookmark": "Yer işaretini kaldır", + "status.replied_in_thread": "Akışta yanıtlandı", "status.replied_to": "{name} kullanıcısına yanıt verdi", "status.reply": "Yanıtla", "status.replyAll": "Konuyu yanıtla", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 714348db25..b63596037b 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -780,6 +780,7 @@ "status.bookmark": "Додати до закладок", "status.cancel_reblog_private": "Скасувати поширення", "status.cannot_reblog": "Цей допис не може бути поширений", + "status.continued_thread": "Continued thread", "status.copy": "Копіювати посилання на допис", "status.delete": "Видалити", "status.detailed_status": "Детальний вигляд бесіди", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index ea4ebcda47..94adc9af2d 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -95,7 +95,7 @@ "block_modal.they_cant_see_posts": "他们看不到你的嘟文,你也看不到他们的嘟文。", "block_modal.they_will_know": "他们将能看到他们被屏蔽。", "block_modal.title": "是否屏蔽该用户?", - "block_modal.you_wont_see_mentions": "你将无法看到提及他们的嘟文。", + "block_modal.you_wont_see_mentions": "你将不会看到提及他们的嘟文。", "boost_modal.combo": "下次按住 {combo} 即可跳过此提示", "boost_modal.reblog": "是否转嘟?", "boost_modal.undo_reblog": "是否取消转嘟?", @@ -780,6 +780,7 @@ "status.bookmark": "添加到书签", "status.cancel_reblog_private": "取消转贴", "status.cannot_reblog": "这条嘟文不允许被转嘟", + "status.continued_thread": "继续线程", "status.copy": "复制嘟文链接", "status.delete": "删除", "status.detailed_status": "详细的对话视图", @@ -813,6 +814,7 @@ "status.reblogs.empty": "没有人转嘟过此条嘟文。如果有人转嘟了,就会显示在这里。", "status.redraft": "删除并重新编辑", "status.remove_bookmark": "移除书签", + "status.replied_in_thread": "已在线程中回复", "status.replied_to": "回复给 {name}", "status.reply": "回复", "status.replyAll": "回复所有人", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 257bec0163..e671803573 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -780,6 +780,7 @@ "status.bookmark": "書籤", "status.cancel_reblog_private": "取消轉嘟", "status.cannot_reblog": "這則嘟文無法被轉嘟", + "status.continued_thread": "接續討論串", "status.copy": "複製嘟文連結", "status.delete": "刪除", "status.detailed_status": "詳細的對話內容", @@ -813,6 +814,7 @@ "status.reblogs.empty": "還沒有人轉嘟過這則嘟文。當有人轉嘟時,它將於此顯示。", "status.redraft": "刪除並重新編輯", "status.remove_bookmark": "移除書籤", + "status.replied_in_thread": "於討論串中回覆", "status.replied_to": "回覆 {name}", "status.reply": "回覆", "status.replyAll": "回覆討論串", diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 8918228f46..121266916f 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -25,7 +25,7 @@ ca: admin: account_actions: action: Realitza l'acció - already_silenced: Aquest compte ja s'ha silenciat. + already_silenced: Aquest compte ja s'ha limitat. already_suspended: Aquest compte ja s'ha suspès. title: Fer l'acció de moderació a %{acct} account_moderation_notes: @@ -61,6 +61,7 @@ ca: demote: Degrada destroyed_msg: Les dades de %{username} son a la cua per a ser esborrades en breu disable: Inhabilita + disable_sign_in_token_auth: Desactivar l'autenticació de token per correu-e disable_two_factor_authentication: Desactiva 2FA disabled: Inhabilitat display_name: Nom visible @@ -69,6 +70,7 @@ ca: email: Adreça electrònica email_status: Estat de l'adreça electrònica enable: Habilita + enable_sign_in_token_auth: Activar l'autenticació de token per correu-e enabled: Habilitat enabled_msg: El compte de %{username} s’ha descongelat amb èxit followers: Seguidors @@ -201,8 +203,10 @@ ca: destroy_user_role: Destrueix Rol disable_2fa_user: Desactiva 2FA disable_custom_emoji: Desactiva l'emoji personalitzat + disable_sign_in_token_auth_user: Desactivar l'autenticació de token per correu-e per a l'usuari disable_user: Deshabilita l'usuari enable_custom_emoji: Activa l'emoji personalitzat + enable_sign_in_token_auth_user: Activar l'autenticació de token per correu-e per a l'usuari enable_user: Activa l'usuari memorialize_account: Memoritza el compte promote_user: Promou l'usuari @@ -237,17 +241,21 @@ ca: confirm_user_html: "%{name} ha confirmat l'adreça del correu electrònic de l'usuari %{target}" create_account_warning_html: "%{name} ha enviat un avís a %{target}" create_announcement_html: "%{name} ha creat un nou anunci %{target}" + create_canonical_email_block_html: "%{name} ha blocat l'adreça de correu electrònic amb el hash %{target}" create_custom_emoji_html: "%{name} ha pujat un emoji nou %{target}" create_domain_allow_html: "%{name} ha permès la federació amb el domini %{target}" create_domain_block_html: "%{name} ha bloquejat el domini %{target}" + create_email_domain_block_html: "%{name} ha blocat el domini de correu electrònic %{target}" create_ip_block_html: "%{name} ha creat una regla per a l'IP %{target}" create_unavailable_domain_html: "%{name} ha aturat el lliurament al domini %{target}" create_user_role_html: "%{name} ha creat el rol %{target}" demote_user_html: "%{name} ha degradat l'usuari %{target}" destroy_announcement_html: "%{name} ha eliminat l'anunci %{target}" + destroy_canonical_email_block_html: "%{name} ha desblocat el correu electrònic amb el hash %{target}" destroy_custom_emoji_html: "%{name} ha esborrat l'emoji %{target}" destroy_domain_allow_html: "%{name} no permet la federació amb el domini %{target}" destroy_domain_block_html: "%{name} ha desbloquejat el domini %{target}" + destroy_email_domain_block_html: "%{name} ha desblocat el domini de correu electrònic %{target}" destroy_instance_html: "%{name} ha purgat el domini %{target}" destroy_ip_block_html: "%{name} ha esborrat la regla per a l'IP %{target}" destroy_status_html: "%{name} ha eliminat el tut de %{target}" @@ -255,8 +263,10 @@ ca: destroy_user_role_html: "%{name} ha esborrat el rol %{target}" disable_2fa_user_html: "%{name} ha desactivat el requisit de dos factors per a l'usuari %{target}" disable_custom_emoji_html: "%{name} ha desactivat l'emoji %{target}" + disable_sign_in_token_auth_user_html: "%{name} ha desactivat l'autenticació de token per correu-e per a %{target}" disable_user_html: "%{name} ha desactivat l'accés del usuari %{target}" enable_custom_emoji_html: "%{name} ha activat l'emoji %{target}" + enable_sign_in_token_auth_user_html: "%{name} ha activat l'autenticació de token per correu-e per a %{target}" enable_user_html: "%{name} ha activat l'accés del usuari %{target}" memorialize_account_html: "%{name} ha convertit el compte %{target} en una pàgina de memorial" promote_user_html: "%{name} ha promogut l'usuari %{target}" @@ -264,6 +274,7 @@ ca: reject_user_html: "%{name} ha rebutjat el registre de %{target}" remove_avatar_user_html: "%{name} ha eliminat l'avatar de %{target}" reopen_report_html: "%{name} ha reobert l'informe %{target}" + resend_user_html: "%{name} ha reenviat el correu-e de confirmació per %{target}" reset_password_user_html: "%{name} ha restablert la contrasenya de l'usuari %{target}" resolve_report_html: "%{name} ha resolt l'informe %{target}" sensitive_account_html: "%{name} ha marcat els mèdia de %{target} com a sensibles" @@ -432,6 +443,7 @@ ca: new: create: Afegir un domini resolve: Resol domini + title: Blocar el nou domini de correu-e not_permitted: No permés resolved_through_html: Resolt mitjançant %{domain} export_domain_allows: @@ -1402,6 +1414,7 @@ ca: authentication_methods: otp: aplicació d'autenticació de dos factors password: contrasenya + sign_in_token: codi de seguretat per correu electrònic webauthn: claus de seguretat description_html: Si veus activitat que no reconeixes, considera canviar la teva contrasenya i activar l'autenticació de dos factors. empty: Historial d'autenticació no disponible @@ -1412,6 +1425,16 @@ ca: unsubscribe: action: Sí, canceŀla la subscripció complete: Subscripció cancel·lada + confirmation_html: Segur que vols donar-te de baixa de rebre %{type} de Mastodon a %{domain} a %{email}? Sempre pots subscriure't de nou des de la configuració de les notificacions per correu electrònic. + emails: + notification_emails: + favourite: notificacions dels favorits per correu electrònic + follow: notificacions dels seguiments per correu electrònic + follow_request: correus electrònics de peticions de seguiment + mention: correus electrònics de notificacions de mencions + reblog: correus electrònics de notificacions d'impulsos + resubscribe_html: Si ets dones de baixa per error pots donar-te d'alta des de la configuració de les notificacions per correu electrònic. + success_html: Ja no rebràs %{type} de Mastodon a %{domain} a %{email}. title: Cancel·la la subscripció media_attachments: validations: @@ -1493,6 +1516,8 @@ ca: update: subject: "%{name} ha editat una publicació" notifications: + administration_emails: Notificacions per correu-e de l'administrador + email_events: Esdeveniments per a notificacions de correu electrònic email_events_hint: 'Selecciona els esdeveniments per als quals vols rebre notificacions:' number: human: @@ -1651,6 +1676,7 @@ ca: import: Importació import_and_export: Importació i exportació migrate: Migració del compte + notifications: Notificacions per correu electrònic preferences: Preferències profile: Perfil relationships: Seguits i seguidors @@ -1897,6 +1923,7 @@ ca: invalid_otp_token: El codi de dos factors no és correcte otp_lost_help_html: Si has perdut l'accés a tots dos pots contactar per %{email} rate_limited: Excessius intents d'autenticació, torneu-hi més tard. + seamless_external_login: Has iniciat sessió via un servei extern. Així, els ajustos de contrasenya i correu electrònic no estan disponibles. signed_in_as: 'Sessió iniciada com a:' verification: extra_instructions_html: Consell: l'enllaç al vostre lloc web pot ser invisible. La part important és rel="me" que evita que us suplantin la identitat a llocs web amb contingut generat pels usuaris. Fins i tot podeu generar una etiqueta link a la capçalera de la pàgina en comptes d'una a, però el codi HTML ha de ser accessible sense requerir executar JavaScript. diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 4a01967e23..b3886ffeb2 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -33,7 +33,6 @@ cy: admin: account_actions: action: Cyflawni gweithred - already_silenced: Mae'r cyfrif hwn eisoes wedi'i dewi. already_suspended: Mae'r cyfrif hwn eisoes wedi'i atal. title: Cyflawni gweithred cymedroli ar %{acct} account_moderation_notes: diff --git a/config/locales/da.yml b/config/locales/da.yml index e3f8343452..89430e37ed 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -25,7 +25,7 @@ da: admin: account_actions: action: Udfør handling - already_silenced: Denne konto er allerede gjort tavs. + already_silenced: Denne konto er allerede blevet begrænset. already_suspended: Denne konto er allerede suspenderet. title: Udfør moderatorhandling på %{acct} account_moderation_notes: diff --git a/config/locales/de.yml b/config/locales/de.yml index 2952d22d7c..975ec517f7 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -25,7 +25,6 @@ de: admin: account_actions: action: Aktion ausführen - already_silenced: Dieses Konto wurde bereits stummgeschaltet. already_suspended: Dieses Konto wurde bereits gesperrt. title: "@%{acct} moderieren" account_moderation_notes: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 520211e2e2..bd15c9862d 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -25,7 +25,7 @@ es-AR: admin: account_actions: action: Ejecutar acción - already_silenced: Esta cuenta ya ha sido limitada. + already_silenced: Esta cuenta ya fue limitada. already_suspended: Esta cuenta ya ha sido suspendida. title: Ejecutar acción de moderación en %{acct} account_moderation_notes: diff --git a/config/locales/et.yml b/config/locales/et.yml index bbd1b4ab20..d2a4bc605e 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -25,7 +25,6 @@ et: admin: account_actions: action: Täida tegevus - already_silenced: See konto on juba vaigistatud. already_suspended: See konto on juba peatatud. title: Rakenda moderaatori tegevus kasutajale %{acct} account_moderation_notes: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 0c5d5ef987..c94f04a9bb 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -981,7 +981,7 @@ fi: used_by_over_week: one: Käyttänyt yksi käyttäjä viimeisen viikon aikana other: Käyttänyt %{count} käyttäjää viimeisen viikon aikana - title: Suositukset ja suuntaukset + title: Suositukset ja trendit trending: Trendaus warning_presets: add_new: Lisää uusi diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 040e312d78..f3d9aee4c2 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -25,7 +25,6 @@ fo: admin: account_actions: action: Frem atgerð - already_silenced: Hendan kontan er longu gjørd kvirr. already_suspended: Hendan kontan er longu ógildað. title: Frem umsjónaratgerð á %{acct} account_moderation_notes: diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index dd1f73c459..766ba71d8a 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -25,7 +25,6 @@ fr-CA: admin: account_actions: action: Effectuer l'action - already_silenced: Ce compte est déjà limité. already_suspended: Ce compte est déjà suspendu. title: Effectuer une action de modération sur %{acct} account_moderation_notes: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 7e30b517a6..420a4d314e 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -25,7 +25,6 @@ fr: admin: account_actions: action: Effectuer l'action - already_silenced: Ce compte est déjà limité. already_suspended: Ce compte est déjà suspendu. title: Effectuer une action de modération sur %{acct} account_moderation_notes: diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 4ea9cef73d..d2783a5a6a 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -31,7 +31,6 @@ ga: admin: account_actions: action: Déan gníomh - already_silenced: Tá an cuntas seo ina thost cheana féin. already_suspended: Tá an cuntas seo curtha ar fionraí cheana féin. title: Dean gníomh modhnóireachta ar %{acct} account_moderation_notes: diff --git a/config/locales/gd.yml b/config/locales/gd.yml index f824e30815..c08ba60213 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -29,7 +29,6 @@ gd: admin: account_actions: action: Gabh an gnìomh - already_silenced: Chaidh an cunntas seo a chuingeachadh mu thràth. already_suspended: Chaidh an cunntas seo a chur à rèim mu thràth. title: Gabh gnìomh maorsainneachd air %{acct} account_moderation_notes: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index de4840dda1..657908922d 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -25,7 +25,7 @@ gl: admin: account_actions: action: Executar acción - already_silenced: Esta conta xa está silenciada. + already_silenced: A conta xa está limitada already_suspended: Esta conta xa está suspendida. title: Executar acción de moderación a %{acct} account_moderation_notes: @@ -1854,7 +1854,7 @@ gl: failed_2fa: details: 'Detalles do intento de acceso:' explanation: Alguén intentou acceder á túa conta mais fíxoo cun segundo factor de autenticación non válido. - further_actions_html: Se non foches ti, recomendámosche %{action} inmediatamente xa que a conta podería estar en risco. + further_actions_html: Se non foches ti, recomendámosche %{action} inmediatamente porque a conta podería estar en risco. subject: Fallo co segundo factor de autenticación title: Fallou o segundo factor de autenticación suspicious_sign_in: diff --git a/config/locales/he.yml b/config/locales/he.yml index 47ec5cafbe..a838c69636 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -29,6 +29,7 @@ he: admin: account_actions: action: בצע/י פעולה + already_suspended: חשבון זה הושעה. title: ביצוע פעולות הנהלה על %{acct} account_moderation_notes: create: ליצור @@ -50,6 +51,7 @@ he: title: שינוי כתובת דוא"ל עבור המשתמש.ת %{username} change_role: changed_msg: התפקיד שונה בהצלחה! + edit_roles: נהל תפקידי משתמש label: שינוי תפקיד no_role: ללא תפקיד title: שינוי תפקיד עבור %{username} @@ -626,6 +628,7 @@ he: suspend_description_html: חשבון זה על כל תכניו יחסמו וברבות הימים ימחקו, כל פעילות מולו לא תתאפשר. הפעולה ניתנת לביטול תוך 30 ימים, והיא תסגור כל דיווח התלוי ועומד נגד החשבון. actions_description_html: בחר/י איזו פעולה לבצע על מנת לפתור את הדו"ח. אם תופעל פעולת ענישה כנגד החשבון המדווח, הודעת דוא"ל תשלח אליהם, אלא אם נבחרה קטגוריית הספאם. actions_description_remote_html: בחרו איזו פעולה לבצע כדי לפתור את הדיווח שהוגש. פעולה זו תשפיע רק על התקשורת מול השרת שלך עם החשבון המרוחק ותוכנו. + actions_no_posts: דווח זה לא כולל הודעות למחיקה add_to_report: הוספת פרטים לדיווח already_suspended_badges: local: כבר הודח בשרת זה diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 60fb96a121..71af138305 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -25,7 +25,6 @@ hu: admin: account_actions: action: Művelet végrehajtása - already_silenced: Ezt a fiókot már elnémították. already_suspended: Ezt a fiókot már felfüggesztették. title: 'Moderálási művelet végrehajtása ezen: %{acct}' account_moderation_notes: diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 683edbe7cb..8827e084d2 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -25,7 +25,6 @@ ia: admin: account_actions: action: Exequer action - already_silenced: Iste conto jam ha essite silentiate. already_suspended: Iste conto jam ha essite suspendite. title: Exequer action de moderation sur %{acct} account_moderation_notes: diff --git a/config/locales/is.yml b/config/locales/is.yml index 0854d88123..748d931ff8 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -25,7 +25,6 @@ is: admin: account_actions: action: Framkvæma aðgerð - already_silenced: Þessi aðgangur hefur þegar verið þaggaður. already_suspended: Þessi aðgangur hefur þegar verið settur í frysti. title: Framkvæma umsjónaraðgerð á %{acct} account_moderation_notes: diff --git a/config/locales/it.yml b/config/locales/it.yml index 66a462e61f..a1ed71a7a0 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -25,7 +25,7 @@ it: admin: account_actions: action: Esegui azione - already_silenced: Questo account è già stato silenziato. + already_silenced: Questo account è già stato limitato. already_suspended: Questo account è già stato sospeso. title: Esegui l'azione di moderazione su %{acct} account_moderation_notes: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 9bec26c450..962ecdd053 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -23,7 +23,6 @@ ko: admin: account_actions: action: 조치 취하기 - already_silenced: 이 계정은 이미 침묵되었습니다. already_suspended: 이 계정은 이미 정지되었습니다. title: "%{acct} 계정에 중재 취하기" account_moderation_notes: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 0fd71f52ed..c48b8ef93b 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -29,6 +29,7 @@ lt: admin: account_actions: action: Atlikti veiksmą + already_suspended: Ši paskyra jau sustabdyta. title: Atlikti prižiūrėjimo veiksmą %{acct} account_moderation_notes: create: Palikti pastabą @@ -49,6 +50,7 @@ lt: title: Keisti el. paštą %{username} change_role: changed_msg: Vaidmuo sėkmingai pakeistas. + edit_roles: Tvarkyti naudotojų vaidmenis label: Keisti vaidmenį no_role: Jokios vaidmenį title: Keisti vaidmenį %{username} @@ -485,6 +487,7 @@ lt: destroyed_msg: Skundo žinutė sekmingai ištrinta! reports: action_taken_by: Veiksmo ėmėsi + actions_no_posts: Ši ataskaita neturi jokių susijusių įrašų ištrinti already_suspended_badges: local: Jau sustabdytas šiame serveryje remote: Jau sustabdytas jų serveryje diff --git a/config/locales/nn.yml b/config/locales/nn.yml index f301b8ca98..f7c2f74260 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -25,6 +25,7 @@ nn: admin: account_actions: action: Utfør + already_silenced: Denne kontoen har allereie vorte avgrensa. title: Utfør moderatorhandling på %{acct} account_moderation_notes: create: Legg igjen merknad diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 2a1a0c8d75..7a8d208b06 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -29,7 +29,6 @@ pl: admin: account_actions: action: Wykonaj działanie - already_silenced: To konto zostało już wyciszone. already_suspended: To konto zostało już zawieszone. title: Wykonaj działanie moderacyjne na %{acct} account_moderation_notes: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 1bd724595d..96cb92efda 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -4,8 +4,8 @@ pt-PT: about_mastodon_html: 'A rede social do futuro: sem publicidade, e sem vigilância empresarial; desenho ético, e descentralizado! Tome posse dos seus dados com o Mastodon!' contact_missing: Por definir contact_unavailable: n.d. - hosted_on: Mastodon em %{domain} - title: Acerca de + hosted_on: Mastodon alojado em %{domain} + title: Sobre accounts: follow: Seguir followers: @@ -25,15 +25,17 @@ pt-PT: admin: account_actions: action: Executar acção + already_suspended: Esta conta já foi suspensa. title: Executar ação de moderação em %{acct} account_moderation_notes: create: Deixar uma nota created_msg: Nota de moderação criada com sucesso! destroyed_msg: Nota de moderação destruída! accounts: + add_email_domain_block: Bloquear domínio de e-mail approve: Aprovar approved_msg: Inscrição de %{username} aprovada com sucesso - are_you_sure: Tens a certeza? + are_you_sure: Tem a certeza? avatar: Imagem de perfil by_domain: Domínio change_email: @@ -45,18 +47,20 @@ pt-PT: title: Alterar e-mail para %{username} change_role: changed_msg: Função alterada com sucesso! + edit_roles: Gerir funções de utilizador label: Alterar função no_role: Nenhuma função title: Alterar a função de %{username} confirm: Confirmar confirmed: Confirmado confirming: A confirmar - custom: Personalizar + custom: Personalizado delete: Eliminar dados deleted: Eliminada - demote: Despromoveu + demote: Despromovida destroyed_msg: Os dados de %{username} estão agora em fila de espera para serem eliminados de imediato disable: Congelar + disable_sign_in_token_auth: Desativar token de autenticação por e-mail disable_two_factor_authentication: Desativar autenticação por dois fatores (2FA) disabled: Congelada display_name: Nome a mostrar @@ -65,6 +69,7 @@ pt-PT: email: E-mail email_status: Estado do e-mail enable: Descongelar + enable_sign_in_token_auth: Ativar token de autenticação por e-mail enabled: Ativado enabled_msg: Descongelou a conta %{username} followers: Seguidores @@ -100,8 +105,8 @@ pt-PT: no_limits_imposed: Sem limites impostos no_role_assigned: Nenhuma função atribuída not_subscribed: Não inscrito - pending: Pendente de revisão - perform_full_suspension: Fazer suspensão completa + pending: Revisão pendente + perform_full_suspension: Suspender previous_strikes: Reprimendas anteriores previous_strikes_description_html: one: Esta conta tem 1 reprimenda. @@ -109,7 +114,7 @@ pt-PT: promote: Promover protocol: Protocolo public: Público - push_subscription_expires: A Inscrição PuSH expira + push_subscription_expires: A inscrição PuSH expira redownload: Atualizar perfil redownloaded_msg: Perfil de %{username} atualizado a partir da origem com sucesso reject: Rejeitar @@ -122,13 +127,14 @@ pt-PT: removed_header_msg: Imagem de cabeçalho de %{username} removida resend_confirmation: already_confirmed: Este utilizador já está confirmado - send: Reenviar link de confirmação - success: Link de confirmação enviado com sucesso! - reset: Reiniciar + send: Reenviar hiperligação de confirmação + success: Hiperligação de confirmação enviada com sucesso! + reset: Repor reset_password: Criar nova palavra-passe resubscribe: Reinscrever role: Função search: Pesquisar + search_same_email_domain: Outros utilizadores com o mesmo domínio de e-mail search_same_ip: Outros utilizadores com o mesmo IP security: Segurança security_measures: @@ -136,7 +142,7 @@ pt-PT: password_and_2fa: Palavra-passe e 2FA sensitive: Marcar como problemático sensitized: Marcada como problemática - shared_inbox_url: URL da caixa de entrada compartilhada + shared_inbox_url: URL da caixa de entrada partilhada show: created_reports: Denúncias realizadas targeted_reports: Denunciada por outros @@ -151,101 +157,116 @@ pt-PT: suspension_reversible_hint_html: A conta foi suspensa e os dados serão totalmente eliminados em %{date}. Até lá, a conta poderá ser recuperada sem quaisquer efeitos negativos. Se deseja eliminar todos os dados desta conta imediatamente, pode fazê-lo em baixo. title: Contas unblock_email: Desbloquear endereço de e-mail - unblocked_email_msg: Endereço de e-mail de %{username} desbloqueado + unblocked_email_msg: Endereço de e-mail de %{username} desbloqueado com sucesso unconfirmed_email: E-mail por confirmar undo_sensitized: Desmarcar como problemático undo_silenced: Desfazer silenciar undo_suspension: Desfazer supensão - unsilenced_msg: Removeu as limitações da conta %{username} + unsilenced_msg: Limitações da conta %{username} removidas com sucesso unsubscribe: Cancelar inscrição unsuspended_msg: Removeu a suspensão da conta %{username} username: Nome de utilizador view_domain: Ver resumo do domínio warn: Advertir - web: Teia + web: Web whitelisted: Permitido para a federação action_logs: action_types: approve_appeal: Aprovar recurso approve_user: Aprovar utilizador - assigned_to_self_report: Atribuir Denúncia - change_role_user: Alterar Função do Utilizador - confirm_user: Confirmar Utilizador - create_account_warning: Criar Aviso + assigned_to_self_report: Atribuir denúncia + change_email_user: Alterar e-mail do utilizador + change_role_user: Alterar função do utilizador + confirm_user: Confirmar utilizador + create_account_warning: Criar aviso create_announcement: Criar comunicado - create_custom_emoji: Criar Emoji Personalizado - create_domain_allow: Criar Permissão de Domínio - create_domain_block: Criar Bloqueio de Domínio + create_canonical_email_block: Criar bloqueio de e-mail + create_custom_emoji: Criar emoji personalizado + create_domain_allow: Criar permissão de domínio + create_domain_block: Criar bloqueio de domínio + create_email_domain_block: Criar bloqueio de domínio de e-mail create_ip_block: Criar regra de IP - create_unavailable_domain: Criar Domínio Indisponível - create_user_role: Criar Função - demote_user: Despromover Utilizador - destroy_announcement: Apagar comunicado - destroy_custom_emoji: Eliminar Emoji Personalizado - destroy_domain_allow: Eliminar Permissão de Domínio - destroy_domain_block: Eliminar Bloqueio de Domínio - destroy_instance: Purgar Domínio + create_unavailable_domain: Criar domínio indisponível + create_user_role: Criar função + demote_user: Despromover utilizador + destroy_announcement: Eliminar comunicado + destroy_canonical_email_block: Eliminar bloqueio de e-mail + destroy_custom_emoji: Eliminar emoji personalizado + destroy_domain_allow: Eliminar permissão de domínio + destroy_domain_block: Eliminar bloqueio de domínio + destroy_email_domain_block: Eliminar bloqueio de domínio de e-mail + destroy_instance: Purgar domínio destroy_ip_block: Eliminar regra de IP - destroy_status: Eliminar Publicação - destroy_unavailable_domain: Eliminar Domínio Indisponível - destroy_user_role: Eliminar Função + destroy_status: Eliminar publicação + destroy_unavailable_domain: Eliminar domínio indisponível + destroy_user_role: Eliminar função disable_2fa_user: Desativar 2FA - disable_custom_emoji: Desativar Emoji Personalizado - disable_user: Desativar Utilizador - enable_custom_emoji: Ativar Emoji Personalizado - enable_user: Ativar Utilizador - memorialize_account: Tornar conta num memorial - promote_user: Promover Utilizador - reject_appeal: Rejeitar Recurso - reject_user: Rejeitar Utilizador - remove_avatar_user: Remover Imagem de Perfil - reopen_report: Reabrir Denúncia - resend_user: Reenviar E-mail de Confirmação - reset_password_user: Repor Password - resolve_report: Resolver Denúncia + disable_custom_emoji: Desativar emoji personalizado + disable_sign_in_token_auth_user: Desativar token de autenticação por e-mail para o utilizador + disable_user: Desativar utilizador + enable_custom_emoji: Ativar emoji personalizado + enable_sign_in_token_auth_user: Ativar token de autenticação por e-mail para o utilizador + enable_user: Ativar utilizador + memorialize_account: Transformar conta num memorial + promote_user: Promover utilizador + reject_appeal: Rejeitar recurso + reject_user: Rejeitar utilizador + remove_avatar_user: Remover imagem de perfil + reopen_report: Reabrir denúncia + resend_user: Reenviar e-mail de confirmação + reset_password_user: Repor palavra-passe + resolve_report: Resolver denúncia sensitive_account: Marcar a media na sua conta como problemática silence_account: Limitar conta suspend_account: Suspender conta - unassigned_report: Desatribuir Denúncia + unassigned_report: Anular atribuição desta denúncia unblock_email_account: Desbloquear endereço de e-mail unsensitive_account: Desmarcar a conta como problemática - unsilence_account: Deixar de Silenciar Conta - unsuspend_account: Retirar Suspensão à Conta + unsilence_account: Deixar de silenciar conta + unsuspend_account: Retirar suspensão da conta update_announcement: Atualizar comunicado - update_custom_emoji: Atualizar Emoji Personalizado - update_domain_block: Atualizar Bloqueio de Domínio + update_custom_emoji: Atualizar emoji personalizado + update_domain_block: Atualizar bloqueio de domínio update_ip_block: Atualizar regra de IP - update_report: Atualizar Relatório - update_status: Atualizar Estado - update_user_role: Atualizar Função + update_report: Atualizar denúncia + update_status: Atualizar publicação + update_user_role: Atualizar função actions: approve_appeal_html: "%{name} aprovou recurso da decisão de moderação de %{target}" approve_user_html: "%{name} aprovou a inscrição de %{target}" assigned_to_self_report_html: "%{name} atribuiu a denúncia %{target} a si próprio" + change_email_user_html: "%{name} alterou o endereço de e-mail do utilizador %{target}" change_role_user_html: "%{name} alterou a função de %{target}" + confirm_user_html: "%{name} confirmou o endereço de e-mail do utilizador %{target}" create_account_warning_html: "%{name} enviou um aviso para %{target}" create_announcement_html: "%{name} criou o novo anúncio %{target}" - create_custom_emoji_html: "%{name} carregou o novo emoji %{target}" + create_canonical_email_block_html: "%{name} bloqueou o e-mail com a hash %{target}" + create_custom_emoji_html: "%{name} enviou o novo emoji %{target}" create_domain_allow_html: "%{name} permitiu a federação com o domínio %{target}" create_domain_block_html: "%{name} bloqueou o domínio %{target}" - create_ip_block_html: "%{name} criou regra para o IP %{target}" - create_unavailable_domain_html: "%{name} parou a entrega ao domínio %{target}" + create_email_domain_block_html: "%{name} bloqueou o domínio de e-mail %{target}" + create_ip_block_html: "%{name} criou uma regra para o IP %{target}" + create_unavailable_domain_html: "%{name} parou as entregas ao domínio %{target}" create_user_role_html: "%{name} criou a função %{target}" demote_user_html: "%{name} despromoveu o utilizador %{target}" destroy_announcement_html: "%{name} eliminou o anúncio %{target}" + destroy_canonical_email_block_html: "%{name} desbloqueou o e-mail com a hash %{target}" destroy_custom_emoji_html: "%{name} eliminou o emoji %{target}" - destroy_domain_allow_html: "%{name} desabilitou a federação com o domínio %{target}" + destroy_domain_allow_html: "%{name} bloqueou a federação com o domínio %{target}" destroy_domain_block_html: "%{name} desbloqueou o domínio %{target}" + destroy_email_domain_block_html: "%{name} desbloqueou o domínio de e-mail %{target}" destroy_instance_html: "%{name} purgou o domínio %{target}" - destroy_ip_block_html: "%{name} eliminou regra para o IP %{target}" + destroy_ip_block_html: "%{name} eliminou a regra para o IP %{target}" destroy_status_html: "%{name} removeu a publicação de %{target}" - destroy_unavailable_domain_html: "%{name} retomou a entrega ao domínio %{target}" + destroy_unavailable_domain_html: "%{name} retomou as entregas ao domínio %{target}" destroy_user_role_html: "%{name} eliminou a função %{target}" disable_2fa_user_html: "%{name} desativou o requerimento de autenticação em dois passos para o utilizador %{target}" - disable_custom_emoji_html: "%{name} desabilitou o emoji %{target}" - disable_user_html: "%{name} desativou o acesso para o utilizador %{target}" + disable_custom_emoji_html: "%{name} desativou o emoji %{target}" + disable_sign_in_token_auth_user_html: "%{name} desativou o token de autenticação por e-mail para %{target}" + disable_user_html: "%{name} desativou o início de sessão para o utilizador %{target}" enable_custom_emoji_html: "%{name} ativou o emoji %{target}" - enable_user_html: "%{name} ativou o acesso para o utilizador %{target}" + enable_sign_in_token_auth_user_html: "%{name} ativou o token de autenticação por e-mail para %{target}" + enable_user_html: "%{name} ativou o início de sessão para o utilizador %{target}" memorialize_account_html: "%{name} transformou a conta de %{target} em um memorial" promote_user_html: "%{name} promoveu o utilizador %{target}" reject_appeal_html: "%{name} rejeitou recurso da decisão de moderação de %{target}" @@ -352,7 +373,7 @@ pt-PT: title: Painel de controlo top_languages: Principais idiomas ativos top_servers: Servidores mais ativos - website: Página na teia + website: Website disputes: appeals: empty: Nenhum recurso encontrado. @@ -669,39 +690,39 @@ pt-PT: privileges: administrator: Administrador administrator_description: Utilizadores com esta permissão irão contornar todas as permissões - delete_user_data: Eliminar Dados de Utilizador + delete_user_data: Eliminar dados de utilizador delete_user_data_description: Permite que os utilizadores eliminem os dados doutros utilizadores sem tempo de espera - invite_users: Convidar Utilizadores + invite_users: Convidar utilizadores invite_users_description: Permite aos utilizadores convidar pessoas novas para o servidor manage_announcements: Gerir comunicados manage_announcements_description: Permite aos utilizadores gerirem os comunicados no servidor manage_appeals: Gerir apelos manage_appeals_description: Permite aos utilizadores rever recursos de moderação - manage_blocks: Gerir Bloqueios - manage_custom_emojis: Gerir Emojis Personalizados + manage_blocks: Gerir bloqueios + manage_custom_emojis: Gerir emojis personalizados manage_custom_emojis_description: Permite aos utilizadores gerirem os emojis personalizados do servidor - manage_federation: Gerir Federação + manage_federation: Gerir federação manage_federation_description: Permite aos utilizadores bloquear ou permitir federação com outros domínios e controlar a entregabilidade - manage_invites: Gerir Convites + manage_invites: Gerir convites manage_invites_description: Permite aos utilizadores pesquisarem e desativarem ligações de convite - manage_reports: Gerir Relatórios - manage_reports_description: Permite aos utilizadores rever relatórios e executar ações de moderação contra eles - manage_roles: Gerir Funções + manage_reports: Gerir denúncias + manage_reports_description: Permite aos utilizadores rever denúncias e executar ações de moderação contra eles + manage_roles: Gerir funções manage_roles_description: Permite aos utilizadores a gestão e atribuição de funções abaixo dos seus - manage_rules: Gerir Regras + manage_rules: Gerir regras manage_rules_description: Permite aos utilizadores alterar as regras do servidor - manage_settings: Gerir Configurações - manage_settings_description: Permite aos utilizadores alterar as configurações do sítio na teia - manage_taxonomies: Gerir Taxonomias + manage_settings: Gerir configurações + manage_settings_description: Permite aos utilizadores alterar as configurações do site + manage_taxonomies: Gerir taxonomias manage_taxonomies_description: Permite aos utilizadores rever o conteúdo em tendência e atualizar as configurações de hashtag - manage_user_access: Gerir Acesso de Utilizador - manage_users: Gerir Utilizadores + manage_user_access: Gerir acesso de utilizador + manage_users: Gerir utilizadores manage_users_description: Permite aos utilizadores ver os detalhes de outros utilizadores e executar ações de moderação contra eles - manage_webhooks: Gerir Webhooks + manage_webhooks: Gerir webhooks manage_webhooks_description: Permite aos utilizadores configurar webhooks para eventos administrativos - view_audit_log: Ver Registo de Auditoria + view_audit_log: Ver registo de auditoria view_audit_log_description: Permite aos utilizadores ver um histórico de ações administrativas no servidor - view_dashboard: Ver Painel de Controlo + view_dashboard: Ver painel de controlo view_dashboard_description: Permite aos utilizadores acederem ao painel de controlo e a várias estatísticas view_devops: DevOps view_devops_description: Permite aos utilizadores aceder aos painéis de controlo do Sidekiq e pgHero @@ -723,14 +744,14 @@ pt-PT: preamble: Personalize a interface web do Mastodon. title: Aspeto branding: - preamble: A marca do seu servidor diferencia-a doutros servidores na rede. Essa informação pode ser exibida em vários contexos, como a interface na teia do Mastodon, aplicações nativas, visualizações de hiperligações noutros sites, em aplicações de mensagens, etc. Por esta razão, é melhor manter esta informação clara, curta e concisa. + preamble: A marca do seu servidor diferencia-a de outros servidores na rede. Essa informação pode ser mostrada em vários ambientes, como a interface web do Mastodon, aplicações nativas, visualizações de hiperligações em outros sites e dentro de aplicações de mensagens, etc. Por esta razão, é melhor manter esta informação clara, curta e concisa. title: Marca captcha_enabled: desc_html: Isto depende de scripts externos da hCaptcha, o que pode ser uma preocupação de segurança e privacidade. Além disso, isto pode tornar o processo de registo menos acessível para algumas pessoas (especialmente as com limitações físicas). Por isso, considere medidas alternativas tais como registo mediante aprovação ou sob convite. title: Requerer que novos utilizadores resolvam um CAPTCHA para confirmar a sua conta content_retention: danger_zone: Zona de perigo - preamble: Controle como o conteúdo gerado pelos utilizadores é armazenado no Mastodon. + preamble: Controle a forma como o conteúdo gerado pelo utilizador é armazenado no Mastodon. title: Retenção de conteúdo default_noindex: desc_html: Afeta todos os utilizadores que não alteraram esta configuração @@ -1198,7 +1219,7 @@ pt-PT: content: Desculpe, mas algo correu mal da nossa parte. title: Esta página não está correta '503': A página não pôde ser apresentada devido a uma falha temporária do servidor. - noscript_html: Para usar a aplicação da teia do Mastodon, por favor active o JavaScript. Em alternativa, experimenta uma das aplicações nativas do Mastodon para a sua plataforma. + noscript_html: Para usar a aplicação web do Mastodon, ative o JavaScript. Alternativamente, experimente uma das aplicações nativas para o Mastodon na sua plataforma. existing_username_validator: not_found: não foi possível encontrar um utilizador local com esse nome not_found_multiple: não foi possível encontrar %{usernames} @@ -1236,7 +1257,7 @@ pt-PT: statuses_hint_html: Este filtro aplica-se a publicações individuais selecionadas independentemente de estas corresponderem às palavras-chave abaixo. Reveja ou remova publicações do filtro. title: Editar filtros errors: - deprecated_api_multiple_keywords: Estes parâmetros não podem ser alterados a partir desta aplicação porque se aplicam a mais que um filtro de palavra-chave. Use uma aplicação mais recente ou a interface na teia. + deprecated_api_multiple_keywords: Estes parâmetros não podem ser alterados a partir desta aplicação porque se aplicam a mais de um filtro de palavra-chave. Use uma aplicação mais recente ou a interface web. invalid_context: Inválido ou nenhum contexto fornecido index: contexts: Filtros em %{contexts} @@ -1664,7 +1685,7 @@ pt-PT: edited_at_html: Editado em %{date} errors: in_reply_not_found: A publicação a que está a tentar responder parece não existir. - open_in_web: Abrir na Teia + open_in_web: Abrir na web over_character_limit: limite de caracter excedeu %{max} pin_errors: direct: Publicações visíveis apenas para utilizadores mencionados não podem ser afixadas @@ -1826,7 +1847,7 @@ pt-PT: welcome: apps_android_action: Baixe no Google Play apps_ios_action: Baixar na App Store - apps_step: Baixe nossos aplicativos oficiais. + apps_step: Descarregue as nossas aplicações oficiais. apps_title: Apps Mastodon checklist_subtitle: 'Vamos começar nesta nova fronteira social:' checklist_title: Checklist de Boas-vindas @@ -1835,11 +1856,11 @@ pt-PT: edit_profile_title: Personalize seu perfil explanation: Aqui estão algumas dicas para começar feature_action: Mais informações - feature_audience: Mastodon oferece uma possibilidade única de gerenciar seu público sem intermediários. O Mastodon implantado em sua própria infraestrutura permite que você siga e seja seguido de qualquer outro servidor Mastodon online e não esteja sob o controle de ninguém além do seu. + feature_audience: O Mastodon oferece-lhe uma possibilidade única de gerir a sua audiência sem intermediários. O Mastodon implantado na sua própria infraestrutura permite-lhe seguir e ser seguido a partir de qualquer outro servidor Mastodon online e não está sob o controlo de ninguém a não ser o seu. feature_audience_title: Construa seu público em confiança - feature_control: Você sabe melhor o que deseja ver no feed da sua casa. Sem algoritmos ou anúncios para desperdiçar seu tempo. Siga qualquer pessoa em qualquer servidor Mastodon a partir de uma única conta e receba suas postagens em ordem cronológica, deixando seu canto da internet um pouco mais parecido com você. - feature_control_title: Fique no controle da sua própria linha do tempo - feature_creativity: Mastodon suporta postagens de áudio, vídeo e imagens, descrições de acessibilidade, enquetes, avisos de conteúdo, avatares animados, emojis personalizados, controle de corte de miniaturas e muito mais, para ajudá-lo a se expressar online. Esteja você publicando sua arte, sua música ou seu podcast, o Mastodon está lá para você. + feature_control: Você sabe melhor o que quer ver no seu feed. Não há algoritmos ou anúncios que o façam perder tempo. Siga qualquer pessoa em qualquer servidor Mastodon a partir de uma única conta e receba as suas mensagens por ordem cronológica e torne o seu canto da Internet um pouco mais parecido consigo. + feature_control_title: Mantenha o controlo da sua própria cronologia + feature_creativity: O Mastodon suporta publicações de áudio, vídeo e imagens, descrições de acessibilidade, sondagens, avisos de conteúdo, avatares animados, emojis personalizados, controlo de corte de miniaturas e muito mais, para o ajudar a expressar-se online. Quer esteja a publicar a sua arte, a sua música ou o seu podcast, o Mastodon está lá para si. feature_creativity_title: Criatividade inigualável feature_moderation: Mastodon coloca a tomada de decisões de volta em suas mãos. Cada servidor cria as suas próprias regras e regulamentos, que são aplicados localmente e não de cima para baixo como as redes sociais corporativas, tornando-o mais flexível na resposta às necessidades de diferentes grupos de pessoas. Junte-se a um servidor com as regras com as quais você concorda ou hospede as suas próprias. feature_moderation_title: Moderando como deve ser @@ -1856,7 +1877,7 @@ pt-PT: hashtags_title: Etiquetas em tendência hashtags_view_more: Ver mais etiquetas em tendência post_action: Compor - post_step: Diga olá para o mundo com texto, fotos, vídeos ou enquetes. + post_step: Diga olá para o mundo com texto, fotos, vídeos ou sondagens. post_title: Faça a sua primeira publicação share_action: Compartilhar share_step: Diga aos seus amigos como te encontrar no Mastodon. diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index f595a31997..26edab3b2e 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -130,6 +130,7 @@ he: name: ניתן רק להחליף בין אותיות קטנות וגדולות, למשל כדי לשפר את הקריאות user: chosen_languages: אם פעיל, רק הודעות בשפות הנבחרות יוצגו לפידים הפומביים + role: התפקיד שולט על אילו הרשאות יש למשתמש. user_role: color: צבע לתפקיד בממשק המשתמש, כ RGB בפורמט הקסדצימלי highlighted: מאפשר נראות ציבורית של התפקיד diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index ecbf501389..99cb269e37 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -101,6 +101,7 @@ lt: show_application: Neatsižvelgiant į tai, visada galėsi matyti, kuri programėlė paskelbė tavo įrašą. user: chosen_languages: Kai pažymėta, viešose laiko skalėse bus rodomi tik įrašai pasirinktomis kalbomis. + role: Vaidmuo valdo, kokius leidimus naudotojas turi. labels: account: discoverable: Rekomenduoti profilį ir įrašus į atradimo algoritmus diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 7419169890..b113e0eed5 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -130,6 +130,7 @@ pl: name: Możesz zmieniać tylko wielkość liter, np. aby były bardziej widoczne user: chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu + role: Rola kontroluje uprawnienia użytkownika. user_role: color: Kolor używany dla roli w całym interfejsie użytkownika, wyrażony jako RGB w formacie szesnastkowym highlighted: To sprawia, że rola jest widoczna publicznie diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 971773b2dc..3b606df032 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -77,7 +77,7 @@ pt-PT: warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro form_admin_settings: activity_api_enabled: Contagem, em blocos semanais, de publicações locais, utilizadores ativos e novos registos - app_icon: WEBP, PNG, GIF ou JPG. Substitui o ícone padrão do aplicativo em dispositivos móveis por um ícone personalizado. + app_icon: WEBP, PNG, GIF ou JPG. Substitui o ícone padrão da aplicação em dispositivos móveis por um ícone personalizado. backups_retention_period: Os utilizadores têm a possibilidade de gerar arquivos das suas mensagens para descarregar mais tarde. Quando definido para um valor positivo, estes arquivos serão automaticamente eliminados do seu armazenamento após o número de dias especificado. bootstrap_timeline_accounts: Estas contas serão destacadas no topo das recomendações aos novos utilizadores. closed_registrations_message: Apresentado quando as inscrições estiverem encerradas @@ -130,12 +130,13 @@ pt-PT: name: Só pode alterar a capitalização das letras, por exemplo, para torná-las mais legíveis user: chosen_languages: Quando selecionado, só serão mostradas nas cronologias públicas as publicações nos idiomas escolhidos + role: A função controla as permissões que o utilizador tem. user_role: color: Cor a ser utilizada para a função em toda a interface de utilizador, como RGB no formato hexadecimal highlighted: Isto torna a função visível publicamente - name: Nome público do cargo, se este estiver definido para ser apresentada com um emblema + name: Nome público da função, se esta estiver definida para ser apresentada com um emblema permissions_as_keys: Utilizadores com esta função terão acesso a... - position: Cargos mais altos decidem a resolução de conflitos em certas situações. Certas ações só podem ser executadas em cargos com uma menor prioridade + position: Funções mais altas decidem a resolução de conflitos em certas situações. Certas ações só podem ser executadas com certas funções com uma menor prioridade webhook: events: Selecione os eventos a enviar template: Componha o seu próprio conteúdo JSON utilizando a interpolação de variáveis. Deixar em branco para o JSON predefinido. @@ -315,7 +316,7 @@ pt-PT: trendable: Permitir que esta etiqueta apareça nas tendências usable: Permitir que as publicações usem esta hashtag localmente user: - role: Cargo + role: Função time_zone: Fuso horário user_role: color: Cor do emblema diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 89fb1675fd..2fcf23b156 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -130,6 +130,7 @@ tr: name: Harflerin, örneğin daha okunabilir yapmak için, sadece büyük/küçük harf durumlarını değiştirebilirsiniz user: chosen_languages: İşaretlendiğinde, yalnızca seçilen dillerdeki gönderiler genel zaman çizelgelerinde görüntülenir + role: Rol, kullanıcıların sahip olduğu izinleri denetler. user_role: color: Arayüz boyunca rol için kullanılacak olan renk, hex biçiminde RGB highlighted: Bu rolü herkese açık hale getirir diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 0f43f43988..6907c1ee3c 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -25,7 +25,6 @@ sq: admin: account_actions: action: Kryeje veprimin - already_silenced: Kjo llogari është heshtuar tashmë. already_suspended: Kjo llogari është pezulluar tashmë. title: Kryeni veprim moderimi te %{acct} account_moderation_notes: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index bcf1e3b816..df403e602a 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -25,6 +25,7 @@ sv: admin: account_actions: action: Utför åtgärd + already_silenced: Detta konto är redan begränsat. title: Utför aktivitet för moderering på %{acct} account_moderation_notes: create: Lämna kommentar diff --git a/config/locales/th.yml b/config/locales/th.yml index f119102112..f409a512d9 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -23,7 +23,6 @@ th: admin: account_actions: action: ทำการกระทำ - already_silenced: มีการทำให้บัญชีนี้เงียบไปแล้ว already_suspended: มีการระงับบัญชีนี้ไปแล้ว title: ทำการกระทำการกลั่นกรองต่อ %{acct} account_moderation_notes: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 4318f4eac4..d2d499077d 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -25,6 +25,8 @@ tr: admin: account_actions: action: Eylemi gerçekleştir + already_silenced: Bu hesap zaten askıya alınmış. + already_suspended: Bu hesap zaten askıya alınmış. title: "%{acct} üzerinde denetleme eylemi gerçekleştir" account_moderation_notes: create: Not bırak @@ -46,6 +48,7 @@ tr: title: "%{username} için e-postayı değiştir" change_role: changed_msg: Rol başarıyla değiştirildi! + edit_roles: Kullanıcı rollerini yönetin label: Rolü değiştir no_role: Rol yok title: "%{username} için rolü değiştir" @@ -602,6 +605,7 @@ tr: suspend_description_html: Bu hesap ve tüm içeriği erişilmez olacak ve nihayetinde silinecek ve bu hesapla etkileşim mümkün olmayacaktır. 30 gün içinde geri alınabilir. Bu hesaba yönelik tüm bildiriimleri kapatır. actions_description_html: Bu bildirimi çözmek için ne yapılması gerektiğine karar verin. Bildirilen hesap için ceza işlemi yaparsanız, İstenmeyen kategorisi seçilmemişse, onlara bir e-posta duyurusu gönderilecektir. actions_description_remote_html: Bu bildirimi çözmek için hangi eylemi yapmak istediğinize karar verin. Bu yalnızca sizin sunucunuzun bu uzak hesapla nasıl etkileşeğini ve içeriğiyle ne yapacağını etkiler. + actions_no_posts: Bu raporun ilişkili olduğu silinecek gönderi yok add_to_report: Bildirime daha fazlasını ekle already_suspended_badges: local: Bu sunucuda zaten askıya alınmış diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 261c87cd75..4e70b192d9 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -628,6 +628,7 @@ uk: suspend_description_html: Обліковий запис і весь його вміст будуть недоступними й врешті-решт видалені, і взаємодіяти з ним буде неможливо. Відновлення можливе протягом 30 днів. Закриває всі скарги на цей обліковий запис. actions_description_html: Визначте, які дії слід вжити для розв'язання цієї скарги. Якщо ви оберете каральні дії проти зареєстрованого облікового запису, про них буде надіслано сповіщення електронним листом, крім випадків, коли вибрано категорію Спам. actions_description_remote_html: Визначте, які дії слід вжити для розв'язання цього звіту. Це вплине тільки на те, як ваш сервер з'єднується з цим віддаленим обліковим записом і обробляє його вміст. + actions_no_posts: Ця скарга не має жодних пов'язаних дописів для видалення add_to_report: Додати ще подробиць до скарги already_suspended_badges: local: Вже призупинено на цьому сервері diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 975df3024b..d211b9e740 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -23,7 +23,6 @@ vi: admin: account_actions: action: Thực hiện hành động - already_silenced: Tài khoản này đã bị hạn chế. already_suspended: Tài khoản này đã bị vô hiệu hóa. title: Áp đặt kiểm duyệt với %{acct} account_moderation_notes: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 6b399d3499..7407d81db9 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -23,7 +23,7 @@ zh-CN: admin: account_actions: action: 执行操作 - already_silenced: 此帐户已受限。 + already_silenced: 此账户已受限。 already_suspended: 此帐户已被封禁。 title: 在 %{acct} 上执行管理操作 account_moderation_notes: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 8288e9bfac..d92d53f391 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -23,7 +23,7 @@ zh-TW: admin: account_actions: action: 執行動作 - already_silenced: 此帳號已被靜音。 + already_silenced: 此帳號已被限制。 already_suspended: 此帳號已被停權。 title: 對 %{acct} 執行站務動作 account_moderation_notes: @@ -1269,7 +1269,7 @@ zh-TW: home: 首頁時間軸 notifications: 通知 public: 公開時間軸 - thread: 對話 + thread: 討論串 edit: add_keyword: 新增關鍵字 keywords: 關鍵字 From 3929e3c6d21226ad42f743a283576004d9c1c7eb Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 10 Sep 2024 11:29:17 +0200 Subject: [PATCH 07/89] Change design of hide media button in web UI (#31807) --- .../mastodon/components/media_gallery.jsx | 32 +++++----- app/javascript/mastodon/locales/en.json | 2 +- .../styles/mastodon/components.scss | 60 +++++++++++-------- 3 files changed, 51 insertions(+), 43 deletions(-) diff --git a/app/javascript/mastodon/components/media_gallery.jsx b/app/javascript/mastodon/components/media_gallery.jsx index ed4805b05d..9a8f852128 100644 --- a/app/javascript/mastodon/components/media_gallery.jsx +++ b/app/javascript/mastodon/components/media_gallery.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import classNames from 'classnames'; @@ -10,17 +10,10 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { debounce } from 'lodash'; -import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react'; import { Blurhash } from 'mastodon/components/blurhash'; import { autoPlayGif, displayMedia, useBlurhash } from '../initial_state'; -import { IconButton } from './icon_button'; - -const messages = defineMessages({ - toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: '{number, plural, one {Hide image} other {Hide images}}' }, -}); - class Item extends PureComponent { static propTypes = { @@ -215,7 +208,6 @@ class MediaGallery extends PureComponent { size: PropTypes.object, height: PropTypes.number.isRequired, onOpenMedia: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, defaultWidth: PropTypes.number, cacheWidth: PropTypes.func, visible: PropTypes.bool, @@ -291,7 +283,7 @@ class MediaGallery extends PureComponent { } render () { - const { media, lang, intl, sensitive, defaultWidth, autoplay } = this.props; + const { media, lang, sensitive, defaultWidth, autoplay } = this.props; const { visible } = this.state; const width = this.state.width || defaultWidth; @@ -323,9 +315,7 @@ class MediaGallery extends PureComponent { ); - } else if (visible) { - spoilerButton = ; - } else { + } else if (!visible) { spoilerButton = ( + + )} ); } } -export default injectIntl(MediaGallery); +export default MediaGallery; diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 7c1d7f126d..39ee7b858f 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -457,7 +457,7 @@ "lists.subheading": "Your lists", "load_pending": "{count, plural, one {# new item} other {# new items}}", "loading_indicator.label": "Loading…", - "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}", + "media_gallery.hide": "Hide", "moved_to_account_banner.text": "Your account {disabledAccount} is currently disabled because you moved to {movedToAccount}.", "mute_modal.hide_from_notifications": "Hide from notifications", "mute_modal.hide_options": "Hide options", diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 92d2034633..570c006faa 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -4718,22 +4718,14 @@ a.status-card { position: absolute; z-index: 100; - &--minified { - display: block; - inset-inline-start: 4px; - top: 4px; - width: auto; - height: auto; + &--hidden { + display: none; } &--click-thru { pointer-events: none; } - &--hidden { - display: none; - } - &__overlay { display: flex; align-items: center; @@ -4745,19 +4737,20 @@ a.status-card { margin: 0; border: 0; color: $white; + line-height: 20px; + font-size: 14px; &__label { background-color: rgba($black, 0.45); backdrop-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%); - border-radius: 6px; - padding: 10px 15px; + border-radius: 8px; + padding: 12px 16px; display: flex; align-items: center; justify-content: center; - gap: 8px; + gap: 4px; flex-direction: column; - font-weight: 500; - font-size: 14px; + font-weight: 600; } &__action { @@ -6838,10 +6831,32 @@ a.status-card { z-index: 9999; } -.media-gallery__item__badges { +.media-gallery__actions { position: absolute; bottom: 6px; - inset-inline-start: 6px; + inset-inline-end: 6px; + display: flex; + gap: 2px; + z-index: 2; + + &__pill { + display: block; + color: $white; + border: 0; + background: rgba($black, 0.65); + backdrop-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%); + padding: 3px 12px; + border-radius: 99px; + font-size: 14px; + font-weight: 700; + line-height: 20px; + } +} + +.media-gallery__item__badges { + position: absolute; + bottom: 8px; + inset-inline-start: 8px; display: flex; gap: 2px; } @@ -6854,18 +6869,13 @@ a.status-card { color: $white; background: rgba($black, 0.65); backdrop-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%); - padding: 2px 6px; + padding: 3px 8px; border-radius: 4px; - font-size: 11px; + font-size: 12px; font-weight: 700; z-index: 1; pointer-events: none; - line-height: 18px; - - .icon { - width: 15px; - height: 15px; - } + line-height: 20px; } .attachment-list { From e0c27a504788bdc6cd518072e557313e4ec5ee7a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 10 Sep 2024 14:00:40 +0200 Subject: [PATCH 08/89] Add ability to manage which websites can credit you in link previews (#31819) --- .../settings/verifications_controller.rb | 20 ++- app/helpers/context_helper.rb | 1 + app/javascript/styles/mastodon/forms.scss | 35 +++++ app/models/account.rb | 2 + .../concerns/account/attribution_domains.rb | 25 ++++ .../activitypub/actor_serializer.rb | 3 +- .../activitypub/process_account_service.rb | 1 + app/services/fetch_link_card_service.rb | 7 +- app/validators/domain_validator.rb | 21 ++- app/validators/lines_validator.rb | 9 ++ .../settings/verifications/show.html.haml | 34 ++++- config/locales/activerecord.en.yml | 6 + config/locales/an.yml | 2 - config/locales/ar.yml | 2 - config/locales/be.yml | 2 - config/locales/bg.yml | 2 - config/locales/ca.yml | 2 - config/locales/ckb.yml | 2 - config/locales/co.yml | 2 - config/locales/cs.yml | 2 - config/locales/cy.yml | 2 - config/locales/da.yml | 2 - config/locales/de.yml | 2 - config/locales/el.yml | 2 - config/locales/en-GB.yml | 2 - config/locales/en.yml | 9 +- config/locales/eo.yml | 2 - config/locales/es-AR.yml | 2 - config/locales/es-MX.yml | 2 - config/locales/es.yml | 2 - config/locales/et.yml | 2 - config/locales/eu.yml | 2 - config/locales/fa.yml | 2 - config/locales/fi.yml | 2 - config/locales/fo.yml | 2 - config/locales/fr-CA.yml | 2 - config/locales/fr.yml | 2 - config/locales/fy.yml | 2 - config/locales/ga.yml | 2 - config/locales/gd.yml | 2 - config/locales/gl.yml | 2 - config/locales/he.yml | 2 - config/locales/hu.yml | 2 - config/locales/hy.yml | 2 - config/locales/ia.yml | 2 - config/locales/id.yml | 2 - config/locales/ie.yml | 2 - config/locales/io.yml | 2 - config/locales/is.yml | 2 - config/locales/it.yml | 2 - config/locales/ja.yml | 2 - config/locales/kk.yml | 2 - config/locales/ko.yml | 2 - config/locales/ku.yml | 2 - config/locales/lad.yml | 2 - config/locales/lv.yml | 2 - config/locales/ms.yml | 2 - config/locales/my.yml | 2 - config/locales/nl.yml | 2 - config/locales/nn.yml | 2 - config/locales/no.yml | 2 - config/locales/oc.yml | 2 - config/locales/pl.yml | 2 - config/locales/pt-BR.yml | 2 - config/locales/pt-PT.yml | 2 - config/locales/ru.yml | 2 - config/locales/sc.yml | 2 - config/locales/sco.yml | 2 - config/locales/si.yml | 2 - config/locales/simple_form.en.yml | 2 + config/locales/sk.yml | 2 - config/locales/sl.yml | 2 - config/locales/sq.yml | 2 - config/locales/sr-Latn.yml | 2 - config/locales/sr.yml | 2 - config/locales/sv.yml | 2 - config/locales/th.yml | 2 - config/locales/tr.yml | 2 - config/locales/uk.yml | 2 - config/locales/vi.yml | 2 - config/locales/zh-CN.yml | 2 - config/locales/zh-HK.yml | 2 - config/locales/zh-TW.yml | 2 - config/routes/settings.rb | 2 +- ...637_add_attribution_domains_to_accounts.rb | 7 + db/schema.rb | 3 +- .../settings/migrations_controller_spec.rb | 1 + spec/models/account_spec.rb | 16 +++ .../process_account_service_spec.rb | 20 +++ spec/services/bulk_import_service_spec.rb | 8 +- spec/validators/domain_validator_spec.rb | 125 ++++++++++++++++++ spec/validators/lines_validator_spec.rb | 46 +++++++ 92 files changed, 381 insertions(+), 160 deletions(-) create mode 100644 app/models/concerns/account/attribution_domains.rb create mode 100644 app/validators/lines_validator.rb create mode 100644 db/migrate/20240909014637_add_attribution_domains_to_accounts.rb create mode 100644 spec/validators/domain_validator_spec.rb create mode 100644 spec/validators/lines_validator_spec.rb diff --git a/app/controllers/settings/verifications_controller.rb b/app/controllers/settings/verifications_controller.rb index fc4f23bb18..4e0663253c 100644 --- a/app/controllers/settings/verifications_controller.rb +++ b/app/controllers/settings/verifications_controller.rb @@ -2,14 +2,30 @@ class Settings::VerificationsController < Settings::BaseController before_action :set_account + before_action :set_verified_links - def show - @verified_links = @account.fields.select(&:verified?) + def show; end + + def update + if UpdateAccountService.new.call(@account, account_params) + ActivityPub::UpdateDistributionWorker.perform_async(@account.id) + redirect_to settings_verification_path, notice: I18n.t('generic.changes_saved_msg') + else + render :show + end end private + def account_params + params.require(:account).permit(:attribution_domains_as_text) + end + def set_account @account = current_account end + + def set_verified_links + @verified_links = @account.fields.select(&:verified?) + end end diff --git a/app/helpers/context_helper.rb b/app/helpers/context_helper.rb index cbefe0fe53..a0c1781d24 100644 --- a/app/helpers/context_helper.rb +++ b/app/helpers/context_helper.rb @@ -41,6 +41,7 @@ module ContextHelper 'cipherText' => 'toot:cipherText', }, suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' }, + attribution_domains: { 'toot' => 'http://joinmastodon.org/ns#', 'attributionDomains' => { '@id' => 'toot:attributionDomains', '@type' => '@id' } }, }.freeze def full_context diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 926df4e96f..56f7b893f3 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -12,6 +12,41 @@ code { margin: 50px auto; } +.form-section { + border-radius: 8px; + background: var(--surface-background-color); + padding: 24px; + margin-bottom: 24px; +} + +.fade-out-top { + position: relative; + overflow: hidden; + height: 160px; + + &::after { + content: ''; + display: block; + background: linear-gradient( + to bottom, + var(--surface-background-color), + transparent + ); + position: absolute; + top: 0; + inset-inline-start: 0; + width: 100%; + height: 100px; + pointer-events: none; + } + + & > div { + position: absolute; + inset-inline-start: 0; + bottom: 0; + } +} + .indicator-icon { display: flex; align-items: center; diff --git a/app/models/account.rb b/app/models/account.rb index 4a7c752e7c..0a2cff2fe8 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -51,6 +51,7 @@ # reviewed_at :datetime # requested_review_at :datetime # indexable :boolean default(FALSE), not null +# attribution_domains :string default([]), is an Array # class Account < ApplicationRecord @@ -88,6 +89,7 @@ class Account < ApplicationRecord include Account::Merging include Account::Search include Account::StatusesSearch + include Account::AttributionDomains include DomainMaterializable include DomainNormalizable include Paginable diff --git a/app/models/concerns/account/attribution_domains.rb b/app/models/concerns/account/attribution_domains.rb new file mode 100644 index 0000000000..37a498a150 --- /dev/null +++ b/app/models/concerns/account/attribution_domains.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Account::AttributionDomains + extend ActiveSupport::Concern + + included do + validates :attribution_domains_as_text, domain: { multiline: true }, lines: { maximum: 100 }, if: -> { local? && will_save_change_to_attribution_domains? } + end + + def attribution_domains_as_text + self[:attribution_domains].join("\n") + end + + def attribution_domains_as_text=(str) + self[:attribution_domains] = str.split.filter_map do |line| + line.strip.delete_prefix('*.') + end + end + + def can_be_attributed_from?(domain) + segments = domain.split('.') + variants = segments.map.with_index { |_, i| segments[i..].join('.') }.to_set + self[:attribution_domains].to_set.intersect?(variants) + end +end diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb index 4ab48ff204..a6281e23b9 100644 --- a/app/serializers/activitypub/actor_serializer.rb +++ b/app/serializers/activitypub/actor_serializer.rb @@ -8,7 +8,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer context_extensions :manually_approves_followers, :featured, :also_known_as, :moved_to, :property_value, :discoverable, :olm, :suspended, - :memorial, :indexable + :memorial, :indexable, :attribution_domains attributes :id, :type, :following, :followers, :inbox, :outbox, :featured, :featured_tags, @@ -25,6 +25,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer attribute :moved_to, if: :moved? attribute :also_known_as, if: :also_known_as? attribute :suspended, if: :suspended? + attribute :attribution_domains, if: -> { object.attribution_domains.any? } class EndpointsSerializer < ActivityPub::Serializer include RoutingHelper diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index b667e97f4d..1e2d614d72 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -117,6 +117,7 @@ class ActivityPub::ProcessAccountService < BaseService @account.discoverable = @json['discoverable'] || false @account.indexable = @json['indexable'] || false @account.memorial = @json['memorial'] || false + @account.attribution_domains = as_array(@json['attributionDomains'] || []).map { |item| value_or_id(item) } end def set_fetchable_key! diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index 36d5c490a6..7662fc1f29 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -153,12 +153,13 @@ class FetchLinkCardService < BaseService return if html.nil? link_details_extractor = LinkDetailsExtractor.new(@url, @html, @html_charset) - provider = PreviewCardProvider.matching_domain(Addressable::URI.parse(link_details_extractor.canonical_url).normalized_host) - linked_account = ResolveAccountService.new.call(link_details_extractor.author_account, suppress_errors: true) if link_details_extractor.author_account.present? && provider&.trendable? + domain = Addressable::URI.parse(link_details_extractor.canonical_url).normalized_host + provider = PreviewCardProvider.matching_domain(domain) + linked_account = ResolveAccountService.new.call(link_details_extractor.author_account, suppress_errors: true) if link_details_extractor.author_account.present? @card = PreviewCard.find_or_initialize_by(url: link_details_extractor.canonical_url) if link_details_extractor.canonical_url != @card.url @card.assign_attributes(link_details_extractor.to_preview_card_attributes) - @card.author_account = linked_account + @card.author_account = linked_account if linked_account&.can_be_attributed_from?(domain) || provider&.trendable? @card.save_with_optional_image! unless @card.title.blank? && @card.html.blank? end end diff --git a/app/validators/domain_validator.rb b/app/validators/domain_validator.rb index 3a951f9a7e..718fd190f1 100644 --- a/app/validators/domain_validator.rb +++ b/app/validators/domain_validator.rb @@ -1,22 +1,29 @@ # frozen_string_literal: true class DomainValidator < ActiveModel::EachValidator + MAX_DOMAIN_LENGTH = 256 + MIN_LABEL_LENGTH = 1 + MAX_LABEL_LENGTH = 63 + ALLOWED_CHARACTERS_RE = /^[a-z0-9\-]+$/i + def validate_each(record, attribute, value) return if value.blank? - domain = if options[:acct] - value.split('@').last - else - value - end + (options[:multiline] ? value.split : [value]).each do |domain| + _, domain = domain.split('@') if options[:acct] - record.errors.add(attribute, I18n.t('domain_validator.invalid_domain')) unless compliant?(domain) + next if domain.blank? + + record.errors.add(attribute, options[:multiline] ? :invalid_domain_on_line : :invalid, value: domain) unless compliant?(domain) + end end private def compliant?(value) - Addressable::URI.new.tap { |uri| uri.host = value } + uri = Addressable::URI.new + uri.host = value + uri.normalized_host.size < MAX_DOMAIN_LENGTH && uri.normalized_host.split('.').all? { |label| label.size.between?(MIN_LABEL_LENGTH, MAX_LABEL_LENGTH) && label =~ ALLOWED_CHARACTERS_RE } rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError false end diff --git a/app/validators/lines_validator.rb b/app/validators/lines_validator.rb new file mode 100644 index 0000000000..27a108bb2c --- /dev/null +++ b/app/validators/lines_validator.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class LinesValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + return if value.blank? + + record.errors.add(attribute, :too_many_lines, limit: options[:maximum]) if options[:maximum].present? && value.split.size > options[:maximum] + end +end diff --git a/app/views/settings/verifications/show.html.haml b/app/views/settings/verifications/show.html.haml index 4fb2918018..5318b0767d 100644 --- a/app/views/settings/verifications/show.html.haml +++ b/app/views/settings/verifications/show.html.haml @@ -5,7 +5,9 @@ %h2= t('settings.profile') = render partial: 'settings/shared/profile_navigation' -.simple_form +.simple_form.form-section + %h3= t('verification.website_verification') + %p.lead= t('verification.hint_html') %h4= t('verification.here_is_how') @@ -28,3 +30,33 @@ %span.verified-badge = material_symbol 'check', class: 'verified-badge__mark' %span= field.value + += simple_form_for @account, url: settings_verification_path, html: { method: :put, class: 'form-section' } do |f| + = render 'shared/error_messages', object: @account + + %h3= t('author_attribution.title') + + %p.lead= t('author_attribution.hint_html') + + .fields-row + .fields-row__column.fields-row__column-6 + .fields-group + = f.input :attribution_domains_as_text, as: :text, wrapper: :with_block_label, input_html: { placeholder: "example1.com\nexample2.com\nexample3.com", rows: 4 } + .fields-row__column.fields-row__column-6 + .fields-group.fade-out-top + %div + .status-card.expanded.bottomless + .status-card__image + = image_tag frontend_asset_url('images/preview.png'), alt: '', class: 'status-card__image-image' + .status-card__content + %span.status-card__host + %span= t('author_attribution.s_blog', name: @account.username) + · + %time.time-ago{ datetime: 1.year.ago.to_date.iso8601 } + %strong.status-card__title= t('author_attribution.example_title') + .more-from-author + = logo_as_symbol(:icon) + = t('author_attribution.more_from_html', name: link_to(root_url, class: 'story__details__shared__author-link') { image_tag(@account.avatar.url, class: 'account__avatar', width: 16, height: 16, alt: '') + content_tag(:bdi, display_name(@account)) }) + + .actions + = f.button :button, t('generic.save_changes'), type: :submit diff --git a/config/locales/activerecord.en.yml b/config/locales/activerecord.en.yml index a53c7c6e9e..e135856036 100644 --- a/config/locales/activerecord.en.yml +++ b/config/locales/activerecord.en.yml @@ -15,6 +15,12 @@ en: user/invite_request: text: Reason errors: + attributes: + domain: + invalid: is not a valid domain name + messages: + invalid_domain_on_line: "%{value} is not a valid domain name" + too_many_lines: is over the limit of %{limit} lines models: account: attributes: diff --git a/config/locales/an.yml b/config/locales/an.yml index 9afc9e881d..41eeee4614 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -1017,8 +1017,6 @@ an: your_appeal_approved: S'aprebó la tuya apelación your_appeal_pending: Has ninviau una apelación your_appeal_rejected: La tuya apelación ha estau refusada - domain_validator: - invalid_domain: no ye un nombre de dominio valido errors: '400': La solicitut que has ninviau no ye valida u yera malformada. '403': No tiens permiso pa acceder ta esta pachina. diff --git a/config/locales/ar.yml b/config/locales/ar.yml index ee05684b6c..06cea7ecb3 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -1239,8 +1239,6 @@ ar: your_appeal_approved: تمت الموافقة على طعنك your_appeal_pending: لقد قمت بتقديم طعن your_appeal_rejected: تم رفض طعنك - domain_validator: - invalid_domain: ليس بإسم نطاق صالح edit_profile: basic_information: معلومات أساسية hint_html: "قم بتخصيص ما سيراه الناس في ملفك الشخصي العام وبجوار منشوراتك. من المرجح أن يتابعك أشخاص آخرون ويتفاعلون معك إن كان لديك صفحة شخصية مملوء وصورة." diff --git a/config/locales/be.yml b/config/locales/be.yml index fbeb55add7..31a31e9e61 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1256,8 +1256,6 @@ be: your_appeal_approved: Ваша абскарджанне было ўхвалена your_appeal_pending: Вы адправілі апеляцыю your_appeal_rejected: Ваша абскарджанне было адхілена - domain_validator: - invalid_domain: не з'яўляецца сапраўдным даменным імем edit_profile: basic_information: Асноўная інфармацыя hint_html: "Наладзьце тое, што людзі будуць бачыць у вашым профілі і побач з вашымі паведамленнямі. Іншыя людзі з большай верагоднасцю будуць сачыць і ўзаемадзейнічаць з вамі, калі ў вас ёсць запоўнены профіль і фота профілю." diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 56ab759174..42a626c695 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1179,8 +1179,6 @@ bg: your_appeal_approved: Вашето обжалване е одобрено your_appeal_pending: Подадохте обжалване your_appeal_rejected: Вашето обжалване е отхвърлено - domain_validator: - invalid_domain: не е валидно име на домейн edit_profile: basic_information: Основна информация hint_html: "Персонализирайте какво хората виждат в обществения ви профил и до публикациите ви. Другите хора са по-склонни да ви последват и да взаимодействат с вас, когато имате попълнен профил и снимка на профила." diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 121266916f..e1025563eb 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1216,8 +1216,6 @@ ca: your_appeal_approved: La teva apel·lació s'ha aprovat your_appeal_pending: Has enviat una apel·lació your_appeal_rejected: La teva apel·lació ha estat rebutjada - domain_validator: - invalid_domain: no es un nom de domini vàlid edit_profile: basic_information: Informació bàsica hint_html: "Personalitza el que la gent veu en el teu perfil públic i a prop dels teus tuts.. És més probable que altres persones et segueixin i interaccionin amb tu quan tens emplenat el teu perfil i amb la teva imatge." diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index 15c5690cdd..3ecef4bb4d 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -646,8 +646,6 @@ ckb: strikes: title_actions: none: ئاگاداری - domain_validator: - invalid_domain: ناوی دۆمەین بڕوادار نییە errors: '400': داواکاریەکەی کە پێشکەشت کردووە نادروستە یان نەیپێکا. '403': تۆ مۆڵەتت نیە بۆ بینینی ئەم لاپەڕەیە. diff --git a/config/locales/co.yml b/config/locales/co.yml index 5ee69ff8ad..7c0695a770 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -603,8 +603,6 @@ co: more_details_html: Per più di ditagli, videte a pulitica di vita privata. username_available: U vostru cugnome riduvinterà dispunibule username_unavailable: U vostru cugnome ùn sarà sempre micca dispunibule - domain_validator: - invalid_domain: ùn hè micca un nome di duminiu currettu errors: '400': A richiesta mandata ùn era micca valida o curretta. '403': Ùn site micca auturizatu·a à vede sta pagina. diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 98e2c30526..7d4d2296ca 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1213,8 +1213,6 @@ cs: your_appeal_approved: Vaše odvolání bylo schváleno your_appeal_pending: Podali jste odvolání your_appeal_rejected: Vaše odvolání bylo zamítnuto - domain_validator: - invalid_domain: není platné doménové jméno edit_profile: basic_information: Základní informace hint_html: "Nastavte si, co lidé uvidí na vašem veřejném profilu a vedle vašich příspěvků. Ostatní lidé vás budou spíše sledovat a komunikovat s vámi, když budete mít vyplněný profil a profilový obrázek." diff --git a/config/locales/cy.yml b/config/locales/cy.yml index b3886ffeb2..d317efad3f 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1306,8 +1306,6 @@ cy: your_appeal_approved: Mae eich apêl wedi'i chymeradwyo your_appeal_pending: Rydych wedi cyflwyno apêl your_appeal_rejected: Mae eich apêl wedi'i gwrthod - domain_validator: - invalid_domain: ddim yn enw parth dilys edit_profile: basic_information: Gwybodaeth Sylfaenol hint_html: "Addaswch yr hyn y mae pobl yn ei weld ar eich proffil cyhoeddus ac wrth ymyl eich postiadau. Mae pobl eraill yn fwy tebygol o'ch dilyn yn ôl a rhyngweithio â chi pan fydd gennych broffil wedi'i lenwi a llun proffil." diff --git a/config/locales/da.yml b/config/locales/da.yml index 89430e37ed..19ee9b9d81 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1235,8 +1235,6 @@ da: your_appeal_approved: Din appel er godkendt your_appeal_pending: Du har indgivet en appel your_appeal_rejected: Din appel er afvist - domain_validator: - invalid_domain: er ikke et gyldigt domænenavn edit_profile: basic_information: Oplysninger hint_html: "Tilpas hvad folk ser på din offentlige profil og ved siden af dine indlæg. Andre personer vil mere sandsynligt følge dig tilbage og interagere med dig, når du har en udfyldt profil og et profilbillede." diff --git a/config/locales/de.yml b/config/locales/de.yml index 975ec517f7..b75aada764 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1234,8 +1234,6 @@ de: your_appeal_approved: Dein Einspruch wurde angenommen your_appeal_pending: Du hast Einspruch erhoben your_appeal_rejected: Dein Einspruch wurde abgelehnt - domain_validator: - invalid_domain: ist keine gültige Domain edit_profile: basic_information: Allgemeine Informationen hint_html: "Bestimme, was andere auf deinem öffentlichen Profil und neben deinen Beiträgen sehen können. Wenn du ein Profilbild festlegst und dein Profil vervollständigst, werden andere eher mit dir interagieren und dir folgen." diff --git a/config/locales/el.yml b/config/locales/el.yml index 6b1d8bc0e5..3cb9075c38 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1192,8 +1192,6 @@ el: your_appeal_approved: Η έφεση σου έχει εγκριθεί your_appeal_pending: Υπέβαλλες έφεση your_appeal_rejected: Η έφεση σου απορρίφθηκε - domain_validator: - invalid_domain: δεν είναι έγκυρο όνομα τομέα edit_profile: basic_information: Βασικές πληροφορίες hint_html: "Τροποποίησε τί βλέπουν άτομα στο δημόσιο προφίλ σου και δίπλα στις αναρτήσεις σου. Είναι πιο πιθανό κάποιος να σε ακολουθήσει πίσω και να αλληλεπιδράσουν μαζί σου αν έχεις ολοκληρωμένο προφίλ και εικόνα προφίλ." diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index bcde9956c2..a3036c2f96 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -1202,8 +1202,6 @@ en-GB: your_appeal_approved: Your appeal has been approved your_appeal_pending: You have submitted an appeal your_appeal_rejected: Your appeal has been rejected - domain_validator: - invalid_domain: is not a valid domain name edit_profile: basic_information: Basic information hint_html: "Customise what people see on your public profile and next to your posts. Other people are more likely to follow you back and interact with you when you have a filled out profile and a profile picture." diff --git a/config/locales/en.yml b/config/locales/en.yml index 980bd481b1..05300acea5 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1161,6 +1161,12 @@ en: view_strikes: View past strikes against your account too_fast: Form submitted too fast, try again. use_security_key: Use security key + author_attribution: + example_title: Sample text + hint_html: Control how you're credited when links are shared on Mastodon. + more_from_html: More from %{name} + s_blog: "%{name}'s Blog" + title: Author attribution challenge: confirm: Continue hint_html: "Tip: We won't ask you for your password again for the next hour." @@ -1235,8 +1241,6 @@ en: your_appeal_approved: Your appeal has been approved your_appeal_pending: You have submitted an appeal your_appeal_rejected: Your appeal has been rejected - domain_validator: - invalid_domain: is not a valid domain name edit_profile: basic_information: Basic information hint_html: "Customize what people see on your public profile and next to your posts. Other people are more likely to follow you back and interact with you when you have a filled out profile and a profile picture." @@ -1952,6 +1956,7 @@ en: instructions_html: Copy and paste the code below into the HTML of your website. Then add the address of your website into one of the extra fields on your profile from the "Edit profile" tab and save changes. verification: Verification verified_links: Your verified links + website_verification: Website verification webauthn_credentials: add: Add new security key create: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 85aa3a1f31..c1873c2f24 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1105,8 +1105,6 @@ eo: your_appeal_approved: Via apelacio aprobitas your_appeal_pending: Vi sendis apelacion your_appeal_rejected: Via apelacio malakceptitas - domain_validator: - invalid_domain: ne estas valida domajna nomo edit_profile: basic_information: Baza informo other: Alia diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index bd15c9862d..f4d88d7323 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1235,8 +1235,6 @@ es-AR: your_appeal_approved: Se aprobó tu apelación your_appeal_pending: Enviaste una apelación your_appeal_rejected: Se rechazó tu apelación - domain_validator: - invalid_domain: no es un nombre de dominio válido edit_profile: basic_information: Información básica hint_html: "Personalizá lo que la gente ve en tu perfil público y junto a tus publicaciones. Es más probable que otras personas te sigan e interactúen con vos cuando tengas un perfil completo y una foto de perfil." diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 52e440ffed..84663aa895 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1231,8 +1231,6 @@ es-MX: your_appeal_approved: Se aprobó tu apelación your_appeal_pending: Has enviado una apelación your_appeal_rejected: Tu apelación ha sido rechazada - domain_validator: - invalid_domain: no es un nombre de dominio válido edit_profile: basic_information: Información básica hint_html: "Personaliza lo que la gente ve en tu perfil público junto a tus publicaciones. Es más probable que otras personas te sigan e interactúen contigo cuando completes tu perfil y agregues una foto." diff --git a/config/locales/es.yml b/config/locales/es.yml index 21b900192a..e245dde5d6 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1231,8 +1231,6 @@ es: your_appeal_approved: Se aprobó tu apelación your_appeal_pending: Has enviado una apelación your_appeal_rejected: Tu apelación ha sido rechazada - domain_validator: - invalid_domain: no es un nombre de dominio válido edit_profile: basic_information: Información básica hint_html: "Personaliza lo que la gente ve en tu perfil público junto a tus publicaciones. Es más probable que otras personas te sigan e interactúen contigo cuando completas tu perfil y foto." diff --git a/config/locales/et.yml b/config/locales/et.yml index d2a4bc605e..88d48fefcb 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -1212,8 +1212,6 @@ et: your_appeal_approved: Su vaidlustus on heakskiidetud your_appeal_pending: Vaidlustus on esitatud your_appeal_rejected: Vaidlustus on tagasi lükatud - domain_validator: - invalid_domain: ei ole sobiv domeeni nimi edit_profile: basic_information: Põhiinfo hint_html: "Kohanda, mida inimesed näevad su avalikul profiilil ja postituste kõrval. Inimesed alustavad tõenäolisemalt sinu jälgimist ja interakteeruvad sinuga, kui sul on täidetud profiil ja profiilipilt." diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 5e7d4a7f05..e5ae0ab79d 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1155,8 +1155,6 @@ eu: your_appeal_approved: Zure apelazioa onartu da your_appeal_pending: Apelazio bat bidali duzu your_appeal_rejected: Zure apelazioa baztertu da - domain_validator: - invalid_domain: ez da domeinu izen baliogarria edit_profile: basic_information: Oinarrizko informazioa hint_html: "Pertsonalizatu jendeak zer ikusi dezakeen zure profil publikoan eta zure bidalketen baitan. Segur aski, jende gehiagok jarraituko dizu eta interakzio gehiago izango dituzu profila osatuta baduzu, profil irudia eta guzti." diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 42782da204..ce8a61e3f0 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -986,8 +986,6 @@ fa: your_appeal_approved: درخواست تجدیدنظرتان پذیرفته شد your_appeal_pending: شما یک درخواست تجدیدنظر فرستادید your_appeal_rejected: درخواست تجدیدنظرتان رد شد - domain_validator: - invalid_domain: نام دامین معتبر نیست edit_profile: basic_information: اطلاعات پایه hint_html: "شخصی‌سازی آن چه مردم روی نمایهٔ عمومیتان و کنار فرسته‌هایتان می‌بینند. هنگامی که نمایه‌ای کامل و یک تصویر نمایه داشته باشید،‌ احتمال پی‌گیری متقابل و تعامل با شما بیش‌تر است." diff --git a/config/locales/fi.yml b/config/locales/fi.yml index c94f04a9bb..90c1e77760 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1235,8 +1235,6 @@ fi: your_appeal_approved: Valituksesi on hyväksytty your_appeal_pending: Olet lähettänyt valituksen your_appeal_rejected: Valituksesi on hylätty - domain_validator: - invalid_domain: ei ole kelvollinen verkkotunnus edit_profile: basic_information: Perustiedot hint_html: "Mukauta, mitä ihmiset näkevät julkisessa profiilissasi ja julkaisujesi vieressä. Sinua seurataan takaisin ja kanssasi ollaan vuorovaikutuksessa todennäköisemmin, kun sinulla on täytetty profiili ja profiilikuva." diff --git a/config/locales/fo.yml b/config/locales/fo.yml index f3d9aee4c2..5bc192e9db 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1234,8 +1234,6 @@ fo: your_appeal_approved: Kæra tín er góðkend your_appeal_pending: Tú hevur kært your_appeal_rejected: Kæra tín er vrakað - domain_validator: - invalid_domain: er ikki eitt loyvt økisnavn edit_profile: basic_information: Grundleggjandi upplýsingar hint_html: "Tillaga tað, sum fólk síggja á tínum almenna vanga og við síðna av tínum postum. Sannlíkindini fyri, at onnur fylgja tær og virka saman við tær eru størri, tá tú hevur fylt út vangan og eina vangamynd." diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 766ba71d8a..27e09d1f9c 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1222,8 +1222,6 @@ fr-CA: your_appeal_approved: Votre appel a été approuvé your_appeal_pending: Vous avez soumis un appel your_appeal_rejected: Votre appel a été rejeté - domain_validator: - invalid_domain: n’est pas un nom de domaine valide edit_profile: basic_information: Informations de base hint_html: "Personnalisez ce que les gens voient sur votre profil public et à côté de vos messages. Les autres personnes seront plus susceptibles de vous suivre et d’interagir avec vous lorsque vous avez un profil complet et une photo." diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 420a4d314e..055b50900c 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1222,8 +1222,6 @@ fr: your_appeal_approved: Votre appel a été approuvé your_appeal_pending: Vous avez soumis un appel your_appeal_rejected: Votre appel a été rejeté - domain_validator: - invalid_domain: n’est pas un nom de domaine valide edit_profile: basic_information: Informations de base hint_html: "Personnalisez ce que les gens voient sur votre profil public et à côté de vos messages. Les autres personnes seront plus susceptibles de vous suivre et d’interagir avec vous lorsque vous avez un profil complet et une photo." diff --git a/config/locales/fy.yml b/config/locales/fy.yml index de7495dd55..27fcaf3af7 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1231,8 +1231,6 @@ fy: your_appeal_approved: Jo beswier is goedkard your_appeal_pending: Jo hawwe in beswier yntsjinne your_appeal_rejected: Jo beswier is ôfwêzen - domain_validator: - invalid_domain: is in ûnjildige domeinnamme edit_profile: basic_information: Algemiene ynformaasje hint_html: "Pas oan wat minsken op jo iepenbiere profyl en njonken jo berjochten sjogge. Oare minsken sille jo earder folgje en mei jo kommunisearje wannear’t jo profyl ynfolle is en jo in profylfoto hawwe." diff --git a/config/locales/ga.yml b/config/locales/ga.yml index d2783a5a6a..870f79cba9 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -1288,8 +1288,6 @@ ga: your_appeal_approved: Tá d’achomharc ceadaithe your_appeal_pending: Chuir tú achomharc isteach your_appeal_rejected: Diúltaíodh do d'achomharc - domain_validator: - invalid_domain: nach ainm fearainn bailí é edit_profile: basic_information: Eolas bunúsach hint_html: "Saincheap a bhfeiceann daoine ar do phróifíl phoiblí agus in aice le do phostálacha. Is dóichí go leanfaidh daoine eile ar ais tú agus go n-idirghníomhóidh siad leat nuair a bhíonn próifíl líonta agus pictiúr próifíle agat." diff --git a/config/locales/gd.yml b/config/locales/gd.yml index c08ba60213..dda918d15c 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1270,8 +1270,6 @@ gd: your_appeal_approved: Chaidh aontachadh ris an ath-thagradh agad your_appeal_pending: Chuir thu ath-thagradh a-null your_appeal_rejected: Chaidh an t-ath-thagradh agad a dhiùltadh - domain_validator: - invalid_domain: "– chan eil seo ’na ainm àrainne dligheach" edit_profile: basic_information: Fiosrachadh bunasach hint_html: "Gnàthaich na chithear air a’ phròifil phoblach agad is ri taobh nam postaichean agad. Bidh càch nas buailtiche do leantainn agus conaltradh leat nuair a bhios tu air a’ phròifil agad a lìonadh agus dealbh rithe." diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 657908922d..c8fa1d833d 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1235,8 +1235,6 @@ gl: your_appeal_approved: A apelación foi aprobada your_appeal_pending: Enviaches unha apelación your_appeal_rejected: A apelación foi rexeitada - domain_validator: - invalid_domain: non é un nome de dominio válido edit_profile: basic_information: Información básica hint_html: "Personaliza o que van ver no teu perfil público e ao lado das túas publicacións. As outras persoas estarán máis animadas a seguirte e interactuar contigo se engades algún dato sobre ti así como unha imaxe de perfil." diff --git a/config/locales/he.yml b/config/locales/he.yml index a838c69636..025b2de9e2 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1270,8 +1270,6 @@ he: your_appeal_approved: ערעורך התקבל your_appeal_pending: הגשת ערעור your_appeal_rejected: ערעורך נדחה - domain_validator: - invalid_domain: הוא לא שם דומיין קביל edit_profile: basic_information: מידע בסיסי hint_html: "התאמה אישית של מה שיראו אחרים בפרופיל הציבורי שלך וליד הודעותיך. אחרים עשויים יותר להחזיר עוקב וליצור אתך שיחה אם הפרופיל והתמונה יהיו מלאים." diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 71af138305..141f5b7d07 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1234,8 +1234,6 @@ hu: your_appeal_approved: A fellebbezésedet jóváhagyták your_appeal_pending: Beküldtél egy fellebbezést your_appeal_rejected: A fellebbezésedet visszautasították - domain_validator: - invalid_domain: nem egy valódi domain név edit_profile: basic_information: Általános információk hint_html: "Tedd egyedivé, mi látnak mások a profilodon és a bejegyzéseid mellett. Mások nagyobb eséllyel követnek vissza és lépnek veled kapcsolatba, ha van kitöltött profilod és profilképed." diff --git a/config/locales/hy.yml b/config/locales/hy.yml index dfb280ac48..c7128a2a46 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -523,8 +523,6 @@ hy: success_msg: Հաշիւդ բարեյաջող ջնջուեց warning: username_available: Քո օգտանունը կրկին հասանելի կը դառնայ - domain_validator: - invalid_domain: անվաւէր տիրոյթի անուն errors: '404': Էջը, որը փնտրում ես գոյութիւն չունի։ '429': Չափազանց շատ հարցումներ diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 8827e084d2..073e5032b4 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -1220,8 +1220,6 @@ ia: your_appeal_approved: Tu appello ha essite approbate your_appeal_pending: Tu ha submittite un appello your_appeal_rejected: Tu appello ha essite rejectate - domain_validator: - invalid_domain: non es un nomine de dominio valide edit_profile: basic_information: Information basic hint_html: "Personalisa lo que le personas vide sur tu profilo public e presso tu messages. Il es plus probabile que altere personas te seque e interage con te quando tu ha un profilo complete e un photo." diff --git a/config/locales/id.yml b/config/locales/id.yml index 73b4218397..575daddca6 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1000,8 +1000,6 @@ id: your_appeal_approved: Banding Anda disetujui your_appeal_pending: Anda telah mengirim banding your_appeal_rejected: Banding Anda ditolak - domain_validator: - invalid_domain: bukan nama domain yang valid errors: '400': Permintaan yang dikirim tidak valid atau cacat. '403': Anda tidak mempunyai izin untuk melihat halaman ini. diff --git a/config/locales/ie.yml b/config/locales/ie.yml index 4ee869d92f..1529ea04b8 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1153,8 +1153,6 @@ ie: your_appeal_approved: Tui apelle ha esset aprobat your_appeal_pending: Tu ha fat un apelle your_appeal_rejected: Tui apelle ha esset rejectet - domain_validator: - invalid_domain: ne es un valid dominia-nómine edit_profile: basic_information: Basic information hint_html: "Customisa ti quel gente vide sur tui public profil e apu tui postas. Altri persones es plu probabil sequer te e interacter con te si tu have un detalliat profil e un profil-image." diff --git a/config/locales/io.yml b/config/locales/io.yml index a1d268b9fa..d1b9aef3e5 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -1128,8 +1128,6 @@ io: your_appeal_approved: Vua konto aprobesis your_appeal_pending: Vu sendis apelo your_appeal_rejected: Vua apelo refuzesis - domain_validator: - invalid_domain: ne esas valida domennomo edit_profile: basic_information: Fundamentala informo other: Altra diff --git a/config/locales/is.yml b/config/locales/is.yml index 748d931ff8..1c84c45c80 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1238,8 +1238,6 @@ is: your_appeal_approved: Áfrýjun þín hefur verið samþykkt your_appeal_pending: Þú hefur sent inn áfrýjun your_appeal_rejected: Áfrýjun þinni hefur verið hafnað - domain_validator: - invalid_domain: er ekki leyfilegt nafn á léni edit_profile: basic_information: Grunnupplýsingar hint_html: "Sérsníddu hvað fólk sér á opinbera notandasniðinu þínu og næst færslunum þínum. Annað fólk er líklegra til að fylgjast með þér og eiga í samskiptum við þig ef þú fyllir út notandasniðið og setur auðkennismynd." diff --git a/config/locales/it.yml b/config/locales/it.yml index a1ed71a7a0..a429c6339b 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1237,8 +1237,6 @@ it: your_appeal_approved: Il tuo appello è stato approvato your_appeal_pending: Hai presentato un appello your_appeal_rejected: Il tuo appello è stato respinto - domain_validator: - invalid_domain: non è un nome di dominio valido edit_profile: basic_information: Informazioni di base hint_html: "Personalizza ciò che le persone vedono sul tuo profilo pubblico e accanto ai tuoi post. È più probabile che altre persone ti seguano e interagiscano con te quando hai un profilo compilato e un'immagine del profilo." diff --git a/config/locales/ja.yml b/config/locales/ja.yml index af9173cfc4..3f50b0d7a6 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1213,8 +1213,6 @@ ja: your_appeal_approved: 申し立てが承認されました your_appeal_pending: 申し立てを送信しました your_appeal_rejected: 申し立ては拒否されました - domain_validator: - invalid_domain: は無効なドメイン名です edit_profile: basic_information: 基本情報 hint_html: "アカウントのトップページや投稿の隣に表示される公開情報です。プロフィールとアイコンを設定することで、ほかのユーザーは親しみやすく、またフォローしやすくなります。" diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 065cd801f7..f89bdee622 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -385,8 +385,6 @@ kk: more_details_html: Қосымша мәліметтер алу үшін құпиялылық саясатын қараңыз. username_available: Аккаунтыңыз қайтадан қолжетімді болады username_unavailable: Логиніңіз қолжетімді болмайды - domain_validator: - invalid_domain: жарамды домен атауы емес errors: '400': Сіз жіберген сұрау жарамсыз немесе дұрыс емес. '403': Бұны көру үшін сізде рұқсат жоқ. diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 962ecdd053..ab377df304 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1218,8 +1218,6 @@ ko: your_appeal_approved: 소명이 받아들여졌습니다 your_appeal_pending: 소명을 제출했습니다 your_appeal_rejected: 소명이 기각되었습니다 - domain_validator: - invalid_domain: 올바른 도메인 네임이 아닙니다 edit_profile: basic_information: 기본 정보 hint_html: "사람들이 공개 프로필을 보고서 게시물을 볼 때를 위한 프로필을 꾸밉니다. 프로필과 프로필 사진을 채우면 다른 사람들이 나를 팔로우하고 나와 교류할 기회가 더 많아집니다." diff --git a/config/locales/ku.yml b/config/locales/ku.yml index cbb6b76406..20fe6cf6de 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -1014,8 +1014,6 @@ ku: your_appeal_approved: Îtîraza te hate pejirandin your_appeal_pending: Te îtîrazek şand your_appeal_rejected: Îtîraza te nehate pejirandin - domain_validator: - invalid_domain: ne naveke navper a derbasdar e errors: '400': Daxwaza ku te şand nederbasdar an çewt bû. '403': Ji bo dîtina vê rûpelê mafê te nîn e. diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 5d60e6e9a1..164967159b 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1186,8 +1186,6 @@ lad: your_appeal_approved: Tu apelasyon fue achetada your_appeal_pending: Tienes enviado una apelasyon your_appeal_rejected: Tu apelasyon fue refuzada - domain_validator: - invalid_domain: no es un nombre de domeno valido edit_profile: basic_information: Enformasyon bazika hint_html: "Personaliza lo ke la djente ve en tu profil publiko i kon tus publikasyones. Es mas probavle ke otras personas te sigan i enteraktuen kontigo kuando kompletas tu profil i foto." diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 43b6995e28..5dd6ff9e1e 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1162,8 +1162,6 @@ lv: your_appeal_approved: Jūsu apelācija ir apstiprināta your_appeal_pending: Jūs esat iesniedzis apelāciju your_appeal_rejected: Jūsu apelācija ir noraidīta - domain_validator: - invalid_domain: nav derīgs domēna nosaukums edit_profile: basic_information: Pamata informācija hint_html: "Pielāgo, ko cilvēki redz Tavā publiskajā profilā un blakus Taviem ierakstiem. Ir lielāka iespējamība, ka citi clivēki sekos Tev un mijiedarbosies ar Tevi, ja Tev ir aizpildīts profils un profila attēls." diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 28a2993d36..c91a624230 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1115,8 +1115,6 @@ ms: your_appeal_approved: Rayuan anda telah diluluskan your_appeal_pending: Anda telah menghantar rayuan your_appeal_rejected: Rayuan anda telah ditolak - domain_validator: - invalid_domain: bukan nama domain yang sah edit_profile: basic_information: Maklumat Asas hint_html: "Sesuaikan perkara yang orang lihat pada profil awam anda dan di sebelah siaran anda. Orang lain lebih berkemungkinan mengikuti anda kembali dan berinteraksi dengan anda apabila anda mempunyai profil dan gambar profil yang telah diisi." diff --git a/config/locales/my.yml b/config/locales/my.yml index 76372ba174..771fbba579 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -1108,8 +1108,6 @@ my: your_appeal_approved: သင့်တင်သွင်းခြင်းကို အတည်ပြုပြီးပါပြီ your_appeal_pending: အယူခံဝင်ရန် တင်သွင်းထားသည် your_appeal_rejected: အယူခံဝင်မှုကို ပယ်ချလိုက်သည် - domain_validator: - invalid_domain: တရားဝင်ဒိုမိန်းအမည်မဟုတ်ပါ edit_profile: basic_information: အခြေခံသတင်းအချက်အလက် hint_html: "သင်၏ အများမြင်ပရိုဖိုင်နှင့် သင့်ပို့စ်များဘေးရှိ တွေ့မြင်ရသည့်အရာကို စိတ်ကြိုက်ပြင်ဆင်ပါ။ သင့်တွင် ပရိုဖိုင်နှင့် ပရိုဖိုင်ပုံတစ်ခု ဖြည့်သွင်းထားပါက အခြားသူများအနေဖြင့် သင်နှင့် အပြန်အလှန် တုံ့ပြန်နိုင်ခြေပိုများပါသည်။" diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 725d3915c2..c74bf488b5 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1235,8 +1235,6 @@ nl: your_appeal_approved: Jouw bezwaar is goedgekeurd your_appeal_pending: Je hebt een bezwaar ingediend your_appeal_rejected: Jouw bezwaar is afgewezen - domain_validator: - invalid_domain: is een ongeldige domeinnaam edit_profile: basic_information: Algemene informatie hint_html: "Wat mensen op jouw openbare profiel en naast je berichten zien aanpassen. Andere mensen gaan je waarschijnlijk eerder volgen en hebben vaker interactie met je, wanneer je profiel is ingevuld en je een profielfoto hebt." diff --git a/config/locales/nn.yml b/config/locales/nn.yml index f7c2f74260..5c46a0d43e 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -1232,8 +1232,6 @@ nn: your_appeal_approved: Din klage har blitt godkjent your_appeal_pending: Du har levert en klage your_appeal_rejected: Din klage har blitt avvist - domain_validator: - invalid_domain: er ikkje eit gangbart domenenamn edit_profile: basic_information: Grunnleggande informasjon hint_html: "Tilpass kva folk ser på den offentlege profilen din og ved sida av innlegga dine. Andre vil i større grad fylgja og samhandla med deg når du har eit profilbilete og har fyllt ut profilen din." diff --git a/config/locales/no.yml b/config/locales/no.yml index e2ede9328b..b3eebd8ecc 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1147,8 +1147,6 @@ your_appeal_approved: Anken din har blitt godkjent your_appeal_pending: Du har levert en anke your_appeal_rejected: Anken din har blitt avvist - domain_validator: - invalid_domain: er ikke et gyldig domenenavn edit_profile: basic_information: Grunnleggende informasjon hint_html: "Tilpass hva folk ser på din offentlige profil og ved siden av dine innlegg. Det er mer sannsynlig at andre mennesker følger deg tilbake og samhandler med deg når du har fylt ut en profil og et profilbilde." diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 8373513c9b..e88f8a3f69 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -538,8 +538,6 @@ oc: strikes: title_actions: none: Avertiment - domain_validator: - invalid_domain: es pas un nom de domeni valid errors: '403': Avètz pas l’autorizacion de veire aquesta pagina. '404': La pagina que cercatz existís pas aquí. diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 7a8d208b06..c90d448a7f 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1270,8 +1270,6 @@ pl: your_appeal_approved: Twoje odwołanie zostało zatwierdzone your_appeal_pending: Zgłosiłeś odwołanie your_appeal_rejected: Twoje odwołanie zostało odrzucone - domain_validator: - invalid_domain: nie jest prawidłową nazwą domeny edit_profile: basic_information: Podstawowe informacje hint_html: "Dostosuj to, co ludzie widzą na Twoim profilu publicznym i obok Twoich wpisów. Inne osoby są bardziej skłonne obserwować Cię i wchodzić z Tobą w interakcje, gdy masz wypełniony profil i zdjęcie profilowe." diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 18496b9e1d..3c14589e6c 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1231,8 +1231,6 @@ pt-BR: your_appeal_approved: Sua revisão foi aprovada your_appeal_pending: Você enviou uma revisão your_appeal_rejected: Sua revisão foi rejeitada - domain_validator: - invalid_domain: não é um nome de domínio válido edit_profile: basic_information: Informações básicas hint_html: "Personalize o que as pessoas veem no seu perfil público e ao lado de suas publicações. É mais provável que outras pessoas o sigam de volta e interajam com você quando você tiver um perfil preenchido e uma foto de perfil." diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 96cb92efda..0f0d6f36ee 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1199,8 +1199,6 @@ pt-PT: your_appeal_approved: O seu recurso foi deferido your_appeal_pending: Submeteu um recurso your_appeal_rejected: O seu recurso foi indeferido - domain_validator: - invalid_domain: não é um nome de domínio válido edit_profile: basic_information: Informação básica hint_html: "Personalize o que as pessoas veem no seu perfil público e junto das suas publicações. É mais provável que as outras pessoas o sigam de volta ou interajam consigo se tiver um perfil preenchido e uma imagem de perfil." diff --git a/config/locales/ru.yml b/config/locales/ru.yml index b9c582843d..9d6b2946ac 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1193,8 +1193,6 @@ ru: your_appeal_approved: Ваша апелляция одобрена your_appeal_pending: Вы подали апелляцию your_appeal_rejected: Ваша апелляция отклонена - domain_validator: - invalid_domain: не является корректным доменным именем edit_profile: basic_information: Основная информация hint_html: "Настройте то, что люди видят в вашем публичном профиле и рядом с вашими сообщениями. Другие люди с большей вероятностью подпишутся на Вас и будут взаимодействовать с вами, если у Вас заполнен профиль и добавлено изображение." diff --git a/config/locales/sc.yml b/config/locales/sc.yml index ee66cef834..fee79a1325 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -734,8 +734,6 @@ sc: title_actions: delete_statuses: Cantzelladura de publicatziones none: Atentzione - domain_validator: - invalid_domain: no est unu nòmine de domìniu vàlidu edit_profile: basic_information: Informatzione bàsica other: Àteru diff --git a/config/locales/sco.yml b/config/locales/sco.yml index 4b7b9e56d7..967706f03a 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -1004,8 +1004,6 @@ sco: your_appeal_approved: Yer appeal haes been approved your_appeal_pending: Ye hae submittit a appeal your_appeal_rejected: Yer appeal haes been rejectit - domain_validator: - invalid_domain: isnae a valid domain nemm errors: '400': The request thit ye submittit wisnae valid or it wis illformt. '403': Ye dinnae hae permission fir tae luik at this page. diff --git a/config/locales/si.yml b/config/locales/si.yml index e68da4321a..c7968e2479 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -892,8 +892,6 @@ si: your_appeal_approved: ඔබගේ අභියාචනය අනුමත කර ඇත your_appeal_pending: ඔබ අභියාචනයක් ඉදිරිපත් කර ඇත your_appeal_rejected: ඔබගේ අභියාචනය ප්‍රතික්ෂේප කර ඇත - domain_validator: - invalid_domain: වලංගු ඩොමේන් නාමයක් නොවේ edit_profile: basic_information: මූලික තොරතුරු other: වෙනත් diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index c1fae7e83e..8f6137c8c1 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -3,6 +3,7 @@ en: simple_form: hints: account: + attribution_domains_as_text: Protects from false attributions. discoverable: Your public posts and profile may be featured or recommended in various areas of Mastodon and your profile may be suggested to other users. display_name: Your full name or your fun name. fields: Your homepage, pronouns, age, anything you want. @@ -143,6 +144,7 @@ en: url: Where events will be sent to labels: account: + attribution_domains_as_text: Only allow specific websites discoverable: Feature profile and posts in discovery algorithms fields: name: Label diff --git a/config/locales/sk.yml b/config/locales/sk.yml index ad9f8fb5ee..c49da0fc38 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -905,8 +905,6 @@ sk: silence: Obmedzenie účtu your_appeal_approved: Tvoja námietka bola schválená your_appeal_pending: Odoslal si námietku - domain_validator: - invalid_domain: nieje správny tvar domény edit_profile: basic_information: Základné informácie other: Ostatné diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 3384049a11..d0440abb00 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1263,8 +1263,6 @@ sl: your_appeal_approved: Vaša pritožba je bila odobrena your_appeal_pending: Oddali ste pritožbo your_appeal_rejected: Vaša pritožba je bila zavržena - domain_validator: - invalid_domain: ni veljavno ime domene edit_profile: basic_information: Osnovni podatki hint_html: "Prilagodite, kaj ljudje vidijo na vašem javnem profilu in poleg vaših objav. Drugi vam bodo raje sledili nazaj in z vami klepetali, če boste imeli izpolnjen profil in nastavljeno profilno sliko." diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 6907c1ee3c..5e8a3c912c 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1226,8 +1226,6 @@ sq: your_appeal_approved: Apelimi juaj u miratua your_appeal_pending: Keni parashtruar një apelim your_appeal_rejected: Apelimi juaj është hedhur poshtë - domain_validator: - invalid_domain: s’është emër i vlefshëm përkatësie edit_profile: basic_information: Hollësi elementare hint_html: "Përshtatni ç’shohin njerëzit në profilin tuaj publik dhe në krah të postimeve tuaja. Personat e tjerë ka më shumë gjasa t’ju ndjekin dhe ndërveprojnë me ju, kur keni të plotësuar profilin dhe një foto profili." diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index dfc8a635c8..428b9cb084 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -1174,8 +1174,6 @@ sr-Latn: your_appeal_approved: Vaša žalba je uvažena your_appeal_pending: Priložili ste žalbu your_appeal_rejected: Vaša žalba je odbijena - domain_validator: - invalid_domain: nelegitimno ime domena edit_profile: basic_information: Osnovne informacije hint_html: "Prilagodite šta ljudi vide na vašem javnom profilu i pored vaših objava. Veća je verovatnoća da će vas drugi pratiti i komunicirati sa vama kada imate popunjen profil i sliku profila." diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 2bbc4ef131..08fbf39fb8 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -1204,8 +1204,6 @@ sr: your_appeal_approved: Ваша жалба је уважена your_appeal_pending: Приложили сте жалбу your_appeal_rejected: Ваша жалба је одбијена - domain_validator: - invalid_domain: нелегитимно име домена edit_profile: basic_information: Основне информације hint_html: "Прилагодите шта људи виде на вашем јавном профилу и поред ваших објава. Већа је вероватноћа да ће вас други пратити и комуницирати са вама када имате попуњен профил и слику профила." diff --git a/config/locales/sv.yml b/config/locales/sv.yml index df403e602a..0cc47ca92e 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -1182,8 +1182,6 @@ sv: your_appeal_approved: Din överklagan har godkänts your_appeal_pending: Du har lämnat in en överklagan your_appeal_rejected: Din överklagan har avvisats - domain_validator: - invalid_domain: är inte ett giltigt domännamn edit_profile: basic_information: Allmän information hint_html: "Anpassa vad folk ser på din offentliga profil och bredvid dina inlägg. Andra personer är mer benägna att följa dig och interagera med dig när du har en ifylld profil och en profilbild." diff --git a/config/locales/th.yml b/config/locales/th.yml index f409a512d9..d1de9fd818 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1216,8 +1216,6 @@ th: your_appeal_approved: อนุมัติการอุทธรณ์ของคุณแล้ว your_appeal_pending: คุณได้ส่งการอุทธรณ์ your_appeal_rejected: ปฏิเสธการอุทธรณ์ของคุณแล้ว - domain_validator: - invalid_domain: ไม่ใช่ชื่อโดเมนที่ถูกต้อง edit_profile: basic_information: ข้อมูลพื้นฐาน hint_html: "ปรับแต่งสิ่งที่ผู้คนเห็นในโปรไฟล์สาธารณะของคุณและถัดจากโพสต์ของคุณ ผู้คนอื่น ๆ มีแนวโน้มที่จะติดตามคุณกลับและโต้ตอบกับคุณมากขึ้นเมื่อคุณมีโปรไฟล์ที่กรอกแล้วและรูปภาพโปรไฟล์" diff --git a/config/locales/tr.yml b/config/locales/tr.yml index d2d499077d..d8f5eff6e8 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1235,8 +1235,6 @@ tr: your_appeal_approved: İtirazınız onaylandı your_appeal_pending: Bir itiraz gönderdiniz your_appeal_rejected: İtirazınız reddedildi - domain_validator: - invalid_domain: geçerli bir alan adı değil edit_profile: basic_information: Temel bilgiler hint_html: "İnsanlara herkese açık profilinizde ve gönderilerinizin yanında ne göstermek istediğinizi düzenleyin. Dolu bir profile ve bir profil resmine sahip olduğunuzda diğer insanlar daha yüksek ihtimalle sizi takip etmek ve sizinle etkileşime geçmek isteyeceklerdir." diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 4e70b192d9..600239107e 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1270,8 +1270,6 @@ uk: your_appeal_approved: Вашу апеляцію було схвалено your_appeal_pending: Ви не подавали апеляцій your_appeal_rejected: Вашу апеляцію було відхилено - domain_validator: - invalid_domain: не є допустимим ім'ям домену edit_profile: basic_information: Основна інформація hint_html: "Налаштуйте те, що люди бачитимуть у вашому загальнодоступному профілі та поруч із вашими дописами. Інші люди з більшою ймовірністю підпишуться на вас та взаємодіятимуть з вами, якщо у вас є заповнений профіль та зображення профілю." diff --git a/config/locales/vi.yml b/config/locales/vi.yml index d211b9e740..dfb36c02da 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1216,8 +1216,6 @@ vi: your_appeal_approved: Khiếu nại của bạn được chấp nhận your_appeal_pending: Bạn đã gửi một khiếu nại your_appeal_rejected: Khiếu nại của bạn bị từ chối - domain_validator: - invalid_domain: không phải là một tên miền hợp lệ edit_profile: basic_information: Thông tin cơ bản hint_html: "Tùy chỉnh những gì mọi người nhìn thấy trên hồ sơ công khai và bên cạnh tút của bạn. Mọi người sẽ muốn theo dõi và tương tác với bạn hơn nếu bạn có ảnh đại diện và một hồ sơ hoàn chỉnh." diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 7407d81db9..b97ab65f04 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1217,8 +1217,6 @@ zh-CN: your_appeal_approved: 你的申诉已被批准 your_appeal_pending: 你已提交申诉 your_appeal_rejected: 你的申诉已被驳回 - domain_validator: - invalid_domain: 不是一个有效的域名 edit_profile: basic_information: 基本信息 hint_html: "自定义公开资料和嘟文旁边显示的内容。当您填写完整的个人资料并设置了头像时,其他人更有可能关注您并与您互动。" diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 26743d2cb1..90227b911d 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1135,8 +1135,6 @@ zh-HK: your_appeal_approved: 你的申訴已獲批准 your_appeal_pending: 你已提交申訴 your_appeal_rejected: 你的申訴已被駁回 - domain_validator: - invalid_domain: 不是一個可用域名 edit_profile: basic_information: 基本資料 hint_html: "自訂你的公開個人檔案和帖文內容。當你有完整的個人檔案和頭像時,其他人更願意追蹤你和與你互動。" diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index d92d53f391..052773e328 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1219,8 +1219,6 @@ zh-TW: your_appeal_approved: 您的申訴已被批准 your_appeal_pending: 您已遞交申訴 your_appeal_rejected: 您的申訴已被駁回 - domain_validator: - invalid_domain: 並非一個有效網域 edit_profile: basic_information: 基本資訊 hint_html: "自訂人們能於您個人檔案及嘟文旁所見之內容。當您完成填寫個人檔案及設定大頭貼後,其他人們比較願意跟隨您並與您互動。" diff --git a/config/routes/settings.rb b/config/routes/settings.rb index 297b80942c..cefa24316d 100644 --- a/config/routes/settings.rb +++ b/config/routes/settings.rb @@ -60,7 +60,7 @@ namespace :settings do resource :delete, only: [:show, :destroy] resource :migration, only: [:show, :create] - resource :verification, only: :show + resource :verification, only: [:show, :update] resource :privacy, only: [:show, :update], controller: 'privacy' namespace :migration do diff --git a/db/migrate/20240909014637_add_attribution_domains_to_accounts.rb b/db/migrate/20240909014637_add_attribution_domains_to_accounts.rb new file mode 100644 index 0000000000..e90f6f1ede --- /dev/null +++ b/db/migrate/20240909014637_add_attribution_domains_to_accounts.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddAttributionDomainsToAccounts < ActiveRecord::Migration[7.1] + def change + add_column :accounts, :attribution_domains, :string, array: true, default: [] + end +end diff --git a/db/schema.rb b/db/schema.rb index f01e11792d..540a971333 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_08_08_125420) do +ActiveRecord::Schema[7.1].define(version: 2024_09_09_014637) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -200,6 +200,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_08_08_125420) do t.datetime "reviewed_at", precision: nil t.datetime "requested_review_at", precision: nil t.boolean "indexable", default: false, null: false + t.string "attribution_domains", default: [], array: true t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin t.index "lower((username)::text), COALESCE(lower((domain)::text), ''::text)", name: "index_accounts_on_username_and_domain_lower", unique: true t.index ["domain", "id"], name: "index_accounts_on_domain_and_id" diff --git a/spec/controllers/settings/migrations_controller_spec.rb b/spec/controllers/settings/migrations_controller_spec.rb index 93c5de0899..67d5ab54f0 100644 --- a/spec/controllers/settings/migrations_controller_spec.rb +++ b/spec/controllers/settings/migrations_controller_spec.rb @@ -95,6 +95,7 @@ RSpec.describe Settings::MigrationsController do before do moved_to = Fabricate(:account, also_known_as: [ActivityPub::TagManager.instance.uri_for(user.account)]) + p moved_to.acct user.account.migrations.create!(acct: moved_to.acct) end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 1e8e4b1e4d..2ec7aafc51 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -747,6 +747,22 @@ RSpec.describe Account do end end + describe '#can_be_attributed_from?' do + subject { Fabricate(:account, attribution_domains: %w(example.com)) } + + it 'returns true for a matching domain' do + expect(subject.can_be_attributed_from?('example.com')).to be true + end + + it 'returns true for a subdomain of a domain' do + expect(subject.can_be_attributed_from?('foo.example.com')).to be true + end + + it 'returns false for a non-matching domain' do + expect(subject.can_be_attributed_from?('hoge.com')).to be false + end + end + describe 'Normalizations' do describe 'username' do it { is_expected.to normalize(:username).from(" \u3000bob \t \u00a0 \n ").to('bob') } diff --git a/spec/services/activitypub/process_account_service_spec.rb b/spec/services/activitypub/process_account_service_spec.rb index 86314e6b48..e4a36cf182 100644 --- a/spec/services/activitypub/process_account_service_spec.rb +++ b/spec/services/activitypub/process_account_service_spec.rb @@ -63,6 +63,26 @@ RSpec.describe ActivityPub::ProcessAccountService do end end + context 'with attribution domains' do + let(:payload) do + { + id: 'https://foo.test', + type: 'Actor', + inbox: 'https://foo.test/inbox', + attributionDomains: [ + 'example.com', + ], + }.with_indifferent_access + end + + it 'parses attribution domains' do + account = subject.call('alice', 'example.com', payload) + + expect(account.attribution_domains) + .to match_array(%w(example.com)) + end + end + context 'when account is not suspended' do subject { described_class.new.call(account.username, account.domain, payload) } diff --git a/spec/services/bulk_import_service_spec.rb b/spec/services/bulk_import_service_spec.rb index e8bec96c85..0197f81a44 100644 --- a/spec/services/bulk_import_service_spec.rb +++ b/spec/services/bulk_import_service_spec.rb @@ -274,7 +274,7 @@ RSpec.describe BulkImportService do let(:rows) do [ { 'domain' => 'blocked.com' }, - { 'domain' => 'to_block.com' }, + { 'domain' => 'to-block.com' }, ] end @@ -286,7 +286,7 @@ RSpec.describe BulkImportService do it 'blocks all the new domains' do subject.call(import) - expect(account.domain_blocks.pluck(:domain)).to contain_exactly('alreadyblocked.com', 'blocked.com', 'to_block.com') + expect(account.domain_blocks.pluck(:domain)).to contain_exactly('alreadyblocked.com', 'blocked.com', 'to-block.com') end it 'marks the import as finished' do @@ -302,7 +302,7 @@ RSpec.describe BulkImportService do let(:rows) do [ { 'domain' => 'blocked.com' }, - { 'domain' => 'to_block.com' }, + { 'domain' => 'to-block.com' }, ] end @@ -314,7 +314,7 @@ RSpec.describe BulkImportService do it 'blocks all the new domains' do subject.call(import) - expect(account.domain_blocks.pluck(:domain)).to contain_exactly('blocked.com', 'to_block.com') + expect(account.domain_blocks.pluck(:domain)).to contain_exactly('blocked.com', 'to-block.com') end it 'marks the import as finished' do diff --git a/spec/validators/domain_validator_spec.rb b/spec/validators/domain_validator_spec.rb new file mode 100644 index 0000000000..0b4cb0d3f0 --- /dev/null +++ b/spec/validators/domain_validator_spec.rb @@ -0,0 +1,125 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe DomainValidator do + let(:record) { record_class.new } + + context 'with no options' do + let(:record_class) do + Class.new do + include ActiveModel::Validations + + attr_accessor :domain + + validates :domain, domain: true + end + end + + describe '#validate_each' do + context 'with a nil value' do + it 'does not add errors' do + record.domain = nil + + expect(record).to be_valid + expect(record.errors).to be_empty + end + end + + context 'with a valid domain' do + it 'does not add errors' do + record.domain = 'example.com' + + expect(record).to be_valid + expect(record.errors).to be_empty + end + end + + context 'with a domain that is too long' do + it 'adds an error' do + record.domain = "#{'a' * 300}.com" + + expect(record).to_not be_valid + expect(record.errors.where(:domain)).to_not be_empty + end + end + + context 'with a domain with an empty segment' do + it 'adds an error' do + record.domain = '.example.com' + + expect(record).to_not be_valid + expect(record.errors.where(:domain)).to_not be_empty + end + end + + context 'with a domain with an invalid character' do + it 'adds an error' do + record.domain = '*.example.com' + + expect(record).to_not be_valid + expect(record.errors.where(:domain)).to_not be_empty + end + end + + context 'with a domain that would fail parsing' do + it 'adds an error' do + record.domain = '/' + + expect(record).to_not be_valid + expect(record.errors.where(:domain)).to_not be_empty + end + end + end + end + + context 'with acct option' do + let(:record_class) do + Class.new do + include ActiveModel::Validations + + attr_accessor :acct + + validates :acct, domain: { acct: true } + end + end + + describe '#validate_each' do + context 'with a nil value' do + it 'does not add errors' do + record.acct = nil + + expect(record).to be_valid + expect(record.errors).to be_empty + end + end + + context 'with no domain' do + it 'does not add errors' do + record.acct = 'hoge_123' + + expect(record).to be_valid + expect(record.errors).to be_empty + end + end + + context 'with a valid domain' do + it 'does not add errors' do + record.acct = 'hoge_123@example.com' + + expect(record).to be_valid + expect(record.errors).to be_empty + end + end + + context 'with an invalid domain' do + it 'adds an error' do + record.acct = 'hoge_123@.example.com' + + expect(record).to_not be_valid + expect(record.errors.where(:acct)).to_not be_empty + end + end + end + end +end diff --git a/spec/validators/lines_validator_spec.rb b/spec/validators/lines_validator_spec.rb new file mode 100644 index 0000000000..a80dbbaf3e --- /dev/null +++ b/spec/validators/lines_validator_spec.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe LinesValidator do + let(:record_class) do + Class.new do + include ActiveModel::Validations + + attr_accessor :text + + validates :text, lines: { maximum: 5 } + end + end + + let(:record) { record_class.new } + + describe '#validate_each' do + context 'with a nil value' do + it 'does not add errors' do + record.text = nil + + expect(record).to be_valid + expect(record.errors).to be_empty + end + end + + context 'with lines below the limit' do + it 'does not add errors' do + record.text = "hoge\n" * 5 + + expect(record).to be_valid + expect(record.errors).to be_empty + end + end + + context 'with more lines than limit' do + it 'adds an error' do + record.text = "hoge\n" * 6 + + expect(record).to_not be_valid + expect(record.errors.where(:text)).to_not be_empty + end + end + end +end From da07adfe6c2137b07f3def1716b370329a9ec9cb Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 10 Sep 2024 09:21:40 -0400 Subject: [PATCH 09/89] Add `CustomEmoji.enabled` scope (#31830) --- app/lib/entity_cache.rb | 2 +- app/models/announcement_reaction.rb | 2 +- app/models/custom_emoji.rb | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/lib/entity_cache.rb b/app/lib/entity_cache.rb index 80b0046eea..e647dcab7f 100644 --- a/app/lib/entity_cache.rb +++ b/app/lib/entity_cache.rb @@ -27,7 +27,7 @@ class EntityCache end unless uncached_ids.empty? - uncached = CustomEmoji.where(shortcode: shortcodes, domain: domain, disabled: false).index_by(&:shortcode) + uncached = CustomEmoji.enabled.where(shortcode: shortcodes, domain: domain).index_by(&:shortcode) uncached.each_value { |item| Rails.cache.write(to_key(:emoji, item.shortcode, domain), item, expires_in: MAX_EXPIRATION) } end diff --git a/app/models/announcement_reaction.rb b/app/models/announcement_reaction.rb index 9881892c4b..f953402b7e 100644 --- a/app/models/announcement_reaction.rb +++ b/app/models/announcement_reaction.rb @@ -27,7 +27,7 @@ class AnnouncementReaction < ApplicationRecord private def set_custom_emoji - self.custom_emoji = CustomEmoji.local.find_by(disabled: false, shortcode: name) if name.present? + self.custom_emoji = CustomEmoji.local.enabled.find_by(shortcode: name) if name.present? end def queue_publish diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb index 31ba91ad02..6e788c0c1c 100644 --- a/app/models/custom_emoji.rb +++ b/app/models/custom_emoji.rb @@ -48,9 +48,10 @@ class CustomEmoji < ApplicationRecord scope :local, -> { where(domain: nil) } scope :remote, -> { where.not(domain: nil) } + scope :enabled, -> { where(disabled: false) } scope :alphabetic, -> { order(domain: :asc, shortcode: :asc) } scope :by_domain_and_subdomains, ->(domain) { where(domain: domain).or(where(arel_table[:domain].matches("%.#{domain}"))) } - scope :listed, -> { local.where(disabled: false).where(visible_in_picker: true) } + scope :listed, -> { local.enabled.where(visible_in_picker: true) } remotable_attachment :image, LIMIT From c4b09d684e864d58fc5eaa171fafcc942e4d6937 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 10 Sep 2024 09:23:55 -0400 Subject: [PATCH 10/89] Extract method for account-referencing in CLI prune task (#31824) --- lib/mastodon/cli/accounts.rb | 37 +++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/lib/mastodon/cli/accounts.rb b/lib/mastodon/cli/accounts.rb index 8a138323d4..08a28e5f5c 100644 --- a/lib/mastodon/cli/accounts.rb +++ b/lib/mastodon/cli/accounts.rb @@ -502,17 +502,7 @@ module Mastodon::CLI - not muted/blocked by us LONG_DESC def prune - query = Account.remote.non_automated - query = query.where('NOT EXISTS (SELECT 1 FROM mentions WHERE account_id = accounts.id)') - query = query.where('NOT EXISTS (SELECT 1 FROM favourites WHERE account_id = accounts.id)') - query = query.where('NOT EXISTS (SELECT 1 FROM statuses WHERE account_id = accounts.id)') - query = query.where('NOT EXISTS (SELECT 1 FROM follows WHERE account_id = accounts.id OR target_account_id = accounts.id)') - query = query.where('NOT EXISTS (SELECT 1 FROM blocks WHERE account_id = accounts.id OR target_account_id = accounts.id)') - query = query.where('NOT EXISTS (SELECT 1 FROM mutes WHERE target_account_id = accounts.id)') - query = query.where('NOT EXISTS (SELECT 1 FROM reports WHERE target_account_id = accounts.id)') - query = query.where('NOT EXISTS (SELECT 1 FROM follow_requests WHERE account_id = accounts.id OR target_account_id = accounts.id)') - - _, deleted = parallelize_with_progress(query) do |account| + _, deleted = parallelize_with_progress(prunable_accounts) do |account| next if account.bot? || account.group? next if account.suspended? next if account.silenced? @@ -577,6 +567,31 @@ module Mastodon::CLI private + def prunable_accounts + Account + .remote + .non_automated + .where.not(referencing_account(Mention, :account_id)) + .where.not(referencing_account(Favourite, :account_id)) + .where.not(referencing_account(Status, :account_id)) + .where.not(referencing_account(Follow, :account_id)) + .where.not(referencing_account(Follow, :target_account_id)) + .where.not(referencing_account(Block, :account_id)) + .where.not(referencing_account(Block, :target_account_id)) + .where.not(referencing_account(Mute, :target_account_id)) + .where.not(referencing_account(Report, :target_account_id)) + .where.not(referencing_account(FollowRequest, :account_id)) + .where.not(referencing_account(FollowRequest, :target_account_id)) + end + + def referencing_account(model, attribute) + model + .where(model.arel_table[attribute].eq Account.arel_table[:id]) + .select(1) + .arel + .exists + end + def report_errors(errors) message = errors.map do |error| <<~STRING From 4ffaced8bcbcb9227722c8e09756c7ca1909aa86 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 10 Sep 2024 16:00:23 +0200 Subject: [PATCH 11/89] Second attempt at disabling Codecov annotations (#31841) --- .github/codecov.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/codecov.yml b/.github/codecov.yml index d9b43b2594..21af6d0d45 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -1,4 +1,3 @@ -annotations: false comment: false # Do not leave PR comments coverage: status: @@ -10,3 +9,5 @@ coverage: default: # GitHub status check is not blocking informational: true +github_checks: + annotations: false From 0c3c06f7cc50c9207a44f56e184ce6a41f953171 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 10 Sep 2024 13:32:58 -0400 Subject: [PATCH 12/89] Remove vendor prefix from `mobile-web-app-capable` meta tag (#31845) --- app/views/layouts/application.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index a6b34c8a36..99e89d45ce 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -21,7 +21,7 @@ %link{ rel: 'mask-icon', href: frontend_asset_path('images/logo-symbol-icon.svg'), color: '#6364FF' }/ %link{ rel: 'manifest', href: manifest_path(format: :json) }/ = theme_color_tags current_theme - %meta{ name: 'apple-mobile-web-app-capable', content: 'yes' }/ + %meta{ name: 'mobile-web-app-capable', content: 'yes' }/ %title= html_title From e09f9f885e3d2859f495d5e5e6107bba9bde3b5a Mon Sep 17 00:00:00 2001 From: Michael Stanclift Date: Tue, 10 Sep 2024 12:33:55 -0500 Subject: [PATCH 13/89] Fix alt text modal styling (#31844) --- app/javascript/styles/mastodon-light/diff.scss | 17 +++++++---------- app/javascript/styles/mastodon/components.scss | 16 +++++++++------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index 1df556b42a..c0cabf837c 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -159,8 +159,8 @@ .error-modal, .onboarding-modal, .compare-history-modal, -.report-modal__comment .setting-text__wrapper, -.report-modal__comment .setting-text, +.report-modal__comment, +.report-modal__comment, .announcements, .picture-in-picture__header, .picture-in-picture__footer, @@ -169,6 +169,11 @@ border: 1px solid var(--background-border-color); } +.setting-text__wrapper, +.setting-text { + border: 1px solid var(--background-border-color); +} + .reactions-bar__item:hover, .reactions-bar__item:focus, .reactions-bar__item:active { @@ -198,14 +203,6 @@ color: $white; } -.report-modal__comment { - border-right-color: lighten($ui-base-color, 8%); -} - -.report-modal__container { - border-top-color: lighten($ui-base-color, 8%); -} - .column-settings__hashtags .column-select__option { color: $white; } diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 570c006faa..382491eb74 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3911,7 +3911,7 @@ $ui-header-logo-wordmark-width: 99px; &__wrapper { background: $white; - border: 1px solid $ui-secondary-color; + border: 1px solid var(--background-border-color); margin-bottom: 10px; border-radius: 4px; @@ -6298,9 +6298,10 @@ a.status-card { .report-modal, .actions-modal, .compare-history-modal { - background: lighten($ui-secondary-color, 8%); - color: $inverted-text-color; - border-radius: 8px; + background: var(--background-color); + color: $primary-text-color; + border-radius: 4px; + border: 1px solid var(--background-border-color); overflow: hidden; max-width: 90vw; width: 480px; @@ -6344,6 +6345,7 @@ a.status-card { .report-modal { width: 90vw; max-width: 700px; + border: 1px solid var(--background-border-color); } .report-dialog-modal { @@ -6567,7 +6569,7 @@ a.status-card { .report-modal__container { display: flex; - border-top: 1px solid $ui-secondary-color; + border-top: 1px solid var(--background-border-color); @media screen and (width <= 480px) { flex-wrap: wrap; @@ -6625,7 +6627,7 @@ a.status-card { .report-modal__comment { padding: 20px; - border-inline-end: 1px solid $ui-secondary-color; + border-inline-end: 1px solid var(--background-border-color); max-width: 320px; p { @@ -6636,7 +6638,7 @@ a.status-card { .setting-text-label { display: block; - color: $inverted-text-color; + color: $secondary-text-color; font-size: 14px; font-weight: 500; margin-bottom: 10px; From e6f5b36a12396daf0a8166d0d2ea8865cd589ee2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 19:45:16 +0200 Subject: [PATCH 14/89] Update dependency express to v4.20.0 (#31836) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 90 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 31 deletions(-) diff --git a/yarn.lock b/yarn.lock index 332f6d012f..90e764f49c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5470,9 +5470,9 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.2": - version: 1.20.2 - resolution: "body-parser@npm:1.20.2" +"body-parser@npm:1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" dependencies: bytes: "npm:3.1.2" content-type: "npm:~1.0.5" @@ -5482,11 +5482,11 @@ __metadata: http-errors: "npm:2.0.0" iconv-lite: "npm:0.4.24" on-finished: "npm:2.4.1" - qs: "npm:6.11.0" + qs: "npm:6.13.0" raw-body: "npm:2.5.2" type-is: "npm:~1.6.18" unpipe: "npm:1.0.0" - checksum: 10c0/06f1438fff388a2e2354c96aa3ea8147b79bfcb1262dfcc2aae68ec13723d01d5781680657b74e9f83c808266d5baf52804032fbde2b7382b89bd8cdb273ace9 + checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 languageName: node linkType: hard @@ -7499,6 +7499,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -8336,41 +8343,41 @@ __metadata: linkType: hard "express@npm:^4.17.1, express@npm:^4.18.2": - version: 4.19.2 - resolution: "express@npm:4.19.2" + version: 4.20.0 + resolution: "express@npm:4.20.0" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.2" + body-parser: "npm:1.20.3" content-disposition: "npm:0.5.4" content-type: "npm:~1.0.4" cookie: "npm:0.6.0" cookie-signature: "npm:1.0.6" debug: "npm:2.6.9" depd: "npm:2.0.0" - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" etag: "npm:~1.8.1" finalhandler: "npm:1.2.0" fresh: "npm:0.5.2" http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.1" + merge-descriptors: "npm:1.0.3" methods: "npm:~1.1.2" on-finished: "npm:2.4.1" parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.7" + path-to-regexp: "npm:0.1.10" proxy-addr: "npm:~2.0.7" qs: "npm:6.11.0" range-parser: "npm:~1.2.1" safe-buffer: "npm:5.2.1" - send: "npm:0.18.0" - serve-static: "npm:1.15.0" + send: "npm:0.19.0" + serve-static: "npm:1.16.0" setprototypeof: "npm:1.2.0" statuses: "npm:2.0.1" type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: 10c0/e82e2662ea9971c1407aea9fc3c16d6b963e55e3830cd0ef5e00b533feda8b770af4e3be630488ef8a752d7c75c4fcefb15892868eeaafe7353cb9e3e269fdcb + checksum: 10c0/626e440e9feffa3f82ebce5e7dc0ad7a74fa96079994f30048cce450f4855a258abbcabf021f691aeb72154867f0d28440a8498c62888805faf667a829fb65aa languageName: node linkType: hard @@ -11808,10 +11815,10 @@ __metadata: languageName: node linkType: hard -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 10c0/b67d07bd44cfc45cebdec349bb6e1f7b077ee2fd5beb15d1f7af073849208cb6f144fe403e29a36571baf3f4e86469ac39acf13c318381e958e186b2766f54ec +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 languageName: node linkType: hard @@ -12930,10 +12937,10 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 10c0/50a1ddb1af41a9e68bd67ca8e331a705899d16fb720a1ea3a41e310480948387daf603abb14d7b0826c58f10146d49050a1291ba6a82b78a382d1c02c0b8f905 +"path-to-regexp@npm:0.1.10": + version: 0.1.10 + resolution: "path-to-regexp@npm:0.1.10" + checksum: 10c0/34196775b9113ca6df88e94c8d83ba82c0e1a2063dd33bfe2803a980da8d49b91db8104f49d5191b44ea780d46b8670ce2b7f4a5e349b0c48c6779b653f1afe4 languageName: node linkType: hard @@ -14335,12 +14342,12 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.11.0": - version: 6.11.2 - resolution: "qs@npm:6.11.2" +"qs@npm:6.13.0, qs@npm:^6.11.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" dependencies: - side-channel: "npm:^1.0.4" - checksum: 10c0/4f95d4ff18ed480befcafa3390022817ffd3087fc65f146cceb40fc5edb9fa96cb31f648cae2fa96ca23818f0798bd63ad4ca369a0e22702fcd41379b3ab6571 + side-channel: "npm:^1.0.6" + checksum: 10c0/62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860 languageName: node linkType: hard @@ -15614,6 +15621,27 @@ __metadata: languageName: node linkType: hard +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: 10c0/ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3 + languageName: node + linkType: hard + "serialize-javascript@npm:^5.0.1": version: 5.0.1 resolution: "serialize-javascript@npm:5.0.1" @@ -15647,15 +15675,15 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:1.15.0": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" +"serve-static@npm:1.16.0": + version: 1.16.0 + resolution: "serve-static@npm:1.16.0" dependencies: encodeurl: "npm:~1.0.2" escape-html: "npm:~1.0.3" parseurl: "npm:~1.3.3" send: "npm:0.18.0" - checksum: 10c0/fa9f0e21a540a28f301258dfe1e57bb4f81cd460d28f0e973860477dd4acef946a1f41748b5bd41c73b621bea2029569c935faa38578fd34cd42a9b4947088ba + checksum: 10c0/d7a5beca08cc55f92998d8b87c111dd842d642404231c90c11f504f9650935da4599c13256747b0a988442a59851343271fe8e1946e03e92cd79c447b5f3ae01 languageName: node linkType: hard From 9e12fa254e8956f1f8765a76b2c6ea54e47cfdae Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 17:45:32 +0000 Subject: [PATCH 15/89] Update dependency propshaft to v1 (#31832) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index de541edfbd..1f4e042f2b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -601,7 +601,7 @@ GEM actionmailer (>= 3) net-smtp premailer (~> 1.7, >= 1.7.9) - propshaft (0.9.1) + propshaft (1.0.0) actionpack (>= 7.0.0) activesupport (>= 7.0.0) rack @@ -691,7 +691,7 @@ GEM redlock (1.3.2) redis (>= 3.0.0, < 6.0) regexp_parser (2.9.2) - reline (0.5.9) + reline (0.5.10) io-console (~> 0.5) request_store (1.6.0) rack (>= 1.4) From a3215c0f88bb5f436bed665ad26175923544d9d4 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 11 Sep 2024 09:29:18 +0200 Subject: [PATCH 16/89] Change inner borders in media galleries in web UI (#31852) --- .../mastodon/components/media_gallery.jsx | 2 +- .../styles/mastodon/components.scss | 58 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/media_gallery.jsx b/app/javascript/mastodon/components/media_gallery.jsx index 9a8f852128..ba54b7f903 100644 --- a/app/javascript/mastodon/components/media_gallery.jsx +++ b/app/javascript/mastodon/components/media_gallery.jsx @@ -327,7 +327,7 @@ class MediaGallery extends PureComponent { } return ( -
+
{(!visible || uncached) && (
{spoilerButton} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 382491eb74..5a8fa3e5c0 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -6953,6 +6953,64 @@ a.status-card { grid-template-columns: 50% 50%; grid-template-rows: 50% 50%; gap: 2px; + + &--layout-2 { + .media-gallery__item:nth-child(1) { + border-end-end-radius: 0; + border-start-end-radius: 0; + } + + .media-gallery__item:nth-child(2) { + border-start-start-radius: 0; + border-end-start-radius: 0; + } + } + + &--layout-3 { + .media-gallery__item:nth-child(1) { + border-end-end-radius: 0; + border-start-end-radius: 0; + } + + .media-gallery__item:nth-child(2) { + border-start-start-radius: 0; + border-end-start-radius: 0; + border-end-end-radius: 0; + } + + .media-gallery__item:nth-child(3) { + border-start-start-radius: 0; + border-end-start-radius: 0; + border-start-end-radius: 0; + } + } + + &--layout-4 { + .media-gallery__item:nth-child(1) { + border-end-end-radius: 0; + border-start-end-radius: 0; + border-end-start-radius: 0; + } + + .media-gallery__item:nth-child(2) { + border-start-start-radius: 0; + border-end-start-radius: 0; + border-end-end-radius: 0; + } + + .media-gallery__item:nth-child(3) { + border-start-start-radius: 0; + border-start-end-radius: 0; + border-end-start-radius: 0; + border-end-end-radius: 0; + } + + .media-gallery__item:nth-child(4) { + border-start-start-radius: 0; + border-end-start-radius: 0; + border-start-end-radius: 0; + } + } } .media-gallery__item { From cee71b9892d14d934f4f14e91c4d7d7843fc13d9 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 11 Sep 2024 03:47:16 -0400 Subject: [PATCH 17/89] Remove `fa_` prefix from status visibility icon method (#31846) --- app/helpers/statuses_helper.rb | 20 +++++++++---------- app/views/admin/reports/_status.html.haml | 2 +- .../filters/statuses/_status_filter.html.haml | 2 +- spec/helpers/statuses_helper_spec.rb | 18 ++++++++--------- 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb index d956e4fcd8..bba6d64a47 100644 --- a/app/helpers/statuses_helper.rb +++ b/app/helpers/statuses_helper.rb @@ -4,6 +4,13 @@ module StatusesHelper EMBEDDED_CONTROLLER = 'statuses' EMBEDDED_ACTION = 'embed' + VISIBLITY_ICONS = { + public: 'globe', + unlisted: 'lock_open', + private: 'lock', + direct: 'alternate_email', + }.freeze + def nothing_here(extra_classes = '') content_tag(:div, class: "nothing-here #{extra_classes}") do t('accounts.nothing_here') @@ -57,17 +64,8 @@ module StatusesHelper embedded_view? ? '_blank' : nil end - def fa_visibility_icon(status) - case status.visibility - when 'public' - material_symbol 'globe' - when 'unlisted' - material_symbol 'lock_open' - when 'private' - material_symbol 'lock' - when 'direct' - material_symbol 'alternate_email' - end + def visibility_icon(status) + VISIBLITY_ICONS[status.visibility.to_sym] end def embedded_view? diff --git a/app/views/admin/reports/_status.html.haml b/app/views/admin/reports/_status.html.haml index 11be38ef84..e0870503d6 100644 --- a/app/views/admin/reports/_status.html.haml +++ b/app/views/admin/reports/_status.html.haml @@ -33,7 +33,7 @@ = material_symbol('repeat_active') = t('statuses.boosted_from_html', acct_link: admin_account_inline_link_to(status.proper.account)) - else - = fa_visibility_icon(status) + = material_symbol visibility_icon(status) = t("statuses.visibilities.#{status.visibility}") - if status.proper.sensitive? · diff --git a/app/views/filters/statuses/_status_filter.html.haml b/app/views/filters/statuses/_status_filter.html.haml index 31aa9ec237..d0d04638d2 100644 --- a/app/views/filters/statuses/_status_filter.html.haml +++ b/app/views/filters/statuses/_status_filter.html.haml @@ -29,7 +29,7 @@ · = t('statuses.edited_at_html', date: content_tag(:time, l(status.edited_at), datetime: status.edited_at.iso8601, title: l(status.edited_at), class: 'formatted')) · - = fa_visibility_icon(status) + = material_symbol visibility_icon(status) = t("statuses.visibilities.#{status.visibility}") - if status.sensitive? · diff --git a/spec/helpers/statuses_helper_spec.rb b/spec/helpers/statuses_helper_spec.rb index 8809d0afae..edd3e8f2f7 100644 --- a/spec/helpers/statuses_helper_spec.rb +++ b/spec/helpers/statuses_helper_spec.rb @@ -36,14 +36,14 @@ RSpec.describe StatusesHelper do end end - describe 'fa_visibility_icon' do + describe 'visibility_icon' do context 'with a status that is public' do let(:status) { Status.new(visibility: 'public') } it 'returns the correct fa icon' do - result = helper.fa_visibility_icon(status) + result = helper.visibility_icon(status) - expect(result).to match('material-globe') + expect(result).to match('globe') end end @@ -51,9 +51,9 @@ RSpec.describe StatusesHelper do let(:status) { Status.new(visibility: 'unlisted') } it 'returns the correct fa icon' do - result = helper.fa_visibility_icon(status) + result = helper.visibility_icon(status) - expect(result).to match('material-lock_open') + expect(result).to match('lock_open') end end @@ -61,9 +61,9 @@ RSpec.describe StatusesHelper do let(:status) { Status.new(visibility: 'private') } it 'returns the correct fa icon' do - result = helper.fa_visibility_icon(status) + result = helper.visibility_icon(status) - expect(result).to match('material-lock') + expect(result).to match('lock') end end @@ -71,9 +71,9 @@ RSpec.describe StatusesHelper do let(:status) { Status.new(visibility: 'direct') } it 'returns the correct fa icon' do - result = helper.fa_visibility_icon(status) + result = helper.visibility_icon(status) - expect(result).to match('material-alternate_email') + expect(result).to match('alternate_email') end end end From 9769ffdcc2d93fbb33b5daec52ea02854dbb1574 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 09:47:37 +0200 Subject: [PATCH 18/89] Update dependency aws-sdk-s3 to v1.161.0 (#31853) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1f4e042f2b..1564c267b8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -100,16 +100,16 @@ GEM attr_required (1.0.2) awrence (1.2.1) aws-eventstream (1.3.0) - aws-partitions (1.970.0) - aws-sdk-core (3.203.0) + aws-partitions (1.973.0) + aws-sdk-core (3.204.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.9) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.89.0) + aws-sdk-kms (1.90.0) aws-sdk-core (~> 3, >= 3.203.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.160.0) + aws-sdk-s3 (1.161.0) aws-sdk-core (~> 3, >= 3.203.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) From cdcd834f3c08f12eb1b7cbf66aec3c716b232663 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 11 Sep 2024 04:01:32 -0400 Subject: [PATCH 19/89] Add coverage for `AnnualReport::*` source child classes (#31849) --- .../commonly_interacted_with_accounts_spec.rb | 41 +++++++++++++++ .../most_reblogged_accounts_spec.rb | 41 +++++++++++++++ spec/lib/annual_report/most_used_apps_spec.rb | 40 +++++++++++++++ spec/lib/annual_report/percentiles_spec.rb | 44 ++++++++++++++++ spec/lib/annual_report/time_series_spec.rb | 46 +++++++++++++++++ spec/lib/annual_report/top_hashtags_spec.rb | 43 ++++++++++++++++ spec/lib/annual_report/top_statuses_spec.rb | 50 +++++++++++++++++++ .../annual_report/type_distribution_spec.rb | 48 ++++++++++++++++++ 8 files changed, 353 insertions(+) create mode 100644 spec/lib/annual_report/commonly_interacted_with_accounts_spec.rb create mode 100644 spec/lib/annual_report/most_reblogged_accounts_spec.rb create mode 100644 spec/lib/annual_report/most_used_apps_spec.rb create mode 100644 spec/lib/annual_report/percentiles_spec.rb create mode 100644 spec/lib/annual_report/time_series_spec.rb create mode 100644 spec/lib/annual_report/top_hashtags_spec.rb create mode 100644 spec/lib/annual_report/top_statuses_spec.rb create mode 100644 spec/lib/annual_report/type_distribution_spec.rb diff --git a/spec/lib/annual_report/commonly_interacted_with_accounts_spec.rb b/spec/lib/annual_report/commonly_interacted_with_accounts_spec.rb new file mode 100644 index 0000000000..e99d3cb4a7 --- /dev/null +++ b/spec/lib/annual_report/commonly_interacted_with_accounts_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe AnnualReport::CommonlyInteractedWithAccounts do + describe '#generate' do + subject { described_class.new(account, Time.zone.now.year) } + + context 'with an inactive account' do + let(:account) { Fabricate :account } + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + commonly_interacted_with_accounts: be_an(Array).and(be_empty) + ) + end + end + + context 'with an active account' do + let(:account) { Fabricate :account } + + let(:other_account) { Fabricate :account } + + before do + _other = Fabricate :status + Fabricate :status, account: account, reply: true, in_reply_to_id: Fabricate(:status, account: other_account).id + Fabricate :status, account: account, reply: true, in_reply_to_id: Fabricate(:status, account: other_account).id + end + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + commonly_interacted_with_accounts: contain_exactly( + include(account_id: other_account.id, count: 2) + ) + ) + end + end + end +end diff --git a/spec/lib/annual_report/most_reblogged_accounts_spec.rb b/spec/lib/annual_report/most_reblogged_accounts_spec.rb new file mode 100644 index 0000000000..0280ba1992 --- /dev/null +++ b/spec/lib/annual_report/most_reblogged_accounts_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe AnnualReport::MostRebloggedAccounts do + describe '#generate' do + subject { described_class.new(account, Time.zone.now.year) } + + context 'with an inactive account' do + let(:account) { Fabricate :account } + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + most_reblogged_accounts: be_an(Array).and(be_empty) + ) + end + end + + context 'with an active account' do + let(:account) { Fabricate :account } + + let(:other_account) { Fabricate :account } + + before do + _other = Fabricate :status + Fabricate :status, account: account, reblog: Fabricate(:status, account: other_account) + Fabricate :status, account: account, reblog: Fabricate(:status, account: other_account) + end + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + most_reblogged_accounts: contain_exactly( + include(account_id: other_account.id, count: 2) + ) + ) + end + end + end +end diff --git a/spec/lib/annual_report/most_used_apps_spec.rb b/spec/lib/annual_report/most_used_apps_spec.rb new file mode 100644 index 0000000000..d2fcecc4d8 --- /dev/null +++ b/spec/lib/annual_report/most_used_apps_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe AnnualReport::MostUsedApps do + describe '#generate' do + subject { described_class.new(account, Time.zone.now.year) } + + context 'with an inactive account' do + let(:account) { Fabricate :account } + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + most_used_apps: be_an(Array).and(be_empty) + ) + end + end + + context 'with an active account' do + let(:account) { Fabricate :account } + + let(:application) { Fabricate :application } + + before do + _other = Fabricate :status + Fabricate.times 2, :status, account: account, application: application + end + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + most_used_apps: contain_exactly( + include(name: application.name, count: 2) + ) + ) + end + end + end +end diff --git a/spec/lib/annual_report/percentiles_spec.rb b/spec/lib/annual_report/percentiles_spec.rb new file mode 100644 index 0000000000..1d1df3166b --- /dev/null +++ b/spec/lib/annual_report/percentiles_spec.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe AnnualReport::Percentiles do + describe '#generate' do + subject { described_class.new(account, Time.zone.now.year) } + + context 'with an inactive account' do + let(:account) { Fabricate :account } + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + percentiles: include( + followers: 0, + statuses: 0 + ) + ) + end + end + + context 'with an active account' do + let(:account) { Fabricate :account } + + before do + Fabricate.times 2, :status # Others as `account` + Fabricate.times 2, :follow # Others as `target_account` + Fabricate.times 2, :status, account: account + Fabricate.times 2, :follow, target_account: account + end + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + percentiles: include( + followers: 50, + statuses: 50 + ) + ) + end + end + end +end diff --git a/spec/lib/annual_report/time_series_spec.rb b/spec/lib/annual_report/time_series_spec.rb new file mode 100644 index 0000000000..219d6c0834 --- /dev/null +++ b/spec/lib/annual_report/time_series_spec.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe AnnualReport::TimeSeries do + describe '#generate' do + subject { described_class.new(account, Time.zone.now.year) } + + context 'with an inactive account' do + let(:account) { Fabricate :account } + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + time_series: match( + include(followers: 0, following: 0, month: 1, statuses: 0) + ) + ) + end + end + + context 'with an active account' do + let(:account) { Fabricate :account } + + let(:month_one_date) { DateTime.new(Time.zone.now.year, 1, 1, 12, 12, 12) } + + let(:tag) { Fabricate :tag } + + before do + _other = Fabricate :status + Fabricate :status, account: account, created_at: month_one_date + Fabricate :follow, account: account, created_at: month_one_date + Fabricate :follow, target_account: account, created_at: month_one_date + end + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + time_series: match( + include(followers: 1, following: 1, month: 1, statuses: 1) + ) + ) + end + end + end +end diff --git a/spec/lib/annual_report/top_hashtags_spec.rb b/spec/lib/annual_report/top_hashtags_spec.rb new file mode 100644 index 0000000000..58a9152184 --- /dev/null +++ b/spec/lib/annual_report/top_hashtags_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe AnnualReport::TopHashtags do + describe '#generate' do + subject { described_class.new(account, Time.zone.now.year) } + + context 'with an inactive account' do + let(:account) { Fabricate :account } + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + top_hashtags: be_an(Array).and(be_empty) + ) + end + end + + context 'with an active account' do + let(:account) { Fabricate :account } + + let(:tag) { Fabricate :tag } + + before do + _other = Fabricate :status + first = Fabricate :status, account: account + first.tags << tag + last = Fabricate :status, account: account + last.tags << tag + end + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + top_hashtags: contain_exactly( + include(name: tag.name, count: 2) + ) + ) + end + end + end +end diff --git a/spec/lib/annual_report/top_statuses_spec.rb b/spec/lib/annual_report/top_statuses_spec.rb new file mode 100644 index 0000000000..b956b03973 --- /dev/null +++ b/spec/lib/annual_report/top_statuses_spec.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe AnnualReport::TopStatuses do + describe '#generate' do + subject { described_class.new(account, Time.zone.now.year) } + + context 'with an inactive account' do + let(:account) { Fabricate :account } + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + top_statuses: include( + by_reblogs: be_nil, + by_favourites: be_nil, + by_replies: be_nil + ) + ) + end + end + + context 'with an active account' do + let(:account) { Fabricate :account } + + let(:reblogged_status) { Fabricate :status, account: account } + let(:favourited_status) { Fabricate :status, account: account } + let(:replied_status) { Fabricate :status, account: account } + + before do + _other = Fabricate :status + reblogged_status.status_stat.update(reblogs_count: 123) + favourited_status.status_stat.update(favourites_count: 123) + replied_status.status_stat.update(replies_count: 123) + end + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + top_statuses: include( + by_reblogs: reblogged_status.id, + by_favourites: favourited_status.id, + by_replies: replied_status.id + ) + ) + end + end + end +end diff --git a/spec/lib/annual_report/type_distribution_spec.rb b/spec/lib/annual_report/type_distribution_spec.rb new file mode 100644 index 0000000000..89a31fb207 --- /dev/null +++ b/spec/lib/annual_report/type_distribution_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe AnnualReport::TypeDistribution do + describe '#generate' do + subject { described_class.new(account, Time.zone.now.year) } + + context 'with an inactive account' do + let(:account) { Fabricate :account } + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + type_distribution: include( + total: 0, + reblogs: 0, + replies: 0, + standalone: 0 + ) + ) + end + end + + context 'with an active account' do + let(:account) { Fabricate :account } + + before do + _other = Fabricate :status + Fabricate :status, reblog: Fabricate(:status), account: account + Fabricate :status, in_reply_to_id: Fabricate(:status).id, account: account, reply: true + Fabricate :status, account: account + end + + it 'builds a report for an account' do + expect(subject.generate) + .to include( + type_distribution: include( + total: 3, + reblogs: 1, + replies: 1, + standalone: 1 + ) + ) + end + end + end +end From 2babfafaffd56ff69b6213f3a550c7d0b3d3283c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 10:18:10 +0200 Subject: [PATCH 20/89] New Crowdin Translations (automated) (#31855) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/an.json | 1 - app/javascript/mastodon/locales/ar.json | 1 - app/javascript/mastodon/locales/ast.json | 1 - app/javascript/mastodon/locales/be.json | 1 - app/javascript/mastodon/locales/bg.json | 1 - app/javascript/mastodon/locales/bn.json | 1 - app/javascript/mastodon/locales/br.json | 1 - app/javascript/mastodon/locales/ca.json | 2 +- app/javascript/mastodon/locales/ckb.json | 1 - app/javascript/mastodon/locales/co.json | 1 - app/javascript/mastodon/locales/cs.json | 1 - app/javascript/mastodon/locales/cy.json | 1 - app/javascript/mastodon/locales/da.json | 2 +- app/javascript/mastodon/locales/de.json | 2 +- app/javascript/mastodon/locales/el.json | 1 - app/javascript/mastodon/locales/en-GB.json | 4 +- app/javascript/mastodon/locales/eo.json | 1 - app/javascript/mastodon/locales/es-AR.json | 1 - app/javascript/mastodon/locales/es-MX.json | 1 - app/javascript/mastodon/locales/es.json | 1 - app/javascript/mastodon/locales/et.json | 1 - app/javascript/mastodon/locales/eu.json | 1 - app/javascript/mastodon/locales/fa.json | 1 - app/javascript/mastodon/locales/fi.json | 2 +- app/javascript/mastodon/locales/fo.json | 4 +- app/javascript/mastodon/locales/fr-CA.json | 1 - app/javascript/mastodon/locales/fr.json | 1 - app/javascript/mastodon/locales/fy.json | 1 - app/javascript/mastodon/locales/ga.json | 1 - app/javascript/mastodon/locales/gd.json | 1 - app/javascript/mastodon/locales/gl.json | 6 +-- app/javascript/mastodon/locales/he.json | 2 +- app/javascript/mastodon/locales/hi.json | 1 + app/javascript/mastodon/locales/hr.json | 1 - app/javascript/mastodon/locales/hu.json | 2 +- app/javascript/mastodon/locales/hy.json | 1 - app/javascript/mastodon/locales/ia.json | 3 +- app/javascript/mastodon/locales/id.json | 1 - app/javascript/mastodon/locales/ie.json | 1 - app/javascript/mastodon/locales/io.json | 1 - app/javascript/mastodon/locales/is.json | 4 +- app/javascript/mastodon/locales/it.json | 2 +- app/javascript/mastodon/locales/ja.json | 1 - app/javascript/mastodon/locales/ka.json | 1 - app/javascript/mastodon/locales/kab.json | 1 - app/javascript/mastodon/locales/kk.json | 1 - app/javascript/mastodon/locales/ko.json | 22 +++++------ app/javascript/mastodon/locales/ku.json | 1 - app/javascript/mastodon/locales/kw.json | 1 - app/javascript/mastodon/locales/la.json | 1 - app/javascript/mastodon/locales/lad.json | 1 - app/javascript/mastodon/locales/lt.json | 2 +- app/javascript/mastodon/locales/lv.json | 1 - app/javascript/mastodon/locales/ms.json | 1 - app/javascript/mastodon/locales/my.json | 1 - app/javascript/mastodon/locales/nl.json | 2 +- app/javascript/mastodon/locales/nn.json | 4 +- app/javascript/mastodon/locales/no.json | 1 - app/javascript/mastodon/locales/oc.json | 1 - app/javascript/mastodon/locales/pl.json | 2 +- app/javascript/mastodon/locales/pt-BR.json | 4 +- app/javascript/mastodon/locales/pt-PT.json | 1 - app/javascript/mastodon/locales/ro.json | 1 - app/javascript/mastodon/locales/ru.json | 1 - app/javascript/mastodon/locales/sa.json | 1 - app/javascript/mastodon/locales/sc.json | 1 - app/javascript/mastodon/locales/sco.json | 1 - app/javascript/mastodon/locales/sk.json | 1 - app/javascript/mastodon/locales/sl.json | 1 - app/javascript/mastodon/locales/sq.json | 4 +- app/javascript/mastodon/locales/sr-Latn.json | 1 - app/javascript/mastodon/locales/sr.json | 1 - app/javascript/mastodon/locales/sv.json | 2 +- app/javascript/mastodon/locales/ta.json | 1 - app/javascript/mastodon/locales/te.json | 1 - app/javascript/mastodon/locales/th.json | 1 - app/javascript/mastodon/locales/tok.json | 1 - app/javascript/mastodon/locales/tr.json | 2 +- app/javascript/mastodon/locales/uk.json | 5 ++- app/javascript/mastodon/locales/uz.json | 1 - app/javascript/mastodon/locales/vi.json | 1 - app/javascript/mastodon/locales/zgh.json | 1 - app/javascript/mastodon/locales/zh-CN.json | 2 +- app/javascript/mastodon/locales/zh-HK.json | 1 - app/javascript/mastodon/locales/zh-TW.json | 2 +- config/locales/activerecord.ca.yml | 6 +++ config/locales/activerecord.da.yml | 6 +++ config/locales/activerecord.de.yml | 6 +++ config/locales/activerecord.en-GB.yml | 6 +++ config/locales/activerecord.fi.yml | 6 +++ config/locales/activerecord.fo.yml | 6 +++ config/locales/activerecord.gl.yml | 6 +++ config/locales/activerecord.he.yml | 6 +++ config/locales/activerecord.hu.yml | 6 +++ config/locales/activerecord.ia.yml | 5 +++ config/locales/activerecord.is.yml | 6 +++ config/locales/activerecord.it.yml | 6 +++ config/locales/activerecord.lt.yml | 6 +++ config/locales/activerecord.nl.yml | 6 +++ config/locales/activerecord.nn.yml | 6 +++ config/locales/activerecord.pl.yml | 6 +++ config/locales/activerecord.pt-BR.yml | 6 +++ config/locales/activerecord.sv.yml | 2 + config/locales/activerecord.tr.yml | 6 +++ config/locales/activerecord.uk.yml | 6 +++ config/locales/activerecord.zh-CN.yml | 6 +++ config/locales/activerecord.zh-TW.yml | 6 +++ config/locales/ca.yml | 20 ++++++++++ config/locales/da.yml | 7 ++++ config/locales/de.yml | 8 ++++ config/locales/en-GB.yml | 41 ++++++++++++++++++++ config/locales/fi.yml | 5 +++ config/locales/fo.yml | 8 ++++ config/locales/gl.yml | 7 ++++ config/locales/he.yml | 8 ++++ config/locales/hu.yml | 10 ++++- config/locales/ia.yml | 6 +++ config/locales/is.yml | 8 ++++ config/locales/it.yml | 7 ++++ config/locales/lt.yml | 8 ++++ config/locales/nl.yml | 7 ++++ config/locales/nn.yml | 10 +++++ config/locales/pl.yml | 8 ++++ config/locales/pt-BR.yml | 11 ++++++ config/locales/simple_form.ca.yml | 2 + config/locales/simple_form.da.yml | 2 + config/locales/simple_form.de.yml | 2 + config/locales/simple_form.en-GB.yml | 3 ++ config/locales/simple_form.fi.yml | 1 + config/locales/simple_form.fo.yml | 2 + config/locales/simple_form.gl.yml | 2 + config/locales/simple_form.he.yml | 2 + config/locales/simple_form.hu.yml | 2 + config/locales/simple_form.ia.yml | 1 + config/locales/simple_form.is.yml | 2 + config/locales/simple_form.it.yml | 2 + config/locales/simple_form.lt.yml | 2 + config/locales/simple_form.nl.yml | 2 + config/locales/simple_form.nn.yml | 3 ++ config/locales/simple_form.pl.yml | 2 + config/locales/simple_form.pt-BR.yml | 3 ++ config/locales/simple_form.tr.yml | 2 + config/locales/simple_form.uk.yml | 2 + config/locales/simple_form.zh-CN.yml | 2 + config/locales/simple_form.zh-TW.yml | 2 + config/locales/sq.yml | 1 + config/locales/sv.yml | 4 ++ config/locales/tr.yml | 9 ++++- config/locales/uk.yml | 8 ++++ config/locales/zh-CN.yml | 7 ++++ config/locales/zh-TW.yml | 7 ++++ 151 files changed, 435 insertions(+), 99 deletions(-) diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json index 7974cea640..893882fe7a 100644 --- a/app/javascript/mastodon/locales/an.json +++ b/app/javascript/mastodon/locales/an.json @@ -308,7 +308,6 @@ "lists.search": "Buscar entre la chent a la quala sigues", "lists.subheading": "Las tuyas listas", "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}", - "media_gallery.toggle_visible": "{number, plural, one {Amaga la imachen} other {Amaga las imáchens}}", "moved_to_account_banner.text": "La tuya cuenta {disabledAccount} ye actualment deshabilitada perque t'has mudau a {movedToAccount}.", "navigation_bar.about": "Sobre", "navigation_bar.blocks": "Usuarios blocaus", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 722f2bc98b..0dbeb0a190 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -443,7 +443,6 @@ "lists.subheading": "قوائمك", "load_pending": "{count, plural, one {# عنصر جديد} other {# عناصر جديدة}}", "loading_indicator.label": "جاري التحميل…", - "media_gallery.toggle_visible": "{number, plural, zero {} one {اخف الصورة} two {اخف الصورتين} few {اخف الصور} many {اخف الصور} other {اخف الصور}}", "moved_to_account_banner.text": "حسابك {disabledAccount} معطل حاليًا لأنك انتقلت إلى {movedToAccount}.", "mute_modal.hide_from_notifications": "إخفاء من قائمة الإشعارات", "mute_modal.hide_options": "إخفاء الخيارات", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 74eb7021d3..507703023c 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -268,7 +268,6 @@ "lists.search": "Buscar ente los perfiles que sigues", "lists.subheading": "Les tos llistes", "load_pending": "{count, plural, one {# elementu nuevu} other {# elementos nuevos}}", - "media_gallery.toggle_visible": "{number, plural, one {Anubrir la imaxe} other {Anubrir les imáxenes}}", "navigation_bar.about": "Tocante a", "navigation_bar.blocks": "Perfiles bloquiaos", "navigation_bar.bookmarks": "Marcadores", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 57431b0a57..412eae1481 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -437,7 +437,6 @@ "lists.subheading": "Вашыя спісы", "load_pending": "{count, plural, one {# новы элемент} few {# новыя элементы} many {# новых элементаў} other {# новых элементаў}}", "loading_indicator.label": "Загрузка…", - "media_gallery.toggle_visible": "{number, plural, one {Схаваць відарыс} other {Схаваць відарысы}}", "moved_to_account_banner.text": "Ваш уліковы запіс {disabledAccount} зараз адключаны таму што вы перанесены на {movedToAccount}.", "mute_modal.hide_from_notifications": "Схаваць з апавяшчэнняў", "mute_modal.hide_options": "Схаваць опцыі", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 828092d430..b89b539dcf 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -444,7 +444,6 @@ "lists.subheading": "Вашите списъци", "load_pending": "{count, plural, one {# нов елемент} other {# нови елемента}}", "loading_indicator.label": "Зареждане…", - "media_gallery.toggle_visible": "Скриване на {number, plural, one {изображение} other {изображения}}", "moved_to_account_banner.text": "Вашият акаунт {disabledAccount} сега е изключен, защото се преместихте в {movedToAccount}.", "mute_modal.hide_from_notifications": "Скриване от известията", "mute_modal.hide_options": "Скриване на възможностите", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 584bf303b1..df97abdff5 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -288,7 +288,6 @@ "lists.search": "যাদের অনুসরণ করেন তাদের ভেতরে খুঁজুন", "lists.subheading": "আপনার তালিকা", "load_pending": "{count, plural, one {# নতুন জিনিস} other {# নতুন জিনিস}}", - "media_gallery.toggle_visible": "দৃশ্যতার অবস্থা বদলান", "navigation_bar.about": "পরিচিতি", "navigation_bar.blocks": "বন্ধ করা ব্যবহারকারী", "navigation_bar.bookmarks": "বুকমার্ক", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index c8bb4975de..226ff756ff 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -360,7 +360,6 @@ "lists.subheading": "Ho listennoù", "load_pending": "{count, plural, one {# dra nevez} other {# dra nevez}}", "loading_indicator.label": "O kargañ…", - "media_gallery.toggle_visible": "{number, plural, one {Kuzhat ar skeudenn} other {Kuzhat ar skeudenn}}", "navigation_bar.about": "Diwar-benn", "navigation_bar.blocks": "Implijer·ezed·ien berzet", "navigation_bar.bookmarks": "Sinedoù", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 5981c1df84..91f28bd151 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -457,7 +457,7 @@ "lists.subheading": "Les teves llistes", "load_pending": "{count, plural, one {# element nou} other {# elements nous}}", "loading_indicator.label": "Es carrega…", - "media_gallery.toggle_visible": "{number, plural, one {Amaga la imatge} other {Amaga les imatges}}", + "media_gallery.hide": "Amaga", "moved_to_account_banner.text": "El teu compte {disabledAccount} està desactivat perquè l'has mogut a {movedToAccount}.", "mute_modal.hide_from_notifications": "Amaga de les notificacions", "mute_modal.hide_options": "Amaga les opcions", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index 9def7533ae..61b81c9f31 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -355,7 +355,6 @@ "lists.search": "بگەڕێ لەناو ئەو کەسانەی کە شوێنیان کەوتویت", "lists.subheading": "لیستەکانت", "load_pending": "{count, plural, one {# بەڕگەی نوێ} other {# بەڕگەی نوێ}}", - "media_gallery.toggle_visible": "شاردنەوەی {number, plural, one {image} other {images}}", "moved_to_account_banner.text": "ئەکاونتەکەت {disabledAccount} لە ئێستادا لەکارخراوە چونکە تۆ چوویتە {movedToAccount}.", "navigation_bar.about": "دەربارە", "navigation_bar.blocks": "بەکارهێنەرە بلۆککراوەکان", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 3a72ecd3fb..180616b782 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -214,7 +214,6 @@ "lists.search": "Circà indè i vostr'abbunamenti", "lists.subheading": "E vo liste", "load_pending": "{count, plural, one {# entrata nova} other {# entrate nove}}", - "media_gallery.toggle_visible": "Piattà {number, plural, one {ritrattu} other {ritratti}}", "navigation_bar.blocks": "Utilizatori bluccati", "navigation_bar.bookmarks": "Segnalibri", "navigation_bar.community_timeline": "Linea pubblica lucale", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 116a9c0148..8dd8f31fa8 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -435,7 +435,6 @@ "lists.subheading": "Vaše seznamy", "load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položek} other {# nových položek}}", "loading_indicator.label": "Načítání…", - "media_gallery.toggle_visible": "{number, plural, one {Skrýt obrázek} few {Skrýt obrázky} many {Skrýt obrázky} other {Skrýt obrázky}}", "moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován, protože jste se přesunul/a na {movedToAccount}.", "mute_modal.hide_from_notifications": "Skrýt z notifikací", "mute_modal.hide_options": "Skrýt možnosti", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 158f31aeb3..d34b7a970d 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -457,7 +457,6 @@ "lists.subheading": "Eich rhestrau", "load_pending": "{count, plural, one {# eitem newydd} other {# eitem newydd}}", "loading_indicator.label": "Yn llwytho…", - "media_gallery.toggle_visible": "{number, plural, one {Cuddio delwedd} other {Cuddio delwedd}}", "moved_to_account_banner.text": "Ar hyn y bryd, mae eich cyfrif {disabledAccount} wedi ei analluogi am i chi symud i {movedToAccount}.", "mute_modal.hide_from_notifications": "Cuddio rhag hysbysiadau", "mute_modal.hide_options": "Cuddio'r dewis", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 4155dc9fc5..dea313ffed 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -457,7 +457,7 @@ "lists.subheading": "Dine lister", "load_pending": "{count, plural, one {# nyt emne} other {# nye emner}}", "loading_indicator.label": "Indlæser…", - "media_gallery.toggle_visible": "{number, plural, one {Skjul billede} other {Skjul billeder}}", + "media_gallery.hide": "Skjul", "moved_to_account_banner.text": "Din konto {disabledAccount} er pt. deaktiveret, da du flyttede til {movedToAccount}.", "mute_modal.hide_from_notifications": "Skjul fra notifikationer", "mute_modal.hide_options": "Skjul valgmuligheder", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index e37a595469..46bb08d7cb 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -457,7 +457,7 @@ "lists.subheading": "Deine Listen", "load_pending": "{count, plural, one {# neuer Beitrag} other {# neue Beiträge}}", "loading_indicator.label": "Wird geladen …", - "media_gallery.toggle_visible": "{number, plural, one {Medium ausblenden} other {Medien ausblenden}}", + "media_gallery.hide": "Ausblenden", "moved_to_account_banner.text": "Dein Konto {disabledAccount} ist derzeit deaktiviert, weil du zu {movedToAccount} umgezogen bist.", "mute_modal.hide_from_notifications": "Benachrichtigungen ausblenden", "mute_modal.hide_options": "Einstellungen ausblenden", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index a3adaaf9d1..64a603923e 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -452,7 +452,6 @@ "lists.subheading": "Οι λίστες σου", "load_pending": "{count, plural, one {# νέο στοιχείο} other {# νέα στοιχεία}}", "loading_indicator.label": "Φόρτωση…", - "media_gallery.toggle_visible": "{number, plural, one {Απόκρυψη εικόνας} other {Απόκρυψη εικόνων}}", "moved_to_account_banner.text": "Ο λογαριασμός σου {disabledAccount} είναι προσωρινά απενεργοποιημένος επειδή μεταφέρθηκες στον {movedToAccount}.", "mute_modal.hide_from_notifications": "Απόκρυψη από ειδοποιήσεις", "mute_modal.hide_options": "Απόκρυψη επιλογών", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index e9007c8654..c727b8e49f 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -457,7 +457,7 @@ "lists.subheading": "Your lists", "load_pending": "{count, plural, one {# new item} other {# new items}}", "loading_indicator.label": "Loading…", - "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}", + "media_gallery.hide": "Hide", "moved_to_account_banner.text": "Your account {disabledAccount} is currently disabled because you moved to {movedToAccount}.", "mute_modal.hide_from_notifications": "Hide from notifications", "mute_modal.hide_options": "Hide options", @@ -780,6 +780,7 @@ "status.bookmark": "Bookmark", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", + "status.continued_thread": "Continued thread", "status.copy": "Copy link to status", "status.delete": "Delete", "status.detailed_status": "Detailed conversation view", @@ -813,6 +814,7 @@ "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.", "status.redraft": "Delete & re-draft", "status.remove_bookmark": "Remove bookmark", + "status.replied_in_thread": "Replied in thread", "status.replied_to": "Replied to {name}", "status.reply": "Reply", "status.replyAll": "Reply to thread", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 40eee9805a..d8ec27748e 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -390,7 +390,6 @@ "lists.subheading": "Viaj listoj", "load_pending": "{count,plural, one {# nova elemento} other {# novaj elementoj}}", "loading_indicator.label": "Ŝargado…", - "media_gallery.toggle_visible": "{number, plural, one {Kaŝi la bildon} other {Kaŝi la bildojn}}", "moved_to_account_banner.text": "Via konto {disabledAccount} estas malvalidigita ĉar vi movis ĝin al {movedToAccount}.", "navigation_bar.about": "Pri", "navigation_bar.advanced_interface": "Malfermi altnivelan retpaĝan interfacon", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 20d93ed011..a0f91c4760 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -457,7 +457,6 @@ "lists.subheading": "Tus listas", "load_pending": "{count, plural, one {# elemento nuevo} other {# elementos nuevos}}", "loading_indicator.label": "Cargando…", - "media_gallery.toggle_visible": "Ocultar {number, plural, one {imagen} other {imágenes}}", "moved_to_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada porque te mudaste a {movedToAccount}.", "mute_modal.hide_from_notifications": "Ocultar en las notificaciones", "mute_modal.hide_options": "Ocultar opciones", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 348300f728..63f3d53812 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -457,7 +457,6 @@ "lists.subheading": "Tus listas", "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}", "loading_indicator.label": "Cargando…", - "media_gallery.toggle_visible": "Cambiar visibilidad", "moved_to_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada porque te has mudado a {movedToAccount}.", "mute_modal.hide_from_notifications": "Ocultar de las notificaciones", "mute_modal.hide_options": "Ocultar opciones", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 85b160d7a8..b01eb68222 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -457,7 +457,6 @@ "lists.subheading": "Tus listas", "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}", "loading_indicator.label": "Cargando…", - "media_gallery.toggle_visible": "Cambiar visibilidad", "moved_to_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada porque te has mudado a {movedToAccount}.", "mute_modal.hide_from_notifications": "Ocultar de las notificaciones", "mute_modal.hide_options": "Ocultar opciones", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index d0fc80e60c..ca37a152fe 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -457,7 +457,6 @@ "lists.subheading": "Sinu nimekirjad", "load_pending": "{count, plural, one {# uus kirje} other {# uut kirjet}}", "loading_indicator.label": "Laadimine…", - "media_gallery.toggle_visible": "{number, plural, one {Varja pilt} other {Varja pildid}}", "moved_to_account_banner.text": "Kontot {disabledAccount} ei ole praegu võimalik kasutada, sest kolisid kontole {movedToAccount}.", "mute_modal.hide_from_notifications": "Peida teavituste hulgast", "mute_modal.hide_options": "Peida valikud", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index f169e2905b..15dd63486b 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -457,7 +457,6 @@ "lists.subheading": "Zure zerrendak", "load_pending": "{count, plural, one {elementu berri #} other {# elementu berri}}", "loading_indicator.label": "Kargatzen…", - "media_gallery.toggle_visible": "Txandakatu ikusgaitasuna", "moved_to_account_banner.text": "Zure {disabledAccount} kontua desgaituta dago une honetan, {movedToAccount} kontura aldatu zinelako.", "mute_modal.hide_from_notifications": "Ezkutatu jakinarazpenetatik", "mute_modal.hide_options": "Ezkutatu aukerak", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 50c376b3bd..d2b520e1d2 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -447,7 +447,6 @@ "lists.subheading": "سیاهه‌هایتان", "load_pending": "{count, plural, one {# مورد جدید} other {# مورد جدید}}", "loading_indicator.label": "در حال بارگذاری…", - "media_gallery.toggle_visible": "{number, plural, one {نهفتن تصویر} other {نهفتن تصاویر}}", "moved_to_account_banner.text": "حسابتان {disabledAccount} اکنون از کار افتاده؛ چرا که به {movedToAccount} منتقل شدید.", "mute_modal.hide_from_notifications": "نهفتن از آگاهی‌ها", "mute_modal.hide_options": "گزینه‌های نهفتن", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 8f9cc5fe4d..d8c5b72040 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -457,7 +457,7 @@ "lists.subheading": "Omat listasi", "load_pending": "{count, plural, one {# uusi kohde} other {# uutta kohdetta}}", "loading_indicator.label": "Ladataan…", - "media_gallery.toggle_visible": "{number, plural, one {Piilota kuva} other {Piilota kuvat}}", + "media_gallery.hide": "Piilota", "moved_to_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä, koska teit siirron tiliin {movedToAccount}.", "mute_modal.hide_from_notifications": "Piilota ilmoituksista", "mute_modal.hide_options": "Piilota vaihtoehdot", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index d4e5d9ad54..6e7eb3b7c2 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -457,7 +457,7 @@ "lists.subheading": "Tínir listar", "load_pending": "{count, plural, one {# nýtt evni} other {# nýggj evni}}", "loading_indicator.label": "Innlesur…", - "media_gallery.toggle_visible": "{number, plural, one {Fjal mynd} other {Fjal myndir}}", + "media_gallery.hide": "Fjal", "moved_to_account_banner.text": "Konta tín {disabledAccount} er í løtuni óvirkin, tí tú flutti til {movedToAccount}.", "mute_modal.hide_from_notifications": "Fjal boð", "mute_modal.hide_options": "Fjal valmøguleikar", @@ -780,6 +780,7 @@ "status.bookmark": "Goym", "status.cancel_reblog_private": "Strika stimbran", "status.cannot_reblog": "Tað ber ikki til at stimbra hendan postin", + "status.continued_thread": "Framhaldandi tráður", "status.copy": "Kopiera leinki til postin", "status.delete": "Strika", "status.detailed_status": "Útgreinað samrøðusýni", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Eingin hevur stimbrað hendan postin enn. Tá onkur stimbrar postin, verður hann sjónligur her.", "status.redraft": "Strika & ger nýggja kladdu", "status.remove_bookmark": "Gloym", + "status.replied_in_thread": "Svaraði í tráðnum", "status.replied_to": "Svaraði {name}", "status.reply": "Svara", "status.replyAll": "Svara tráðnum", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index a1d4061eba..9f51aaaa7d 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -456,7 +456,6 @@ "lists.subheading": "Vos listes", "load_pending": "{count, plural, one {# nouvel élément} other {# nouveaux éléments}}", "loading_indicator.label": "Chargement…", - "media_gallery.toggle_visible": "{number, plural, one {Cacher l’image} other {Cacher les images}}", "moved_to_account_banner.text": "Votre compte {disabledAccount} est actuellement désactivé parce que vous avez déménagé sur {movedToAccount}.", "mute_modal.hide_from_notifications": "Cacher des notifications", "mute_modal.hide_options": "Masquer les options", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 9f55634b29..5bcc1c946b 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -456,7 +456,6 @@ "lists.subheading": "Vos listes", "load_pending": "{count, plural, one {# nouvel élément} other {# nouveaux éléments}}", "loading_indicator.label": "Chargement…", - "media_gallery.toggle_visible": "{number, plural, one {Cacher l’image} other {Cacher les images}}", "moved_to_account_banner.text": "Votre compte {disabledAccount} est actuellement désactivé parce que vous l'avez déplacé à {movedToAccount}.", "mute_modal.hide_from_notifications": "Cacher des notifications", "mute_modal.hide_options": "Masquer les options", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index bb409b63c1..badd6a1c21 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -457,7 +457,6 @@ "lists.subheading": "Jo listen", "load_pending": "{count, plural, one {# nij item} other {# nije items}}", "loading_indicator.label": "Lade…", - "media_gallery.toggle_visible": "{number, plural, one {ôfbylding ferstopje} other {ôfbyldingen ferstopje}}", "moved_to_account_banner.text": "Omdat jo nei {movedToAccount} ferhuze binne is jo account {disabledAccount} op dit stuit útskeakele.", "mute_modal.hide_from_notifications": "Meldingen ferstopje", "mute_modal.hide_options": "Opsjes ferstopje", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index b51d4adf68..95bb293854 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -457,7 +457,6 @@ "lists.subheading": "Do liostaí", "load_pending": "{count, plural, one {# mír nua} two {# mír nua} few {# mír nua} many {# mír nua} other {# mír nua}}", "loading_indicator.label": "Á lódáil…", - "media_gallery.toggle_visible": "{number, plural, one {Folaigh íomhá} two {Folaigh íomhánna} few {Folaigh íomhánna} many {Folaigh íomhánna} other {Folaigh íomhánna}}", "moved_to_account_banner.text": "Tá do chuntas {disabledAccount} díchumasaithe faoi láthair toisc gur bhog tú go {movedToAccount}.", "mute_modal.hide_from_notifications": "Folaigh ó fhógraí", "mute_modal.hide_options": "Folaigh roghanna", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 1090df0881..e2f67bc296 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -457,7 +457,6 @@ "lists.subheading": "Na liostaichean agad", "load_pending": "{count, plural, one {# nì ùr} two {# nì ùr} few {# nithean ùra} other {# nì ùr}}", "loading_indicator.label": "’Ga luchdadh…", - "media_gallery.toggle_visible": "{number, plural, 1 {Falaich an dealbh} one {Falaich na dealbhan} two {Falaich na dealbhan} few {Falaich na dealbhan} other {Falaich na dealbhan}}", "moved_to_account_banner.text": "Tha an cunntas {disabledAccount} agad à comas on a rinn thu imrich gu {movedToAccount}.", "mute_modal.hide_from_notifications": "Falaich o na brathan", "mute_modal.hide_options": "Roghainnean falaich", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index df477fe9e2..b0b530e88f 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -315,7 +315,7 @@ "follow_suggestions.curated_suggestion": "Suxestións do Servidor", "follow_suggestions.dismiss": "Non mostrar máis", "follow_suggestions.featured_longer": "Elección persoal do equipo de {domain}", - "follow_suggestions.friends_of_friends_longer": "Popular entre as persoas que sigues", + "follow_suggestions.friends_of_friends_longer": "Popular entre as persoas que segues", "follow_suggestions.hints.featured": "Este perfil foi escollido pola administración de {domain}.", "follow_suggestions.hints.friends_of_friends": "Este perfil é popular entre as persoas que segues.", "follow_suggestions.hints.most_followed": "Este perfil é un dos máis seguidos en {domain}.", @@ -457,9 +457,9 @@ "lists.subheading": "As túas listaxes", "load_pending": "{count, plural, one {# novo elemento} other {# novos elementos}}", "loading_indicator.label": "Estase a cargar…", - "media_gallery.toggle_visible": "Agochar {number, plural, one {imaxe} other {imaxes}}", + "media_gallery.hide": "Agochar", "moved_to_account_banner.text": "A túa conta {disabledAccount} está actualmente desactivada porque movéchela a {movedToAccount}.", - "mute_modal.hide_from_notifications": "Ocultar nas notificacións", + "mute_modal.hide_from_notifications": "Agochar nas notificacións", "mute_modal.hide_options": "Opcións ao ocultar", "mute_modal.indefinite": "Ata que as reactive", "mute_modal.show_options": "Mostrar opcións", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 47fc444e88..80d9f054cc 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -457,7 +457,7 @@ "lists.subheading": "הרשימות שלך", "load_pending": "{count, plural, one {# פריט חדש} other {# פריטים חדשים}}", "loading_indicator.label": "בטעינה…", - "media_gallery.toggle_visible": "{number, plural, one {להסתיר תמונה} two {להסתיר תמונותיים} many {להסתיר תמונות} other {להסתיר תמונות}}", + "media_gallery.hide": "להסתיר", "moved_to_account_banner.text": "חשבונך {disabledAccount} אינו פעיל כרגע עקב מעבר ל{movedToAccount}.", "mute_modal.hide_from_notifications": "להסתיר מהתראות", "mute_modal.hide_options": "הסתרת אפשרויות", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 0b40251730..58b04a20cd 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -367,6 +367,7 @@ "lists.replies_policy.none": "कोई नहीं", "lists.replies_policy.title": "इसके जवाब दिखाएं:", "lists.subheading": "आपकी सूचियाँ", + "media_gallery.hide": "छिपाएं", "navigation_bar.about": "विवरण", "navigation_bar.blocks": "ब्लॉक्ड यूज़र्स", "navigation_bar.bookmarks": "पुस्तकचिह्न:", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 0b42c49338..9f5782767b 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -310,7 +310,6 @@ "lists.replies_policy.none": "Nitko", "lists.search": "Traži među praćenim ljudima", "lists.subheading": "Vaše liste", - "media_gallery.toggle_visible": "Sakrij {number, plural, one {sliku} other {slike}}", "navigation_bar.about": "O aplikaciji", "navigation_bar.advanced_interface": "Otvori u naprednom web sučelju", "navigation_bar.blocks": "Blokirani korisnici", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index f0f08ca50c..1e4e02cb9d 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -457,7 +457,7 @@ "lists.subheading": "Saját listák", "load_pending": "{count, plural, one {# új elem} other {# új elem}}", "loading_indicator.label": "Betöltés…", - "media_gallery.toggle_visible": "{number, plural, one {Kép elrejtése} other {Képek elrejtése}}", + "media_gallery.hide": "Elrejtés", "moved_to_account_banner.text": "A(z) {disabledAccount} fiókod jelenleg le van tiltva, mert átköltöztél ide: {movedToAccount}.", "mute_modal.hide_from_notifications": "Elrejtés az értesítések közül", "mute_modal.hide_options": "Beállítások elrejtése", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 1d82e884ff..d1475338fd 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -289,7 +289,6 @@ "lists.search": "Փնտրել քո հետեւած մարդկանց մէջ", "lists.subheading": "Քո ցանկերը", "load_pending": "{count, plural, one {# նոր նիւթ} other {# նոր նիւթ}}", - "media_gallery.toggle_visible": "Ցուցադրել/թաքցնել", "navigation_bar.about": "Մասին", "navigation_bar.blocks": "Արգելափակուած օգտատէրեր", "navigation_bar.bookmarks": "Էջանիշեր", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 8a448920c1..9d7e3ff2c7 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -447,7 +447,7 @@ "lists.subheading": "Tu listas", "load_pending": "{count, plural, one {# nove entrata} other {# nove entratas}}", "loading_indicator.label": "Cargante…", - "media_gallery.toggle_visible": "{number, plural, one {Celar imagine} other {Celar imagines}}", + "media_gallery.hide": "Celar", "moved_to_account_banner.text": "Tu conto {disabledAccount} es actualmente disactivate perque tu ha cambiate de conto a {movedToAccount}.", "mute_modal.hide_from_notifications": "Celar in notificationes", "mute_modal.hide_options": "Celar optiones", @@ -784,6 +784,7 @@ "status.reblogs.empty": "Necuno ha ancora impulsate iste message. Quando alcuno lo face, le impulsos apparera hic.", "status.redraft": "Deler e reconciper", "status.remove_bookmark": "Remover marcapagina", + "status.replied_in_thread": "Respondite in le discussion", "status.replied_to": "Respondite a {name}", "status.reply": "Responder", "status.replyAll": "Responder al discussion", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 29f0bfda9d..3e2cc03145 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -403,7 +403,6 @@ "lists.subheading": "Daftar Anda", "load_pending": "{count, plural, other {# item baru}}", "loading_indicator.label": "Memuat…", - "media_gallery.toggle_visible": "Tampil/Sembunyikan", "moved_to_account_banner.text": "Akun {disabledAccount} Anda kini dinonaktifkan karena Anda pindah ke {movedToAccount}.", "mute_modal.hide_options": "Sembunyikan opsi", "mute_modal.title": "Bisukan pengguna?", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index 4002767cf9..7a176dfbb6 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -419,7 +419,6 @@ "lists.subheading": "Tui listes", "load_pending": "{count, plural, one {# nov element} other {# nov elementes}}", "loading_indicator.label": "Cargant…", - "media_gallery.toggle_visible": "{number, plural, one {Celar image} other {Celar images}}", "moved_to_account_banner.text": "Tui conto {disabledAccount} es actualmen desactivisat pro que tu movet te a {movedToAccount}.", "mute_modal.hide_from_notifications": "Celar de notificationes", "mute_modal.hide_options": "Celar optiones", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 1329875185..d0ccb923ba 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -362,7 +362,6 @@ "lists.subheading": "Vua listi", "load_pending": "{count, plural, one {# nova kozo} other {# nova kozi}}", "loading_indicator.label": "Kargante…", - "media_gallery.toggle_visible": "Chanjar videbleso", "moved_to_account_banner.text": "Vua konto {disabledAccount} es nune desaktiva pro ke vu movis a {movedToAccount}.", "navigation_bar.about": "Pri co", "navigation_bar.advanced_interface": "Apertez per retintervizajo", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 54fbee48e6..83932f1b4b 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -457,7 +457,7 @@ "lists.subheading": "Listarnir þínir", "load_pending": "{count, plural, one {# nýtt atriði} other {# ný atriði}}", "loading_indicator.label": "Hleð inn…", - "media_gallery.toggle_visible": "Víxla sýnileika", + "media_gallery.hide": "Fela", "moved_to_account_banner.text": "Aðgangurinn þinn {disabledAccount} er óvirkur í augnablikinu vegna þess að þú fluttir þig yfir á {movedToAccount}.", "mute_modal.hide_from_notifications": "Fela úr tilkynningum", "mute_modal.hide_options": "Fela valkosti", @@ -780,6 +780,7 @@ "status.bookmark": "Bókamerki", "status.cancel_reblog_private": "Taka úr endurbirtingu", "status.cannot_reblog": "Þessa færslu er ekki hægt að endurbirta", + "status.continued_thread": "Hélt samtali áfram", "status.copy": "Afrita tengil í færslu", "status.delete": "Eyða", "status.detailed_status": "Nákvæm spjallþráðasýn", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Enginn hefur ennþá endurbirt þessa færslu. Þegar einhver gerir það, mun það birtast hér.", "status.redraft": "Eyða og endurvinna drög", "status.remove_bookmark": "Fjarlægja bókamerki", + "status.replied_in_thread": "Svaraði í samtali", "status.replied_to": "Svaraði til {name}", "status.reply": "Svara", "status.replyAll": "Svara þræði", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 46d1fdd7ab..1c8cff5490 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -457,7 +457,7 @@ "lists.subheading": "Le tue liste", "load_pending": "{count, plural, one {# nuovo oggetto} other {# nuovi oggetti}}", "loading_indicator.label": "Caricamento…", - "media_gallery.toggle_visible": "{number, plural, one {Nascondi immagine} other {Nascondi immagini}}", + "media_gallery.hide": "Nascondi", "moved_to_account_banner.text": "Il tuo profilo {disabledAccount} è correntemente disabilitato perché ti sei spostato a {movedToAccount}.", "mute_modal.hide_from_notifications": "Nascondi dalle notifiche", "mute_modal.hide_options": "Nascondi le opzioni", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 489ff9c8e7..60dd8b12ea 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -457,7 +457,6 @@ "lists.subheading": "あなたのリスト", "load_pending": "{count}件の新着", "loading_indicator.label": "読み込み中…", - "media_gallery.toggle_visible": "{number, plural, one {画像を閉じる} other {画像を閉じる}}", "moved_to_account_banner.text": "あなたのアカウント『{disabledAccount}』は『{movedToAccount}』に移動したため現在無効になっています。", "mute_modal.hide_from_notifications": "通知をオフにする", "mute_modal.hide_options": "オプションを閉じる", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 5713fe60ee..0bd86a2476 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -153,7 +153,6 @@ "lists.new.title_placeholder": "ახალი სიის სათაური", "lists.search": "ძებნა ადამიანებს შორის რომელთაც მიჰყვებით", "lists.subheading": "თქვენი სიები", - "media_gallery.toggle_visible": "ხილვადობის ჩართვა", "navigation_bar.blocks": "დაბლოკილი მომხმარებლები", "navigation_bar.community_timeline": "ლოკალური თაიმლაინი", "navigation_bar.compose": "Compose new toot", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index a1e95fd8d1..ae783b6c24 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -351,7 +351,6 @@ "lists.subheading": "Tibdarin-ik·im", "load_pending": "{count, plural, one {# n uferdis amaynut} other {# n yiferdisen imaynuten}}", "loading_indicator.label": "Yessalay-d …", - "media_gallery.toggle_visible": "{number, plural, one {Ffer tugna} other {Ffer tugniwin}}", "mute_modal.hide_from_notifications": "Ffer-it deg ulɣuten", "mute_modal.hide_options": "Ffer tinefrunin", "mute_modal.indefinite": "Alamma ssnesreɣ asgugem fell-as", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index 85b2fdc005..eace5d95b8 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -222,7 +222,6 @@ "lists.search": "Сіз іздеген адамдар арасында іздеу", "lists.subheading": "Тізімдеріңіз", "load_pending": "{count, plural, one {# жаңа нәрсе} other {# жаңа нәрсе}}", - "media_gallery.toggle_visible": "Көрінуді қосу", "navigation_bar.blocks": "Бұғатталғандар", "navigation_bar.bookmarks": "Бетбелгілер", "navigation_bar.community_timeline": "Жергілікті желі", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index b3d3476e4f..4c78f4332e 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -34,9 +34,9 @@ "account.follow_back": "맞팔로우 하기", "account.followers": "팔로워", "account.followers.empty": "아직 아무도 이 사용자를 팔로우하고 있지 않습니다.", - "account.followers_counter": "{count, plural, other {{counter} 팔로워}}", + "account.followers_counter": "{count, plural, other {팔로워 {counter}명}}", "account.following": "팔로잉", - "account.following_counter": "{count, plural, other {{counter} 팔로잉}}", + "account.following_counter": "{count, plural, other {팔로잉 {counter}명}}", "account.follows.empty": "이 사용자는 아직 아무도 팔로우하고 있지 않습니다.", "account.go_to_profile": "프로필로 이동", "account.hide_reblogs": "@{name}의 부스트를 숨기기", @@ -62,7 +62,7 @@ "account.requested_follow": "{name} 님이 팔로우 요청을 보냈습니다", "account.share": "@{name}의 프로필 공유", "account.show_reblogs": "@{name}의 부스트 보기", - "account.statuses_counter": "{count, plural, other {{counter} 게시물}}", + "account.statuses_counter": "{count, plural, other {게시물 {counter}개}}", "account.unblock": "차단 해제", "account.unblock_domain": "도메인 {domain} 차단 해제", "account.unblock_short": "차단 해제", @@ -156,7 +156,7 @@ "compose_form.placeholder": "지금 무슨 생각을 하고 있나요?", "compose_form.poll.duration": "투표 기간", "compose_form.poll.multiple": "다중 선택", - "compose_form.poll.option_placeholder": "{option}번째 항목", + "compose_form.poll.option_placeholder": "{number}번째 옵션", "compose_form.poll.single": "단일 선택", "compose_form.poll.switch_to_multiple": "다중 선택이 가능한 투표로 변경", "compose_form.poll.switch_to_single": "단일 선택 투표로 변경", @@ -347,12 +347,12 @@ "hashtag.column_settings.tag_mode.any": "어느것이든", "hashtag.column_settings.tag_mode.none": "이것들을 제외하고", "hashtag.column_settings.tag_toggle": "추가 해시태그를 이 컬럼에 추가합니다", - "hashtag.counter_by_accounts": "{count, plural, other {{counter} 명의 참여자}}", - "hashtag.counter_by_uses": "{count, plural, other {{counter} 개의 게시물}}", - "hashtag.counter_by_uses_today": "오늘 {count, plural, other {{counter} 개의 게시물}}", - "hashtag.follow": "팔로우", - "hashtag.unfollow": "팔로우 해제", - "hashtags.and_other": "…그리고 {count, plural,other {# 개 더}}", + "hashtag.counter_by_accounts": "{count, plural, other {참여자 {counter}명}}", + "hashtag.counter_by_uses": "{count, plural, other {게시물 {counter}개}}", + "hashtag.counter_by_uses_today": "금일 {count, plural, other {게시물 {counter}개}}", + "hashtag.follow": "해시태그 팔로우", + "hashtag.unfollow": "해시태그 팔로우 해제", + "hashtags.and_other": "…및 {count, plural,other {#개}}", "hints.profiles.followers_may_be_missing": "이 프로필의 팔로워 목록은 일부 누락되었을 수 있습니다.", "hints.profiles.follows_may_be_missing": "이 프로필의 팔로우 목록은 일부 누락되었을 수 있습니다.", "hints.profiles.posts_may_be_missing": "이 프로필의 게시물은 일부 누락되었을 수 있습니다.", @@ -457,7 +457,7 @@ "lists.subheading": "리스트", "load_pending": "{count, plural, other {#}} 개의 새 항목", "loading_indicator.label": "불러오는 중...", - "media_gallery.toggle_visible": "이미지 숨기기", + "media_gallery.hide": "숨기기", "moved_to_account_banner.text": "당신의 계정 {disabledAccount}는 {movedToAccount}로 이동하였기 때문에 현재 비활성화 상태입니다.", "mute_modal.hide_from_notifications": "알림에서 숨기기", "mute_modal.hide_options": "옵션 숨기기", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index 73cfa69f42..d69f4b0d05 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -313,7 +313,6 @@ "lists.search": "Di navbera kesên ku te dişopînin bigere", "lists.subheading": "Lîsteyên te", "load_pending": "{count, plural, one {# hêmaneke nû} other {#hêmaneke nû}}", - "media_gallery.toggle_visible": "{number, plural, one {Wêneyê veşêre} other {Wêneyan veşêre}}", "moved_to_account_banner.text": "Ajimêrê te {disabledAccount} niha neçalak e ji ber ku te bar kir bo {movedToAccount}.", "navigation_bar.about": "Derbar", "navigation_bar.blocks": "Bikarhênerên astengkirî", diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json index 0d60d09e30..046910daf8 100644 --- a/app/javascript/mastodon/locales/kw.json +++ b/app/javascript/mastodon/locales/kw.json @@ -213,7 +213,6 @@ "lists.search": "Hwilas yn-mysk tus a holyewgh", "lists.subheading": "Agas rolyow", "load_pending": "{count, plural, one {# daklennowydh} other {# a daklennow nowydh}}", - "media_gallery.toggle_visible": "Hide {number, plural, one {aven} other {aven}}", "navigation_bar.blocks": "Devnydhyoryon lettys", "navigation_bar.bookmarks": "Folennosow", "navigation_bar.community_timeline": "Amserlin leel", diff --git a/app/javascript/mastodon/locales/la.json b/app/javascript/mastodon/locales/la.json index dc07961441..d894cc01c6 100644 --- a/app/javascript/mastodon/locales/la.json +++ b/app/javascript/mastodon/locales/la.json @@ -141,7 +141,6 @@ "lists.new.create": "Addere tabella", "lists.subheading": "Tuae tabulae", "load_pending": "{count, plural, one {# novum item} other {# nova itema}}", - "media_gallery.toggle_visible": "{number, plural, one {Cēla imaginem} other {Cēla imagines}}", "moved_to_account_banner.text": "Tua ratione {disabledAccount} interdum reposita est, quod ad {movedToAccount} migrāvisti.", "mute_modal.you_wont_see_mentions": "Non videbis nuntios quī eōs commemorant.", "navigation_bar.about": "De", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 3d0bfcb4be..e63c22ec69 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -418,7 +418,6 @@ "lists.subheading": "Tus listas", "load_pending": "{count, plural, one {# muevo elemento} other {# muevos elementos}}", "loading_indicator.label": "Eskargando…", - "media_gallery.toggle_visible": "{number, plural, one {Eskonde imaje} other {Eskonde imajes}}", "moved_to_account_banner.text": "Tu kuento {disabledAccount} esta aktualmente inkapasitado porke transferates a {movedToAccount}.", "mute_modal.hide_from_notifications": "Eskonde de avizos", "mute_modal.hide_options": "Eskonde opsyones", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 55ef2afce8..cc905e3a21 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -457,7 +457,7 @@ "lists.subheading": "Tavo sąrašai", "load_pending": "{count, plural, one {# naujas elementas} few {# nauji elementai} many {# naujo elemento} other {# naujų elementų}}", "loading_indicator.label": "Kraunama…", - "media_gallery.toggle_visible": "{number, plural, one {Slėpti vaizdą} few {Slėpti vaizdus} many {Slėpti vaizdo} other {Slėpti vaizdų}}", + "media_gallery.hide": "Slėpti", "moved_to_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu išjungta, nes persikėlei į {movedToAccount}.", "mute_modal.hide_from_notifications": "Slėpti nuo pranešimų", "mute_modal.hide_options": "Slėpti parinktis", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 6cd15afbec..37dc1d06db 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -388,7 +388,6 @@ "lists.subheading": "Tavi saraksti", "load_pending": "{count, plural, one {# jauna lieta} other {# jaunas lietas}}", "loading_indicator.label": "Ielādē…", - "media_gallery.toggle_visible": "{number, plural, one {Slēpt attēlu} other {Slēpt attēlus}}", "moved_to_account_banner.text": "Tavs konts {disabledAccount} pašlaik ir atspējots, jo Tu pārcēlies uz kontu {movedToAccount}.", "mute_modal.hide_from_notifications": "Paslēpt paziņojumos", "mute_modal.hide_options": "Paslēpt iespējas", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 4a32b1d820..c6bc630bfe 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -383,7 +383,6 @@ "lists.subheading": "Senarai anda", "load_pending": "{count, plural, one {# item baharu} other {# item baharu}}", "loading_indicator.label": "Memuatkan…", - "media_gallery.toggle_visible": "{number, plural, other {Sembunyikan imej}}", "moved_to_account_banner.text": "Akaun anda {disabledAccount} kini dinyahdayakan kerana anda berpindah ke {movedToAccount}.", "navigation_bar.about": "Perihal", "navigation_bar.advanced_interface": "Buka dalam antara muka web lanjutan", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index b042ebbcce..2127d69baa 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -362,7 +362,6 @@ "lists.subheading": "သင့်၏စာရင်းများ", "load_pending": "{count, plural, one {# new item} other {# new items}}", "loading_indicator.label": "လုပ်ဆောင်နေသည်…", - "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}", "moved_to_account_banner.text": "{movedToAccount} အကောင့်သို့ပြောင်းလဲထားသဖြင့် {disabledAccount} အကောင့်မှာပိတ်ထားသည်", "navigation_bar.about": "အကြောင်း", "navigation_bar.advanced_interface": "အဆင့်မြင့်ဝဘ်ပုံစံ ဖွင့်ပါ", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 7956435361..e5d8e8d2eb 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -457,7 +457,7 @@ "lists.subheading": "Jouw lijsten", "load_pending": "{count, plural, one {# nieuw item} other {# nieuwe items}}", "loading_indicator.label": "Laden…", - "media_gallery.toggle_visible": "{number, plural, one {afbeelding verbergen} other {afbeeldingen verbergen}}", + "media_gallery.hide": "Verbergen", "moved_to_account_banner.text": "Omdat je naar {movedToAccount} bent verhuisd is jouw account {disabledAccount} momenteel uitgeschakeld.", "mute_modal.hide_from_notifications": "Onder meldingen verbergen", "mute_modal.hide_options": "Opties verbergen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 393946ff18..d21ebffe22 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -457,7 +457,7 @@ "lists.subheading": "Listene dine", "load_pending": "{count, plural, one {# nytt element} other {# nye element}}", "loading_indicator.label": "Lastar…", - "media_gallery.toggle_visible": "{number, plural, one {Skjul bilete} other {Skjul bilete}}", + "media_gallery.hide": "Gøym", "moved_to_account_banner.text": "Kontoen din, {disabledAccount} er for tida deaktivert fordi du har flytta til {movedToAccount}.", "mute_modal.hide_from_notifications": "Ikkje vis varslingar", "mute_modal.hide_options": "Gøym val", @@ -780,6 +780,7 @@ "status.bookmark": "Set bokmerke", "status.cancel_reblog_private": "Opphev framheving", "status.cannot_reblog": "Du kan ikkje framheva dette innlegget", + "status.continued_thread": "Framhald til tråden", "status.copy": "Kopier lenke til status", "status.delete": "Slett", "status.detailed_status": "Detaljert samtalevisning", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Ingen har framheva dette tutet enno. Om nokon gjer, så dukkar det opp her.", "status.redraft": "Slett & skriv på nytt", "status.remove_bookmark": "Fjern bokmerke", + "status.replied_in_thread": "Svara i tråden", "status.replied_to": "Svarte {name}", "status.reply": "Svar", "status.replyAll": "Svar til tråd", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index bb41754e7d..b805b98528 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -457,7 +457,6 @@ "lists.subheading": "Dine lister", "load_pending": "{count, plural,one {# ny gjenstand} other {# nye gjenstander}}", "loading_indicator.label": "Laster…", - "media_gallery.toggle_visible": "Veksle synlighet", "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", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index a4e552ba45..1d9008dbd1 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -319,7 +319,6 @@ "lists.subheading": "Vòstras listas", "load_pending": "{count, plural, one {# nòu element} other {# nòu elements}}", "loading_indicator.label": "Cargament…", - "media_gallery.toggle_visible": "Modificar la visibilitat", "navigation_bar.about": "A prepaus", "navigation_bar.advanced_interface": "Dobrir l’interfàcia web avançada", "navigation_bar.blocks": "Personas blocadas", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 6bf6252d70..2ef437ef04 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -457,7 +457,7 @@ "lists.subheading": "Twoje listy", "load_pending": "{count, plural, one {# nowa pozycja} other {nowe pozycje}}", "loading_indicator.label": "Ładowanie…", - "media_gallery.toggle_visible": "Przełącz widoczność", + "media_gallery.hide": "Ukryj", "moved_to_account_banner.text": "Twoje konto {disabledAccount} jest obecnie wyłączone, ponieważ zostało przeniesione na {movedToAccount}.", "mute_modal.hide_from_notifications": "Ukryj z powiadomień", "mute_modal.hide_options": "Ukryj opcje", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index aeff65485e..9978bf7644 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -457,7 +457,7 @@ "lists.subheading": "Suas listas", "load_pending": "{count, plural, one {# novo item} other {# novos items}}", "loading_indicator.label": "Carregando…", - "media_gallery.toggle_visible": "{number, plural, one {Ocultar mídia} other {Ocultar mídias}}", + "media_gallery.hide": "Ocultar", "moved_to_account_banner.text": "Sua conta {disabledAccount} está desativada porque você a moveu para {movedToAccount}.", "mute_modal.hide_from_notifications": "Ocultar das notificações", "mute_modal.hide_options": "Ocultar opções", @@ -780,6 +780,7 @@ "status.bookmark": "Salvar", "status.cancel_reblog_private": "Desfazer boost", "status.cannot_reblog": "Este toot não pode receber boost", + "status.continued_thread": "Continuação da conversa", "status.copy": "Copiar link", "status.delete": "Excluir", "status.detailed_status": "Visão detalhada da conversa", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Nada aqui. Quando alguém der boost, o usuário aparecerá aqui.", "status.redraft": "Excluir e rascunhar", "status.remove_bookmark": "Remover do Salvos", + "status.replied_in_thread": "Respondido na discussão", "status.replied_to": "Em resposta a {name}", "status.reply": "Responder", "status.replyAll": "Responder a conversa", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index fd811d6833..24f5993112 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -444,7 +444,6 @@ "lists.subheading": "As tuas listas", "load_pending": "{count, plural, one {# novo item} other {# novos itens}}", "loading_indicator.label": "A carregar…", - "media_gallery.toggle_visible": "Alternar visibilidade", "moved_to_account_banner.text": "A sua conta {disabledAccount} está, no momento, desativada, porque você migrou para {movedToAccount}.", "mute_modal.hide_from_notifications": "Ocultar das notificações", "mute_modal.hide_options": "Ocultar opções", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 5b1901fbe0..18380928b3 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -355,7 +355,6 @@ "lists.search": "Caută printre persoanele la care ești abonat", "lists.subheading": "Listele tale", "load_pending": "{count, plural, one {# element nou} other {# elemente noi}}", - "media_gallery.toggle_visible": "{number, plural, one {Ascunde imaginea} other {Ascunde imaginile}}", "moved_to_account_banner.text": "Contul tău {disabledAccount} este în acest moment dezactivat deoarece te-ai mutat la {movedToAccount}.", "navigation_bar.about": "Despre", "navigation_bar.advanced_interface": "Deschide în interfața web avansată", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 2c55da90b7..ab89743467 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -432,7 +432,6 @@ "lists.subheading": "Ваши списки", "load_pending": "{count, plural, one {# новый элемент} few {# новых элемента} other {# новых элементов}}", "loading_indicator.label": "Загрузка…", - "media_gallery.toggle_visible": "Показать/скрыть {number, plural, =1 {изображение} other {изображения}}", "moved_to_account_banner.text": "Ваша учетная запись {disabledAccount} в настоящее время заморожена, потому что вы переехали на {movedToAccount}.", "mute_modal.hide_from_notifications": "Скрыть из уведомлений", "mute_modal.hide_options": "Скрыть параметры", diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index 6ca4eafe19..ac715e718e 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -319,7 +319,6 @@ "lists.search": "त्वया अनुसारितजनेषु अन्विष्य", "lists.subheading": "तव सूचयः", "load_pending": "{count, plural, one {# नूतनवस्तु} other {# नूतनवस्तूनि}}", - "media_gallery.toggle_visible": "{number, plural, one {चित्रं प्रच्छादय} other {चित्राणि प्रच्छादय}}", "moved_to_account_banner.text": "तव एकौण्ट् {disabledAccount} अधुना निष्कृतो यतोहि {movedToAccount} अस्मिन्त्वमसार्षीः।", "navigation_bar.about": "विषये", "navigation_bar.blocks": "निषिद्धभोक्तारः", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index 461383191e..0e055716e1 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -370,7 +370,6 @@ "lists.subheading": "Is listas tuas", "load_pending": "{count, plural, one {# elementu nou} other {# elementos noos}}", "loading_indicator.label": "Carrighende…", - "media_gallery.toggle_visible": "Cua {number, plural, one {immàgine} other {immàgines}}", "navigation_bar.about": "Informatziones", "navigation_bar.blocks": "Persones blocadas", "navigation_bar.bookmarks": "Sinnalibros", diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json index e8ae521ae5..b1b17b57db 100644 --- a/app/javascript/mastodon/locales/sco.json +++ b/app/javascript/mastodon/locales/sco.json @@ -304,7 +304,6 @@ "lists.search": "Seirch amang the fowk ye ken", "lists.subheading": "Yer lists", "load_pending": "{count, plural, one {# new item} other {# new items}}", - "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}", "moved_to_account_banner.text": "Yer accoont {disabledAccount} is disabilt the noo acause ye flittit tae {movedToAccount}.", "navigation_bar.about": "Aboot", "navigation_bar.blocks": "Dingied uisers", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 3d7c5416c9..f89e8cf5ab 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -420,7 +420,6 @@ "lists.subheading": "Vaše zoznamy", "load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položiek} other {# nových položiek}}", "loading_indicator.label": "Načítavanie…", - "media_gallery.toggle_visible": "{number, plural, one {Skryť obrázok} other {Skryť obrázky}}", "moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálne deaktivovaný, pretože ste sa presunuli na {movedToAccount}.", "mute_modal.hide_from_notifications": "Ukryť z upozornení", "mute_modal.hide_options": "Skryť možnosti", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 6e8ac52df3..4e83b15089 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -437,7 +437,6 @@ "lists.subheading": "Vaši seznami", "load_pending": "{count, plural, one {# nov element} two {# nova elementa} few {# novi elementi} other {# novih elementov}}", "loading_indicator.label": "Nalaganje …", - "media_gallery.toggle_visible": "{number, plural,one {Skrij sliko} two {Skrij sliki} other {Skrij slike}}", "moved_to_account_banner.text": "Vaš račun {disabledAccount} je trenutno onemogočen, ker ste se prestavili na {movedToAccount}.", "mute_modal.hide_from_notifications": "Skrijte se pred obvestili", "mute_modal.hide_options": "Skrij možnosti", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 51b7a551c1..1904c186f7 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -457,7 +457,7 @@ "lists.subheading": "Listat tuaja", "load_pending": "{count, plural,one {# objekt i ri }other {# objekte të rinj }}", "loading_indicator.label": "Po ngarkohet…", - "media_gallery.toggle_visible": "Fshihni {number, plural, one {figurë} other {figura}}", + "media_gallery.hide": "Fshihe", "moved_to_account_banner.text": "Llogaria juaj {disabledAccount} aktualisht është e çaktivizuar, ngaqë kaluat te {movedToAccount}.", "mute_modal.hide_from_notifications": "Fshihe prej njoftimeve", "mute_modal.hide_options": "Fshihi mundësitë", @@ -780,6 +780,7 @@ "status.bookmark": "Faqeruaje", "status.cancel_reblog_private": "Shpërforcojeni", "status.cannot_reblog": "Ky postim s’mund të përforcohet", + "status.continued_thread": "Vazhdoi rrjedhën", "status.copy": "Kopjoje lidhjen për te mesazhi", "status.delete": "Fshije", "status.detailed_status": "Pamje e hollësishme bisede", @@ -813,6 +814,7 @@ "status.reblogs.empty": "Këtë mesazh s’e ka përforcuar njeri deri tani. Kur ta bëjë dikush, kjo do të duket këtu.", "status.redraft": "Fshijeni & rihartojeni", "status.remove_bookmark": "Hiqe faqerojtësin", + "status.replied_in_thread": "U përgjigj te rrjedha", "status.replied_to": "Iu përgjigj {name}", "status.reply": "Përgjigjuni", "status.replyAll": "Përgjigjuni rrjedhës", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index d550f6517c..02be70f5bf 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -424,7 +424,6 @@ "lists.subheading": "Vaše liste", "load_pending": "{count, plural, one {# nova stavka} few {# nove stavke} other {# novih stavki}}", "loading_indicator.label": "Učitavanje…", - "media_gallery.toggle_visible": "{number, plural, one {Sakrij sliku} few {Sakrij slike} other {Sakrij slike}}", "moved_to_account_banner.text": "Vaš nalog {disabledAccount} je trenutno onemogućen jer ste prešli na {movedToAccount}.", "mute_modal.hide_from_notifications": "Sakrij iz obaveštenja", "mute_modal.hide_options": "Sakrij opcije", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index f608d46a20..dfd10579e6 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -424,7 +424,6 @@ "lists.subheading": "Ваше листе", "load_pending": "{count, plural, one {# нова ставка} few {# нове ставке} other {# нових ставки}}", "loading_indicator.label": "Учитавање…", - "media_gallery.toggle_visible": "{number, plural, one {Сакриј слику} few {Сакриј слике} other {Сакриј слике}}", "moved_to_account_banner.text": "Ваш налог {disabledAccount} је тренутно онемогућен јер сте прешли на {movedToAccount}.", "mute_modal.hide_from_notifications": "Сакриј из обавештења", "mute_modal.hide_options": "Сакриј опције", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 76b46f3425..61cad916ca 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -454,7 +454,7 @@ "lists.subheading": "Dina listor", "load_pending": "{count, plural, one {# nytt objekt} other {# nya objekt}}", "loading_indicator.label": "Laddar…", - "media_gallery.toggle_visible": "Växla synlighet", + "media_gallery.hide": "Dölj", "moved_to_account_banner.text": "Ditt konto {disabledAccount} är för närvarande inaktiverat eftersom du flyttat till {movedToAccount}.", "mute_modal.hide_from_notifications": "Dölj från aviseringslistan", "mute_modal.hide_options": "Dölj alternativ", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 4bded45679..4f209b7e3e 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -252,7 +252,6 @@ "lists.search": "நீங்கள் பின்தொடரும் நபர்கள் மத்தியில் தேடுதல்", "lists.subheading": "உங்கள் பட்டியல்கள்", "load_pending": "{count, plural,one {# புதியது}other {# புதியவை}}", - "media_gallery.toggle_visible": "நிலைமாற்று தெரியும்", "navigation_bar.blocks": "தடுக்கப்பட்ட பயனர்கள்", "navigation_bar.bookmarks": "அடையாளக்குறிகள்", "navigation_bar.community_timeline": "உள்ளூர் காலக்கெடு", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 52cb612d86..a6dc74b290 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -167,7 +167,6 @@ "lists.new.title_placeholder": "కొత్త జాబితా శీర్షిక", "lists.search": "మీరు అనుసరించే వ్యక్తులలో శోధించండి", "lists.subheading": "మీ జాబితాలు", - "media_gallery.toggle_visible": "దృశ్యమానతను టోగుల్ చేయండి", "navigation_bar.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు", "navigation_bar.community_timeline": "స్థానిక కాలక్రమం", "navigation_bar.compose": "కొత్త టూట్ను రాయండి", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 55f0fe02be..81424a9490 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -457,7 +457,6 @@ "lists.subheading": "รายการของคุณ", "load_pending": "{count, plural, other {# รายการใหม่}}", "loading_indicator.label": "กำลังโหลด…", - "media_gallery.toggle_visible": "{number, plural, other {ซ่อนภาพ}}", "moved_to_account_banner.text": "มีการปิดใช้งานบัญชีของคุณ {disabledAccount} ในปัจจุบันเนื่องจากคุณได้ย้ายไปยัง {movedToAccount}", "mute_modal.hide_from_notifications": "ซ่อนจากการแจ้งเตือน", "mute_modal.hide_options": "ซ่อนตัวเลือก", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index 19e33233c0..0ca30c57da 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -270,7 +270,6 @@ "lists.subheading": "kulupu lipu sina", "load_pending": "{count, plural, other {ijo sin #}}", "loading_indicator.label": "ni li kama…", - "media_gallery.toggle_visible": "{number, plural, other {o len e sitelen}}", "mute_modal.title": "sina wile ala wile kute e jan ni?", "navigation_bar.about": "sona", "navigation_bar.blocks": "jan weka", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 4873fa943e..6577737bf1 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -457,7 +457,7 @@ "lists.subheading": "Listeleriniz", "load_pending": "{count, plural, one {# yeni öğe} other {# yeni öğe}}", "loading_indicator.label": "Yükleniyor…", - "media_gallery.toggle_visible": "{number, plural, one {Resmi} other {Resimleri}} gizle", + "media_gallery.hide": "Gizle", "moved_to_account_banner.text": "{disabledAccount} hesabınız, {movedToAccount} hesabına taşıdığınız için şu an devre dışı.", "mute_modal.hide_from_notifications": "Bildirimlerde gizle", "mute_modal.hide_options": "Seçenekleri gizle", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index b63596037b..638a84b64f 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -457,7 +457,7 @@ "lists.subheading": "Ваші списки", "load_pending": "{count, plural, one {# новий елемент} other {# нових елементів}}", "loading_indicator.label": "Завантаження…", - "media_gallery.toggle_visible": "{number, plural, one {Приховати зображення} other {Приховати зображення}}", + "media_gallery.hide": "Сховати", "moved_to_account_banner.text": "Ваш обліковий запис {disabledAccount} наразі вимкнений, оскільки вас перенесено до {movedToAccount}.", "mute_modal.hide_from_notifications": "Сховати зі сповіщень", "mute_modal.hide_options": "Сховати опції", @@ -780,7 +780,7 @@ "status.bookmark": "Додати до закладок", "status.cancel_reblog_private": "Скасувати поширення", "status.cannot_reblog": "Цей допис не може бути поширений", - "status.continued_thread": "Continued thread", + "status.continued_thread": "Продовження у потоці", "status.copy": "Копіювати посилання на допис", "status.delete": "Видалити", "status.detailed_status": "Детальний вигляд бесіди", @@ -814,6 +814,7 @@ "status.reblogs.empty": "Ніхто ще не поширив цей допис. Коли хтось це зроблять, вони будуть зображені тут.", "status.redraft": "Видалити та виправити", "status.remove_bookmark": "Видалити закладку", + "status.replied_in_thread": "Відповідь у потоці", "status.replied_to": "Відповідь для {name}", "status.reply": "Відповісти", "status.replyAll": "Відповісти на ланцюжок", diff --git a/app/javascript/mastodon/locales/uz.json b/app/javascript/mastodon/locales/uz.json index 048f8e7757..6dae368ffc 100644 --- a/app/javascript/mastodon/locales/uz.json +++ b/app/javascript/mastodon/locales/uz.json @@ -299,7 +299,6 @@ "lists.search": "Siz kuzatadigan odamlar orasidan qidiring", "lists.subheading": "Sizning ro'yxatlaringiz", "load_pending": "{count, plural, one {# yangi element} other {# yangi elementlar}}", - "media_gallery.toggle_visible": "{number, plural, one {Rasmni yashirish} other {Rasmlarni yashirish}}", "moved_to_account_banner.text": "{movedToAccount} hisobiga koʻchganingiz uchun {disabledAccount} hisobingiz hozirda oʻchirib qoʻyilgan.", "navigation_bar.about": "Haqida", "navigation_bar.blocks": "Bloklangan foydalanuvchilar", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 80a766683a..09f288469d 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -457,7 +457,6 @@ "lists.subheading": "Danh sách của bạn", "load_pending": "{count, plural, one {# tút mới} other {# tút mới}}", "loading_indicator.label": "Đang tải…", - "media_gallery.toggle_visible": "{number, plural, other {Ẩn hình ảnh}}", "moved_to_account_banner.text": "Tài khoản {disabledAccount} của bạn hiện không khả dụng vì bạn đã chuyển sang {movedToAccount}.", "mute_modal.hide_from_notifications": "Ẩn thông báo", "mute_modal.hide_options": "Tùy chọn ẩn", diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json index d9367520e8..2fe63fe83c 100644 --- a/app/javascript/mastodon/locales/zgh.json +++ b/app/javascript/mastodon/locales/zgh.json @@ -118,7 +118,6 @@ "lists.replies_policy.title": "ⵙⴽⵏ ⵜⵉⵔⴰⵔⵉⵏ ⵉ:", "lists.subheading": "ⵜⵉⵍⴳⴰⵎⵉⵏ ⵏⵏⴽ", "load_pending": "{count, plural, one {# ⵓⴼⵔⴷⵉⵙ ⴰⵎⴰⵢⵏⵓ} other {# ⵉⴼⵔⴷⴰⵙ ⵉⵎⴰⵢⵏⵓⵜⵏ}}", - "media_gallery.toggle_visible": "ⴼⴼⵔ {number, plural, one {ⵜⴰⵡⵍⴰⴼⵜ} other {ⵜⵉⵡⵍⴰⴼⵉⵏ}}", "navigation_bar.compose": "Compose new toot", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.follow_requests": "ⵜⵓⵜⵔⴰⵡⵉⵏ ⵏ ⵓⴹⴼⴰⵕ", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 94adc9af2d..9a6076f23f 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -457,7 +457,7 @@ "lists.subheading": "你的列表", "load_pending": "{count} 项", "loading_indicator.label": "加载中…", - "media_gallery.toggle_visible": "{number, plural, other {隐藏图像}}", + "media_gallery.hide": "隐藏", "moved_to_account_banner.text": "您的账号 {disabledAccount} 已禁用,因为您已迁移到 {movedToAccount}。", "mute_modal.hide_from_notifications": "从通知中隐藏", "mute_modal.hide_options": "隐藏选项", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 8543090b9a..2a55e6fc20 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -421,7 +421,6 @@ "lists.subheading": "列表", "load_pending": "{count, plural, other {# 個新項目}}", "loading_indicator.label": "載入中…", - "media_gallery.toggle_visible": "隱藏圖片", "moved_to_account_banner.text": "您的帳號 {disabledAccount} 目前已停用,因為您已搬家至 {movedToAccount}。", "mute_modal.hide_from_notifications": "隱藏通知", "mute_modal.hide_options": "隱藏選項", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index e671803573..cdc6c977b7 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -457,7 +457,7 @@ "lists.subheading": "您的列表", "load_pending": "{count, plural, one {# 個新項目} other {# 個新項目}}", "loading_indicator.label": "正在載入...", - "media_gallery.toggle_visible": "切換可見性", + "media_gallery.hide": "隱藏", "moved_to_account_banner.text": "您的帳號 {disabledAccount} 目前已停用,因為您已搬家至 {movedToAccount}。", "mute_modal.hide_from_notifications": "於推播通知中隱藏", "mute_modal.hide_options": "隱藏選項", diff --git a/config/locales/activerecord.ca.yml b/config/locales/activerecord.ca.yml index 021cc38b4f..9fa0f704b0 100644 --- a/config/locales/activerecord.ca.yml +++ b/config/locales/activerecord.ca.yml @@ -15,6 +15,12 @@ ca: user/invite_request: text: Motiu errors: + attributes: + domain: + invalid: no és un nom de domini vàlid + messages: + invalid_domain_on_line: "%{value} no és un nom de domini vàlid" + too_many_lines: sobrepassa el límit de %{limit} línies models: account: attributes: diff --git a/config/locales/activerecord.da.yml b/config/locales/activerecord.da.yml index fd94a6cf9a..35151f477d 100644 --- a/config/locales/activerecord.da.yml +++ b/config/locales/activerecord.da.yml @@ -15,6 +15,12 @@ da: user/invite_request: text: Årsag errors: + attributes: + domain: + invalid: er ikke et gyldigt domænenavn + messages: + invalid_domain_on_line: "%{value} er ikke et gyldigt domænenavn" + too_many_lines: overstiger grænsen på %{limit} linjer models: account: attributes: diff --git a/config/locales/activerecord.de.yml b/config/locales/activerecord.de.yml index ca590bec7d..b4bcd660d8 100644 --- a/config/locales/activerecord.de.yml +++ b/config/locales/activerecord.de.yml @@ -15,6 +15,12 @@ de: user/invite_request: text: Begründung errors: + attributes: + domain: + invalid: ist kein gültiger Domain-Name + messages: + invalid_domain_on_line: "%{value} ist kein gültiger Domain-Name" + too_many_lines: übersteigt das Limit von %{limit} Zeilen models: account: attributes: diff --git a/config/locales/activerecord.en-GB.yml b/config/locales/activerecord.en-GB.yml index 2b1cb05a6f..72edf5e02f 100644 --- a/config/locales/activerecord.en-GB.yml +++ b/config/locales/activerecord.en-GB.yml @@ -15,6 +15,12 @@ en-GB: user/invite_request: text: Reason errors: + attributes: + domain: + invalid: is not a valid domain name + messages: + invalid_domain_on_line: "%{value} is not a valid domain name" + too_many_lines: is over the limit of %{limit} lines models: account: attributes: diff --git a/config/locales/activerecord.fi.yml b/config/locales/activerecord.fi.yml index 9da69b7dbd..b4d91a5f1e 100644 --- a/config/locales/activerecord.fi.yml +++ b/config/locales/activerecord.fi.yml @@ -15,6 +15,12 @@ fi: user/invite_request: text: Syy errors: + attributes: + domain: + invalid: ei ole kelvollinen verkkotunnus + messages: + invalid_domain_on_line: "%{value} ei ole kelvollinen verkkotunnus" + too_many_lines: ylittää %{limit} rivin rajan models: account: attributes: diff --git a/config/locales/activerecord.fo.yml b/config/locales/activerecord.fo.yml index cf447a9dbc..61b924e5bf 100644 --- a/config/locales/activerecord.fo.yml +++ b/config/locales/activerecord.fo.yml @@ -15,6 +15,12 @@ fo: user/invite_request: text: Orsøk errors: + attributes: + domain: + invalid: er ikki eitt virkið økisnavn + messages: + invalid_domain_on_line: "%{value} er ikki eitt virkið økisnavn" + too_many_lines: er longri enn markið á %{limit} reglur models: account: attributes: diff --git a/config/locales/activerecord.gl.yml b/config/locales/activerecord.gl.yml index 477db570e7..961c96edb4 100644 --- a/config/locales/activerecord.gl.yml +++ b/config/locales/activerecord.gl.yml @@ -15,6 +15,12 @@ gl: user/invite_request: text: Razón errors: + attributes: + domain: + invalid: non é un nome de dominio válido + messages: + invalid_domain_on_line: "%{value} non é un nome de dominio válido" + too_many_lines: superou o límite de %{limit} liñas models: account: attributes: diff --git a/config/locales/activerecord.he.yml b/config/locales/activerecord.he.yml index 211d984863..1729084a4c 100644 --- a/config/locales/activerecord.he.yml +++ b/config/locales/activerecord.he.yml @@ -15,6 +15,12 @@ he: user/invite_request: text: סיבה errors: + attributes: + domain: + invalid: אינו שם מתחם קביל + messages: + invalid_domain_on_line: "%{value} אינו שם מתחם קביל" + too_many_lines: מעבר למגבלה של %{limit} שורות models: account: attributes: diff --git a/config/locales/activerecord.hu.yml b/config/locales/activerecord.hu.yml index f34ade0440..6e376dd678 100644 --- a/config/locales/activerecord.hu.yml +++ b/config/locales/activerecord.hu.yml @@ -15,6 +15,12 @@ hu: user/invite_request: text: Indoklás errors: + attributes: + domain: + invalid: nem egy érvényes domain név + messages: + invalid_domain_on_line: "%{value} nem egy érvényes domain név" + too_many_lines: túllépi a(z) %{limit} soros korlátot models: account: attributes: diff --git a/config/locales/activerecord.ia.yml b/config/locales/activerecord.ia.yml index bf1fbc67ef..bccfb96602 100644 --- a/config/locales/activerecord.ia.yml +++ b/config/locales/activerecord.ia.yml @@ -15,6 +15,11 @@ ia: user/invite_request: text: Motivo errors: + attributes: + domain: + invalid: non es un nomine de dominio valide + messages: + invalid_domain_on_line: "%{value} non es un nomine de dominio valide" models: account: attributes: diff --git a/config/locales/activerecord.is.yml b/config/locales/activerecord.is.yml index 4423cb6e47..e274cc0a9e 100644 --- a/config/locales/activerecord.is.yml +++ b/config/locales/activerecord.is.yml @@ -15,6 +15,12 @@ is: user/invite_request: text: Ástæða errors: + attributes: + domain: + invalid: er ekki leyfilegt nafn á léni + messages: + invalid_domain_on_line: "%{value} er ekki leyfilegt nafn á léni" + too_many_lines: er yfir takmörkum á %{limit} línum models: account: attributes: diff --git a/config/locales/activerecord.it.yml b/config/locales/activerecord.it.yml index f23513e34c..3d5be6c258 100644 --- a/config/locales/activerecord.it.yml +++ b/config/locales/activerecord.it.yml @@ -15,6 +15,12 @@ it: user/invite_request: text: Motivo errors: + attributes: + domain: + invalid: non è un nome di dominio valido + messages: + invalid_domain_on_line: "%{value} non è un nome di dominio valido" + too_many_lines: è oltre il limite di %{limit} righe models: account: attributes: diff --git a/config/locales/activerecord.lt.yml b/config/locales/activerecord.lt.yml index cb6e21d8e8..2e4b54c626 100644 --- a/config/locales/activerecord.lt.yml +++ b/config/locales/activerecord.lt.yml @@ -15,6 +15,12 @@ lt: user/invite_request: text: Priežastis errors: + attributes: + domain: + invalid: nėra tinkamas domeno vardas. + messages: + invalid_domain_on_line: "%{value} nėra tinkamas domeno vardas." + too_many_lines: yra daugiau nei %{limit} eilučių ribojimą. models: account: attributes: diff --git a/config/locales/activerecord.nl.yml b/config/locales/activerecord.nl.yml index ce2c28a810..ee3c8bf260 100644 --- a/config/locales/activerecord.nl.yml +++ b/config/locales/activerecord.nl.yml @@ -15,6 +15,12 @@ nl: user/invite_request: text: Reden errors: + attributes: + domain: + invalid: is een ongeldige domeinnaam + messages: + invalid_domain_on_line: "%{value} is een ongeldige domeinnaam" + too_many_lines: overschrijdt de limiet van %{limit} regels models: account: attributes: diff --git a/config/locales/activerecord.nn.yml b/config/locales/activerecord.nn.yml index a303af6247..a34cc7cf12 100644 --- a/config/locales/activerecord.nn.yml +++ b/config/locales/activerecord.nn.yml @@ -15,6 +15,12 @@ nn: user/invite_request: text: Grunn errors: + attributes: + domain: + invalid: er ikkje eit gyldig domenenamn + messages: + invalid_domain_on_line: "%{value} er ikkje gyldig i eit domenenamn" + too_many_lines: er over grensa på %{limit} liner models: account: attributes: diff --git a/config/locales/activerecord.pl.yml b/config/locales/activerecord.pl.yml index 5ae1d3778a..d0e6dda58d 100644 --- a/config/locales/activerecord.pl.yml +++ b/config/locales/activerecord.pl.yml @@ -15,6 +15,12 @@ pl: user/invite_request: text: Powód errors: + attributes: + domain: + invalid: nie jest prawidłową nazwą domeny + messages: + invalid_domain_on_line: "%{value} nie jest prawidłową nazwą domeny" + too_many_lines: przekracza limit %{limit} linii models: account: attributes: diff --git a/config/locales/activerecord.pt-BR.yml b/config/locales/activerecord.pt-BR.yml index 3199eb8e2d..52f2b6ee87 100644 --- a/config/locales/activerecord.pt-BR.yml +++ b/config/locales/activerecord.pt-BR.yml @@ -15,6 +15,12 @@ pt-BR: user/invite_request: text: Razão errors: + attributes: + domain: + invalid: não é um nome de domínio válido + messages: + invalid_domain_on_line: "%{value} não é um nome de domínio válido" + too_many_lines: está acima do limite de %{limit} linhas models: account: attributes: diff --git a/config/locales/activerecord.sv.yml b/config/locales/activerecord.sv.yml index a3a45705ec..1679dae46e 100644 --- a/config/locales/activerecord.sv.yml +++ b/config/locales/activerecord.sv.yml @@ -15,6 +15,8 @@ sv: user/invite_request: text: Anledning errors: + messages: + invalid_domain_on_line: "%{value} Är inte ett giltigt domännamn" models: account: attributes: diff --git a/config/locales/activerecord.tr.yml b/config/locales/activerecord.tr.yml index d2b79d256c..505289470e 100644 --- a/config/locales/activerecord.tr.yml +++ b/config/locales/activerecord.tr.yml @@ -15,6 +15,12 @@ tr: user/invite_request: text: Gerekçe errors: + attributes: + domain: + invalid: geçerli bir alan adı değil + messages: + invalid_domain_on_line: "%{value} geçerli bir alan adı değil" + too_many_lines: "%{limit} satır sınırının üzerinde" models: account: attributes: diff --git a/config/locales/activerecord.uk.yml b/config/locales/activerecord.uk.yml index f16750acec..c9a4c8e1ec 100644 --- a/config/locales/activerecord.uk.yml +++ b/config/locales/activerecord.uk.yml @@ -15,6 +15,12 @@ uk: user/invite_request: text: Причина errors: + attributes: + domain: + invalid: не є дійсним іменем домену + messages: + invalid_domain_on_line: "%{value} не є дійсним іменем домену" + too_many_lines: перевищує ліміт %{limit} рядків models: account: attributes: diff --git a/config/locales/activerecord.zh-CN.yml b/config/locales/activerecord.zh-CN.yml index 1b661266ca..a4edf294a3 100644 --- a/config/locales/activerecord.zh-CN.yml +++ b/config/locales/activerecord.zh-CN.yml @@ -15,6 +15,12 @@ zh-CN: user/invite_request: text: 理由 errors: + attributes: + domain: + invalid: 不是有效的域名 + messages: + invalid_domain_on_line: "%{value} 不是有效的域名" + too_many_lines: 超出 %{limit} 行的长度限制 models: account: attributes: diff --git a/config/locales/activerecord.zh-TW.yml b/config/locales/activerecord.zh-TW.yml index 24609332cd..7422550660 100644 --- a/config/locales/activerecord.zh-TW.yml +++ b/config/locales/activerecord.zh-TW.yml @@ -15,6 +15,12 @@ zh-TW: user/invite_request: text: 原因 errors: + attributes: + domain: + invalid: 並非一個有效網域 + messages: + invalid_domain_on_line: "%{value} 並非一個有效網域" + too_many_lines: 已超過行數限制 (%{limit} 行) models: account: attributes: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index e1025563eb..63654ae708 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -435,6 +435,7 @@ ca: attempts_over_week: one: "%{count} intent en la darrera setmana" other: "%{count} intents de registre en la darrera setmana" + created_msg: S'ha blocat el domini de correu-e delete: Elimina dns: types: @@ -444,8 +445,10 @@ ca: create: Afegir un domini resolve: Resol domini title: Blocar el nou domini de correu-e + no_email_domain_block_selected: No s'han canviat els bloqueigs de domini perquè no se n'ha seleccionat cap not_permitted: No permés resolved_through_html: Resolt mitjançant %{domain} + title: Dominis de correu-e blocats export_domain_allows: new: title: Importa dominis permesos @@ -599,6 +602,7 @@ ca: resolve_description_html: No serà presa cap acció contra el compte denunciat, no se'n registrarà res i l'informe es tancarà. silence_description_html: El compte només serà visible a qui ja el seguia o l'ha cercat manualment, limitant-ne fortament l'abast. Sempre es pot revertir. Es tancaran tots els informes contra aquest compte. suspend_description_html: Aquest compte i tots els seus continguts seran inaccessibles i finalment eliminats, i interaccionar amb ell no serà possible. Reversible en 30 dies. Tanca tots els informes contra aquest compte. + actions_description_html: Decidiu quina acció a prendre per a resoldre aquest informe. Si preneu una acció punitiva contra el compte denunciat, se li enviarà una notificació per correu-e, excepte si se selecciona la categoria Spam. actions_description_remote_html: Decideix quina acció prendre per a resoldre aquest informe. Això només afectarà com el teu servidor es comunica amb aquest compte remot i en gestiona el contingut. actions_no_posts: Aquest informe no té associada cap publicació a esborrar add_to_report: Afegir més al informe @@ -664,6 +668,7 @@ ca: delete_data_html: Esborra el perfil de @%{acct} i els seus continguts dins de 30 dies des d'ara a no ser que es desactivi la suspensió abans preview_preamble_html: "@%{acct} rebrà un avís amb el contingut següent:" record_strike_html: Registra una acció contra @%{acct} per ajudar a escalar-ho en futures violacions des d'aquest compte + send_email_html: Envia un avís per correu-e a @%{acct} warning_placeholder: Opcional raó adicional d'aquesta acció de moderació. target_origin: Origen del compte denunciat title: Informes @@ -703,6 +708,7 @@ ca: manage_appeals: Gestiona apel·lacions manage_appeals_description: Permet als usuaris revisar les apel·lacions contra les accions de moderació manage_blocks: Gestiona blocs + manage_blocks_description: Permet als usuaris blocar adreces IP i proveïdors de correu-e manage_custom_emojis: Gestiona emojis personalitzats manage_custom_emojis_description: Permet als usuaris gestionar emojis personalitzats al servidor manage_federation: Gestiona federació @@ -720,6 +726,7 @@ ca: manage_taxonomies: Gestionar taxonomies manage_taxonomies_description: Permet als usuaris revisar el contingut actual i actualitzar la configuració de l'etiqueta manage_user_access: Gestionar l'accés dels usuaris + manage_user_access_description: Permet als usuaris desactivar l'autenticació de dos factors d'altres usuaris, canviar la seva adreça de correu-e i restablir la seva contrasenya manage_users: Gestionar usuaris manage_users_description: Permet als usuaris veure els detalls d'altres usuaris i realitzar accions de moderació contra ells manage_webhooks: Gestionar Webhooks @@ -1057,7 +1064,9 @@ ca: guide_link_text: Tothom hi pot contribuir. sensitive_content: Contingut sensible application_mailer: + notification_preferences: Canviar les preferències de correu-e salutation: "%{name}," + settings: 'Canviar les preferències de correu-e: %{link}' unsubscribe: Cancel·la la subscripció view: 'Visualització:' view_profile: Mostra el perfil @@ -1077,6 +1086,7 @@ ca: hint_html: Una cosa més! Necessitem confirmar que ets una persona humana (és així com mantenim a ratlla l'spam). Resolt el CAPTCHA inferior i clica a "Segueix". title: Revisió de seguretat confirmations: + awaiting_review: S'ha confirmat la vostra adreça-e. El personal de %{domain} revisa ara el registre. Rebreu un correu si s'aprova el compte. awaiting_review_title: S'està revisant la teva inscripció clicking_this_link: en clicar aquest enllaç login_link: inici de sessió @@ -1084,6 +1094,7 @@ ca: redirect_to_app_html: Se us hauria d'haver redirigit a l'app %{app_name}. Si això no ha passat, intenteu %{clicking_this_link} o torneu manualment a l'app. registration_complete: La teva inscripció a %{domain} ja és completa. welcome_title: Hola, %{name}! + wrong_email_hint: Si aquesta adreça de correu-e no és correcta, podeu canviar-la en els ajustos del compte. delete_account: Elimina el compte delete_account_html: Si vols suprimir el compte pots fer-ho aquí. Se't demanarà confirmació. description: @@ -1126,6 +1137,7 @@ ca: security: Seguretat set_new_password: Estableix una contrasenya nova setup: + email_below_hint_html: Verifiqueu la carpeta de correu brossa o demaneu-ne un altre. Podeu corregir l'adreça de correu-e si no és correcta. email_settings_hint_html: Toca l'enllaç que t'hem enviat per a verificar %{email}. Esperarem aquí mateix. link_not_received: No has rebut l'enllaç? new_confirmation_instructions_sent: Rebràs un nou correu amb l'enllaç de confirmació en pocs minuts! @@ -1139,12 +1151,19 @@ ca: title: Configurem-te a %{domain}. status: account_status: Estat del compte + confirming: Esperant que es completi la confirmació del correu-e. functional: El teu compte està completament operatiu. redirecting_to: El teu compte és inactiu perquè actualment està redirigint a %{acct}. self_destruct: Com que %{domain} tanca, només tindreu accés limitat al vostre compte. view_strikes: Veure accions del passat contra el teu compte too_fast: Formulari enviat massa ràpid, torna a provar-ho. use_security_key: Usa clau de seguretat + author_attribution: + example_title: Text d'exemple + hint_html: Controleu com se us acredita quan els enllaços es comparteixen a Mastodon. + more_from_html: Més de %{name} + s_blog: Blog de %{name} + title: Atribució d'autor challenge: confirm: Continua hint_html: "Pista: No et preguntarem un altre cop la teva contrasenya en la pròxima hora." @@ -1930,6 +1949,7 @@ ca: instructions_html: Copieu i enganxeu el següent codi HTML al vostre lloc web. Després, afegiu l'adreça del vostre lloc web dins d'un dels camps extres del vostre perfil i deseu els canvis. verification: Verificació verified_links: Els teus enllaços verificats + website_verification: Verificació de web webauthn_credentials: add: Afegir nova clau de seguretat create: diff --git a/config/locales/da.yml b/config/locales/da.yml index 19ee9b9d81..731c1f0b40 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1161,6 +1161,12 @@ da: view_strikes: Se tidligere anmeldelser af din konto too_fast: Formularen indsendt for hurtigt, forsøg igen. use_security_key: Brug sikkerhedsnøgle + author_attribution: + example_title: Eksempeltekst + hint_html: Styrer, hvordan man krediteres, når links deles på Mastodon. + more_from_html: Flere fra %{name} + s_blog: "%{name}s blog" + title: Forfattertilskrivning challenge: confirm: Fortsæt hint_html: "Tip: Du bliver ikke anmodet om din adgangskode igen den næste time." @@ -1949,6 +1955,7 @@ da: instructions_html: Kopier og indsæt koden nedenfor i HTML på din hjemmeside. Tilføj derefter adressen på din hjemmeside i et af de ekstra felter på din profil på fanen "Redigér profil" og gem ændringer. verification: Bekræftelse verified_links: Dine bekræftede links + website_verification: Webstedsbekræftelse webauthn_credentials: add: Tilføj ny sikkerhedsnøgle create: diff --git a/config/locales/de.yml b/config/locales/de.yml index b75aada764..cc049c5903 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -25,6 +25,7 @@ de: admin: account_actions: action: Aktion ausführen + already_silenced: Dieses Konto wurde bereits eingeschränkt. already_suspended: Dieses Konto wurde bereits gesperrt. title: "@%{acct} moderieren" account_moderation_notes: @@ -1160,6 +1161,12 @@ de: view_strikes: Vorherige Verstöße deines Kontos ansehen too_fast: Formular zu schnell übermittelt. Bitte versuche es erneut. use_security_key: Sicherheitsschlüssel verwenden + author_attribution: + example_title: Beispieltext + hint_html: Bestimme, wie du Anerkennungen durch geteilte Links auf Mastodon handhaben möchtest. + more_from_html: Mehr von %{name} + s_blog: Blog von %{name} + title: Anerkennung als Autor*in challenge: confirm: Fortfahren hint_html: "Hinweis: Wir werden dich für die nächste Stunde nicht erneut nach deinem Passwort fragen." @@ -1948,6 +1955,7 @@ de: instructions_html: Kopiere den unten stehenden Code und füge ihn in das HTML deiner Website ein. Trage anschließend die Adresse deiner Website in ein Zusatzfeld auf deinem Profil ein und speichere die Änderungen. Die Zusatzfelder befinden sich im Reiter „Profil bearbeiten“. verification: Verifizierung verified_links: Deine verifizierten Links + website_verification: Website-Verifizierung webauthn_credentials: add: Sicherheitsschlüssel hinzufügen create: diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index a3036c2f96..dc07dcff0b 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -25,6 +25,8 @@ en-GB: admin: account_actions: action: Perform action + already_silenced: This account has already been limited. + already_suspended: This account has already been suspended. title: Perform moderation action on %{acct} account_moderation_notes: create: Leave note @@ -46,6 +48,7 @@ en-GB: title: Change email for %{username} change_role: changed_msg: Role successfully changed! + edit_roles: Manage user roles label: Change role no_role: No role title: Change role for %{username} @@ -602,6 +605,7 @@ en-GB: suspend_description_html: The account and all its contents will be inaccessible and eventually deleted, and interacting with it will be impossible. Reversible within 30 days. Closes all reports against this account. actions_description_html: Decide which action to take to resolve this report. If you take a punitive action against the reported account, an email notification will be sent to them, except when the Spam category is selected. actions_description_remote_html: Decide which action to take to resolve this report. This will only affect how your server communicates with this remote account and handle its content. + actions_no_posts: This report doesn't have any associated posts to delete add_to_report: Add more to report already_suspended_badges: local: Already suspended on this server @@ -723,6 +727,7 @@ en-GB: manage_taxonomies: Manage Taxonomies manage_taxonomies_description: Allows users to review trending content and update hashtag settings manage_user_access: Manage User Access + manage_user_access_description: Allows users to disable other users' two-factor authentication, change their email address, and reset their password manage_users: Manage Users manage_users_description: Allows users to view other users' details and perform moderation actions against them manage_webhooks: Manage Webhooks @@ -797,6 +802,7 @@ en-GB: destroyed_msg: Site upload successfully deleted! software_updates: critical_update: Critical — please update quickly + description: It is recommended to keep your Mastodon installation up to date to benefit from the latest fixes and features. Moreover, it is sometimes critical to update Mastodon in a timely manner to avoid security issues. For these reasons, Mastodon checks for updates every 30 minutes, and will notify you according to your email notification preferences. documentation_link: Learn more release_notes: Release notes title: Available updates @@ -883,16 +889,37 @@ en-GB: action: Check here for more information message_html: "Your object storage is misconfigured. The privacy of your users is at risk." tags: + moderation: + not_trendable: Not trendable + not_usable: Not usable + pending_review: Pending review + review_requested: Review requested + reviewed: Reviewed + title: Status + trendable: Trendable + unreviewed: Unreviewed + usable: Usable + name: Name + newest: Newest + oldest: Oldest + open: View Publicly + reset: Reset review: Review status + search: Search + title: Hashtags updated_msg: Hashtag settings updated successfully title: Administration trends: allow: Allow approved: Approved + confirm_allow: Are you sure you want to allow selected tags? + confirm_disallow: Are you sure you want to disallow selected tags? disallow: Disallow links: allow: Allow link allow_provider: Allow publisher + confirm_allow: Are you sure you want to allow selected links? + confirm_allow_provider: Are you sure you want to allow selected providers? confirm_disallow: Are you sure you want to disallow selected links? confirm_disallow_provider: Are you sure you want to disallow selected providers? description_html: These are links that are currently being shared a lot by accounts that your server sees posts from. It can help your users find out what's going on in the world. No links are displayed publicly until you approve the publisher. You can also allow or reject individual links. @@ -1039,7 +1066,9 @@ en-GB: guide_link_text: Everyone can contribute. sensitive_content: Sensitive content application_mailer: + notification_preferences: Change email preferences salutation: "%{name}," + settings: 'Change email preferences: %{link}' unsubscribe: Unsubscribe view: 'View:' view_profile: View profile @@ -1059,6 +1088,7 @@ en-GB: hint_html: Just one more thing! We need to confirm you're a human (this is so we can keep the spam out!). Solve the CAPTCHA below and click "Continue". title: Security check confirmations: + awaiting_review: Your email address is confirmed! The %{domain} staff is now reviewing your registration. You will receive an email if they approve your account! awaiting_review_title: Your registration is being reviewed clicking_this_link: clicking this link login_link: log in @@ -1066,6 +1096,7 @@ en-GB: redirect_to_app_html: You should have been redirected to the %{app_name} app. If that did not happen, try %{clicking_this_link} or manually return to the app. registration_complete: Your registration on %{domain} is now complete! welcome_title: Welcome, %{name}! + wrong_email_hint: If that email address is not correct, you can change it in account settings. delete_account: Delete account delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. description: @@ -1086,6 +1117,7 @@ en-GB: or_log_in_with: Or log in with privacy_policy_agreement_html: I have read and agree to the privacy policy progress: + confirm: Confirm email details: Your details review: Our review rules: Accept rules @@ -1107,6 +1139,7 @@ en-GB: security: Security set_new_password: Set new password setup: + email_below_hint_html: Check your spam folder, or request another one. You can correct your email address if it's wrong. email_settings_hint_html: Click the link we sent you to verify %{email}. We'll wait right here. link_not_received: Didn't get a link? new_confirmation_instructions_sent: You will receive a new email with the confirmation link in a few minutes! @@ -1128,6 +1161,12 @@ en-GB: view_strikes: View past strikes against your account too_fast: Form submitted too fast, try again. use_security_key: Use security key + author_attribution: + example_title: Sample text + hint_html: Control how you're credited when links are shared on Mastodon. + more_from_html: More from %{name} + s_blog: "%{name}'s Blog" + title: Author attribution challenge: confirm: Continue hint_html: "Tip: We won't ask you for your password again for the next hour." @@ -1423,6 +1462,7 @@ en-GB: media_attachments: validations: images_and_video: Cannot attach a video to a post that already contains images + not_found: Media %{ids} not found or already attached to another post not_ready: Cannot attach files that have not finished processing. Try again in a moment! too_many: Cannot attach more than 4 files migrations: @@ -1915,6 +1955,7 @@ en-GB: instructions_html: Copy and paste the code below into the HTML of your website. Then add the address of your website into one of the extra fields on your profile from the "Edit profile" tab and save changes. verification: Verification verified_links: Your verified links + website_verification: Website verification webauthn_credentials: add: Add new security key create: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 90c1e77760..5c39346a9f 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1161,6 +1161,10 @@ fi: view_strikes: Näytä aiemmat tiliäsi koskevat varoitukset too_fast: Lomake lähetettiin liian nopeasti, yritä uudelleen. use_security_key: Käytä suojausavainta + author_attribution: + example_title: Esimerkkiteksti + more_from_html: Lisää tekijältä %{name} + s_blog: Käyttäjän %{name} blogi challenge: confirm: Jatka hint_html: "Vihje: Emme pyydä sinulta salasanaa uudelleen seuraavan tunnin aikana." @@ -1949,6 +1953,7 @@ fi: instructions_html: Kopioi ja liitä seuraava koodi verkkosivustosi HTML-lähdekoodiin. Lisää sitten verkkosivustosi osoite johonkin profiilisi lisäkentistä ”Muokkaa profiilia” -välilehdellä ja tallenna muutokset. verification: Vahvistus verified_links: Vahvistetut linkkisi + website_verification: Verkkosivuston vahvistus webauthn_credentials: add: Lisää uusi suojausavain create: diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 5bc192e9db..6d7b38e18a 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -25,6 +25,7 @@ fo: admin: account_actions: action: Frem atgerð + already_silenced: Hendan kontan er longu avmarkað. already_suspended: Hendan kontan er longu ógildað. title: Frem umsjónaratgerð á %{acct} account_moderation_notes: @@ -1160,6 +1161,12 @@ fo: view_strikes: Vís eldri atsóknir móti tíni kontu too_fast: Oyðublaðið innsent ov skjótt, royn aftur. use_security_key: Brúka trygdarlykil + author_attribution: + example_title: Tekstadømi + hint_html: Kanna, hvussu tú verður viðurkend/ur, tá ið onnur deila slóðir á Mastodon. + more_from_html: Meiri frá %{name} + s_blog: Bloggurin hjá %{name} + title: Ískoyti høvundans challenge: confirm: Hald á hint_html: "Góð ráð: vit spyrja teg ikki aftur um loyniorðið næsta tíman." @@ -1945,6 +1952,7 @@ fo: instructions_html: Avrita og innset koduna niðanfyri inn í HTML'ið á heimasíðuni hjá tær. Legg síðani adressuna á heimasíðuni hjá tær inn á eitt av eyka teigunum á vanganum hjá tær umvegis "Rætta vanga" teigin og goym broytingar. verification: Váttan verified_links: Tíni váttaðu leinki + website_verification: Heimasíðuváttan webauthn_credentials: add: Legg nýggjan trygdarlykil afturat create: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index c8fa1d833d..d275b844fd 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1161,6 +1161,12 @@ gl: view_strikes: Ver avisos anteriores respecto da túa conta too_fast: Formulario enviado demasiado rápido, inténtao outra vez. use_security_key: Usa chave de seguridade + author_attribution: + example_title: Texto de mostra + hint_html: Controla o xeito en que te acreditan cando se comparten ligazóns en Mastodon. + more_from_html: Máis de %{name} + s_blog: Blog de %{name} + title: Atribución da autoría challenge: confirm: Continuar hint_html: "Nota: Non che pediremos o contrasinal na seguinte hora." @@ -1949,6 +1955,7 @@ gl: instructions_html: Copia e pega o código inferior no HTML do teu sitio web. Despois engade o enderezo da túa web nun dos campos de datos extra do teu perfil dispoñibles na lapela "Editar perfil" e garda os cambios. verification: Validación verified_links: As túas ligazóns verificadas + website_verification: Verificación do sitio web webauthn_credentials: add: Engadir nova chave de seguridade create: diff --git a/config/locales/he.yml b/config/locales/he.yml index 025b2de9e2..341e2bf023 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -29,6 +29,7 @@ he: admin: account_actions: action: בצע/י פעולה + already_silenced: חשבון זה הוגבל זה מכבר. already_suspended: חשבון זה הושעה. title: ביצוע פעולות הנהלה על %{acct} account_moderation_notes: @@ -1196,6 +1197,12 @@ he: view_strikes: צפיה בעברות קודמות שנרשמו נגד חשבונך too_fast: הטופס הוגש מהר מדי, נסה/י שוב. use_security_key: שימוש במפתח אבטחה + author_attribution: + example_title: טקסט לדוגמה + hint_html: בחירה איך תקבלו קרדיטציה כאשר קישורים משותפים דרך מסטודון. + more_from_html: עוד מאת %{name} + s_blog: הבלוג של %{name} + title: ייחוס למפרסם challenge: confirm: המשך hint_html: "טיפ: לא נבקש את סיסמתך שוב בשעה הקרובה." @@ -2014,6 +2021,7 @@ he: instructions_html: יש להדביק את הקוד שלמטה אל האתר שלך. ואז להוסיף את כתובת האתר לאחד השדות הנוספים בפרופיל מתוך טאב "עריכת פרופיל" ולשמור את השינויים. verification: אימות verified_links: קישוריך המאומתים + website_verification: אימות אתר רשת webauthn_credentials: add: הוספת מפתח אבטחה חדש create: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 141f5b7d07..e29472f8d8 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -25,6 +25,7 @@ hu: admin: account_actions: action: Művelet végrehajtása + already_silenced: Ezt a fiókot már korlátozták. already_suspended: Ezt a fiókot már felfüggesztették. title: 'Moderálási művelet végrehajtása ezen: %{acct}' account_moderation_notes: @@ -1160,6 +1161,12 @@ hu: view_strikes: Fiókod ellen felrótt korábbi vétségek megtekintése too_fast: Túl gyorsan küldted el az űrlapot, próbáld később. use_security_key: Biztonsági kulcs használata + author_attribution: + example_title: Mintaszöveg + hint_html: Szabályozd, hogyan hivatkoznak rád, amikor linket osztanak meg Mastodonon. + more_from_html: 'Több tőle: %{name}' + s_blog: "%{name} blogja" + title: Szerző forrásmegjelölése challenge: confirm: Folytatás hint_html: "Hasznos: Nem fogjuk megint a jelszavadat kérdezni a következő órában." @@ -1946,8 +1953,9 @@ hu: here_is_how: Itt van, hogyan kell hint_html: "A személyazonosságod ellenőrizhetősége a Mastodonon mindenki számára elérhető. Ez nyílt webes szabványok alapján, most és mindörökké szabadon és ingyenesen történik. Ehhez csak egy saját weboldalra van szükséged, mely alapján mások felismernek téged. Ha a profilodról erre a weboldalra hivatkozol, mi ellenőrizzük, hogy erről az oldalról visszahivatkozol-e a profilodra, és siker esetén erről vizuális jelzést is adunk a profilodon." instructions_html: Az alábbi kódot másold be a weboldalad HTML kódjába. Ezután add hozzá a weboldalad címét a profilod egyik extra mezőjéhez a "Profil szerkesztése" fülön és mentsd a változásokat. - verification: Hitelesítés + verification: Ellenőrzés verified_links: Ellenőrzött hivatkozásaid + website_verification: Weboldal ellenőrzése webauthn_credentials: add: Biztonsági kulcs hozzáadása create: diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 073e5032b4..87789562fd 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -25,6 +25,7 @@ ia: admin: account_actions: action: Exequer action + already_silenced: Iste conto jam ha essite limitate. already_suspended: Iste conto jam ha essite suspendite. title: Exequer action de moderation sur %{acct} account_moderation_notes: @@ -1146,6 +1147,10 @@ ia: view_strikes: Examinar le sanctiones passate contra tu conto too_fast: Formulario inviate troppo rapidemente. Tenta lo de novo. use_security_key: Usar clave de securitate + author_attribution: + example_title: Texto de exemplo + more_from_html: Plus de %{name} + s_blog: Blog de %{name} challenge: confirm: Continuar hint_html: "Consilio: Nos non te demandara tu contrasigno de novo in le proxime hora." @@ -1933,6 +1938,7 @@ ia: instructions_html: Copia e colla le codice hic infra in le HTML de tu sito web. Alora adde le adresse de tu sito web in un del campos supplementari sur tu profilo desde le scheda “Modificar profilo” e salva le cambiamentos. verification: Verification verified_links: Tu ligamines verificate + website_verification: Verification de sito web webauthn_credentials: add: Adder un nove clave de securitate create: diff --git a/config/locales/is.yml b/config/locales/is.yml index 1c84c45c80..5fa147e8db 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -25,6 +25,7 @@ is: admin: account_actions: action: Framkvæma aðgerð + already_silenced: Þessi aðgangur hefur þegar verið takmarkaður. already_suspended: Þessi aðgangur hefur þegar verið settur í frysti. title: Framkvæma umsjónaraðgerð á %{acct} account_moderation_notes: @@ -1164,6 +1165,12 @@ is: view_strikes: Skoða fyrri bönn notandaaðgangsins þíns too_fast: Innfyllingarform sent inn of hratt, prófaðu aftur. use_security_key: Nota öryggislykil + author_attribution: + example_title: Sýnitexti + hint_html: Stýrðu hvernig framlög þín birtast þegar tenglum er deilt á Mastodon. + more_from_html: Meira frá %{name} + s_blog: Bloggsvæði hjá %{name} + title: Framlag höfundar challenge: confirm: Halda áfram hint_html: "Ábending: Við munum ekki spyrja þig um lykilorðið aftur næstu klukkustundina." @@ -1952,6 +1959,7 @@ is: instructions_html: Afritaðu og límdu kóðann hér fyrir neðan inn í HTML-kóða vefsvæðisins þíns. Bættu síðan slóð vefsvæðisins þíns inn í einn af auka-reitunum í flipanum "Breyta notandasniði" og vistaðu síðan breytingarnar. verification: Sannprófun verified_links: Staðfestu tenglarnir þínir + website_verification: Staðfesting vefsvæðis webauthn_credentials: add: Bæta við nýjum öryggislykli create: diff --git a/config/locales/it.yml b/config/locales/it.yml index a429c6339b..7de24fe259 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1163,6 +1163,12 @@ it: view_strikes: Visualizza le sanzioni precedenti prese nei confronti del tuo account too_fast: Modulo inviato troppo velocemente, riprova. use_security_key: Usa la chiave di sicurezza + author_attribution: + example_title: Testo di esempio + hint_html: Controlla come sei viene accreditato quando i link sono condivisi su Mastodon. + more_from_html: Altro da %{name} + s_blog: Blog di %{name} + title: Attribuzione autore challenge: confirm: Continua hint_html: "Suggerimento: Non ti chiederemo di nuovo la tua password per la prossima ora." @@ -1951,6 +1957,7 @@ it: instructions_html: Copia e incolla il codice qui sotto nell'HTML del tuo sito web. Quindi, aggiungi l'indirizzo del tuo sito web in uno dei campi aggiuntivi del tuo profilo dalla scheda "Modifica profilo" e salva le modifiche. verification: Verifica verified_links: I tuoi collegamenti verificati + website_verification: Verifica del sito web webauthn_credentials: add: Aggiungi una nuova chiave di sicurezza create: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index c48b8ef93b..07e8ba75a2 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -29,6 +29,7 @@ lt: admin: account_actions: action: Atlikti veiksmą + already_silenced: Ši paskyra jau buvo apribota. already_suspended: Ši paskyra jau sustabdyta. title: Atlikti prižiūrėjimo veiksmą %{acct} account_moderation_notes: @@ -800,6 +801,12 @@ lt: redirecting_to: Tavo paskyra yra neaktyvi, nes šiuo metu ji nukreipiama į %{acct}. self_destruct: Kadangi %{domain} uždaromas, turėsi tik ribotą prieigą prie savo paskyros. view_strikes: Peržiūrėti ankstesnius savo paskyros pažeidimus + author_attribution: + example_title: Teksto pavyzdys + hint_html: Valdyk, kaip esi nurodomas (-a), kai nuorodos bendrinamos platformoje „Mastodon“. + more_from_html: Daugiau iš %{name} + s_blog: "%{name} tinklaraštis" + title: Autoriaus (-ės) atribucija challenge: hint_html: "Patarimas: artimiausią valandą daugiau neprašysime tavo slaptažodžio." datetime: @@ -1230,6 +1237,7 @@ lt: instructions_html: Nukopijuok ir įklijuok toliau pateiktą kodą į savo svetainės HTML. Tada į vieną iš papildomų profilio laukų skirtuke Redaguoti profilį įrašyk savo svetainės adresą ir išsaugok pakeitimus. verification: Patvirtinimas verified_links: Tavo patikrintos nuorodos + website_verification: Svetainės patvirtinimas webauthn_credentials: add: Pridėti naują saugumo raktą create: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index c74bf488b5..63fcf1c857 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1161,6 +1161,12 @@ nl: view_strikes: Bekijk de eerder door moderatoren vastgestelde overtredingen die je hebt gemaakt too_fast: Formulier is te snel ingediend. Probeer het nogmaals. use_security_key: Beveiligingssleutel gebruiken + author_attribution: + example_title: Voorbeeldtekst + hint_html: Bepaal hoe we je vermelden, wanneer jouw links op Mastodon worden gedeeld. + more_from_html: Meer van %{name} + s_blog: De weblog van %{name} + title: Auteur-attributie challenge: confirm: Doorgaan hint_html: "Tip: We vragen jou het komende uur niet meer naar jouw wachtwoord." @@ -1949,6 +1955,7 @@ nl: instructions_html: Kopieer en plak de onderstaande code in de HTML van je website. Voeg vervolgens het adres van je website toe aan een van de extra velden op je profiel op het tabblad "Profiel bewerken" en sla de wijzigingen op. verification: Verificatie verified_links: Jouw geverifieerde links + website_verification: Website-verificatie webauthn_credentials: add: Nieuwe beveiligingssleutel toevoegen create: diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 5c46a0d43e..47dcc1ac8e 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -26,6 +26,7 @@ nn: account_actions: action: Utfør already_silenced: Denne kontoen har allereie vorte avgrensa. + already_suspended: Denne kontoen er allereie sperra. title: Utfør moderatorhandling på %{acct} account_moderation_notes: create: Legg igjen merknad @@ -47,6 +48,7 @@ nn: title: Byt e-post for %{username} change_role: changed_msg: Rolle endra! + edit_roles: Administrer brukarroller label: Endre rolle no_role: Inga rolle title: Endre rolle for %{username} @@ -603,6 +605,7 @@ nn: suspend_description_html: Brukarkontoen og alt innhaldet vil bli utilgjengeleg og til slutt sletta, og det vil vera uråd å samhandla med brukaren. Du kan angra dette innan 30 dagar. Dette avsluttar alle rapportar om kontoen. actions_description_html: Avgjer kva som skal gjerast med denne rapporteringa. Dersom du utfører straffetiltak mot den rapporterte kontoen, vil dei motta ein e-post – så sant du ikkje har valt kategorien Spam. actions_description_remote_html: Avgjer kva du vil gjera for å løysa denne rapporten. Dette påverkar berre korleis tenaren din kommuniserer med kontoen på ein annan tenar, og korleis tenaren din handterer innhald derifrå. + actions_no_posts: Denne rapporten har ingen tilknytte innlegg å sletta add_to_report: Legg til i rapporten already_suspended_badges: local: Allereie utestengd på denne tenaren @@ -1158,6 +1161,12 @@ nn: view_strikes: Vis tidligere advarsler mot kontoen din too_fast: Skjemaet ble sendt inn for raskt, prøv på nytt. use_security_key: Bruk sikkerhetsnøkkel + author_attribution: + example_title: Eksempeltekst + hint_html: Kontroller korleis du blir kreditert når nokon deler lenker på Mastodon. + more_from_html: Meir frå %{name} + s_blog: Bloggen til %{name} + title: Forfattarkreditering challenge: confirm: Hald fram hint_html: "Tips: Vi skal ikkje spørja deg om passordet ditt igjen i laupet av den neste timen." @@ -1946,6 +1955,7 @@ nn: instructions_html: Kopier og lim inn i koden nedanfor i HTML-koden for nettsida di. Legg deretter adressa til nettsida di til i ei av ekstrafelta på profilen din frå fana "Rediger profil" og lagre endringane. verification: Stadfesting verified_links: Dine verifiserte lenker + website_verification: Stadfesting av nettside webauthn_credentials: add: Legg til ny sikkerhetsnøkkel create: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index c90d448a7f..b710df2e78 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -29,6 +29,7 @@ pl: admin: account_actions: action: Wykonaj działanie + already_silenced: To konto zostało już ograniczone. already_suspended: To konto zostało już zawieszone. title: Wykonaj działanie moderacyjne na %{acct} account_moderation_notes: @@ -1196,6 +1197,12 @@ pl: view_strikes: Zobacz dawne ostrzeżenia nałożone na twoje konto too_fast: Zbyt szybko przesłano formularz, spróbuj ponownie. use_security_key: Użyj klucza bezpieczeństwa + author_attribution: + example_title: Przykładowy tekst + hint_html: Kontroluj przypisy do twoich wpisów widoczne na Mastodonie. + more_from_html: Więcej od %{name} + s_blog: Blog %{name} + title: Przypis do autora challenge: confirm: Kontynuuj hint_html: "Informacja: Nie będziemy prosić Cię o ponowne podanie hasła przez następną godzinę." @@ -2014,6 +2021,7 @@ pl: instructions_html: Skopiuj poniższy kod HTML i wklej go na swoją stronę. Potem dodaj link do twojej strony do jednego z wolnych pól na profilu z zakładki "Edytuj profil". verification: Weryfikacja verified_links: Twoje zweryfikowane linki + website_verification: Weryfikacja strony internetowej webauthn_credentials: add: Dodaj nowy klucz bezpieczeństwa create: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 3c14589e6c..864a8b4d91 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -25,6 +25,8 @@ pt-BR: admin: account_actions: action: Tomar uma atitude + already_silenced: Esta conta já foi limitada. + already_suspended: Esta conta já foi suspensa. title: Moderar %{acct} account_moderation_notes: create: Deixar nota @@ -46,6 +48,7 @@ pt-BR: title: Alterar e-mail para %{username} change_role: changed_msg: Função alterada com sucesso! + edit_roles: Gerenciar funções do usuário label: Alterar função no_role: Nenhuma função title: Alterar função para %{username} @@ -602,6 +605,7 @@ pt-BR: suspend_description_html: A conta e todo o seu conteúdo ficará inacessível e, eventualmente, excluído e interagir com ela será impossível. Reversível dentro de 30 dias. Encerra todas as denúncias contra esta conta. actions_description_html: Decida qual ação tomar para responder a essa denúncia. Se você tomar uma ação punitiva contra a conta denunciada, uma notificação por e-mail será enviada ao usuário, exceto quando a categoria Spam for selecionada. actions_description_remote_html: Decida quais medidas tomará para resolver esta denúncia. Isso só afetará como seu servidor se comunica com esta conta remota e manipula seu conteúdo. + actions_no_posts: Essa denúncia não tem nenhuma publicação associada para excluir add_to_report: Adicionar mais à denúncia already_suspended_badges: local: Já suspenso neste servidor @@ -1157,6 +1161,12 @@ pt-BR: view_strikes: Veja os avisos anteriores em relação à sua conta too_fast: O formulário foi enviado muito rapidamente, tente novamente. use_security_key: Usar chave de segurança + author_attribution: + example_title: Texto de amostra + hint_html: Controle como você é creditado quando links são compartilhados no Mastodon. + more_from_html: Mais de %{name} + s_blog: Blog do %{name} + title: Atribuição de autoria challenge: confirm: Continuar hint_html: "Dica: Não pediremos novamente sua senha pela próxima hora." @@ -1945,6 +1955,7 @@ pt-BR: instructions_html: Copie o código abaixo e cole no HTML do seu site. Em seguida, adicione o endereço do seu site em um dos campos extras em seu perfil, na aba "Editar perfil", e salve as alterações. verification: Verificação verified_links: Seus links verificados + website_verification: Verificação do site webauthn_credentials: add: Adicionar nova chave de segurança create: diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index c628bebaad..7b651470bf 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -3,6 +3,7 @@ ca: simple_form: hints: account: + attribution_domains_as_text: Protegeix de falses atribucions. discoverable: El teu perfil i els teus tuts públics poden aparèixer o ser recomanats en diverses àreas de Mastodon i el teu perfil pot ser suggerit a altres usuaris. display_name: El teu nom complet o el teu nom divertit. fields: La teva pàgina d'inici, pronoms, edat, el que vulguis. @@ -143,6 +144,7 @@ ca: url: On els esdeveniments seran enviats labels: account: + attribution_domains_as_text: Permet només webs específics discoverable: Permet el perfil i el tuts en els algorismes de descobriment fields: name: Etiqueta diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 8bacdc46c3..e7b8fe337a 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -3,6 +3,7 @@ da: simple_form: hints: account: + attribution_domains_as_text: Beskytter mod falske tilskrivninger. discoverable: Dine offentlige indlæg og profil kan blive fremhævet eller anbefalet i forskellige områder af Mastodon, og profilen kan blive foreslået til andre brugere. display_name: Dit fulde navn eller dit sjove navn. fields: Din hjemmeside, dine pronominer, din alder, eller hvad du har lyst til. @@ -143,6 +144,7 @@ da: url: Hvor begivenheder sendes til labels: account: + attribution_domains_as_text: Tillad kun bestemte websteder discoverable: Fremhæv profil og indlæg i opdagelsesalgoritmer fields: name: Etiket diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index ddb6621aa6..f7e55f1a7b 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -3,6 +3,7 @@ de: simple_form: hints: account: + attribution_domains_as_text: Dadurch können falsche Zuschreibungen unterbunden werden. discoverable: Deine öffentlichen Beiträge und dein Profil können in verschiedenen Bereichen auf Mastodon angezeigt oder empfohlen werden und dein Profil kann anderen vorgeschlagen werden. display_name: Dein richtiger Name oder dein Fantasiename. fields: Deine Website, Pronomen, dein Alter – alles, was du möchtest. @@ -143,6 +144,7 @@ de: url: Wohin Ereignisse gesendet werden labels: account: + attribution_domains_as_text: Nur ausgewählte Websites zulassen discoverable: Profil und Beiträge in Suchalgorithmen berücksichtigen fields: name: Beschriftung diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index 18776d67d6..b802fd532f 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -3,6 +3,7 @@ en-GB: simple_form: hints: account: + attribution_domains_as_text: Protects from false attributions. discoverable: Your public posts and profile may be featured or recommended in various areas of Mastodon and your profile may be suggested to other users. display_name: Your full name or your fun name. fields: Your homepage, pronouns, age, anything you want. @@ -130,6 +131,7 @@ en-GB: name: You can only change the casing of the letters, for example, to make it more readable user: chosen_languages: When checked, only posts in selected languages will be displayed in public timelines + role: The role controls which permissions the user has. user_role: color: Color to be used for the role throughout the UI, as RGB in hex format highlighted: This makes the role publicly visible @@ -142,6 +144,7 @@ en-GB: url: Where events will be sent to labels: account: + attribution_domains_as_text: Only allow specific websites discoverable: Feature profile and posts in discovery algorithms fields: name: Label diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index d3f0628631..a2b29566f6 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -143,6 +143,7 @@ fi: url: Mihin tapahtumat lähetetään labels: account: + attribution_domains_as_text: Salli vain tietyt verkkosivustot discoverable: Pidä profiiliasi ja julkaisujasi esillä löytämisalgoritmeissa fields: name: Nimike diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index 35e42f6c74..afcd3b39ac 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -3,6 +3,7 @@ fo: simple_form: hints: account: + attribution_domains_as_text: Verjir fyri følskum ískoytum. discoverable: Tínir almennu postar og tín vangi kunnu vera drigin fram og viðmæld ymsa staðni í Mastodon og vangin hjá tær kann vera viðmæltur øðrum brúkarum. display_name: Títt fulla navn og títt stuttliga navn. fields: Heimasíðan hjá tær, fornøvn, aldur ella hvat tú vil. @@ -143,6 +144,7 @@ fo: url: Hvar hendingar verða sendar til labels: account: + attribution_domains_as_text: Loyv einans ávísum heimasíðum discoverable: Framheva vanga og postar í uppdagingar-algoritmum fields: name: Spjaldur diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index abb30fa48c..cddeae5cee 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -3,6 +3,7 @@ gl: simple_form: hints: account: + attribution_domains_as_text: Protéxete de falsas atribucións. discoverable: As túas publicacións públicas e perfil poden mostrarse ou recomendarse en varias zonas de Mastodon e o teu perfil ser suxerido a outras usuarias. display_name: O teu nome completo ou un nome divertido. fields: Páxina web, pronome, idade, o que ti queiras. @@ -143,6 +144,7 @@ gl: url: A onde se enviarán os eventos labels: account: + attribution_domains_as_text: Permitir só os sitios web indicados discoverable: Perfil destacado e publicacións nos algoritmos de descubrimento fields: name: Etiqueta diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index 26edab3b2e..1feebb0d69 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -3,6 +3,7 @@ he: simple_form: hints: account: + attribution_domains_as_text: הגנה מייחוסים שקריים. discoverable: הפוסטים והפרופיל שלך עשויים להיות מוצגים או מומלצים באזורים שונים באתר וייתכן שהפרופיל שלך יוצע למשתמשים אחרים. display_name: שמך המלא או שם הכיף שלך. fields: עמוד הבית שלך, לשון הפנייה, גיל, וכל מידע אחר לפי העדפתך האישית. @@ -143,6 +144,7 @@ he: url: היעד שאליו יישלחו אירועים labels: account: + attribution_domains_as_text: רק אתרים מסויימים יאושרו discoverable: הצג משתמש ופוסטים בעמוד התגליות fields: name: תווית diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 545fd4a8e9..383bdd0760 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -3,6 +3,7 @@ hu: simple_form: hints: account: + attribution_domains_as_text: Megvéd a hamis forrásmegjelölésektől. discoverable: A nyilvános bejegyzéseid és a profilod kiemelhető vagy ajánlható a Mastodon különböző területein, a profilod más felhasználóknak is javasolható. display_name: Teljes neved vagy vicces neved. fields: Weboldalad, megszólításaid, korod, bármi, amit szeretnél. @@ -143,6 +144,7 @@ hu: url: Ahová az eseményket küldjük labels: account: + attribution_domains_as_text: Csak meghatározott weboldalak engedélyezése discoverable: Profil és bejegyzések szerepeltetése a felfedezési algoritmusokban fields: name: Címke diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index 85fa74f1ed..dc5aad57ae 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -142,6 +142,7 @@ ia: url: Ubi le eventos essera inviate labels: account: + attribution_domains_as_text: Solmente permitter sitos web specific discoverable: Evidentiar le profilo e messages in le algorithmos de discoperta fields: name: Etiquetta diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index d615e391ac..6f3a4fe8a5 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -3,6 +3,7 @@ is: simple_form: hints: account: + attribution_domains_as_text: Ver fyrir fölskum tilvísunum í höfunda. discoverable: Opinberar færslur og notandasnið þitt geta birst eða verið mælt með á hinum ýmsu svæðum í Mastodon auk þess sem hægt er að mæla með þér við aðra notendur. display_name: Fullt nafn þitt eða eitthvað til gamans. fields: Heimasíðan þín, fornöfn, aldur eða eitthvað sem þú vilt koma á framfæri. @@ -143,6 +144,7 @@ is: url: Hvert atburðir verða sendir labels: account: + attribution_domains_as_text: Einungis leyfa tiltekin vefsvæði discoverable: Hafa notandasnið og færslur með í reikniritum leitar fields: name: Skýring diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 1068b2f927..7ed4c0d004 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -3,6 +3,7 @@ it: simple_form: hints: account: + attribution_domains_as_text: Protegge da false attribuzioni. discoverable: I tuoi post pubblici e il tuo profilo potrebbero essere presenti o consigliati in varie aree di Mastodon e il tuo profilo potrebbe essere suggerito ad altri utenti. display_name: Il tuo nome completo o il tuo soprannome. fields: La tua homepage, i pronomi, l'età, tutto quello che vuoi. @@ -143,6 +144,7 @@ it: url: Dove gli eventi saranno inviati labels: account: + attribution_domains_as_text: Consenti solo siti web specifici discoverable: Include il profilo e i post negli algoritmi di scoperta fields: name: Etichetta diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index 99cb269e37..41f55f183d 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -3,6 +3,7 @@ lt: simple_form: hints: account: + attribution_domains_as_text: Apsaugo nuo klaidingų atributų. discoverable: Tavo vieši įrašai ir profilis gali būti rodomi arba rekomenduojami įvairiose Mastodon vietose, o profilis gali būti siūlomas kitiems naudotojams. display_name: Tavo pilnas vardas arba smagus vardas. fields: Tavo pagrindinis puslapis, įvardžiai, amžius, bet kas, ko tik nori. @@ -104,6 +105,7 @@ lt: role: Vaidmuo valdo, kokius leidimus naudotojas turi. labels: account: + attribution_domains_as_text: Leisti tik konkrečias svetaines discoverable: Rekomenduoti profilį ir įrašus į atradimo algoritmus indexable: Įtraukti viešus įrašus į paieškos rezultatus show_collections: Rodyti sekimus ir sekėjus profilyje diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 066f6c2acb..7f8aaa01d6 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -3,6 +3,7 @@ nl: simple_form: hints: account: + attribution_domains_as_text: Beschermt tegen onjuiste attributies. discoverable: Jouw openbare berichten kunnen worden uitgelicht op verschillende plekken binnen Mastodon en jouw account kan worden aanbevolen aan andere gebruikers. display_name: Jouw volledige naam of een leuke bijnaam. fields: Jouw website, persoonlijke voornaamwoorden, leeftijd, alles wat je maar kwijt wilt. @@ -143,6 +144,7 @@ nl: url: Waar gebeurtenissen naartoe worden verzonden labels: account: + attribution_domains_as_text: Alleen bepaalde websites toestaan discoverable: Jouw account en berichten laten uitlichten door Mastodon fields: name: Label diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index 500a41c8cc..ddd5ed8995 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -3,6 +3,7 @@ nn: simple_form: hints: account: + attribution_domains_as_text: Vernar mot falske krediteringar. discoverable: Dei offentlege innlegga dine og profilen din kan dukka opp i tilrådingar på ulike stader på Mastodon, og profilen din kan bli føreslegen for andre folk. display_name: Ditt fulle namn eller ditt tøysenamn. fields: Heimesida di, pronomen, alder, eller kva du måtte ynskje. @@ -130,6 +131,7 @@ nn: name: Du kan berre endra bruken av store/små bokstavar, t. d. for å gjera det meir leseleg user: chosen_languages: Når merka vil berre tuta på dei valde språka synast på offentlege tidsliner + role: Rolla kontrollerer kva løyve brukaren har. user_role: color: Fargen som skal nyttast for denne rolla i heile brukargrensesnittet, som RGB i hex-format highlighted: Dette gjer rolla synleg offentleg @@ -142,6 +144,7 @@ nn: url: Kvar hendingar skal sendast labels: account: + attribution_domains_as_text: Tillat berre visse nettstader discoverable: Ta med profilen og innlegga i oppdagingsalgoritmar fields: name: Merkelapp diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index b113e0eed5..bb404e56c9 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -3,6 +3,7 @@ pl: simple_form: hints: account: + attribution_domains_as_text: Chroni przed fałszywym przypisaniem wpisów. discoverable: Twój profil i publiczne wpisy mogą być promowane lub polecane na Mastodonie i twój profil może być sugerowany innym użytkownikom. display_name: Twoje imię lub pseudonim. fields: Co ci się tylko podoba – twoja strona domowa, zaimki, wiek… @@ -143,6 +144,7 @@ pl: url: Dokąd będą wysłane zdarzenia labels: account: + attribution_domains_as_text: Zezwól tylko na konkretne strony discoverable: Udostępniaj profil i wpisy funkcjom odkrywania fields: name: Nazwa diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 6b0bad0f08..96bc219e8e 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -3,6 +3,7 @@ pt-BR: simple_form: hints: account: + attribution_domains_as_text: Protege de atribuições falsas. discoverable: Suas publicações e perfil públicos podem ser destaques ou recomendados em várias áreas de Mastodon, e seu perfil pode ser sugerido a outros usuários. display_name: Seu nome completo ou apelido. fields: Sua página inicial, pronomes, idade ou qualquer coisa que quiser. @@ -130,6 +131,7 @@ pt-BR: name: Você pode mudar a capitalização das letras, por exemplo, para torná-la mais legível user: chosen_languages: Apenas as publicações dos idiomas selecionados serão exibidas nas linhas públicas + role: A função controla quais permissões o usuário tem. user_role: color: Cor a ser usada para o cargo em toda a interface do usuário, como RGB no formato hexadecimal highlighted: Isso torna o cargo publicamente visível @@ -142,6 +144,7 @@ pt-BR: url: Aonde os eventos serão enviados labels: account: + attribution_domains_as_text: Permitir apenas sites específicos discoverable: Destacar perfil e publicações nos algoritmos de descoberta fields: name: Rótulo diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 2fcf23b156..d90b97bf9b 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -3,6 +3,7 @@ tr: simple_form: hints: account: + attribution_domains_as_text: Sahte atıflardan korur. discoverable: Herkese açık gönderileriniz ve profiliniz Mastodon'un çeşitli kısımlarında öne çıkarılabilir veya önerilebilir ve profiliniz başka kullanıcılara önerilebilir. display_name: Tam adınız veya kullanıcı adınız. fields: Ana sayfanız, zamirleriniz, yaşınız, istediğiniz herhangi bir şey. @@ -143,6 +144,7 @@ tr: url: Olayların gönderileceği yer labels: account: + attribution_domains_as_text: Yalnızca belirli websitelerine izin ver discoverable: Profil ve gönderileri keşif algoritmalarında kullan fields: name: Etiket diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index e2a1562b53..b584a6cada 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -3,6 +3,7 @@ uk: simple_form: hints: account: + attribution_domains_as_text: Захищає від фальшивих атрибутів. discoverable: Ваші дописи та профіль можуть бути рекомендовані в різних частинах Mastodon і ваш профіль може бути запропонований іншим користувачам. display_name: Ваше повне ім'я або ваш псевдонім. fields: Ваша домашня сторінка, займенники, вік, все, що вам заманеться. @@ -143,6 +144,7 @@ uk: url: Куди надсилатимуться події labels: account: + attribution_domains_as_text: Дозволити лише на певних вебсайтах discoverable: Функції профілю та дописів у алгоритмах виявлення fields: name: Мітка diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index cb4341b551..419cb99abb 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -3,6 +3,7 @@ zh-CN: simple_form: hints: account: + attribution_domains_as_text: 保护作品免受虚假署名。 discoverable: 您的公开嘟文和个人资料可能会在 Mastodon 的多个位置展示,您的个人资料可能会被推荐给其他用户。 display_name: 你的全名或昵称。 fields: 你的主页、人称代词、年龄,以及任何你想要添加的内容。 @@ -143,6 +144,7 @@ zh-CN: url: 事件将被发往的目的地 labels: account: + attribution_domains_as_text: 仅允许特定网站 discoverable: 在发现算法中展示你的个人资料和嘟文 fields: name: 标签 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 8b4c440025..a5bc683634 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -3,6 +3,7 @@ zh-TW: simple_form: hints: account: + attribution_domains_as_text: 偽造署名保護。 discoverable: 公開嘟文及個人檔案可能於各 Mastodon 功能中被推薦,並且您的個人檔案可能被推薦至其他使用者。 display_name: 完整名稱或暱稱。 fields: 烘培雞、自我認同代稱、年齡,及任何您想分享的。 @@ -143,6 +144,7 @@ zh-TW: url: 事件會被傳送至何處 labels: account: + attribution_domains_as_text: 僅允許特定網站 discoverable: 於探索演算法中推薦個人檔案及嘟文 fields: name: 標籤 diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 5e8a3c912c..dcc6ff7fb5 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -25,6 +25,7 @@ sq: admin: account_actions: action: Kryeje veprimin + already_silenced: Kjo llogari është kufizuar tashmë. already_suspended: Kjo llogari është pezulluar tashmë. title: Kryeni veprim moderimi te %{acct} account_moderation_notes: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 0cc47ca92e..7b45f28c92 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -183,14 +183,17 @@ sv: create_custom_emoji: Skapa egen emoji create_domain_allow: Skapa tillåten domän create_domain_block: Skapa blockerad domän + create_email_domain_block: Skapa E-post domän block create_ip_block: Skapa IP-regel create_unavailable_domain: Skapa otillgänglig domän create_user_role: Skapa roll demote_user: Degradera användare destroy_announcement: Radera kungörelse + destroy_canonical_email_block: Ta bort e-post block destroy_custom_emoji: Radera egen emoji destroy_domain_allow: Ta bort tillåten domän destroy_domain_block: Ta bort blockerad domän + destroy_email_domain_block: Ta bort E-post domän block destroy_instance: Rensa domänen destroy_ip_block: Radera IP-regel destroy_status: Radera inlägg @@ -233,6 +236,7 @@ sv: assigned_to_self_report_html: "%{name} tilldelade rapporten %{target} till sig själva" change_email_user_html: "%{name} bytte e-postadress för användaren %{target}" change_role_user_html: "%{name} ändrade roll för %{target}" + confirm_user_html: "%{name} bekräftad e-post adress av användare %{target}" create_account_warning_html: "%{name} skickade en varning till %{target}" create_announcement_html: "%{name} skapade kungörelsen %{target}" create_custom_emoji_html: "%{name} laddade upp ny emoji %{target}" diff --git a/config/locales/tr.yml b/config/locales/tr.yml index d8f5eff6e8..785be3caf4 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -25,7 +25,7 @@ tr: admin: account_actions: action: Eylemi gerçekleştir - already_silenced: Bu hesap zaten askıya alınmış. + already_silenced: Bu hesap zaten sınırlanmış. already_suspended: Bu hesap zaten askıya alınmış. title: "%{acct} üzerinde denetleme eylemi gerçekleştir" account_moderation_notes: @@ -1161,6 +1161,12 @@ tr: view_strikes: Hesabınıza yönelik eski eylemleri görüntüleyin too_fast: Form çok hızlı gönderildi, tekrar deneyin. use_security_key: Güvenlik anahtarını kullan + author_attribution: + example_title: Örnek metin + hint_html: Mastodon'da bağlantılar paylaşıldığında nasıl tanınmak istediğinizi denetleyin. + more_from_html: "%{name} kişisinden daha fazlası" + s_blog: "%{name} kişisinin Günlüğü" + title: Yazar atıfı challenge: confirm: Devam et hint_html: "İpucu: Önümüzdeki saat boyunca sana parolanı sormayacağız." @@ -1949,6 +1955,7 @@ tr: instructions_html: Aşağıdaki kodu kopyalayın ve websitenizin HTML'sine yapıştırın. Daha sonra "Profil Düzenle" sekmesini kullanarak profilinizdeki ek sahalardan birine websitenizin adresini ekleyin ve değişiklikleri kaydedin. verification: Doğrulama verified_links: Doğrulanmış bağlantılarınız + website_verification: Website doğrulama webauthn_credentials: add: Yeni güvenlik anahtarı ekle create: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 600239107e..f5cd40bad7 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -29,6 +29,7 @@ uk: admin: account_actions: action: Виконати дію + already_silenced: Цей обліковий запис вже обмежено. already_suspended: Цей обліковий запис вже було призупинено. title: Здійснити модераційну дію над %{acct} account_moderation_notes: @@ -1196,6 +1197,12 @@ uk: view_strikes: Переглянути попередні попередження вашому обліковому запису too_fast: Форму подано занадто швидко, спробуйте ще раз. use_security_key: Використовувати ключ безпеки + author_attribution: + example_title: Зразок тексту + hint_html: Контроль авторства поширених посилань на Mastodon. + more_from_html: Більше від %{name} + s_blog: Блог %{name} + title: Атрибути авторства challenge: confirm: Далі hint_html: "Підказка: ми не будемо запитувати ваш пароль впродовж наступної години." @@ -2014,6 +2021,7 @@ uk: instructions_html: Скопіюйте та вставте наведений нижче код у HTML-код вашого сайту. Потім додайте адресу свого сайту в одне з додаткових полів вашого профілю на вкладці «Редагувати профіль» і збережіть зміни. verification: Підтвердження verified_links: Ваші підтверджені посилання + website_verification: Підтвердження вебсайтів webauthn_credentials: add: Додати новий ключ безпеки create: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index b97ab65f04..747dcf3738 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1143,6 +1143,12 @@ zh-CN: view_strikes: 查看针对你账号的记录 too_fast: 表单提交过快,请重试。 use_security_key: 使用安全密钥 + author_attribution: + example_title: 示例文本 + hint_html: 控制在 Mastodon 上分享的链接如何显示你的署名。 + more_from_html: 来自 %{name} 的更多内容 + s_blog: "%{name} 的博客" + title: 作者归属 challenge: confirm: 继续 hint_html: "注意:接下来一小时内我们不会再次要求你输入密码。" @@ -1916,6 +1922,7 @@ zh-CN: instructions_html: 将下面的代码复制并粘贴到你网站的HTML中。然后在“编辑个人资料”选项卡中的附加字段之一添加你网站的地址,并保存更改。 verification: 验证 verified_links: 你已验证的链接 + website_verification: 网站验证 webauthn_credentials: add: 添加新的安全密钥 create: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 052773e328..8eab176d7d 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1145,6 +1145,12 @@ zh-TW: view_strikes: 檢視針對您帳號過去的警示 too_fast: 送出表單的速度太快跟不上,請稍後再試。 use_security_key: 使用安全金鑰 + author_attribution: + example_title: 範例文字 + hint_html: 控制如何於 Mastodon 上分享連結時註明您的貢獻。 + more_from_html: 來自 %{name} 之更多內容 + s_blog: "%{name} 的部落格" + title: 作者署名 challenge: confirm: 繼續 hint_html: "温馨小提醒: 我們於接下來一小時內不會再要求您輸入密碼。" @@ -1918,6 +1924,7 @@ zh-TW: instructions_html: 複製及貼上以下程式碼至您個人網站之 HTML 中。接著透過「編輯個人檔案」將您網站網址加入您個人網站之額外欄位中,並儲存變更。 verification: 驗證連結 verified_links: 已驗證連結 + website_verification: 網站驗證 webauthn_credentials: add: 新增安全金鑰 create: From a27f7f4e561c9d2fe21d984059603d2f500c005b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 15:59:46 +0200 Subject: [PATCH 21/89] Update typescript-eslint monorepo to v8 (major) (#31231) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renaud Chaput --- .eslintrc.js | 2 +- app/javascript/mastodon/actions/markers.ts | 2 +- app/javascript/mastodon/actions/streaming.js | 2 +- app/javascript/mastodon/common.js | 2 +- .../mastodon/components/error_boundary.jsx | 4 +- .../features/interaction_modal/index.jsx | 2 +- app/javascript/mastodon/features/ui/index.jsx | 4 +- .../mastodon/locales/intl_provider.tsx | 2 +- app/javascript/mastodon/settings.js | 7 +- .../mastodon/store/middlewares/errors.ts | 2 +- .../mastodon/store/middlewares/sounds.ts | 2 +- package.json | 4 +- yarn.lock | 141 ++++++++++-------- 13 files changed, 99 insertions(+), 77 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index d118262826..b6e4253e61 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -316,7 +316,7 @@ module.exports = defineConfig({ ], parserOptions: { - project: true, + projectService: true, tsconfigRootDir: __dirname, }, diff --git a/app/javascript/mastodon/actions/markers.ts b/app/javascript/mastodon/actions/markers.ts index 521859f6c2..6254e3f083 100644 --- a/app/javascript/mastodon/actions/markers.ts +++ b/app/javascript/mastodon/actions/markers.ts @@ -65,7 +65,7 @@ export const synchronouslySubmitMarkers = createAppAsyncThunk( client.setRequestHeader('Content-Type', 'application/json'); client.setRequestHeader('Authorization', `Bearer ${accessToken}`); client.send(JSON.stringify(params)); - } catch (e) { + } catch { // Do not make the BeforeUnload handler error out } }, diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js index bfdd894b81..03013110c3 100644 --- a/app/javascript/mastodon/actions/streaming.js +++ b/app/javascript/mastodon/actions/streaming.js @@ -151,7 +151,7 @@ async function refreshHomeTimelineAndNotification(dispatch, getState) { // TODO: polling for merged notifications try { await dispatch(pollRecentGroupNotifications()); - } catch (error) { + } catch { // TODO } } else { diff --git a/app/javascript/mastodon/common.js b/app/javascript/mastodon/common.js index 28857de534..c61e02250c 100644 --- a/app/javascript/mastodon/common.js +++ b/app/javascript/mastodon/common.js @@ -5,7 +5,7 @@ export function start() { try { Rails.start(); - } catch (e) { + } catch { // If called twice } } diff --git a/app/javascript/mastodon/components/error_boundary.jsx b/app/javascript/mastodon/components/error_boundary.jsx index 7fea08e85f..392a3ad61e 100644 --- a/app/javascript/mastodon/components/error_boundary.jsx +++ b/app/javascript/mastodon/components/error_boundary.jsx @@ -60,8 +60,8 @@ export default class ErrorBoundary extends PureComponent { try { textarea.select(); document.execCommand('copy'); - } catch (e) { - + } catch { + // do nothing } finally { document.body.removeChild(textarea); } diff --git a/app/javascript/mastodon/features/interaction_modal/index.jsx b/app/javascript/mastodon/features/interaction_modal/index.jsx index 07f1e6fe5a..723e27ae1c 100644 --- a/app/javascript/mastodon/features/interaction_modal/index.jsx +++ b/app/javascript/mastodon/features/interaction_modal/index.jsx @@ -131,7 +131,7 @@ class LoginForm extends React.PureComponent { try { new URL(url); return true; - } catch(_) { + } catch { return false; } }; diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index 657c9e9e58..a6e3640478 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -319,8 +319,8 @@ class UI extends PureComponent { try { e.dataTransfer.dropEffect = 'copy'; - } catch (err) { - + } catch { + // do nothing } return false; diff --git a/app/javascript/mastodon/locales/intl_provider.tsx b/app/javascript/mastodon/locales/intl_provider.tsx index 68d4fcbd96..94372f95b0 100644 --- a/app/javascript/mastodon/locales/intl_provider.tsx +++ b/app/javascript/mastodon/locales/intl_provider.tsx @@ -17,7 +17,7 @@ function onProviderError(error: unknown) { error && typeof error === 'object' && error instanceof Error && - error.message.match('MISSING_DATA') + /MISSING_DATA/.exec(error.message) ) { console.warn(error.message); } diff --git a/app/javascript/mastodon/settings.js b/app/javascript/mastodon/settings.js index f31aee0afc..f4883dc406 100644 --- a/app/javascript/mastodon/settings.js +++ b/app/javascript/mastodon/settings.js @@ -14,7 +14,7 @@ export default class Settings { const encodedData = JSON.stringify(data); localStorage.setItem(key, encodedData); return data; - } catch (e) { + } catch { return null; } } @@ -24,7 +24,7 @@ export default class Settings { try { const rawData = localStorage.getItem(key); return JSON.parse(rawData); - } catch (e) { + } catch { return null; } } @@ -35,7 +35,8 @@ export default class Settings { const key = this.generateKey(id); try { localStorage.removeItem(key); - } catch (e) { + } catch { + // ignore if the key is not found } } return data; diff --git a/app/javascript/mastodon/store/middlewares/errors.ts b/app/javascript/mastodon/store/middlewares/errors.ts index e77cec34ed..3ad3844d5b 100644 --- a/app/javascript/mastodon/store/middlewares/errors.ts +++ b/app/javascript/mastodon/store/middlewares/errors.ts @@ -30,7 +30,7 @@ function isActionWithmaybeAlertParams( return isAction(action); } -// eslint-disable-next-line @typescript-eslint/ban-types -- we need to use `{}` here to ensure the dispatch types can be merged +// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- we need to use `{}` here to ensure the dispatch types can be merged export const errorsMiddleware: Middleware<{}, RootState> = ({ dispatch }) => (next) => diff --git a/app/javascript/mastodon/store/middlewares/sounds.ts b/app/javascript/mastodon/store/middlewares/sounds.ts index 91407b1ec0..bb3a4aa474 100644 --- a/app/javascript/mastodon/store/middlewares/sounds.ts +++ b/app/javascript/mastodon/store/middlewares/sounds.ts @@ -51,7 +51,7 @@ const play = (audio: HTMLAudioElement) => { }; export const soundsMiddleware = (): Middleware< - // eslint-disable-next-line @typescript-eslint/ban-types -- we need to use `{}` here to ensure the dispatch types can be merged + // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- we need to use `{}` here to ensure the dispatch types can be merged {}, RootState > => { diff --git a/package.json b/package.json index ddf7ee75a2..ea0c0246cb 100644 --- a/package.json +++ b/package.json @@ -168,8 +168,8 @@ "@types/requestidlecallback": "^0.3.5", "@types/webpack": "^4.41.33", "@types/webpack-env": "^1.18.4", - "@typescript-eslint/eslint-plugin": "^7.0.0", - "@typescript-eslint/parser": "^7.0.0", + "@typescript-eslint/eslint-plugin": "^8.0.0", + "@typescript-eslint/parser": "^8.0.0", "babel-jest": "^29.5.0", "eslint": "^8.41.0", "eslint-define-config": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 90e764f49c..f498a5560e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -82,7 +82,19 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.4, @babel/generator@npm:^7.7.2": +"@babel/generator@npm:^7.25.0, @babel/generator@npm:^7.7.2": + version: 7.25.0 + resolution: "@babel/generator@npm:7.25.0" + dependencies: + "@babel/types": "npm:^7.25.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^2.5.1" + checksum: 10c0/d0e2dfcdc8bdbb5dded34b705ceebf2e0bc1b06795a1530e64fb6a3ccf313c189db7f60c1616effae48114e1a25adc75855bc4496f3779a396b3377bae718ce7 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.25.4": version: 7.25.4 resolution: "@babel/generator@npm:7.25.4" dependencies: @@ -1521,7 +1533,18 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.4, @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.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.25.2 + resolution: "@babel/types@npm:7.25.2" + dependencies: + "@babel/helper-string-parser": "npm:^7.24.8" + "@babel/helper-validator-identifier": "npm:^7.24.7" + to-fast-properties: "npm:^2.0.0" + checksum: 10c0/e489435856be239f8cc1120c90a197e4c2865385121908e5edb7223cfdff3768cba18f489adfe0c26955d9e7bbb1fb10625bc2517505908ceb0af848989bd864 + languageName: node + linkType: hard + +"@babel/types@npm:^7.25.4": version: 7.25.4 resolution: "@babel/types@npm:7.25.4" dependencies: @@ -2791,8 +2814,8 @@ __metadata: "@types/requestidlecallback": "npm:^0.3.5" "@types/webpack": "npm:^4.41.33" "@types/webpack-env": "npm:^1.18.4" - "@typescript-eslint/eslint-plugin": "npm:^7.0.0" - "@typescript-eslint/parser": "npm:^7.0.0" + "@typescript-eslint/eslint-plugin": "npm:^8.0.0" + "@typescript-eslint/parser": "npm:^8.0.0" arrow-key-navigation: "npm:^1.2.0" async-mutex: "npm:^0.5.0" axios: "npm:^1.4.0" @@ -4114,44 +4137,44 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^7.0.0": - version: 7.18.0 - resolution: "@typescript-eslint/eslint-plugin@npm:7.18.0" +"@typescript-eslint/eslint-plugin@npm:^8.0.0": + version: 8.1.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.1.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/type-utils": "npm:7.18.0" - "@typescript-eslint/utils": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" + "@typescript-eslint/scope-manager": "npm:8.1.0" + "@typescript-eslint/type-utils": "npm:8.1.0" + "@typescript-eslint/utils": "npm:8.1.0" + "@typescript-eslint/visitor-keys": "npm:8.1.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" ts-api-utils: "npm:^1.3.0" peerDependencies: - "@typescript-eslint/parser": ^7.0.0 - eslint: ^8.56.0 + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/2b37948fa1b0dab77138909dabef242a4d49ab93e4019d4ef930626f0a7d96b03e696cd027fa0087881c20e73be7be77c942606b4a76fa599e6b37f6985304c3 + checksum: 10c0/7bbeae588f859b59c34d6a76cac06ef0fa605921b40c5d3b65b94829984280ea84c4dd3f5cb9ce2eb326f5563e9abb4c90ebff05c47f83f4def296c2ea1fa86c languageName: node linkType: hard -"@typescript-eslint/parser@npm:^7.0.0": - version: 7.18.0 - resolution: "@typescript-eslint/parser@npm:7.18.0" +"@typescript-eslint/parser@npm:^8.0.0": + version: 8.1.0 + resolution: "@typescript-eslint/parser@npm:8.1.0" dependencies: - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/typescript-estree": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" + "@typescript-eslint/scope-manager": "npm:8.1.0" + "@typescript-eslint/types": "npm:8.1.0" + "@typescript-eslint/typescript-estree": "npm:8.1.0" + "@typescript-eslint/visitor-keys": "npm:8.1.0" debug: "npm:^4.3.4" peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/370e73fca4278091bc1b657f85e7d74cd52b24257ea20c927a8e17546107ce04fbf313fec99aed0cc2a145ddbae1d3b12e9cc2c1320117636dc1281bcfd08059 + checksum: 10c0/b94b2d3ab5ca505484d100701fad6a04a5dc8d595029bac1b9f5b8a4a91d80fd605b0f65d230b36a97ab7e5d55eeb0c28af2ab63929a3e4ab8fdefd2a548c36b languageName: node linkType: hard @@ -4165,30 +4188,28 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/scope-manager@npm:7.18.0" +"@typescript-eslint/scope-manager@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/scope-manager@npm:8.1.0" dependencies: - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" - checksum: 10c0/038cd58c2271de146b3a594afe2c99290034033326d57ff1f902976022c8b0138ffd3cb893ae439ae41003b5e4bcc00cabf6b244ce40e8668f9412cc96d97b8e + "@typescript-eslint/types": "npm:8.1.0" + "@typescript-eslint/visitor-keys": "npm:8.1.0" + checksum: 10c0/2bcf8cd176a1819bddcae16c572e7da8fba821b995a91cd53d64d8d6b85a17f5a895522f281ba57e34929574bddd4d6684ee3e545ec4e8096be4c3198e253a9a languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/type-utils@npm:7.18.0" +"@typescript-eslint/type-utils@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/type-utils@npm:8.1.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:7.18.0" - "@typescript-eslint/utils": "npm:7.18.0" + "@typescript-eslint/typescript-estree": "npm:8.1.0" + "@typescript-eslint/utils": "npm:8.1.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" - peerDependencies: - eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/ad92a38007be620f3f7036f10e234abdc2fdc518787b5a7227e55fd12896dacf56e8b34578723fbf9bea8128df2510ba8eb6739439a3879eda9519476d5783fd + checksum: 10c0/62753941c4136e8d2daa72fe0410dea48e5317a6f12ece6382ca85e29912bd1b3f739b61d1060fc0a1f8c488dfc905beab4c8b8497951a21c3138a659c7271ec languageName: node linkType: hard @@ -4199,10 +4220,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/types@npm:7.18.0" - checksum: 10c0/eb7371ac55ca77db8e59ba0310b41a74523f17e06f485a0ef819491bc3dd8909bb930120ff7d30aaf54e888167e0005aa1337011f3663dc90fb19203ce478054 +"@typescript-eslint/types@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/types@npm:8.1.0" + checksum: 10c0/ceade44455f45974e68956016c4d1c6626580732f7f9675e14ffa63db80b551752b0df596b20473dae9f0dc6ed966e17417dc2cf36e1a82b6ab0edc97c5eaa50 languageName: node linkType: hard @@ -4225,12 +4246,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.18.0" +"@typescript-eslint/typescript-estree@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.1.0" dependencies: - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" + "@typescript-eslint/types": "npm:8.1.0" + "@typescript-eslint/visitor-keys": "npm:8.1.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -4240,21 +4261,21 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/0c7f109a2e460ec8a1524339479cf78ff17814d23c83aa5112c77fb345e87b3642616291908dcddea1e671da63686403dfb712e4a4435104f92abdfddf9aba81 + checksum: 10c0/a7bc8275df1c79c4cb14ef086c56674316dd4907efec53eddca35d0b5220428b69c82178ce2d95138da2e398269c8bd0764cae8020a36417e411e35c3c47bc4b languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/utils@npm:7.18.0" +"@typescript-eslint/utils@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/utils@npm:8.1.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/typescript-estree": "npm:7.18.0" + "@typescript-eslint/scope-manager": "npm:8.1.0" + "@typescript-eslint/types": "npm:8.1.0" + "@typescript-eslint/typescript-estree": "npm:8.1.0" peerDependencies: - eslint: ^8.56.0 - checksum: 10c0/a25a6d50eb45c514469a01ff01f215115a4725fb18401055a847ddf20d1b681409c4027f349033a95c4ff7138d28c3b0a70253dfe8262eb732df4b87c547bd1e + eslint: ^8.57.0 || ^9.0.0 + checksum: 10c0/c95503a6bdcd98b1ff04d1adbf46377b2036b1c510d90a4a056401f996f775f06c3108c95fb81cd6babc9c97b73b91b8e848f0337bc508de8a49c993582f0e75 languageName: node linkType: hard @@ -4285,13 +4306,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.18.0" +"@typescript-eslint/visitor-keys@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.1.0" dependencies: - "@typescript-eslint/types": "npm:7.18.0" + "@typescript-eslint/types": "npm:8.1.0" eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/538b645f8ff1d9debf264865c69a317074eaff0255e63d7407046176b0f6a6beba34a6c51d511f12444bae12a98c69891eb6f403c9f54c6c2e2849d1c1cb73c0 + checksum: 10c0/b7544dbb0eec1ddbfcd95c04b51b9a739c2e768c16d1c88508f976a2b0d1bc02fefb7491930e06e48073a5c07c6f488cd8403bba3a8b918888b93a88d5ac3869 languageName: node linkType: hard From e2c101ec35f54a8cf9a3310f4e563749b457cc6a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 9 Sep 2024 17:28:54 +0200 Subject: [PATCH 22/89] [Glitch] Change labels on thread indicators in web UI Partial port of a021dee64214fcc662c0c36ad4e44dc1deaba65f to glitch-soc Signed-off-by: Claire --- .../glitch/components/status_prepend.jsx | 12 +++-- .../glitch/components/status_thread_label.tsx | 50 +++++++++++++++++++ .../flavours/glitch/styles/components.scss | 22 ++++++-- 3 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 app/javascript/flavours/glitch/components/status_thread_label.tsx diff --git a/app/javascript/flavours/glitch/components/status_prepend.jsx b/app/javascript/flavours/glitch/components/status_prepend.jsx index 4756b36696..b83767a990 100644 --- a/app/javascript/flavours/glitch/components/status_prepend.jsx +++ b/app/javascript/flavours/glitch/components/status_prepend.jsx @@ -150,11 +150,13 @@ export default class StatusPrepend extends PureComponent { return !type ? null : ( diff --git a/app/javascript/flavours/glitch/components/status_thread_label.tsx b/app/javascript/flavours/glitch/components/status_thread_label.tsx new file mode 100644 index 0000000000..054156efaa --- /dev/null +++ b/app/javascript/flavours/glitch/components/status_thread_label.tsx @@ -0,0 +1,50 @@ +import { FormattedMessage } from 'react-intl'; + +import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; +import { Icon } from 'flavours/glitch/components/icon'; +import { DisplayedName } from 'flavours/glitch/features/notifications_v2/components/displayed_name'; +import { useAppSelector } from 'flavours/glitch/store'; + +export const StatusThreadLabel: React.FC<{ + accountId: string; + inReplyToAccountId: string; +}> = ({ accountId, inReplyToAccountId }) => { + const inReplyToAccount = useAppSelector((state) => + state.accounts.get(inReplyToAccountId), + ); + + let label; + + if (accountId === inReplyToAccountId) { + label = ( + + ); + } else if (inReplyToAccount) { + label = ( + }} + /> + ); + } else { + label = ( + + ); + } + + return ( +
+
+ +
+ {label} +
+ ); +}; diff --git a/app/javascript/flavours/glitch/styles/components.scss b/app/javascript/flavours/glitch/styles/components.scss index 4ae330d0a5..51d87dbddf 100644 --- a/app/javascript/flavours/glitch/styles/components.scss +++ b/app/javascript/flavours/glitch/styles/components.scss @@ -1776,15 +1776,29 @@ body > [data-popper-placement] { .status__prepend { padding: 8px 14px; // glitch: reduced padding padding-bottom: 0; - display: inline-flex; - gap: 10px; + display: flex; + align-items: center; + gap: 8px; font-size: 14px; line-height: 22px; font-weight: 500; color: $dark-text-color; - .status__display-name strong { - color: $dark-text-color; + &__icon { + display: flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + + .icon { + width: 16px; + height: 16px; + } + } + + a { + color: inherit; + text-decoration: none; } > span { From 7d53ca56d200dc0c3c8c6491d9e25aa8965e8d52 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Sep 2024 09:54:53 +0200 Subject: [PATCH 23/89] New Crowdin Translations (automated) (#31878) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/cy.json | 5 ++++- app/javascript/mastodon/locales/es-AR.json | 1 + config/locales/activerecord.cy.yml | 6 ++++++ config/locales/activerecord.es-AR.yml | 6 ++++++ config/locales/activerecord.sq.yml | 6 ++++++ config/locales/activerecord.sv.yml | 4 ++++ config/locales/cy.yml | 8 ++++++++ config/locales/es-AR.yml | 7 +++++++ config/locales/simple_form.cy.yml | 2 ++ config/locales/simple_form.es-AR.yml | 2 ++ config/locales/simple_form.sq.yml | 2 ++ config/locales/sq.yml | 7 +++++++ config/locales/sv.yml | 9 +++++++++ 13 files changed, 64 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index d34b7a970d..7f058d8912 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -97,7 +97,7 @@ "block_modal.title": "Blocio defnyddiwr?", "block_modal.you_wont_see_mentions": "Fyddwch chi ddim yn gweld postiadau sy'n sôn amdanyn nhw.", "boost_modal.combo": "Mae modd pwyso {combo} er mwyn hepgor hyn tro nesa", - "boost_modal.reblog": "Hybu postiad", + "boost_modal.reblog": "Hybu postiad?", "boost_modal.undo_reblog": "Dad-hybu postiad?", "bundle_column_error.copy_stacktrace": "Copïo'r adroddiad gwall", "bundle_column_error.error.body": "Nid oedd modd cynhyrchu'r dudalen honno. Gall fod oherwydd gwall yn ein cod neu fater cydnawsedd porwr.", @@ -457,6 +457,7 @@ "lists.subheading": "Eich rhestrau", "load_pending": "{count, plural, one {# eitem newydd} other {# eitem newydd}}", "loading_indicator.label": "Yn llwytho…", + "media_gallery.hide": "Cuddio", "moved_to_account_banner.text": "Ar hyn y bryd, mae eich cyfrif {disabledAccount} wedi ei analluogi am i chi symud i {movedToAccount}.", "mute_modal.hide_from_notifications": "Cuddio rhag hysbysiadau", "mute_modal.hide_options": "Cuddio'r dewis", @@ -779,6 +780,7 @@ "status.bookmark": "Llyfrnodi", "status.cancel_reblog_private": "Dadhybu", "status.cannot_reblog": "Nid oes modd hybu'r postiad hwn", + "status.continued_thread": "Edefyn parhaus", "status.copy": "Copïo dolen i'r post", "status.delete": "Dileu", "status.detailed_status": "Golwg manwl o'r sgwrs", @@ -812,6 +814,7 @@ "status.reblogs.empty": "Does neb wedi hybio'r post yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.", "status.redraft": "Dileu ac ailddrafftio", "status.remove_bookmark": "Tynnu nod tudalen", + "status.replied_in_thread": "Atebodd mewn edefyn", "status.replied_to": "Wedi ateb {name}", "status.reply": "Ateb", "status.replyAll": "Ateb i edefyn", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index a0f91c4760..dfba0fe5d9 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -457,6 +457,7 @@ "lists.subheading": "Tus listas", "load_pending": "{count, plural, one {# elemento nuevo} other {# elementos nuevos}}", "loading_indicator.label": "Cargando…", + "media_gallery.hide": "Ocultar", "moved_to_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada porque te mudaste a {movedToAccount}.", "mute_modal.hide_from_notifications": "Ocultar en las notificaciones", "mute_modal.hide_options": "Ocultar opciones", diff --git a/config/locales/activerecord.cy.yml b/config/locales/activerecord.cy.yml index 73b54d554e..0ad257db50 100644 --- a/config/locales/activerecord.cy.yml +++ b/config/locales/activerecord.cy.yml @@ -15,6 +15,12 @@ cy: user/invite_request: text: Rheswm errors: + attributes: + domain: + invalid: "- nid yw'n enw parth dilys" + messages: + invalid_domain_on_line: Nid yw %{value} yn enw parth dilys + too_many_lines: "- dros y terfyn o %{limit} llinell" models: account: attributes: diff --git a/config/locales/activerecord.es-AR.yml b/config/locales/activerecord.es-AR.yml index 71b7f9732d..ba4d148c8b 100644 --- a/config/locales/activerecord.es-AR.yml +++ b/config/locales/activerecord.es-AR.yml @@ -15,6 +15,12 @@ es-AR: user/invite_request: text: Motivo errors: + attributes: + domain: + invalid: no es un nombre de dominio válido + messages: + invalid_domain_on_line: "%{value} no es un nombre de dominio válido" + too_many_lines: está por encima del límite de %{limit} líneas models: account: attributes: diff --git a/config/locales/activerecord.sq.yml b/config/locales/activerecord.sq.yml index 9c548bda04..888a17a1c8 100644 --- a/config/locales/activerecord.sq.yml +++ b/config/locales/activerecord.sq.yml @@ -15,6 +15,12 @@ sq: user/invite_request: text: Arsye errors: + attributes: + domain: + invalid: s’është emër i vlefshëm përkatësie + messages: + invalid_domain_on_line: "%{value} s’është emër i vlefshëm përkatësie" + too_many_lines: është tej kufirit prej %{limit} rreshta models: account: attributes: diff --git a/config/locales/activerecord.sv.yml b/config/locales/activerecord.sv.yml index 1679dae46e..6ac96d9ea9 100644 --- a/config/locales/activerecord.sv.yml +++ b/config/locales/activerecord.sv.yml @@ -15,8 +15,12 @@ sv: user/invite_request: text: Anledning errors: + attributes: + domain: + invalid: är inte ett giltigt domännamn messages: invalid_domain_on_line: "%{value} Är inte ett giltigt domännamn" + too_many_lines: överskrider gränsen på %{limit} rader models: account: attributes: diff --git a/config/locales/cy.yml b/config/locales/cy.yml index d317efad3f..2e425bb497 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -33,6 +33,7 @@ cy: admin: account_actions: action: Cyflawni gweithred + already_silenced: Mae'r cyfrif hwn eisoes wedi'i gyfyngu. already_suspended: Mae'r cyfrif hwn eisoes wedi'i atal. title: Cyflawni gweithred cymedroli ar %{acct} account_moderation_notes: @@ -1232,6 +1233,12 @@ cy: view_strikes: Gweld rybuddion y gorffennol yn erbyn eich cyfrif too_fast: Cafodd y ffurflen ei chyflwyno'n rhy gyflym, ceisiwch eto. use_security_key: Defnyddiwch allwedd diogelwch + author_attribution: + example_title: Testun enghreifftiol + hint_html: Rheolwch sut rydych chi'n cael eich canmol pan fydd dolenni'n cael eu rhannu ar Mastodon. + more_from_html: Mwy gan %{name} + s_blog: Blog %{name} + title: Priodoliad awdur challenge: confirm: Parhau hint_html: "Awgrym: Fyddwn ni ddim yn gofyn i chi am eich cyfrinair eto am yr awr nesaf." @@ -2080,6 +2087,7 @@ cy: instructions_html: Copïwch a gludo'r cod isod i HTML eich gwefan. Yna ychwanegwch gyfeiriad eich gwefan i un o'r meysydd ychwanegol ar eich proffil o'r tab "Golygu proffil" a chadw'r newidiadau. verification: Dilysu verified_links: Eich dolenni wedi'u dilysu + website_verification: Gwirio gwefan webauthn_credentials: add: Ychwanegu allwedd ddiogelwch newydd create: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index f4d88d7323..63d2adc47c 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1161,6 +1161,12 @@ es-AR: view_strikes: Ver incumplimientos pasados contra tu cuenta too_fast: Formulario enviado demasiado rápido, probá de nuevo. use_security_key: Usar la llave de seguridad + author_attribution: + example_title: Texto de ejemplo + hint_html: Controlá cómo se te da crédito cuando los enlaces son compartidos en Mastodon. + more_from_html: Más de %{name} + s_blog: Blog de %{name} + title: Atribución del autor challenge: confirm: Continuar hint_html: "Dato: No volveremos a preguntarte por la contraseña durante la siguiente hora." @@ -1949,6 +1955,7 @@ es-AR: instructions_html: Copiá y pegá el siguiente código en el HTML de tu sitio web. Luego, agregá la dirección de tu sitio web en uno de los campos extras de tu perfil desde la pestaña "Editar perfil" y guardá los cambios. verification: Verificación verified_links: Tus enlaces verificados + website_verification: Verificación del sitio web webauthn_credentials: add: Agregar nueva llave de seguridad create: diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 56586ecc96..56d1f873dc 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -3,6 +3,7 @@ cy: simple_form: hints: account: + attribution_domains_as_text: Yn amddiffyn rhag priodoliadau ffug. discoverable: Mae'n bosibl y bydd eich postiadau cyhoeddus a'ch proffil yn cael sylw neu'n cael eu hargymell mewn gwahanol feysydd o Mastodon ac efallai y bydd eich proffil yn cael ei awgrymu i ddefnyddwyr eraill. display_name: Eich enw llawn neu'ch enw hwyl. fields: Eich tudalen cartref, rhagenwau, oed, neu unrhyw beth. @@ -143,6 +144,7 @@ cy: url: I ble bydd digwyddiadau'n cael eu hanfon labels: account: + attribution_domains_as_text: Dim ond yn caniatáu gwefannau penodol discoverable: Proffil nodwedd a phostiadau mewn algorithmau darganfod fields: name: Label diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 70573c75f4..d06d09761a 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -3,6 +3,7 @@ es-AR: simple_form: hints: account: + attribution_domains_as_text: Protege de atribuciones falsas. discoverable: Tu perfil y publicaciones pueden ser destacadas o recomendadas en varias áreas de Mastodon, y tu perfil puede ser sugerido a otros usuarios. display_name: Tu nombre completo o tu pseudónimo. fields: Tu sitio web, pronombres, edad, o lo que quieras. @@ -143,6 +144,7 @@ es-AR: url: Adónde serán enviados los eventos labels: account: + attribution_domains_as_text: Solo permitir sitios web específicos discoverable: Destacar perfil y mensajes en algoritmos de descubrimiento fields: name: Nombre de campo diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index 3d86557282..169f4a02de 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -3,6 +3,7 @@ sq: simple_form: hints: account: + attribution_domains_as_text: Mbron nga atribuime të rreme. discoverable: Postimet dhe profili juaj publik mund të shfaqen, ose rekomandohen në zona të ndryshme të Mastodon-it dhe profili juaj mund të sugjerohet përdoruesve të tjerë. display_name: Emri juaj i plotë, ose emri juaj lojcak. fields: Faqja juaj hyrëse, përemra, moshë, ç’të keni qejf. @@ -143,6 +144,7 @@ sq: url: Ku do të dërgohen aktet labels: account: + attribution_domains_as_text: Lejo vetëm sajte specifikë discoverable: Profilin dhe postimet bëji objekt të algoritmeve të zbulimit fields: name: Etiketë diff --git a/config/locales/sq.yml b/config/locales/sq.yml index dcc6ff7fb5..241dc08b22 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1153,6 +1153,12 @@ sq: view_strikes: Shihni paralajmërime të dikurshme kundër llogarisë tuaj too_fast: Formulari u parashtrua shumë shpejt, riprovoni. use_security_key: Përdor kyç sigurie + author_attribution: + example_title: Tekst shembull + hint_html: Kontrolloni se si vlerësoheni, kur ndahen lidhje me të tjerë në Mastodon. + more_from_html: Më tepër nga %{name} + s_blog: Blogu i %{name} + title: Atribuim autorësh challenge: confirm: Vazhdo hint_html: "Ndihmëz: S’do t’ju pyesim për fjalëkalimin tuaj sërish, për një orë." @@ -1941,6 +1947,7 @@ sq: instructions_html: Kopjoni dhe ngjitni në HTML-në e sajtit tuaj kodin më poshtë. Mandej shtoni adresën e sajtit tuaj te një nga fushat shtesë në profilin tuaj, që nga skeda “Përpunoni profil” dhe ruani ndryshimet. verification: Verifikim verified_links: Lidhjet tuaja të verifikuara + website_verification: Verifikim sajti webauthn_credentials: add: Shtoni kyç të ri sigurie create: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 7b45f28c92..c8ddc346a5 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -180,6 +180,7 @@ sv: confirm_user: Bekräfta användare create_account_warning: Skapa varning create_announcement: Skapa kungörelse + create_canonical_email_block: Skapa E-post block create_custom_emoji: Skapa egen emoji create_domain_allow: Skapa tillåten domän create_domain_block: Skapa blockerad domän @@ -239,17 +240,21 @@ sv: confirm_user_html: "%{name} bekräftad e-post adress av användare %{target}" create_account_warning_html: "%{name} skickade en varning till %{target}" create_announcement_html: "%{name} skapade kungörelsen %{target}" + create_canonical_email_block_html: "%{name} blockade e-posten med %{target}" create_custom_emoji_html: "%{name} laddade upp ny emoji %{target}" create_domain_allow_html: "%{name} vitlistade domän %{target}" create_domain_block_html: "%{name} blockerade domänen %{target}" + create_email_domain_block_html: "%{name} blockerade e-post domänet%{target}" create_ip_block_html: "%{name} skapade regel för IP %{target}" create_unavailable_domain_html: "%{name} stoppade leverans till domänen %{target}" create_user_role_html: "%{name} skapade rollen %{target}" demote_user_html: "%{name} nedgraderade användare %{target}" destroy_announcement_html: "%{name} raderade kungörelsen %{target}" + destroy_canonical_email_block_html: "%{name} avblockerade e-post med hash%{target}" destroy_custom_emoji_html: "%{name} raderade emoji %{target}" destroy_domain_allow_html: "%{name} raderade domän %{target} från vitlistan" destroy_domain_block_html: "%{name} avblockerade domänen %{target}" + destroy_email_domain_block_html: "%{name} avblockerade e-post domänet %{target}" destroy_instance_html: "%{name} rensade domän %{target}" destroy_ip_block_html: "%{name} tog bort regel för IP %{target}" destroy_status_html: "%{name} tog bort inlägget av %{target}" @@ -870,7 +875,9 @@ sv: message_html: "Din objektlagring är felkonfigurerad. Sekretessen för dina användare är i riskzonen." tags: moderation: + reviewed: Granskat title: Status + trendable: name: Namn reset: Återställ review: Granskningsstatus @@ -1112,6 +1119,8 @@ sv: view_strikes: Visa tidigare prickar på ditt konto too_fast: Formuläret har skickats för snabbt, försök igen. use_security_key: Använd säkerhetsnyckel + author_attribution: + example_title: Exempeltext challenge: confirm: Fortsätt hint_html: "Tips: Vi frågar dig inte efter ditt lösenord igen under nästkommande timme." From f2a92c2d22345568ca7f47ee1d1d70de53eb547d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 12 Sep 2024 10:16:07 +0200 Subject: [PATCH 24/89] Fix notifications re-rendering spuriously in web UI (#31879) --- .../components/notification_mention.tsx | 4 ++- .../features/notifications_v2/index.tsx | 3 ++- .../features/ui/containers/modal_container.js | 4 ++- .../ui/containers/notifications_container.js | 19 +++----------- app/javascript/mastodon/selectors/index.js | 25 ++++++++++++++----- 5 files changed, 30 insertions(+), 25 deletions(-) diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx index 1929446bb2..d53cb37a83 100644 --- a/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx @@ -1,5 +1,7 @@ import { FormattedMessage } from 'react-intl'; +import { isEqual } from 'lodash'; + import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; import ReplyIcon from '@/material-icons/400-24px/reply-fill.svg?react'; import { me } from 'mastodon/initial_state'; @@ -47,7 +49,7 @@ export const NotificationMention: React.FC<{ status.get('visibility') === 'direct', status.get('in_reply_to_account_id') === me, ] as const; - }); + }, isEqual); let labelRenderer = mentionLabelRenderer; diff --git a/app/javascript/mastodon/features/notifications_v2/index.tsx b/app/javascript/mastodon/features/notifications_v2/index.tsx index 29c49e05c8..730d95bcd5 100644 --- a/app/javascript/mastodon/features/notifications_v2/index.tsx +++ b/app/javascript/mastodon/features/notifications_v2/index.tsx @@ -4,6 +4,7 @@ import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { Helmet } from 'react-helmet'; +import { isEqual } from 'lodash'; import { useDebouncedCallback } from 'use-debounce'; import DoneAllIcon from '@/material-icons/400-24px/done_all.svg?react'; @@ -62,7 +63,7 @@ export const Notifications: React.FC<{ multiColumn?: boolean; }> = ({ columnId, multiColumn }) => { const intl = useIntl(); - const notifications = useAppSelector(selectNotificationGroups); + const notifications = useAppSelector(selectNotificationGroups, isEqual); const dispatch = useAppDispatch(); const isLoading = useAppSelector((s) => s.notificationGroups.isLoading); const hasMore = notifications.at(-1)?.type === 'gap'; diff --git a/app/javascript/mastodon/features/ui/containers/modal_container.js b/app/javascript/mastodon/features/ui/containers/modal_container.js index 1c3872cd50..63c568f847 100644 --- a/app/javascript/mastodon/features/ui/containers/modal_container.js +++ b/app/javascript/mastodon/features/ui/containers/modal_container.js @@ -3,10 +3,12 @@ import { connect } from 'react-redux'; import { openModal, closeModal } from '../../../actions/modal'; import ModalRoot from '../components/modal_root'; +const defaultProps = {}; + const mapStateToProps = state => ({ ignoreFocus: state.getIn(['modal', 'ignoreFocus']), type: state.getIn(['modal', 'stack', 0, 'modalType'], null), - props: state.getIn(['modal', 'stack', 0, 'modalProps'], {}), + props: state.getIn(['modal', 'stack', 0, 'modalProps'], defaultProps), }); const mapDispatchToProps = dispatch => ({ diff --git a/app/javascript/mastodon/features/ui/containers/notifications_container.js b/app/javascript/mastodon/features/ui/containers/notifications_container.js index 3d60cfdad1..b8aa9bc461 100644 --- a/app/javascript/mastodon/features/ui/containers/notifications_container.js +++ b/app/javascript/mastodon/features/ui/containers/notifications_container.js @@ -4,24 +4,11 @@ import { connect } from 'react-redux'; import { NotificationStack } from 'react-notification'; -import { dismissAlert } from '../../../actions/alerts'; -import { getAlerts } from '../../../selectors'; - -const formatIfNeeded = (intl, message, values) => { - if (typeof message === 'object') { - return intl.formatMessage(message, values); - } - - return message; -}; +import { dismissAlert } from 'mastodon/actions/alerts'; +import { getAlerts } from 'mastodon/selectors'; const mapStateToProps = (state, { intl }) => ({ - notifications: getAlerts(state).map(alert => ({ - ...alert, - action: formatIfNeeded(intl, alert.action, alert.values), - title: formatIfNeeded(intl, alert.title, alert.values), - message: formatIfNeeded(intl, alert.message, alert.values), - })), + notifications: getAlerts(state, { intl }), }); const mapDispatchToProps = (dispatch) => ({ diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js index bd9b53919c..10e1b167ca 100644 --- a/app/javascript/mastodon/selectors/index.js +++ b/app/javascript/mastodon/selectors/index.js @@ -7,14 +7,16 @@ import { me } from '../initial_state'; export { makeGetAccount } from "./accounts"; -const getFilters = (state, { contextType }) => { - if (!contextType) return null; +const getFilters = createSelector([state => state.get('filters'), (_, { contextType }) => contextType], (filters, contextType) => { + if (!contextType) { + return null; + } - const serverSideType = toServerSideType(contextType); const now = new Date(); + const serverSideType = toServerSideType(contextType); - return state.get('filters').filter((filter) => filter.get('context').includes(serverSideType) && (filter.get('expires_at') === null || filter.get('expires_at') > now)); -}; + return filters.filter(filter => filter.get('context').includes(serverSideType) && (filter.get('expires_at') === null || filter.get('expires_at') > now)); +}); export const makeGetStatus = () => { return createSelector( @@ -73,10 +75,21 @@ const ALERT_DEFAULTS = { style: false, }; -export const getAlerts = createSelector(state => state.get('alerts'), alerts => +const formatIfNeeded = (intl, message, values) => { + if (typeof message === 'object') { + return intl.formatMessage(message, values); + } + + return message; +}; + +export const getAlerts = createSelector([state => state.get('alerts'), (_, { intl }) => intl], (alerts, intl) => alerts.map(item => ({ ...ALERT_DEFAULTS, ...item, + action: formatIfNeeded(intl, item.action, item.values), + title: formatIfNeeded(intl, item.title, item.values), + message: formatIfNeeded(intl, item.message, item.values), })).toArray()); export const makeGetNotification = () => createSelector([ From 3d46f478174403a64bd194e8c60e11b07bbd5d2d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 12 Sep 2024 11:41:19 +0200 Subject: [PATCH 25/89] Change embedded posts to use web UI (#31766) Co-authored-by: Claire --- app/helpers/accounts_helper.rb | 8 - app/helpers/media_component_helper.rb | 36 -- app/javascript/entrypoints/embed.tsx | 74 ++++ app/javascript/entrypoints/public.tsx | 37 -- app/javascript/hooks/useRenderSignal.ts | 32 ++ app/javascript/mastodon/actions/statuses.js | 6 +- app/javascript/mastodon/components/logo.tsx | 7 + .../mastodon/components/more_from_author.jsx | 6 +- .../features/standalone/status/index.tsx | 87 ++++ .../status/components/detailed_status.jsx | 322 --------------- .../status/components/detailed_status.tsx | 390 ++++++++++++++++++ .../containers/detailed_status_container.js | 140 ------- .../mastodon/features/status/index.jsx | 2 +- app/javascript/styles/application.scss | 1 - .../styles/mastodon/components.scss | 31 +- app/javascript/styles/mastodon/statuses.scss | 152 ------- app/serializers/oembed_serializer.rb | 20 +- app/views/layouts/embedded.html.haml | 2 +- app/views/statuses/_detailed_status.html.haml | 80 ---- app/views/statuses/_poll.html.haml | 36 -- app/views/statuses/_simple_status.html.haml | 70 ---- app/views/statuses/_status.html.haml | 2 - app/views/statuses/embed.html.haml | 3 +- config/locales/af.yml | 1 - config/locales/an.yml | 12 - config/locales/ar.yml | 20 - config/locales/ast.yml | 9 - config/locales/be.yml | 16 - config/locales/bg.yml | 12 - config/locales/bn.yml | 1 - config/locales/br.yml | 4 - config/locales/ca.yml | 12 - config/locales/ckb.yml | 12 - config/locales/co.yml | 12 - config/locales/cs.yml | 16 - config/locales/cy.yml | 20 - config/locales/da.yml | 12 - config/locales/de.yml | 12 - config/locales/el.yml | 12 - config/locales/en-GB.yml | 12 - config/locales/en.yml | 12 - config/locales/eo.yml | 12 - config/locales/es-AR.yml | 12 - config/locales/es-MX.yml | 12 - config/locales/es.yml | 12 - config/locales/et.yml | 12 - config/locales/eu.yml | 12 - config/locales/fa.yml | 12 - config/locales/fi.yml | 12 - config/locales/fo.yml | 12 - config/locales/fr-CA.yml | 12 - config/locales/fr.yml | 12 - config/locales/fy.yml | 12 - config/locales/ga.yml | 18 - config/locales/gd.yml | 16 - config/locales/gl.yml | 12 - config/locales/he.yml | 16 - config/locales/hi.yml | 1 - config/locales/hr.yml | 14 - config/locales/hu.yml | 12 - config/locales/hy.yml | 12 - config/locales/ia.yml | 12 - config/locales/id.yml | 10 - config/locales/ie.yml | 12 - config/locales/io.yml | 12 - config/locales/is.yml | 12 - config/locales/it.yml | 12 - config/locales/ja.yml | 10 - config/locales/ka.yml | 3 - config/locales/kab.yml | 12 - config/locales/kk.yml | 12 - config/locales/ko.yml | 10 - config/locales/ku.yml | 12 - config/locales/la.yml | 1 - config/locales/lad.yml | 12 - config/locales/lt.yml | 6 - config/locales/lv.yml | 14 - config/locales/ml.yml | 1 - config/locales/ms.yml | 10 - config/locales/my.yml | 10 - config/locales/nl.yml | 12 - config/locales/nn.yml | 12 - config/locales/no.yml | 12 - config/locales/oc.yml | 12 - config/locales/pa.yml | 1 - config/locales/pl.yml | 16 - config/locales/pt-BR.yml | 12 - config/locales/pt-PT.yml | 12 - config/locales/ro.yml | 14 - config/locales/ru.yml | 16 - config/locales/ry.yml | 1 - config/locales/sc.yml | 12 - config/locales/sco.yml | 12 - config/locales/si.yml | 12 - config/locales/sk.yml | 16 - config/locales/sl.yml | 16 - config/locales/sq.yml | 12 - config/locales/sr-Latn.yml | 14 - config/locales/sr.yml | 14 - config/locales/sv.yml | 12 - config/locales/ta.yml | 2 - config/locales/te.yml | 1 - config/locales/th.yml | 10 - config/locales/tr.yml | 12 - config/locales/tt.yml | 7 - config/locales/uk.yml | 16 - config/locales/uz.yml | 2 - config/locales/vi.yml | 10 - config/locales/zgh.yml | 1 - config/locales/zh-CN.yml | 10 - config/locales/zh-HK.yml | 10 - config/locales/zh-TW.yml | 10 - public/embed.js | 105 +++-- spec/controllers/statuses_controller_spec.rb | 1 - spec/helpers/media_component_helper_spec.rb | 22 - 115 files changed, 710 insertions(+), 1928 deletions(-) create mode 100644 app/javascript/entrypoints/embed.tsx create mode 100644 app/javascript/hooks/useRenderSignal.ts create mode 100644 app/javascript/mastodon/features/standalone/status/index.tsx delete mode 100644 app/javascript/mastodon/features/status/components/detailed_status.jsx create mode 100644 app/javascript/mastodon/features/status/components/detailed_status.tsx delete mode 100644 app/javascript/mastodon/features/status/containers/detailed_status_container.js delete mode 100644 app/javascript/styles/mastodon/statuses.scss delete mode 100644 app/views/statuses/_detailed_status.html.haml delete mode 100644 app/views/statuses/_poll.html.haml delete mode 100644 app/views/statuses/_simple_status.html.haml delete mode 100644 app/views/statuses/_status.html.haml diff --git a/app/helpers/accounts_helper.rb b/app/helpers/accounts_helper.rb index 158a0815e1..d804566c93 100644 --- a/app/helpers/accounts_helper.rb +++ b/app/helpers/accounts_helper.rb @@ -19,14 +19,6 @@ module AccountsHelper end end - def account_action_button(account) - return if account.memorial? || account.moved? - - link_to ActivityPub::TagManager.instance.url_for(account), class: 'button logo-button', target: '_new' do - safe_join([logo_as_symbol, t('accounts.follow')]) - end - end - def account_formatted_stat(value) number_to_human(value, precision: 3, strip_insignificant_zeros: true) end diff --git a/app/helpers/media_component_helper.rb b/app/helpers/media_component_helper.rb index fa8f34fb4d..60ccdd0835 100644 --- a/app/helpers/media_component_helper.rb +++ b/app/helpers/media_component_helper.rb @@ -57,26 +57,6 @@ module MediaComponentHelper end end - def render_card_component(status, **options) - component_params = { - sensitive: sensitive_viewer?(status, current_account), - card: serialize_status_card(status).as_json, - }.merge(**options) - - react_component :card, component_params - end - - def render_poll_component(status, **options) - component_params = { - disabled: true, - poll: serialize_status_poll(status).as_json, - }.merge(**options) - - react_component :poll, component_params do - render partial: 'statuses/poll', locals: { status: status, poll: status.preloadable_poll, autoplay: prefers_autoplay? } - end - end - private def serialize_media_attachment(attachment) @@ -86,22 +66,6 @@ module MediaComponentHelper ) end - def serialize_status_card(status) - ActiveModelSerializers::SerializableResource.new( - status.preview_card, - serializer: REST::PreviewCardSerializer - ) - end - - def serialize_status_poll(status) - ActiveModelSerializers::SerializableResource.new( - status.preloadable_poll, - serializer: REST::PollSerializer, - scope: current_user, - scope_name: :current_user - ) - end - def sensitive_viewer?(status, account) if !account.nil? && account.id == status.account_id status.sensitive diff --git a/app/javascript/entrypoints/embed.tsx b/app/javascript/entrypoints/embed.tsx new file mode 100644 index 0000000000..f8c824d287 --- /dev/null +++ b/app/javascript/entrypoints/embed.tsx @@ -0,0 +1,74 @@ +import './public-path'; +import { createRoot } from 'react-dom/client'; + +import { afterInitialRender } from 'mastodon/../hooks/useRenderSignal'; + +import { start } from '../mastodon/common'; +import { Status } from '../mastodon/features/standalone/status'; +import { loadPolyfills } from '../mastodon/polyfills'; +import ready from '../mastodon/ready'; + +start(); + +function loaded() { + const mountNode = document.getElementById('mastodon-status'); + + if (mountNode) { + const attr = mountNode.getAttribute('data-props'); + + if (!attr) return; + + const props = JSON.parse(attr) as { id: string; locale: string }; + const root = createRoot(mountNode); + + root.render(); + } +} + +function main() { + ready(loaded).catch((error: unknown) => { + console.error(error); + }); +} + +loadPolyfills() + .then(main) + .catch((error: unknown) => { + console.error(error); + }); + +interface SetHeightMessage { + type: 'setHeight'; + id: string; + height: number; +} + +function isSetHeightMessage(data: unknown): data is SetHeightMessage { + if ( + data && + typeof data === 'object' && + 'type' in data && + data.type === 'setHeight' + ) + return true; + else return false; +} + +window.addEventListener('message', (e) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typings are not correct, it can be null in very rare cases + if (!e.data || !isSetHeightMessage(e.data) || !window.parent) return; + + const data = e.data; + + // We use a timeout to allow for the React page to render before calculating the height + afterInitialRender(() => { + window.parent.postMessage( + { + type: 'setHeight', + id: data.id, + height: document.getElementsByTagName('html')[0]?.scrollHeight, + }, + '*', + ); + }); +}); diff --git a/app/javascript/entrypoints/public.tsx b/app/javascript/entrypoints/public.tsx index b06675c2ee..d33e00d5da 100644 --- a/app/javascript/entrypoints/public.tsx +++ b/app/javascript/entrypoints/public.tsx @@ -37,43 +37,6 @@ const messages = defineMessages({ }, }); -interface SetHeightMessage { - type: 'setHeight'; - id: string; - height: number; -} - -function isSetHeightMessage(data: unknown): data is SetHeightMessage { - if ( - data && - typeof data === 'object' && - 'type' in data && - data.type === 'setHeight' - ) - return true; - else return false; -} - -window.addEventListener('message', (e) => { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typings are not correct, it can be null in very rare cases - if (!e.data || !isSetHeightMessage(e.data) || !window.parent) return; - - const data = e.data; - - ready(() => { - window.parent.postMessage( - { - type: 'setHeight', - id: data.id, - height: document.getElementsByTagName('html')[0]?.scrollHeight, - }, - '*', - ); - }).catch((e: unknown) => { - console.error('Error in setHeightMessage postMessage', e); - }); -}); - function loaded() { const { messages: localeData } = getLocale(); diff --git a/app/javascript/hooks/useRenderSignal.ts b/app/javascript/hooks/useRenderSignal.ts new file mode 100644 index 0000000000..740df4a35a --- /dev/null +++ b/app/javascript/hooks/useRenderSignal.ts @@ -0,0 +1,32 @@ +// This hook allows a component to signal that it's done rendering in a way that +// can be used by e.g. our embed code to determine correct iframe height + +let renderSignalReceived = false; + +type Callback = () => void; + +let onInitialRender: Callback; + +export const afterInitialRender = (callback: Callback) => { + if (renderSignalReceived) { + callback(); + } else { + onInitialRender = callback; + } +}; + +export const useRenderSignal = () => { + return () => { + if (renderSignalReceived) { + return; + } + + renderSignalReceived = true; + + if (typeof onInitialRender !== 'undefined') { + window.requestAnimationFrame(() => { + onInitialRender(); + }); + } + }; +}; diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js index 340cee8024..1e4e545d8c 100644 --- a/app/javascript/mastodon/actions/statuses.js +++ b/app/javascript/mastodon/actions/statuses.js @@ -49,11 +49,13 @@ export function fetchStatusRequest(id, skipLoading) { }; } -export function fetchStatus(id, forceFetch = false) { +export function fetchStatus(id, forceFetch = false, alsoFetchContext = true) { return (dispatch, getState) => { const skipLoading = !forceFetch && getState().getIn(['statuses', id], null) !== null; - dispatch(fetchContext(id)); + if (alsoFetchContext) { + dispatch(fetchContext(id)); + } if (skipLoading) { return; diff --git a/app/javascript/mastodon/components/logo.tsx b/app/javascript/mastodon/components/logo.tsx index b7f8bd6695..fe9680d0e3 100644 --- a/app/javascript/mastodon/components/logo.tsx +++ b/app/javascript/mastodon/components/logo.tsx @@ -7,6 +7,13 @@ export const WordmarkLogo: React.FC = () => ( ); +export const IconLogo: React.FC = () => ( + + Mastodon + + +); + export const SymbolLogo: React.FC = () => ( Mastodon ); diff --git a/app/javascript/mastodon/components/more_from_author.jsx b/app/javascript/mastodon/components/more_from_author.jsx index c20e76ac45..719f4dda86 100644 --- a/app/javascript/mastodon/components/more_from_author.jsx +++ b/app/javascript/mastodon/components/more_from_author.jsx @@ -2,14 +2,12 @@ import PropTypes from 'prop-types'; import { FormattedMessage } from 'react-intl'; +import { IconLogo } from 'mastodon/components/logo'; import { AuthorLink } from 'mastodon/features/explore/components/author_link'; export const MoreFromAuthor = ({ accountId }) => (
- - - - + }} />
); diff --git a/app/javascript/mastodon/features/standalone/status/index.tsx b/app/javascript/mastodon/features/standalone/status/index.tsx new file mode 100644 index 0000000000..d5cb7e7f40 --- /dev/null +++ b/app/javascript/mastodon/features/standalone/status/index.tsx @@ -0,0 +1,87 @@ +/* eslint-disable @typescript-eslint/no-unsafe-return, + @typescript-eslint/no-explicit-any, + @typescript-eslint/no-unsafe-assignment */ + +import { useEffect, useCallback } from 'react'; + +import { Provider } from 'react-redux'; + +import { useRenderSignal } from 'mastodon/../hooks/useRenderSignal'; +import { fetchStatus, toggleStatusSpoilers } from 'mastodon/actions/statuses'; +import { hydrateStore } from 'mastodon/actions/store'; +import { Router } from 'mastodon/components/router'; +import { DetailedStatus } from 'mastodon/features/status/components/detailed_status'; +import initialState from 'mastodon/initial_state'; +import { IntlProvider } from 'mastodon/locales'; +import { makeGetStatus, makeGetPictureInPicture } from 'mastodon/selectors'; +import { store, useAppSelector, useAppDispatch } from 'mastodon/store'; + +const getStatus = makeGetStatus() as unknown as (arg0: any, arg1: any) => any; +const getPictureInPicture = makeGetPictureInPicture() as unknown as ( + arg0: any, + arg1: any, +) => any; + +const Embed: React.FC<{ id: string }> = ({ id }) => { + const status = useAppSelector((state) => getStatus(state, { id })); + const pictureInPicture = useAppSelector((state) => + getPictureInPicture(state, { id }), + ); + const domain = useAppSelector((state) => state.meta.get('domain')); + const dispatch = useAppDispatch(); + const dispatchRenderSignal = useRenderSignal(); + + useEffect(() => { + dispatch(fetchStatus(id, false, false)); + }, [dispatch, id]); + + const handleToggleHidden = useCallback(() => { + dispatch(toggleStatusSpoilers(id)); + }, [dispatch, id]); + + // This allows us to calculate the correct page height for embeds + if (status) { + dispatchRenderSignal(); + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access + const permalink = status?.get('url') as string; + + return ( +
+ + + +
+ ); +}; + +export const Status: React.FC<{ id: string }> = ({ id }) => { + useEffect(() => { + if (initialState) { + store.dispatch(hydrateStore(initialState)); + } + }, []); + + return ( + + + + + + + + ); +}; diff --git a/app/javascript/mastodon/features/status/components/detailed_status.jsx b/app/javascript/mastodon/features/status/components/detailed_status.jsx deleted file mode 100644 index 8ee1ec9b9b..0000000000 --- a/app/javascript/mastodon/features/status/components/detailed_status.jsx +++ /dev/null @@ -1,322 +0,0 @@ -import PropTypes from 'prop-types'; - -import { FormattedDate, FormattedMessage } from 'react-intl'; - -import classNames from 'classnames'; -import { Link, withRouter } from 'react-router-dom'; - -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; - -import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; -import { AnimatedNumber } from 'mastodon/components/animated_number'; -import { ContentWarning } from 'mastodon/components/content_warning'; -import EditedTimestamp from 'mastodon/components/edited_timestamp'; -import { getHashtagBarForStatus } from 'mastodon/components/hashtag_bar'; -import { Icon } from 'mastodon/components/icon'; -import PictureInPicturePlaceholder from 'mastodon/components/picture_in_picture_placeholder'; -import { VisibilityIcon } from 'mastodon/components/visibility_icon'; -import { WithRouterPropTypes } from 'mastodon/utils/react_router'; - -import { Avatar } from '../../../components/avatar'; -import { DisplayName } from '../../../components/display_name'; -import MediaGallery from '../../../components/media_gallery'; -import StatusContent from '../../../components/status_content'; -import Audio from '../../audio'; -import scheduleIdleTask from '../../ui/util/schedule_idle_task'; -import Video from '../../video'; - -import Card from './card'; - -class DetailedStatus extends ImmutablePureComponent { - - static propTypes = { - status: ImmutablePropTypes.map, - onOpenMedia: PropTypes.func.isRequired, - onOpenVideo: PropTypes.func.isRequired, - onToggleHidden: PropTypes.func.isRequired, - onTranslate: PropTypes.func.isRequired, - measureHeight: PropTypes.bool, - onHeightChange: PropTypes.func, - domain: PropTypes.string.isRequired, - compact: PropTypes.bool, - showMedia: PropTypes.bool, - pictureInPicture: ImmutablePropTypes.contains({ - inUse: PropTypes.bool, - available: PropTypes.bool, - }), - onToggleMediaVisibility: PropTypes.func, - ...WithRouterPropTypes, - }; - - state = { - height: null, - }; - - handleAccountClick = (e) => { - if (e.button === 0 && !(e.ctrlKey || e.metaKey) && this.props.history) { - e.preventDefault(); - this.props.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`); - } - - e.stopPropagation(); - }; - - handleOpenVideo = (options) => { - this.props.onOpenVideo(this.props.status.getIn(['media_attachments', 0]), options); - }; - - handleExpandedToggle = () => { - this.props.onToggleHidden(this.props.status); - }; - - _measureHeight (heightJustChanged) { - if (this.props.measureHeight && this.node) { - scheduleIdleTask(() => this.node && this.setState({ height: Math.ceil(this.node.scrollHeight) + 1 })); - - if (this.props.onHeightChange && heightJustChanged) { - this.props.onHeightChange(); - } - } - } - - setRef = c => { - this.node = c; - this._measureHeight(); - }; - - componentDidUpdate (prevProps, prevState) { - this._measureHeight(prevState.height !== this.state.height); - } - - handleModalLink = e => { - e.preventDefault(); - - let href; - - if (e.target.nodeName !== 'A') { - href = e.target.parentNode.href; - } else { - href = e.target.href; - } - - window.open(href, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes'); - }; - - handleTranslate = () => { - const { onTranslate, status } = this.props; - onTranslate(status); - }; - - _properStatus () { - const { status } = this.props; - - if (status.get('reblog', null) !== null && typeof status.get('reblog') === 'object') { - return status.get('reblog'); - } else { - return status; - } - } - - getAttachmentAspectRatio () { - const attachments = this._properStatus().get('media_attachments'); - - if (attachments.getIn([0, 'type']) === 'video') { - return `${attachments.getIn([0, 'meta', 'original', 'width'])} / ${attachments.getIn([0, 'meta', 'original', 'height'])}`; - } else if (attachments.getIn([0, 'type']) === 'audio') { - return '16 / 9'; - } else { - return (attachments.size === 1 && attachments.getIn([0, 'meta', 'small', 'aspect'])) ? attachments.getIn([0, 'meta', 'small', 'aspect']) : '3 / 2'; - } - } - - render () { - const status = this._properStatus(); - const outerStyle = { boxSizing: 'border-box' }; - const { compact, pictureInPicture } = this.props; - - if (!status) { - return null; - } - - let media = ''; - let applicationLink = ''; - let reblogLink = ''; - let favouriteLink = ''; - - if (this.props.measureHeight) { - outerStyle.height = `${this.state.height}px`; - } - - const language = status.getIn(['translation', 'language']) || status.get('language'); - - if (pictureInPicture.get('inUse')) { - media = ; - } else if (status.get('media_attachments').size > 0) { - if (status.getIn(['media_attachments', 0, 'type']) === 'audio') { - const attachment = status.getIn(['media_attachments', 0]); - const description = attachment.getIn(['translation', 'description']) || attachment.get('description'); - - media = ( - {status.getIn(['application', 'name'])}; - } - - const visibilityLink = <>·; - - if (['private', 'direct'].includes(status.get('visibility'))) { - reblogLink = ''; - } else if (this.props.history) { - reblogLink = ( - - - - - - - ); - } else { - reblogLink = ( - - - - - - - ); - } - - if (this.props.history) { - favouriteLink = ( - - - - - - - ); - } else { - favouriteLink = ( - - - - - - - ); - } - - const {statusContentProps, hashtagBar} = getHashtagBarForStatus(status); - const expanded = !status.get('hidden') || status.get('spoiler_text').length === 0; - - return ( -
-
- {status.get('visibility') === 'direct' && ( -
-
- -
- )} - -
- -
- - {status.get('spoiler_text').length > 0 && } - - {expanded && ( - <> - - - {media} - {hashtagBar} - - )} - -
-
- - - - - {visibilityLink} - - {applicationLink} -
- - {status.get('edited_at') &&
} - -
- {reblogLink} - {reblogLink && <>·} - {favouriteLink} -
-
-
-
- ); - } - -} - -export default withRouter(DetailedStatus); diff --git a/app/javascript/mastodon/features/status/components/detailed_status.tsx b/app/javascript/mastodon/features/status/components/detailed_status.tsx new file mode 100644 index 0000000000..fa843122fb --- /dev/null +++ b/app/javascript/mastodon/features/status/components/detailed_status.tsx @@ -0,0 +1,390 @@ +/* eslint-disable @typescript-eslint/no-unsafe-member-access, + @typescript-eslint/no-unsafe-call, + @typescript-eslint/no-explicit-any, + @typescript-eslint/no-unsafe-assignment */ + +import type { CSSProperties } from 'react'; +import { useState, useRef, useCallback } from 'react'; + +import { FormattedDate, FormattedMessage } from 'react-intl'; + +import classNames from 'classnames'; +import { Link } from 'react-router-dom'; + +import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; +import { AnimatedNumber } from 'mastodon/components/animated_number'; +import { ContentWarning } from 'mastodon/components/content_warning'; +import EditedTimestamp from 'mastodon/components/edited_timestamp'; +import type { StatusLike } from 'mastodon/components/hashtag_bar'; +import { getHashtagBarForStatus } from 'mastodon/components/hashtag_bar'; +import { Icon } from 'mastodon/components/icon'; +import { IconLogo } from 'mastodon/components/logo'; +import PictureInPicturePlaceholder from 'mastodon/components/picture_in_picture_placeholder'; +import { VisibilityIcon } from 'mastodon/components/visibility_icon'; + +import { Avatar } from '../../../components/avatar'; +import { DisplayName } from '../../../components/display_name'; +import MediaGallery from '../../../components/media_gallery'; +import StatusContent from '../../../components/status_content'; +import Audio from '../../audio'; +import scheduleIdleTask from '../../ui/util/schedule_idle_task'; +import Video from '../../video'; + +import Card from './card'; + +interface VideoModalOptions { + startTime: number; + autoPlay?: boolean; + defaultVolume: number; + componentIndex: number; +} + +export const DetailedStatus: React.FC<{ + status: any; + onOpenMedia?: (status: any, index: number, lang: string) => void; + onOpenVideo?: (status: any, lang: string, options: VideoModalOptions) => void; + onTranslate?: (status: any) => void; + measureHeight?: boolean; + onHeightChange?: () => void; + domain: string; + showMedia?: boolean; + withLogo?: boolean; + pictureInPicture: any; + onToggleHidden?: (status: any) => void; + onToggleMediaVisibility?: () => void; +}> = ({ + status, + onOpenMedia, + onOpenVideo, + onTranslate, + measureHeight, + onHeightChange, + domain, + showMedia, + withLogo, + pictureInPicture, + onToggleMediaVisibility, + onToggleHidden, +}) => { + const properStatus = status?.get('reblog') ?? status; + const [height, setHeight] = useState(0); + const nodeRef = useRef(); + + const handleOpenVideo = useCallback( + (options: VideoModalOptions) => { + const lang = (status.getIn(['translation', 'language']) || + status.get('language')) as string; + if (onOpenVideo) + onOpenVideo(status.getIn(['media_attachments', 0]), lang, options); + }, + [onOpenVideo, status], + ); + + const handleExpandedToggle = useCallback(() => { + if (onToggleHidden) onToggleHidden(status); + }, [onToggleHidden, status]); + + const _measureHeight = useCallback( + (heightJustChanged?: boolean) => { + if (measureHeight && nodeRef.current) { + scheduleIdleTask(() => { + if (nodeRef.current) + setHeight(Math.ceil(nodeRef.current.scrollHeight) + 1); + }); + + if (onHeightChange && heightJustChanged) { + onHeightChange(); + } + } + }, + [onHeightChange, measureHeight, setHeight], + ); + + const handleRef = useCallback( + (c: HTMLDivElement) => { + nodeRef.current = c; + _measureHeight(); + }, + [_measureHeight], + ); + + const handleTranslate = useCallback(() => { + if (onTranslate) onTranslate(status); + }, [onTranslate, status]); + + if (!properStatus) { + return null; + } + + let media; + let applicationLink; + let reblogLink; + let attachmentAspectRatio; + + if (properStatus.get('media_attachments').getIn([0, 'type']) === 'video') { + attachmentAspectRatio = `${properStatus.get('media_attachments').getIn([0, 'meta', 'original', 'width'])} / ${properStatus.get('media_attachments').getIn([0, 'meta', 'original', 'height'])}`; + } else if ( + properStatus.get('media_attachments').getIn([0, 'type']) === 'audio' + ) { + attachmentAspectRatio = '16 / 9'; + } else { + attachmentAspectRatio = + properStatus.get('media_attachments').size === 1 && + properStatus + .get('media_attachments') + .getIn([0, 'meta', 'small', 'aspect']) + ? properStatus + .get('media_attachments') + .getIn([0, 'meta', 'small', 'aspect']) + : '3 / 2'; + } + + const outerStyle = { boxSizing: 'border-box' } as CSSProperties; + + if (measureHeight) { + outerStyle.height = height; + } + + const language = + status.getIn(['translation', 'language']) || status.get('language'); + + if (pictureInPicture.get('inUse')) { + media = ; + } else if (status.get('media_attachments').size > 0) { + if (status.getIn(['media_attachments', 0, 'type']) === 'audio') { + const attachment = status.getIn(['media_attachments', 0]); + const description = + attachment.getIn(['translation', 'description']) || + attachment.get('description'); + + media = ( +
); } } -export default injectIntl(MediaGallery); +export default MediaGallery; diff --git a/app/javascript/flavours/glitch/styles/components.scss b/app/javascript/flavours/glitch/styles/components.scss index 51d87dbddf..70f950f3ca 100644 --- a/app/javascript/flavours/glitch/styles/components.scss +++ b/app/javascript/flavours/glitch/styles/components.scss @@ -5050,22 +5050,14 @@ a.status-card { position: absolute; z-index: 100; - &--minified { - display: block; - inset-inline-start: 4px; - top: 4px; - width: auto; - height: auto; + &--hidden { + display: none; } &--click-thru { pointer-events: none; } - &--hidden { - display: none; - } - &__overlay { display: flex; align-items: center; @@ -5077,19 +5069,20 @@ a.status-card { margin: 0; border: 0; color: $white; + line-height: 20px; + font-size: 14px; &__label { background-color: rgba($black, 0.45); backdrop-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%); - border-radius: 6px; - padding: 10px 15px; + border-radius: 8px; + padding: 12px 16px; display: flex; align-items: center; justify-content: center; - gap: 8px; + gap: 4px; flex-direction: column; - font-weight: 500; - font-size: 14px; + font-weight: 600; } &__action { @@ -7336,10 +7329,32 @@ img.modal-warning { } } -.media-gallery__item__badges { +.media-gallery__actions { position: absolute; bottom: 6px; - inset-inline-start: 6px; + inset-inline-end: 6px; + display: flex; + gap: 2px; + z-index: 2; + + &__pill { + display: block; + color: $white; + border: 0; + background: rgba($black, 0.65); + backdrop-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%); + padding: 3px 12px; + border-radius: 99px; + font-size: 14px; + font-weight: 700; + line-height: 20px; + } +} + +.media-gallery__item__badges { + position: absolute; + bottom: 8px; + inset-inline-start: 8px; display: flex; gap: 2px; } @@ -7352,18 +7367,13 @@ img.modal-warning { color: $white; background: rgba($black, 0.65); backdrop-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%); - padding: 2px 6px; + padding: 3px 8px; border-radius: 4px; - font-size: 11px; + font-size: 12px; font-weight: 700; z-index: 1; pointer-events: none; - line-height: 18px; - - .icon { - width: 15px; - height: 15px; - } + line-height: 20px; } .attachment-list { From 77cbe2332a5bf505e1d6f171714f42d5420bb599 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 10 Sep 2024 14:00:40 +0200 Subject: [PATCH 27/89] [Glitch] Add ability to manage which websites can credit you in link previews Port CSS changes from e0c27a504788bdc6cd518072e557313e4ec5ee7a to glitch-soc Signed-off-by: Claire --- .../flavours/glitch/styles/forms.scss | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss index 81ce9a695f..29f4fe04f7 100644 --- a/app/javascript/flavours/glitch/styles/forms.scss +++ b/app/javascript/flavours/glitch/styles/forms.scss @@ -12,6 +12,41 @@ code { margin: 50px auto; } +.form-section { + border-radius: 8px; + background: var(--surface-background-color); + padding: 24px; + margin-bottom: 24px; +} + +.fade-out-top { + position: relative; + overflow: hidden; + height: 160px; + + &::after { + content: ''; + display: block; + background: linear-gradient( + to bottom, + var(--surface-background-color), + transparent + ); + position: absolute; + top: 0; + inset-inline-start: 0; + width: 100%; + height: 100px; + pointer-events: none; + } + + & > div { + position: absolute; + inset-inline-start: 0; + bottom: 0; + } +} + .indicator-icon { display: flex; align-items: center; From ab763c493fd8d40db6005282c38bd2636120f273 Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Thu, 12 Sep 2024 13:14:42 +0200 Subject: [PATCH 28/89] Ignore `undefined` as canonical url (#31882) --- app/lib/link_details_extractor.rb | 2 +- spec/lib/link_details_extractor_spec.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb index dff57f74f3..e4e815c38d 100644 --- a/app/lib/link_details_extractor.rb +++ b/app/lib/link_details_extractor.rb @@ -225,7 +225,7 @@ class LinkDetailsExtractor end def valid_url_or_nil(str, same_origin_only: false) - return if str.blank? || str == 'null' + return if str.blank? || str == 'null' || str == 'undefined' url = @original_url + Addressable::URI.parse(str) diff --git a/spec/lib/link_details_extractor_spec.rb b/spec/lib/link_details_extractor_spec.rb index b1e5cedced..d8d9db0ad1 100644 --- a/spec/lib/link_details_extractor_spec.rb +++ b/spec/lib/link_details_extractor_spec.rb @@ -33,6 +33,14 @@ RSpec.describe LinkDetailsExtractor do expect(subject.canonical_url).to eq original_url end end + + context 'when canonical URL is set to "undefined"' do + let(:url) { 'undefined' } + + it 'ignores the canonical URLs' do + expect(subject.canonical_url).to eq original_url + end + end end context 'when only basic metadata is present' do From 24ef8255b3f9b44cb54f49bc78fe3382a7070b1a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 12 Sep 2024 14:54:16 +0200 Subject: [PATCH 29/89] Change design of embed modal in web UI (#31801) --- .../mastodon/components/copy_paste_text.tsx | 90 ++++++++++++++ .../mastodon/components/status_action_bar.jsx | 2 +- .../mastodon/containers/status_container.jsx | 6 +- .../mastodon/features/onboarding/share.jsx | 63 +--------- .../features/status/components/action_bar.jsx | 2 +- .../features/ui/components/embed_modal.jsx | 101 --------------- .../features/ui/components/embed_modal.tsx | 116 ++++++++++++++++++ app/javascript/mastodon/locales/en.json | 2 +- .../styles/mastodon/components.scss | 111 ++++++++--------- app/serializers/oembed_serializer.rb | 17 ++- app/views/layouts/embedded.html.haml | 2 +- .../initializers/content_security_policy.rb | 11 +- 12 files changed, 278 insertions(+), 245 deletions(-) create mode 100644 app/javascript/mastodon/components/copy_paste_text.tsx delete mode 100644 app/javascript/mastodon/features/ui/components/embed_modal.jsx create mode 100644 app/javascript/mastodon/features/ui/components/embed_modal.tsx diff --git a/app/javascript/mastodon/components/copy_paste_text.tsx b/app/javascript/mastodon/components/copy_paste_text.tsx new file mode 100644 index 0000000000..f888acd0f7 --- /dev/null +++ b/app/javascript/mastodon/components/copy_paste_text.tsx @@ -0,0 +1,90 @@ +import { useRef, useState, useCallback } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import classNames from 'classnames'; + +import ContentCopyIcon from '@/material-icons/400-24px/content_copy.svg?react'; +import { useTimeout } from 'mastodon/../hooks/useTimeout'; +import { Icon } from 'mastodon/components/icon'; + +export const CopyPasteText: React.FC<{ value: string }> = ({ value }) => { + const inputRef = useRef(null); + const [copied, setCopied] = useState(false); + const [focused, setFocused] = useState(false); + const [setAnimationTimeout] = useTimeout(); + + const handleInputClick = useCallback(() => { + setCopied(false); + + if (inputRef.current) { + inputRef.current.focus(); + inputRef.current.select(); + inputRef.current.setSelectionRange(0, value.length); + } + }, [setCopied, value]); + + const handleButtonClick = useCallback( + (e: React.MouseEvent) => { + e.stopPropagation(); + void navigator.clipboard.writeText(value); + inputRef.current?.blur(); + setCopied(true); + setAnimationTimeout(() => { + setCopied(false); + }, 700); + }, + [setCopied, setAnimationTimeout, value], + ); + + const handleKeyUp = useCallback( + (e: React.KeyboardEvent) => { + if (e.key !== ' ') return; + void navigator.clipboard.writeText(value); + setCopied(true); + setAnimationTimeout(() => { + setCopied(false); + }, 700); + }, + [setCopied, setAnimationTimeout, value], + ); + + const handleFocus = useCallback(() => { + setFocused(true); + }, [setFocused]); + + const handleBlur = useCallback(() => { + setFocused(false); + }, [setFocused]); + + return ( +
+