diff --git a/Gemfile.lock b/Gemfile.lock index f306eb8619..9695abadcd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -365,7 +365,7 @@ GEM json-ld-preloaded (3.3.1) json-ld (~> 3.3) rdf (~> 3.3) - json-schema (5.1.1) + json-schema (5.2.1) addressable (~> 2.8) bigdecimal (~> 3.1) jsonapi-renderer (0.2.2) @@ -761,7 +761,7 @@ GEM rspec-mocks (~> 3.0) sidekiq (>= 5, < 9) rspec-support (3.13.4) - rubocop (1.77.0) + rubocop (1.78.0) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 90f8fd000c..cb349f4d51 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -66,7 +66,7 @@ module ApplicationHelper def provider_sign_in_link(provider) label = Devise.omniauth_configs[provider]&.strategy&.display_name.presence || I18n.t("auth.providers.#{provider}", default: provider.to_s.chomp('_oauth2').capitalize) - link_to label, omniauth_authorize_path(:user, provider), class: "button button-#{provider}", method: :post + link_to label, omniauth_authorize_path(:user, provider), class: "btn button-#{provider}", method: :post end def locale_direction diff --git a/app/helpers/context_helper.rb b/app/helpers/context_helper.rb index 22d1964cae..38a0125c1b 100644 --- a/app/helpers/context_helper.rb +++ b/app/helpers/context_helper.rb @@ -27,6 +27,12 @@ module ContextHelper suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' }, attribution_domains: { 'toot' => 'http://joinmastodon.org/ns#', 'attributionDomains' => { '@id' => 'toot:attributionDomains', '@type' => '@id' } }, quote_requests: { 'QuoteRequest' => 'https://w3id.org/fep/044f#QuoteRequest' }, + quotes: { + 'quote' => 'https://w3id.org/fep/044f#quote', + 'quoteUri' => 'http://fedibird.com/ns#quoteUri', + '_misskey_quote' => 'https://misskey-hub.net/ns#_misskey_quote', + 'quoteAuthorization' => 'https://w3id.org/fep/044f#quoteAuthorization', + }, interaction_policies: { 'gts' => 'https://gotosocial.org/ns#', 'interactionPolicy' => { '@id' => 'gts:interactionPolicy', '@type' => '@id' }, diff --git a/app/javascript/mastodon/components/account_bio.tsx b/app/javascript/mastodon/components/account_bio.tsx index 301ffcbb24..e0127f2092 100644 --- a/app/javascript/mastodon/components/account_bio.tsx +++ b/app/javascript/mastodon/components/account_bio.tsx @@ -1,12 +1,30 @@ +import { useCallback } from 'react'; + import { useLinks } from 'mastodon/hooks/useLinks'; -export const AccountBio: React.FC<{ +interface AccountBioProps { note: string; className: string; -}> = ({ note, className }) => { - const handleClick = useLinks(); + dropdownAccountId?: string; +} - if (note.length === 0 || note === '

') { +export const AccountBio: React.FC = ({ + note, + className, + dropdownAccountId, +}) => { + const handleClick = useLinks(!!dropdownAccountId); + const handleNodeChange = useCallback( + (node: HTMLDivElement | null) => { + if (!dropdownAccountId || !node || node.childNodes.length === 0) { + return; + } + addDropdownToHashtags(node, dropdownAccountId); + }, + [dropdownAccountId], + ); + + if (note.length === 0) { return null; } @@ -15,6 +33,28 @@ export const AccountBio: React.FC<{ className={`${className} translate`} dangerouslySetInnerHTML={{ __html: note }} onClickCapture={handleClick} + ref={handleNodeChange} /> ); }; + +function addDropdownToHashtags(node: HTMLElement | null, accountId: string) { + if (!node) { + return; + } + for (const childNode of node.childNodes) { + if (!(childNode instanceof HTMLElement)) { + continue; + } + if ( + childNode instanceof HTMLAnchorElement && + (childNode.classList.contains('hashtag') || + childNode.innerText.startsWith('#')) && + !childNode.dataset.menuHashtag + ) { + childNode.dataset.menuHashtag = accountId; + } else if (childNode.childNodes.length > 0) { + addDropdownToHashtags(childNode, accountId); + } + } +} diff --git a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx index 30433151c6..b9f83bebaa 100644 --- a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx +++ b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx @@ -6,6 +6,7 @@ import classNames from 'classnames'; import { Helmet } from 'react-helmet'; import { NavLink } from 'react-router-dom'; +import { AccountBio } from '@/mastodon/components/account_bio'; import CheckIcon from '@/material-icons/400-24px/check.svg?react'; import LockIcon from '@/material-icons/400-24px/lock.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; @@ -773,7 +774,6 @@ export const AccountHeader: React.FC<{ ); } - const content = { __html: account.note_emojified }; const displayNameHtml = { __html: account.display_name_html }; const fields = account.fields; const isLocal = !account.acct.includes('@'); @@ -897,12 +897,11 @@ export const AccountHeader: React.FC<{ )} - {account.note.length > 0 && account.note !== '

' && ( -
- )} +
diff --git a/app/javascript/mastodon/hooks/useLinks.ts b/app/javascript/mastodon/hooks/useLinks.ts index c99f3f4199..160fe18503 100644 --- a/app/javascript/mastodon/hooks/useLinks.ts +++ b/app/javascript/mastodon/hooks/useLinks.ts @@ -8,13 +8,14 @@ import { openURL } from 'mastodon/actions/search'; import { useAppDispatch } from 'mastodon/store'; const isMentionClick = (element: HTMLAnchorElement) => - element.classList.contains('mention'); + element.classList.contains('mention') && + !element.classList.contains('hashtag'); const isHashtagClick = (element: HTMLAnchorElement) => element.textContent?.[0] === '#' || element.previousSibling?.textContent?.endsWith('#'); -export const useLinks = () => { +export const useLinks = (skipHashtags?: boolean) => { const history = useHistory(); const dispatch = useAppDispatch(); @@ -61,12 +62,12 @@ export const useLinks = () => { if (isMentionClick(target)) { e.preventDefault(); void handleMentionClick(target); - } else if (isHashtagClick(target)) { + } else if (isHashtagClick(target) && !skipHashtags) { e.preventDefault(); handleHashtagClick(target); } }, - [handleMentionClick, handleHashtagClick], + [skipHashtags, handleMentionClick, handleHashtagClick], ); return handleClick; diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 093422ac87..590c4c8d2b 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -1,6 +1,5 @@ // @ts-check - /** * @typedef {[code: string, name: string, localName: string]} InitialStateLanguage */ @@ -64,6 +63,7 @@ * @property {boolean=} critical_updates_pending * @property {InitialStateMeta} meta * @property {Role?} role + * @property {string[]} features */ const element = document.getElementById('initial-state'); @@ -140,4 +140,12 @@ export function getAccessToken() { return getMeta('access_token'); } +/** + * @param {string} feature + * @returns {boolean} + */ +export function isFeatureEnabled(feature) { + return initialState?.features?.includes(feature) || false; +} + export default initialState; diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 5c29a0ca3a..53b432152b 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -219,6 +219,9 @@ "confirmations.delete_list.confirm": "Elimina", "confirmations.delete_list.message": "Segur que vols suprimir permanentment aquesta llista?", "confirmations.delete_list.title": "Eliminar la llista?", + "confirmations.discard_draft.confirm": "Descarta i continua", + "confirmations.discard_draft.edit.cancel": "Continua l'edició", + "confirmations.discard_draft.post.cancel": "Reprendre l'esborrany", "confirmations.discard_edit_media.confirm": "Descarta", "confirmations.discard_edit_media.message": "Tens canvis no desats en la descripció del contingut o en la previsualització, els vols descartar?", "confirmations.follow_to_list.confirm": "Seguir i afegir a una llista", @@ -792,6 +795,7 @@ "report_notification.categories.violation": "Violació de norma", "report_notification.categories.violation_sentence": "violació de normes", "report_notification.open": "Obre l'informe", + "search.clear": "Esborra la cerca", "search.no_recent_searches": "No hi ha cerques recents", "search.placeholder": "Cerca", "search.quick_action.account_search": "Perfils coincidint amb {x}", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index f88f04afed..27bbf5131d 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -386,7 +386,7 @@ "follow_suggestions.similar_to_recently_followed_longer": "Minder om profiler, du har fulgt for nylig", "follow_suggestions.view_all": "Vis alle", "follow_suggestions.who_to_follow": "Hvem, som skal følges", - "followed_tags": "Hashtag, som følges", + "followed_tags": "Hashtags, som følges", "footer.about": "Om", "footer.directory": "Profiloversigt", "footer.get_app": "Hent appen", @@ -560,7 +560,7 @@ "navigation_bar.favourites": "Favoritter", "navigation_bar.filters": "Skjulte ord", "navigation_bar.follow_requests": "Følgeanmodninger", - "navigation_bar.followed_tags": "Hashtag, som følges", + "navigation_bar.followed_tags": "Hashtags, som følges", "navigation_bar.follows_and_followers": "Følges og følgere", "navigation_bar.import_export": "Import og eksport", "navigation_bar.lists": "Lister", @@ -572,7 +572,7 @@ "navigation_bar.mutes": "Skjulte brugere", "navigation_bar.opened_in_classic_interface": "Indlæg, konti og visse andre sider åbnes som standard i den klassiske webgrænseflade.", "navigation_bar.preferences": "Præferencer", - "navigation_bar.privacy_and_reach": "Fortrolighed og udbredelse", + "navigation_bar.privacy_and_reach": "Fortrolighed og rækkevidde", "navigation_bar.search": "Søg", "navigation_bar.search_trends": "Søg/Trender", "navigation_panel.collapse_followed_tags": "Sammenfold menuen Fulgte hashtags", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index e492cf9f80..b757fb0cda 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -569,6 +569,7 @@ "notification.admin.sign_up.name_and_others": "{name} eta {count, plural, one {erabiltzaile # gehiago} other {# erabiltzaile gehiago}} erregistratu dira", "notification.favourite": "{name}(e)k zure bidalketa gogoko du", "notification.favourite.name_and_others_with_link": "{name} eta {count, plural, one {erabiltzaile # gehiagok} other {# erabiltzaile gehiagok}} zure bidalketa gogoko dute", + "notification.favourite_pm": "{name}-ek zure aipamen pribatua gogokoetan jarri du", "notification.follow": "{name}(e)k jarraitzen dizu", "notification.follow_request": "{name}(e)k zu jarraitzeko eskaera egin du", "notification.follow_request.name_and_others": "{name} eta {count, plural, one {erabiltzaile # gehiagok} other {# erabiltzaile gehiagok}} zu jarraitzeko eskaera egin dute", @@ -902,5 +903,7 @@ "video.hide": "Ezkutatu bideoa", "video.pause": "Pausatu", "video.play": "Jo", + "video.unmute": "Soinua ezarri", + "video.volume_down": "Bolumena jaitsi", "video.volume_up": "Bolumena Igo" } diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 2f34c7aaed..83ffe1834b 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -356,6 +356,7 @@ "hashtag.counter_by_accounts": "{count, plural, one {{counter} partisipante} other {{counter} partisipantes}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}} oy", + "hashtag.feature": "Avalia en profil", "hashtag.follow": "Sige etiketa", "hashtag.mute": "Silensia #{hashtag}", "hashtag.unfeature": "No avalia en profil", @@ -390,6 +391,7 @@ "interaction_modal.title.reblog": "Repartaja publikasyon de {name}", "interaction_modal.title.reply": "Arisponde a publikasyon de {name}", "interaction_modal.title.vote": "Vota en la anketa de {name}", + "interaction_modal.username_prompt": "Por enshemplo {example}", "intervals.full.days": "{number, plural, one {# diya} other {# diyas}}", "intervals.full.hours": "{number, plural, one {# ora} other {# oras}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}", @@ -442,6 +444,7 @@ "lists.delete": "Efasa lista", "lists.done": "Fecho", "lists.edit": "Edita lista", + "lists.list_name": "Nombre de lista", "lists.new_list_name": "Nombre de mueva lista", "lists.replies_policy.followed": "Kualseker utilizador segido", "lists.replies_policy.list": "Miembros de la lista", @@ -738,6 +741,7 @@ "status.reblogs.empty": "Ainda nadie tiene repartajado esta publikasyon. Kuando algien lo aga, se amostrara aki.", "status.redraft": "Efasa i eskrive de muevo", "status.remove_bookmark": "Kita markador", + "status.remove_favourite": "Kita de los favoritos", "status.replied_in_thread": "Arispondo en filo", "status.replied_to": "Arispondio a {name}", "status.reply": "Arisponde", @@ -758,6 +762,7 @@ "subscribed_languages.save": "Guadra trokamientos", "subscribed_languages.target": "Troka linguas abonadas para {target}", "tabs_bar.home": "Linya prinsipala", + "tabs_bar.menu": "Menu", "tabs_bar.notifications": "Avizos", "tabs_bar.publish": "Mueva publikasyon", "tabs_bar.search": "Bushkeda", diff --git a/app/javascript/mastodon/models/account.ts b/app/javascript/mastodon/models/account.ts index 2666059b40..75a5c09b9d 100644 --- a/app/javascript/mastodon/models/account.ts +++ b/app/javascript/mastodon/models/account.ts @@ -126,6 +126,9 @@ export function createAccountFromServerJSON(serverJSON: ApiAccountJSON) { ? accountJSON.username : accountJSON.display_name; + const accountNote = + accountJSON.note && accountJSON.note !== '

' ? accountJSON.note : ''; + return AccountFactory({ ...accountJSON, moved: moved?.id, @@ -142,8 +145,8 @@ export function createAccountFromServerJSON(serverJSON: ApiAccountJSON) { escapeTextContentForBrowser(displayName), emojiMap, ), - note_emojified: emojify(accountJSON.note, emojiMap), - note_plain: unescapeHTML(accountJSON.note), + note_emojified: emojify(accountNote, emojiMap), + note_plain: unescapeHTML(accountNote), url: accountJSON.url.startsWith('http://') || accountJSON.url.startsWith('https://') diff --git a/app/lib/annual_report/archetype.rb b/app/lib/annual_report/archetype.rb index ff7e14e2a0..41973294a6 100644 --- a/app/lib/annual_report/archetype.rb +++ b/app/lib/annual_report/archetype.rb @@ -28,7 +28,7 @@ class AnnualReport::Archetype < AnnualReport::Source end def polls_count - @polls_count ||= report_statuses.where.not(poll_id: nil).count + @polls_count ||= report_statuses.only_polls.count end def reblogs_count @@ -36,7 +36,7 @@ class AnnualReport::Archetype < AnnualReport::Source end def replies_count - @replies_count ||= report_statuses.where.not(in_reply_to_id: nil).where.not(in_reply_to_account_id: @account.id).count + @replies_count ||= report_statuses.where.not(in_reply_to_id: nil).not_replying_to_account(@account).count end def standalone_count diff --git a/app/lib/annual_report/commonly_interacted_with_accounts.rb b/app/lib/annual_report/commonly_interacted_with_accounts.rb index c2aee44dea..219c30063a 100644 --- a/app/lib/annual_report/commonly_interacted_with_accounts.rb +++ b/app/lib/annual_report/commonly_interacted_with_accounts.rb @@ -18,7 +18,7 @@ class AnnualReport::CommonlyInteractedWithAccounts < AnnualReport::Source private def commonly_interacted_with_accounts - report_statuses.where.not(in_reply_to_account_id: @account.id).group(:in_reply_to_account_id).having(minimum_interaction_count).order(count_all: :desc).limit(SET_SIZE).count + report_statuses.not_replying_to_account(@account).group(:in_reply_to_account_id).having(minimum_interaction_count).order(count_all: :desc).limit(SET_SIZE).count end def minimum_interaction_count diff --git a/app/lib/annual_report/top_statuses.rb b/app/lib/annual_report/top_statuses.rb index 74b129595a..f32bd09a15 100644 --- a/app/lib/annual_report/top_statuses.rb +++ b/app/lib/annual_report/top_statuses.rb @@ -2,20 +2,44 @@ class AnnualReport::TopStatuses < AnnualReport::Source def generate - top_reblogs = base_scope.order(reblogs_count: :desc).first&.id - top_favourites = base_scope.where.not(id: top_reblogs).order(favourites_count: :desc).first&.id - top_replies = base_scope.where.not(id: [top_reblogs, top_favourites]).order(replies_count: :desc).first&.id - { top_statuses: { - by_reblogs: top_reblogs&.to_s, - by_favourites: top_favourites&.to_s, - by_replies: top_replies&.to_s, + by_reblogs: status_identifier(most_reblogged_status), + by_favourites: status_identifier(most_favourited_status), + by_replies: status_identifier(most_replied_status), }, } end + private + + def status_identifier(status) + status.id.to_s if status.present? + end + + def most_reblogged_status + base_scope + .order(reblogs_count: :desc) + .first + end + + def most_favourited_status + base_scope + .excluding(most_reblogged_status) + .order(favourites_count: :desc) + .first + end + + def most_replied_status + base_scope + .excluding(most_reblogged_status, most_favourited_status) + .order(replies_count: :desc) + .first + end + def base_scope - report_statuses.public_visibility.joins(:status_stat) + report_statuses + .public_visibility + .joins(:status_stat) end end diff --git a/app/lib/annual_report/type_distribution.rb b/app/lib/annual_report/type_distribution.rb index bdafe34c13..0534055c28 100644 --- a/app/lib/annual_report/type_distribution.rb +++ b/app/lib/annual_report/type_distribution.rb @@ -6,7 +6,7 @@ class AnnualReport::TypeDistribution < AnnualReport::Source type_distribution: { total: report_statuses.count, reblogs: report_statuses.only_reblogs.count, - replies: report_statuses.where.not(in_reply_to_id: nil).where.not(in_reply_to_account_id: @account.id).count, + replies: report_statuses.where.not(in_reply_to_id: nil).not_replying_to_account(@account).count, standalone: report_statuses.without_replies.without_reblogs.count, }, } diff --git a/app/models/account_statuses_cleanup_policy.rb b/app/models/account_statuses_cleanup_policy.rb index ef41bb3ee3..0915003c8b 100644 --- a/app/models/account_statuses_cleanup_policy.rb +++ b/app/models/account_statuses_cleanup_policy.rb @@ -161,7 +161,7 @@ class AccountStatusesCleanupPolicy < ApplicationRecord end def without_poll_scope - Status.where(poll_id: nil) + Status.without_polls end def without_popular_scope diff --git a/app/models/concerns/database_view_record.rb b/app/models/concerns/database_view_record.rb index 8b6672e299..b6709e1e41 100644 --- a/app/models/concerns/database_view_record.rb +++ b/app/models/concerns/database_view_record.rb @@ -10,12 +10,6 @@ module DatabaseViewRecord concurrently: true, cascade: false ) - rescue ActiveRecord::StatementInvalid - Scenic.database.refresh_materialized_view( - table_name, - concurrently: false, - cascade: false - ) end end diff --git a/app/models/concerns/follow_limitable.rb b/app/models/concerns/follow_limitable.rb index c64060d6e5..fb8f76e9bf 100644 --- a/app/models/concerns/follow_limitable.rb +++ b/app/models/concerns/follow_limitable.rb @@ -4,14 +4,8 @@ module FollowLimitable extend ActiveSupport::Concern included do - validates_with FollowLimitValidator, on: :create, unless: :bypass_follow_limit? - end + validates_with FollowLimitValidator, on: :create, unless: :bypass_follow_limit - def bypass_follow_limit=(value) - @bypass_follow_limit = value - end - - def bypass_follow_limit? - @bypass_follow_limit + attribute :bypass_follow_limit, :boolean, default: false end end diff --git a/app/models/status.rb b/app/models/status.rb index b823718a31..e8e03d7a3e 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -124,7 +124,10 @@ class Status < ApplicationRecord scope :without_replies, -> { not_reply.or(reply_to_account) } scope :not_reply, -> { where(reply: false) } scope :only_reblogs, -> { where.not(reblog_of_id: nil) } + scope :only_polls, -> { where.not(poll_id: nil) } + scope :without_polls, -> { where(poll_id: nil) } scope :reply_to_account, -> { where(arel_table[:in_reply_to_account_id].eq arel_table[:account_id]) } + scope :not_replying_to_account, ->(account) { where.not(in_reply_to_account: account) } scope :without_reblogs, -> { where(statuses: { reblog_of_id: nil }) } scope :tagged_with, ->(tag_ids) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag_ids }) } scope :not_excluded_by_account, ->(account) { where.not(account_id: account.excluded_from_timeline_account_ids) } diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index 443f63201e..1d0e1134f5 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -6,7 +6,7 @@ class InitialStateSerializer < ActiveModel::Serializer attributes :meta, :compose, :accounts, :media_attachments, :settings, :max_feed_hashtags, :poll_limits, - :languages + :languages, :features attribute :critical_updates_pending, if: -> { object&.role&.can?(:view_devops) && SoftwareUpdate.check_enabled? } @@ -102,6 +102,10 @@ class InitialStateSerializer < ActiveModel::Serializer LanguagesHelper::SUPPORTED_LOCALES.map { |(key, value)| [key, value[0], value[1]] } end + def features + Mastodon::Feature.enabled_features + end + private def default_meta_store diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 0d0d60cf52..1f64cb82fe 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -578,6 +578,11 @@ ca: all: Totes limited: Limitades title: Moderació + moderation_notes: + create: Afegeix una nota de moderació + created_msg: S'ha creat la nota de moderació d'instància. + destroyed_msg: S'ha esborrat la nota de moderació d'instància. + title: Notes de moderació private_comment: Comentari privat public_comment: Comentari públic purge: Purga @@ -1339,6 +1344,10 @@ ca: 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." other: Altres + emoji_styles: + auto: Automàtic + native: Nadiu + twemoji: Twemoji errors: '400': La sol·licitud que vas emetre no era vàlida o no era correcta. '403': No tens permís per a veure aquesta pàgina. diff --git a/config/locales/da.yml b/config/locales/da.yml index adb59158de..432308d591 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -653,7 +653,7 @@ da: mark_as_sensitive_description_html: Medierne i det anmeldte indlæg markeres som sensitive, og en advarsel (strike) registreres mhp. eskalering ved evt. fremtidige overtrædelser fra samme konto. other_description_html: Se flere muligheder for at kontrollere kontoens adfærd og tilpasse kommunikationen til den anmeldte konto. resolve_description_html: Ingen foranstaltninger træffes mod den anmeldte konto, ingen advarsel (strike) registreres og anmeldelsen lukkes. - silence_description_html: Kontoen vil kun være synlig for følgerene eller dem, som manuelt slå den op, hvilket markant begrænser dens udbredelse. Kan altid omgøres. Lukker alle indrapporteringer af kontoen. + silence_description_html: Kontoen vil kun være synlig for dem, der allerede følger den eller manuelt slår den op, hvilket alvorligt begrænser dens rækkevidde. Kan altid omgøres. Lukker alle indrapporteringer af denne konto. suspend_description_html: Kontoen inkl. alt indhold utilgængeliggøres og interaktion umuliggøres, og den slettes på et tidspunkt. Kan omgøres inden for 30 dage. Lukker alle indrapporteringer af kontoen. actions_description_html: Afgør, hvilke foranstaltning, der skal træffes for at løse denne anmeldelse. Ved en straffende foranstaltning mod den anmeldte konto, fremsendes en e-mailnotifikation, undtagen når kategorien Spam er valgt. actions_description_remote_html: Fastslå en nødvendig handling mhp. at løse denne anmeldelse. Dette vil kun påvirke din servers kommunikation med, og indholdshåndtering for, fjernkontoen. @@ -1266,8 +1266,8 @@ da: user_privacy_agreement_html: Jeg accepterer fortrolighedspolitikken author_attribution: example_title: Eksempeltekst - hint_html: Skriver du nyheder eller blogartikler uden for Mastodon? Styr, hvordan man bliver krediteret, når disse deles på Mastodon. - instructions: 'Sørg for, at denne kode er i artikelens HTML:' + hint_html: Skriver du nyheder eller blogartikler uden for Mastodon? Styr, hvordan du bliver krediteret, når de bliver delt på Mastodon. + instructions: 'Sørg for, at denne kode er i din artikels HTML:' more_from_html: Flere fra %{name} s_blog: "%{name}s blog" then_instructions: Tilføj dernæst publikationsdomænenavnet i feltet nedenfor. @@ -1347,7 +1347,7 @@ da: your_appeal_rejected: Din appel er afvist 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." + hint_html: "Tilpas, hvad folk ser på din offentlige profil og ved siden af dine indlæg. Andre personer er mere tilbøjelige til at følge dig tilbage og interagere med dig, når du har en udfyldt profil og et profilbillede." other: Andre emoji_styles: auto: Auto @@ -1718,11 +1718,11 @@ da: hint_html: "Tilpas hvordan din profil og dine indlæg kan findes. En række funktioner i Mastodon kan hjælpe dig med at nå ud til et bredere publikum, hvis du aktiverer dem. Tjek indstillingerne herunder for at sikre, at de passer til dit brugsscenarie." privacy: Privatliv privacy_hint_html: Styr, hvor meget der ønskes synliggjort til gavn for andre. Folk finder interessante profiler og apps ved at tjekke andres følgere ud, samt se hvilke apps de sender fra, men dine præferencer ønskes muligvis ikke synliggjort. - reach: Udbredelse + reach: Rækkevidde reach_hint_html: Indstil om du vil blive opdaget og fulgt af nye mennesker. Ønsker du, at dine indlæg skal vises på Udforsk-siden? Ønsker du, at andre skal se dig i deres følg-anbefalinger? Ønsker du at acceptere alle nye følgere automatisk, eller vil du have detaljeret kontrol over hver og en? - search: Søg + search: Søgning search_hint_html: Indstil hvordan du vil findes. Ønsker du, at folk skal finde dig gennem hvad du har skrevet offentligt? Vil du have folk udenfor Mastodon til at finde din profil, når de søger på nettet? Vær opmærksom på, at det ikke kan garanteres at dine offentlige indlæg er udelukket fra alle søgemaskiner. - title: Fortrolighed og udbredelse + title: Fortrolighed og rækkevidde privacy_policy: title: Privatlivspolitik reactions: @@ -1923,7 +1923,7 @@ da: '7889238': 3 måneder min_age_label: Alderstærskel min_favs: Behold indlæg favoritmarkeret mindst - min_favs_hint: Sletter ingen dine egne indlæg, som har modtaget minimum dette antal favoritmarkeringer. Lad stå tomt for at slette indlæg uanset antal favoritmarkeringer + min_favs_hint: Sletter ingen af dine egne indlæg, som har modtaget minimum dette antal favoritmarkeringer. Lad stå tom for at slette indlæg uanset antal favoritmarkeringer min_reblogs: Behold indlæg fremhævet mindst min_reblogs_hint: Sletter ingen af dine egne indlæg, som er fremhævet flere end dette antal gange. Lad stå tom for at slette indlæg uanset antallet af fremhævelser stream_entries: @@ -2095,7 +2095,7 @@ da: verification: extra_instructions_html: Tip: Linket på din hjemmeside kan være usynligt. Den vigtige del er rel="me" , som forhindrer impersonation på websteder med brugergenereret indhold. Du kan endda bruge et link tag i overskriften på siden i stedet for a, men HTML skal være tilgængelig uden at udføre JavaScript. here_is_how: Sådan gør du - hint_html: "Bekræftelse af din identitet på Mastodon er for alle. Baseret på åbne webstandarder, nu og for evigt gratis. Alt du behøver er en personlig hjemmeside, som folk genkende dig ved. Når du linker til denne hjemmeside fra din profil, vi vil kontrollere, at hjemmesiden linker tilbage til din profil og vise en visuel indikator på det." + hint_html: "Verificering af din identitet på Mastodon er for alle. Baseret på åbne webstandarder, nu og for altid gratis. Alt, hvad du behøver, er en personlig hjemmeside, som folk kender dig fra. Når du linker til denne hjemmeside fra din profil, kontrollerer vi, at hjemmesiden linker tilbage til din profil, og viser en visuel indikator på den." 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 diff --git a/config/locales/de.yml b/config/locales/de.yml index 59ceea8e79..1eb5ef1c4f 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1944,7 +1944,7 @@ de: contrast: Mastodon (Hoher Kontrast) default: Mastodon (Dunkel) mastodon-light: Mastodon (Hell) - system: Automatisch (mit System synchronisieren) + system: Automatisch (wie Betriebssystem) time: formats: default: "%d. %b %Y, %H:%M Uhr" diff --git a/config/locales/eu.yml b/config/locales/eu.yml index bf52c83bc9..42fb04a65a 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -467,8 +467,11 @@ eu: fasp: debug: callbacks: + created_at: Sortua hemen delete: Ezabatu ip: IP helbidea + request_body: Eskaeraren edukia + title: Atzera-deiak araztu providers: active: Aktibo base_url: Oinarrizko URL-a @@ -822,6 +825,7 @@ eu: destroyed_msg: Guneko igoera ongi ezabatu da! software_updates: critical_update: Kritikoa — mesedez, eguneratu azkar + description: Gomendagarria da Mastodon instalazioa eguneratuta mantentzea azken konponketa eta funtzioez baliatzeko. Gainera, batzuetan ezinbestekoa da Mastodon garaiz eguneratzea segurtasun arazoak saihesteko. Arrazoi hauengatik, Mastodonek 30 minuturo eguneratzeak egiaztatzen ditu, eta zure posta elektroniko bidezko jakinarazpenen lehentasunen arabera jakinaraziko dizu. documentation_link: Informazio gehiago release_notes: Bertsio oharrak title: Eguneraketak eskuragarri diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 86c03aab7d..bb68494118 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1851,6 +1851,8 @@ fr-CA: limit: Vous avez déjà épinglé le nombre maximum de messages ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas reblog: Un partage ne peut pas être épinglé + quote_policies: + followers: Abonné·e·s et utilisateur·trice·s mentionné·e·s title: "%{name} : « %{quote} »" visibilities: direct: Direct @@ -1904,6 +1906,8 @@ fr-CA: does_not_match_previous_name: ne correspond pas au nom précédent terms_of_service: title: Conditions d'utilisation + terms_of_service_interstitial: + title: Les conditions d'utilisation de %{domain} ont changées themes: contrast: Mastodon (Contraste élevé) default: Mastodon (Sombre) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index bace64c213..6fcdb5b972 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1851,6 +1851,8 @@ fr: limit: Vous avez déjà épinglé le nombre maximum de messages ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas reblog: Un partage ne peut pas être épinglé + quote_policies: + followers: Abonné·e·s et utilisateur·trice·s mentionné·e·s title: "%{name} : « %{quote} »" visibilities: direct: Direct @@ -1904,6 +1906,8 @@ fr: does_not_match_previous_name: ne correspond pas au nom précédent terms_of_service: title: Conditions d'utilisation + terms_of_service_interstitial: + title: Les conditions d'utilisation de %{domain} ont changées themes: contrast: Mastodon (Contraste élevé) default: Mastodon (Sombre) diff --git a/config/locales/ga.yml b/config/locales/ga.yml index a38a3cfc7a..c9e943c91c 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -1406,6 +1406,10 @@ ga: 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." other: Eile + emoji_styles: + auto: Uath + native: Dúchasach + twemoji: Twemoji errors: '400': Bhí an t-iarratas a chuir tú isteach neamhbhailí nó míchumtha. '403': Níl cead agat an leathanach seo a fheiceáil. diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 1bf0194043..b46062b2c7 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1349,6 +1349,10 @@ hu: 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." other: Egyéb + emoji_styles: + auto: Automatikus + native: Natív + twemoji: Twemoji errors: '400': A küldött kérés érvénytelen vagy hibás volt. '403': Nincs jogosultságod az oldal megtekintéséhez. diff --git a/config/locales/it.yml b/config/locales/it.yml index 595c2fddb2..2bf9f656ba 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1351,6 +1351,10 @@ it: 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." other: Altro + emoji_styles: + auto: Automatico + native: Nativo + twemoji: Twemoji errors: '400': La richiesta che hai inviato non è valida o non è corretta. '403': Non sei autorizzato a visualizzare questa pagina. diff --git a/config/locales/lad.yml b/config/locales/lad.yml index e3c14367b7..2a5f8cabd2 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -186,6 +186,7 @@ lad: create_domain_block: Kriya bloko de domeno create_email_domain_block: Kriya bloko de domeno de posta create_ip_block: Kriya regla de IP + create_relay: Kriya relevo create_unavailable_domain: Kriya domeno no desponivle create_user_role: Kriya rolo demote_user: Degrada utilizador @@ -197,6 +198,7 @@ lad: destroy_email_domain_block: Efasa bloko de domeno de posta destroy_instance: Efasa domeno destroy_ip_block: Efasa regla de IP + destroy_relay: Efasa relevo destroy_status: Efasa publikasyon destroy_unavailable_domain: Efasa domeno no desponivle destroy_user_role: Efasa rolo @@ -205,6 +207,7 @@ lad: disable_sign_in_token_auth_user: Inkapasita la autentifikasyon por token de posta elektronika para el utilizador disable_user: Inkapasita utilizador enable_custom_emoji: Kapasita emoji personalizados + enable_relay: Aktiva relevo enable_sign_in_token_auth_user: Kapasita la autentifikasyon por token de posta para el utilizador enable_user: Kapasita utilizador memorialize_account: Transforma en kuento komemorativo @@ -229,6 +232,7 @@ lad: update_custom_emoji: Aktualiza emoji personalizado update_domain_block: Aktualiza bloko de domeno update_ip_block: Aktualiza regla de IP + update_report: Aktualiza raporto update_status: Aktualiza publikasyon update_user_role: Aktualiza rolo actions: @@ -466,10 +470,13 @@ lad: fasp: debug: callbacks: + created_at: Kriyado en delete: Efasa + ip: Adreso IP providers: active: Aktivo delete: Efasa + finish_registration: Finaliza enrejistrasyon name: Nombre registrations: confirm: Konfirma @@ -542,6 +549,12 @@ lad: all: Todos limited: Limitado title: Moderasyon + moderation_notes: + create: Adjusta nota de moderasyon + created_msg: Nota de moderasyon de sirvidor kriyada kon sukseso! + description_html: Ve i desha notas a otros moderadores i a tu yo futuro + destroyed_msg: Nota de moderasyon de sirvidor efasada kon sukseso! + title: Notas de moderasyon private_comment: Komento privado public_comment: Komento publiko purge: Purga @@ -748,6 +761,7 @@ lad: title: Rolos rules: add_new: Adjusta regla + add_translation: Adjusta traduksyon delete: Efasa description_html: Aunke la majorita afirma aver meldado i estar de akodro kon los terminos de servisyo, la djente normalmente no los melda asta dempues de ke surja algun problema. Az ke sea mas kolay ver las normas de tu sirvidor de un vistazo estipulándolas en una lista de puntos. Aprova ke kada norma sea corta i kolay, ama sin estar divididas en munchos puntos. edit: Edita regla @@ -920,6 +934,9 @@ lad: updated_msg: Konfigurasyon de etiketas aktualizada kon sukseso terms_of_service: changelog: Ke troko + current: Aktual + generates: + action: Djenera history: Istorya live: En bivo publish: Publika @@ -1245,6 +1262,10 @@ lad: 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." other: Otros + emoji_styles: + auto: Otomatiko + native: Nativo + twemoji: Twemoji errors: '400': La solisitasyon ke enviates no fue valida o fue malformada. '403': No tienes permiso para ver esta pajina. diff --git a/config/locales/nl.yml b/config/locales/nl.yml index e38d80b100..b53aa68a65 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -583,7 +583,7 @@ nl: created_msg: Aanmaken van servermoderatie-opmerking geslaagd! description_html: Opmerkingen bekijken, en voor jezelf en andere moderatoren achterlaten destroyed_msg: Verwijderen van servermoderatie-opmerking geslaagd! - placeholder: Informatie over deze server, genomen acties of iets anders die jou kunnen helpen om deze server in de toekomst te moderen. + placeholder: Informatie over deze server, genomen acties of iets anders die jou kunnen helpen om deze server in de toekomst te modereren. title: Moderatie-opmerkingen private_comment: Privé-opmerking public_comment: Openbare opmerking diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 26205e3826..04bfe7c698 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -61,6 +61,7 @@ ca: setting_display_media_default: Amaga el contingut gràfic marcat com a sensible setting_display_media_hide_all: Oculta sempre tot el contingut multimèdia setting_display_media_show_all: Mostra sempre el contingut gràfic + setting_emoji_style: Com mostrar els emojis. "Automàtic" provarà de fer servir els emojis nadius, però revertirà a twemojis en els navegadors antics. setting_system_scrollbars_ui: S'aplica només als navegadors d'escriptori basats en Safari i Chrome setting_use_blurhash: Els degradats es basen en els colors de les imatges ocultes, però n'enfosqueixen els detalls setting_use_pending_items: Amaga les actualitzacions de la línia de temps després de fer un clic, en lloc de desplaçar-les automàticament @@ -240,6 +241,7 @@ ca: setting_display_media_default: Per defecte setting_display_media_hide_all: Amaga-ho tot setting_display_media_show_all: Mostra-ho tot + setting_emoji_style: Estil d'emojis setting_expand_spoilers: Desplega sempre els tuts marcats amb advertències de contingut setting_hide_network: Amaga la teva xarxa setting_missing_alt_text_modal: Mostra un diàleg de confirmació abans de publicar contingut sense text alternatiu diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 07d36ae1a1..6ce3669527 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -61,7 +61,7 @@ da: setting_display_media_default: Skjul medier med sensitiv-markering setting_display_media_hide_all: Skjul altid medier setting_display_media_show_all: Vis altid medier - setting_emoji_style: Hvordan emojis skal vises. "Auto" vil forsøge at bruge indbyggede emojis, men skifter tilbage til Twemoji for ældre browsere. + setting_emoji_style: Hvordan emojis skal vises. "Auto" vil forsøge at bruge indbyggede emojis, men skifter tilbage til Twemoji i ældre webbrowsere. setting_system_scrollbars_ui: Gælder kun for computerwebbrowsere baseret på Safari og Chrome setting_use_blurhash: Gradienter er baseret på de skjulte grafikelementers farver, men slører alle detaljer setting_use_pending_items: Skjul tidslinjeopdateringer bag et klik i stedet for brug af auto-feedrulning diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 07862f3d88..a7cb83eb13 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -61,7 +61,7 @@ de: setting_display_media_default: Medien mit Inhaltswarnung ausblenden setting_display_media_hide_all: Medien immer ausblenden setting_display_media_show_all: Medien mit Inhaltswarnung immer anzeigen - setting_emoji_style: Darstellung von Emojis. „Automatisch“ verwendet native Emojis, für ältere Browser jedoch Twemoji. + setting_emoji_style: 'Wie Emojis dargestellt werden: „Automatisch“ verwendet native Emojis, für veraltete Browser wird jedoch Twemoji verwendet.' setting_system_scrollbars_ui: Betrifft nur Desktop-Browser, die auf Chrome oder Safari basieren setting_use_blurhash: Der Farbverlauf basiert auf den Farben der ausgeblendeten Medien, verschleiert aber jegliche Details setting_use_pending_items: Neue Beiträge hinter einem Klick verstecken, anstatt automatisch zu scrollen @@ -248,7 +248,7 @@ de: setting_missing_alt_text_modal: Bestätigungsdialog anzeigen, bevor Medien ohne Bildbeschreibung veröffentlicht werden setting_reduce_motion: Bewegung in Animationen verringern setting_system_font_ui: Standardschriftart des Browsers verwenden - setting_system_scrollbars_ui: Bildlaufleiste des Systems verwenden + setting_system_scrollbars_ui: Bildlaufleiste des Betriebssystems verwenden setting_theme: Design setting_trends: Heutige Trends anzeigen setting_unfollow_modal: Bestätigungsdialog beim Entfolgen eines Profils anzeigen diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index b26cd854fc..9c7b9fe28e 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -61,6 +61,7 @@ ga: setting_display_media_default: Folaigh meáin atá marcáilte mar íogair setting_display_media_hide_all: Folaigh meáin i gcónaí setting_display_media_show_all: Taispeáin meáin i gcónaí + setting_emoji_style: Conas emojis a thaispeáint. Déanfaidh "Auto" iarracht emoji dúchasacha a úsáid, ach titeann sé ar ais go Twemoji le haghaidh seanbhrabhsálaithe. setting_system_scrollbars_ui: Ní bhaineann sé ach le brabhsálaithe deisce bunaithe ar Safari agus Chrome setting_use_blurhash: Tá grádáin bunaithe ar dhathanna na n-amharcanna ceilte ach cuireann siad salach ar aon mhionsonraí setting_use_pending_items: Folaigh nuashonruithe amlíne taobh thiar de chlic seachas an fotha a scrollú go huathoibríoch @@ -244,6 +245,7 @@ ga: setting_display_media_default: Réamhshocrú setting_display_media_hide_all: Cuir uile i bhfolach setting_display_media_show_all: Taispeáin uile + setting_emoji_style: Stíl Emoji setting_expand_spoilers: Méadaigh postálacha atá marcáilte le rabhaidh inneachair i gcónaí setting_hide_network: Folaigh do ghraf sóisialta setting_missing_alt_text_modal: Taispeáin dialóg deimhnithe sula bpostálann tú meán gan alt téacs diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index e54adb8ca2..540da347c1 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -61,6 +61,7 @@ hu: setting_display_media_default: Kényes tartalomnak jelölt média elrejtése setting_display_media_hide_all: Média elrejtése mindig setting_display_media_show_all: Média megjelenítése mindig + setting_emoji_style: Az emodzsik megjelenítési módja. Az „Automatikus” megpróbálja a natív emodzsikat használni, de az örökölt böngészők esetén a Twemojira vált vissza. setting_system_scrollbars_ui: Csak Chrome és Safari alapú asztali böngészőkre vonatkozik setting_use_blurhash: A kihomályosítás az eredeti képből történik, de minden részletet elrejt setting_use_pending_items: Idővonal frissítése csak kattintásra automatikus görgetés helyett @@ -241,6 +242,7 @@ hu: setting_display_media_default: Alapértelmezés setting_display_media_hide_all: Mindent elrejt setting_display_media_show_all: Mindent mutat + setting_emoji_style: Emodzsistílus setting_expand_spoilers: Tartalmi figyelmeztetéssel ellátott bejegyzések automatikus kinyitása setting_hide_network: Hálózatod elrejtése setting_missing_alt_text_modal: Megerősítési párbeszédablak megjelenítése a helyettesítő szöveg nélküli média közzététele előtt diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 93c0858ed6..9428f38996 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -61,6 +61,7 @@ it: setting_display_media_default: Nascondi media segnati come sensibili setting_display_media_hide_all: Nascondi sempre tutti i media setting_display_media_show_all: Mostra sempre i media segnati come sensibili + setting_emoji_style: Come visualizzare gli emoji. "Automatico" proverà a usare gli emoji nativi, ma per i browser più vecchi ricorrerà a Twemoji. setting_system_scrollbars_ui: Si applica solo ai browser desktop basati su Safari e Chrome setting_use_blurhash: I gradienti sono basati sui colori delle immagini nascoste ma offuscano tutti i dettagli setting_use_pending_items: Fare clic per mostrare i nuovi messaggi invece di aggiornare la timeline automaticamente @@ -241,6 +242,7 @@ it: setting_display_media_default: Predefinita setting_display_media_hide_all: Nascondi tutti setting_display_media_show_all: Mostra tutti + setting_emoji_style: Stile emoji setting_expand_spoilers: Espandi sempre post con content warning setting_hide_network: Nascondi la tua rete setting_missing_alt_text_modal: Chiedi di confermare prima di pubblicare media senza testo alternativo diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index ef5b2a00b6..78ac35b46d 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -61,7 +61,7 @@ nl: setting_display_media_default: Als gevoelig gemarkeerde media verbergen setting_display_media_hide_all: Media altijd verbergen setting_display_media_show_all: Media altijd tonen - setting_emoji_style: Waarmee moeten emojis worden weergegeven. "Auto" probeert de systeemeigen emojis te gebruiken, maar valt terug op Twemoji voor oudere webbrowsers. + setting_emoji_style: Waarmee moeten emojis worden weergegeven. ‘Auto’ probeert de systeemeigen emojis te gebruiken, maar valt terug op Twemoji voor oudere webbrowsers. setting_system_scrollbars_ui: Alleen van toepassing op desktopbrowsers gebaseerd op Safari en Chrome setting_use_blurhash: Wazige kleurovergangen zijn gebaseerd op de kleuren van de verborgen media, waarmee elk detail verdwijnt setting_use_pending_items: De tijdlijn wordt bijgewerkt door op het aantal nieuwe items te klikken, in plaats van dat deze automatisch wordt bijgewerkt diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index 2561eeb2ca..8a0e901281 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -234,6 +234,7 @@ uk: setting_display_media_default: За промовчанням setting_display_media_hide_all: Сховати всі setting_display_media_show_all: Показати всі + setting_emoji_style: Стиль емодзі setting_expand_spoilers: Завжди розгортати дописи з попередженнями про вміст setting_hide_network: Сховати вашу мережу setting_missing_alt_text_modal: Запитувати перед розміщенням медіа без альтернативного тексту diff --git a/config/locales/uk.yml b/config/locales/uk.yml index dd9e8e826e..ceadfc3466 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1338,6 +1338,9 @@ uk: basic_information: Основна інформація hint_html: "Налаштуйте те, що люди бачитимуть у вашому загальнодоступному профілі та поруч із вашими дописами. Інші люди з більшою ймовірністю підпишуться на вас та взаємодіятимуть з вами, якщо у вас є заповнений профіль та зображення профілю." other: Інше + emoji_styles: + auto: Авто + native: Рідний errors: '400': Ваш запит був недійсним або неправильним. '403': У Вас немає доступу до перегляду даної сторінки. diff --git a/spec/lib/mastodon/cli/accounts_spec.rb b/spec/lib/mastodon/cli/accounts_spec.rb index 238f72f834..e60f5a0cf7 100644 --- a/spec/lib/mastodon/cli/accounts_spec.rb +++ b/spec/lib/mastodon/cli/accounts_spec.rb @@ -1288,49 +1288,64 @@ RSpec.describe Mastodon::CLI::Accounts do describe '#prune' do let(:action) { :prune } - let!(:local_account) { Fabricate(:account) } - let!(:bot_account) { Fabricate(:account, bot: true, domain: 'example.com') } - let!(:group_account) { Fabricate(:account, actor_type: 'Group', domain: 'example.com') } - let!(:mentioned_account) { Fabricate(:account, domain: 'example.com') } - let!(:prunable_accounts) do - Fabricate.times(2, :account, domain: 'example.com', bot: false, suspended_at: nil, silenced_at: nil) - end + let(:viable_attrs) { { domain: 'example.com', bot: false, suspended: false, silenced: false } } + let!(:local_account) { Fabricate(:account) } + let!(:bot_account) { Fabricate(:account, bot: true, domain: 'example.com') } + let!(:group_account) { Fabricate(:account, actor_type: 'Group', domain: 'example.com') } + let!(:account_mentioned) { Fabricate(:account, viable_attrs) } + let!(:account_with_favourite) { Fabricate(:account, viable_attrs) } + let!(:account_with_status) { Fabricate(:account, viable_attrs) } + let!(:account_with_follow) { Fabricate(:account, viable_attrs) } + let!(:account_targeted_follow) { Fabricate(:account, viable_attrs) } + let!(:account_with_block) { Fabricate(:account, viable_attrs) } + let!(:account_targeted_block) { Fabricate(:account, viable_attrs) } + let!(:account_targeted_mute) { Fabricate(:account, viable_attrs) } + let!(:account_targeted_report) { Fabricate(:account, viable_attrs) } + let!(:account_with_follow_request) { Fabricate(:account, viable_attrs) } + let!(:account_targeted_follow_request) { Fabricate(:account, viable_attrs) } + let!(:prunable_accounts) { Fabricate.times(2, :account, viable_attrs) } before do - Fabricate(:mention, account: mentioned_account, status: Fabricate(:status, account: Fabricate(:account))) + Fabricate :mention, account: account_mentioned, status: Fabricate(:status, account: Fabricate(:account)) + Fabricate :favourite, account: account_with_favourite + Fabricate :status, account: account_with_status + Fabricate :follow, account: account_with_follow + Fabricate :follow, target_account: account_targeted_follow + Fabricate :block, account: account_with_block + Fabricate :block, target_account: account_targeted_block + Fabricate :mute, target_account: account_targeted_mute + Fabricate :report, target_account: account_targeted_report + Fabricate :follow_request, account: account_with_follow_request + Fabricate :follow_request, target_account: account_targeted_follow_request stub_parallelize_with_progress! end - def expect_prune_remote_accounts_without_interaction - prunable_account_ids = prunable_accounts.pluck(:id) - - expect(Account.where(id: prunable_account_ids).count).to eq(0) - end - it 'displays a successful message and handles accounts correctly' do expect { subject } .to output_results("OK, pruned #{prunable_accounts.size} accounts") - expect_prune_remote_accounts_without_interaction - expect_not_prune_local_accounts - expect_not_prune_bot_accounts - expect_not_prune_group_accounts - expect_not_prune_mentioned_accounts + expect(prunable_account_records) + .to have_attributes(count: eq(0)) + expect(Account.all) + .to include(local_account) + .and include(bot_account) + .and include(group_account) + .and include(account_mentioned) + .and include(account_with_favourite) + .and include(account_with_status) + .and include(account_with_follow) + .and include(account_targeted_follow) + .and include(account_with_block) + .and include(account_targeted_block) + .and include(account_targeted_mute) + .and include(account_targeted_report) + .and include(account_with_follow_request) + .and include(account_targeted_follow_request) + .and not_include(prunable_accounts.first) + .and not_include(prunable_accounts.last) end - def expect_not_prune_local_accounts - expect(Account.exists?(id: local_account.id)).to be(true) - end - - def expect_not_prune_bot_accounts - expect(Account.exists?(id: bot_account.id)).to be(true) - end - - def expect_not_prune_group_accounts - expect(Account.exists?(id: group_account.id)).to be(true) - end - - def expect_not_prune_mentioned_accounts - expect(Account.exists?(id: mentioned_account.id)).to be true + def prunable_account_records + Account.where(id: prunable_accounts.pluck(:id)) end context 'with --dry-run option' do diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb index f79b9e9853..4e48772765 100644 --- a/spec/models/status_spec.rb +++ b/spec/models/status_spec.rb @@ -191,6 +191,19 @@ RSpec.describe Status do end end + describe '.not_replying_to_account' do + let(:account) { Fabricate :account } + let!(:status_from_account) { Fabricate :status, account: account } + let!(:reply_to_account_status) { Fabricate :status, thread: status_from_account } + let!(:reply_to_other) { Fabricate :status, thread: Fabricate(:status) } + + it 'returns records not in reply to provided account' do + expect(described_class.not_replying_to_account(account)) + .to not_include(reply_to_account_status) + .and include(reply_to_other) + end + end + describe '#untrusted_favourites_count' do before do alice.update(domain: 'example.com') @@ -450,6 +463,28 @@ RSpec.describe Status do end end + describe '.only_polls' do + let!(:poll_status) { Fabricate :status, poll: Fabricate(:poll) } + let!(:no_poll_status) { Fabricate :status } + + it 'returns the expected statuses' do + expect(described_class.only_polls) + .to include(poll_status) + .and not_include(no_poll_status) + end + end + + describe '.without_polls' do + let!(:poll_status) { Fabricate :status, poll: Fabricate(:poll) } + let!(:no_poll_status) { Fabricate :status } + + it 'returns the expected statuses' do + expect(described_class.without_polls) + .to not_include(poll_status) + .and include(no_poll_status) + end + end + describe '.tagged_with' do let(:tag_cats) { Fabricate(:tag, name: 'cats') } let(:tag_dogs) { Fabricate(:tag, name: 'dogs') } diff --git a/yarn.lock b/yarn.lock index cbd02d6e5e..00a6937ee9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6042,9 +6042,9 @@ __metadata: linkType: hard "core-js@npm:^3.30.2, core-js@npm:^3.41.0": - version: 3.43.0 - resolution: "core-js@npm:3.43.0" - checksum: 10c0/9d4ad66296e60380777de51d019b5c3e6cce023b7999750a5094f9a4b0ea53bf3600beb4ef11c56548f2c8791d43d4056e270d1cf55ba87273011aa7d4597871 + version: 3.44.0 + resolution: "core-js@npm:3.44.0" + checksum: 10c0/759bf3dc5f75068e9425dddf895fd5531c38794a11ea1c2b65e5ef7c527fe3652d59e8c287e574a211af9bab3c057c5c3fa6f6a773f4e142af895106efad38a4 languageName: node linkType: hard