diff --git a/.github/renovate.json5 b/.github/renovate.json5
index 8a10676283..3d3499922e 100644
--- a/.github/renovate.json5
+++ b/.github/renovate.json5
@@ -14,6 +14,11 @@
// If we do not want a package to be grouped with others, we need to set its groupName
// to `null` after any other rule set it to something.
dependencyDashboardHeader: 'This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more. Before approving any upgrade: read the description and comments in the [`renovate.json5` file](https://github.com/mastodon/mastodon/blob/main/.github/renovate.json5).',
+ constraints: {
+ // Mastodon should work on Ruby 3.4, but its test dependencies are currently uninstallable on Ruby 3.4.
+ // TODO: remove this once https://github.com/briandunn/flatware/issues/103 is fixed
+ ruby: '3.3',
+ },
postUpdateOptions: ['yarnDedupeHighest'],
packageRules: [
{
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 743cc36ef5..ea18b3cb92 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -135,7 +135,7 @@ The following changelog entries focus on changes visible to users, administrator
- **Add notifications of severed relationships** (#27511, #29665, #29668, #29670, #29700, #29714, #29712, and #29731 by @ClearlyClaire and @Gargron)\
Notify local users when they lose relationships as a result of a local moderator blocking a remote account or server, allowing the affected user to retrieve the list of broken relationships.\
Note that this does not notify remote users.\
- This adds the `severed_relationships` notification type to the REST API and streaming, with a new [`relationship_severance_event` attribute](https://docs.joinmastodon.org/entities/Notification/#relationship_severance_event).
+ This adds the `severed_relationships` notification type to the REST API and streaming, with a new [`event` attribute](https://docs.joinmastodon.org/entities/Notification/#relationship_severance_event).
- **Add hover cards in web UI** (#30754, #30864, #30850, #30879, #30928, #30949, #30948, #30931, and #31300 by @ClearlyClaire, @Gargron, and @renchap)\
Hovering over an avatar or username will now display a hover card with the first two lines of the user's description and their first two profile fields.\
This can be disabled in the “Animations and accessibility” section of the preferences.
diff --git a/Gemfile b/Gemfile
index b626b5511c..ad174cfdc4 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,12 +1,12 @@
# frozen_string_literal: true
source 'https://rubygems.org'
-ruby '>= 3.2.0'
+ruby '>= 3.2.0', '< 3.5'
gem 'propshaft'
gem 'puma', '~> 6.3'
gem 'rack', '~> 2.2.7'
-gem 'rails', '~> 7.2.0'
+gem 'rails', '~> 8.0'
gem 'thor', '~> 1.2'
gem 'dotenv'
@@ -73,13 +73,13 @@ gem 'public_suffix', '~> 6.0'
gem 'pundit', '~> 2.3'
gem 'rack-attack', '~> 6.6'
gem 'rack-cors', '~> 2.0', require: 'rack/cors'
-gem 'rails-i18n', '~> 7.0'
+gem 'rails-i18n', '~> 8.0'
gem 'redcarpet', '~> 3.6'
gem 'redis', '~> 4.5', require: ['redis', 'redis/connection/hiredis']
gem 'redis-namespace', '~> 1.10'
gem 'rqrcode', '~> 2.2'
gem 'ruby-progressbar', '~> 1.13'
-gem 'sanitize', '~> 6.0'
+gem 'sanitize', '~> 7.0'
gem 'scenic', '~> 1.7'
gem 'sidekiq', '~> 6.5'
gem 'sidekiq-bulk', '~> 0.2.0'
@@ -183,7 +183,7 @@ group :development do
gem 'letter_opener_web', '~> 3.0'
# Security analysis CLI tools
- gem 'brakeman', '~> 6.0', require: false
+ gem 'brakeman', '~> 7.0', require: false
gem 'bundler-audit', '~> 0.9', require: false
# Linter CLI for HAML files
@@ -222,7 +222,7 @@ gem 'concurrent-ruby', require: false
gem 'connection_pool', require: false
gem 'xorcist', '~> 1.1'
-gem 'net-http', '~> 0.5.0'
+gem 'net-http', '~> 0.6.0'
gem 'rubyzip', '~> 2.3'
gem 'hcaptcha', '~> 7.1'
diff --git a/Gemfile.lock b/Gemfile.lock
index 3367e04685..f49de6bf3b 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -10,46 +10,45 @@ GIT
GEM
remote: https://rubygems.org/
specs:
- actioncable (7.2.2.1)
- actionpack (= 7.2.2.1)
- activesupport (= 7.2.2.1)
+ actioncable (8.0.1)
+ actionpack (= 8.0.1)
+ activesupport (= 8.0.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
- actionmailbox (7.2.2.1)
- actionpack (= 7.2.2.1)
- activejob (= 7.2.2.1)
- activerecord (= 7.2.2.1)
- activestorage (= 7.2.2.1)
- activesupport (= 7.2.2.1)
+ actionmailbox (8.0.1)
+ actionpack (= 8.0.1)
+ activejob (= 8.0.1)
+ activerecord (= 8.0.1)
+ activestorage (= 8.0.1)
+ activesupport (= 8.0.1)
mail (>= 2.8.0)
- actionmailer (7.2.2.1)
- actionpack (= 7.2.2.1)
- actionview (= 7.2.2.1)
- activejob (= 7.2.2.1)
- activesupport (= 7.2.2.1)
+ actionmailer (8.0.1)
+ actionpack (= 8.0.1)
+ actionview (= 8.0.1)
+ activejob (= 8.0.1)
+ activesupport (= 8.0.1)
mail (>= 2.8.0)
rails-dom-testing (~> 2.2)
- actionpack (7.2.2.1)
- actionview (= 7.2.2.1)
- activesupport (= 7.2.2.1)
+ actionpack (8.0.1)
+ actionview (= 8.0.1)
+ activesupport (= 8.0.1)
nokogiri (>= 1.8.5)
- racc
- rack (>= 2.2.4, < 3.2)
+ rack (>= 2.2.4)
rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
useragent (~> 0.16)
- actiontext (7.2.2.1)
- actionpack (= 7.2.2.1)
- activerecord (= 7.2.2.1)
- activestorage (= 7.2.2.1)
- activesupport (= 7.2.2.1)
+ actiontext (8.0.1)
+ actionpack (= 8.0.1)
+ activerecord (= 8.0.1)
+ activestorage (= 8.0.1)
+ activesupport (= 8.0.1)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
- actionview (7.2.2.1)
- activesupport (= 7.2.2.1)
+ actionview (8.0.1)
+ activesupport (= 8.0.1)
builder (~> 3.1)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
@@ -59,22 +58,22 @@ GEM
activemodel (>= 4.1)
case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
- activejob (7.2.2.1)
- activesupport (= 7.2.2.1)
+ activejob (8.0.1)
+ activesupport (= 8.0.1)
globalid (>= 0.3.6)
- activemodel (7.2.2.1)
- activesupport (= 7.2.2.1)
- activerecord (7.2.2.1)
- activemodel (= 7.2.2.1)
- activesupport (= 7.2.2.1)
+ activemodel (8.0.1)
+ activesupport (= 8.0.1)
+ activerecord (8.0.1)
+ activemodel (= 8.0.1)
+ activesupport (= 8.0.1)
timeout (>= 0.4.0)
- activestorage (7.2.2.1)
- actionpack (= 7.2.2.1)
- activejob (= 7.2.2.1)
- activerecord (= 7.2.2.1)
- activesupport (= 7.2.2.1)
+ activestorage (8.0.1)
+ actionpack (= 8.0.1)
+ activejob (= 8.0.1)
+ activerecord (= 8.0.1)
+ activesupport (= 8.0.1)
marcel (~> 1.0)
- activesupport (7.2.2.1)
+ activesupport (8.0.1)
base64
benchmark (>= 0.3)
bigdecimal
@@ -86,6 +85,7 @@ GEM
minitest (>= 5.1)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
+ uri (>= 0.13.1)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
aes_key_wrap (1.1.0)
@@ -94,8 +94,8 @@ GEM
ast (2.4.2)
attr_required (1.0.2)
aws-eventstream (1.3.0)
- aws-partitions (1.1025.0)
- aws-sdk-core (3.214.0)
+ aws-partitions (1.1029.0)
+ aws-sdk-core (3.214.1)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
@@ -119,14 +119,14 @@ GEM
erubi (>= 1.0.0)
rack (>= 0.9.0)
rouge (>= 1.0.0)
- bigdecimal (3.1.8)
+ bigdecimal (3.1.9)
bindata (2.5.0)
binding_of_caller (1.0.1)
debug_inspector (>= 1.2.0)
blurhash (0.1.8)
bootsnap (1.18.4)
msgpack (~> 1.2)
- brakeman (6.2.2)
+ brakeman (7.0.0)
racc
browser (6.2.0)
brpoplpush-redis_script (0.1.3)
@@ -170,7 +170,7 @@ GEM
crass (1.0.6)
css_parser (1.21.0)
addressable
- csv (3.3.1)
+ csv (3.3.2)
database_cleaner-active_record (2.2.0)
activerecord (>= 5.a)
database_cleaner-core (~> 2.0.0)
@@ -217,7 +217,7 @@ GEM
htmlentities (~> 4.3.3)
launchy (>= 2.1, < 4.0)
mail (~> 2.7)
- erubi (1.13.0)
+ erubi (1.13.1)
et-orbi (1.2.11)
tzinfo
excon (0.112.0)
@@ -234,7 +234,7 @@ GEM
net-http (>= 0.5.0)
fast_blank (1.0.1)
fastimage (2.3.1)
- ffi (1.17.0)
+ ffi (1.17.1)
ffi-compiler (1.3.2)
ffi (>= 1.15.5)
rake
@@ -384,13 +384,13 @@ GEM
llhttp-ffi (0.5.0)
ffi-compiler (~> 1.0)
rake (~> 13.0)
- logger (1.6.3)
+ logger (1.6.4)
lograge (0.14.0)
actionpack (>= 4)
activesupport (>= 4)
railties (>= 4)
request_store (~> 1.0)
- loofah (2.23.1)
+ loofah (2.24.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
@@ -413,9 +413,9 @@ GEM
msgpack (1.7.5)
multi_json (1.15.0)
mutex_m (0.3.0)
- net-http (0.5.0)
+ net-http (0.6.0)
uri
- net-imap (0.5.2)
+ net-imap (0.5.4)
date
net-protocol
net-ldap (0.19.0)
@@ -426,10 +426,10 @@ GEM
net-smtp (0.5.0)
net-protocol
nio4r (2.7.4)
- nokogiri (1.17.2)
+ nokogiri (1.18.1)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
- oj (3.16.8)
+ oj (3.16.9)
bigdecimal (>= 3.0)
ostruct (>= 0.2)
omniauth (2.1.2)
@@ -555,7 +555,8 @@ GEM
opentelemetry-api (~> 1.0)
orm_adapter (0.5.0)
ostruct (0.6.1)
- ox (2.14.18)
+ ox (2.14.19)
+ bigdecimal (>= 3.0)
parallel (1.26.3)
parser (3.3.6.0)
ast (~> 2.4.1)
@@ -607,25 +608,25 @@ GEM
rack
rack-session (1.0.2)
rack (< 3)
- rack-test (2.1.0)
+ rack-test (2.2.0)
rack (>= 1.3)
rackup (1.0.1)
rack (< 3)
webrick
- rails (7.2.2.1)
- actioncable (= 7.2.2.1)
- actionmailbox (= 7.2.2.1)
- actionmailer (= 7.2.2.1)
- actionpack (= 7.2.2.1)
- actiontext (= 7.2.2.1)
- actionview (= 7.2.2.1)
- activejob (= 7.2.2.1)
- activemodel (= 7.2.2.1)
- activerecord (= 7.2.2.1)
- activestorage (= 7.2.2.1)
- activesupport (= 7.2.2.1)
+ rails (8.0.1)
+ actioncable (= 8.0.1)
+ actionmailbox (= 8.0.1)
+ actionmailer (= 8.0.1)
+ actionpack (= 8.0.1)
+ actiontext (= 8.0.1)
+ actionview (= 8.0.1)
+ activejob (= 8.0.1)
+ activemodel (= 8.0.1)
+ activerecord (= 8.0.1)
+ activestorage (= 8.0.1)
+ activesupport (= 8.0.1)
bundler (>= 1.15.0)
- railties (= 7.2.2.1)
+ railties (= 8.0.1)
rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1)
actionview (>= 5.0.1.rc1)
@@ -637,12 +638,12 @@ GEM
rails-html-sanitizer (1.6.2)
loofah (~> 2.21)
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
- rails-i18n (7.0.10)
+ rails-i18n (8.0.1)
i18n (>= 0.7, < 2)
- railties (>= 6.0.0, < 8)
- railties (7.2.2.1)
- actionpack (= 7.2.2.1)
- activesupport (= 7.2.2.1)
+ railties (>= 8.0.0, < 9)
+ railties (8.0.1)
+ actionpack (= 8.0.1)
+ activesupport (= 8.0.1)
irb (~> 1.13)
rackup (>= 1.0.0)
rake (>= 12.2)
@@ -664,7 +665,7 @@ GEM
redis (>= 4)
redlock (1.3.2)
redis (>= 3.0.0, < 6.0)
- regexp_parser (2.9.3)
+ regexp_parser (2.10.0)
reline (0.6.0)
io-console (~> 0.5)
request_store (1.7.0)
@@ -725,7 +726,7 @@ GEM
rubocop-performance (1.23.0)
rubocop (>= 1.48.1, < 2.0)
rubocop-ast (>= 1.31.1, < 2.0)
- rubocop-rails (2.27.0)
+ rubocop-rails (2.28.0)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 1.52.0, < 2.0)
@@ -748,9 +749,9 @@ GEM
fugit (~> 1.1, >= 1.11.1)
safety_net_attestation (0.4.0)
jwt (~> 2.0)
- sanitize (6.1.3)
+ sanitize (7.0.0)
crass (~> 1.0.2)
- nokogiri (>= 1.12.0)
+ nokogiri (>= 1.16.8)
scenic (1.8.0)
activerecord (>= 4.0.0)
railties (>= 4.0.0)
@@ -810,7 +811,7 @@ GEM
climate_control
test-prof (1.4.3)
thor (1.3.2)
- tilt (2.4.0)
+ tilt (2.5.0)
timeout (0.4.3)
tpm-key_attestation (0.12.1)
bindata (~> 2.4)
@@ -890,7 +891,7 @@ DEPENDENCIES
binding_of_caller (~> 1.0)
blurhash (~> 0.1)
bootsnap (~> 1.18.0)
- brakeman (~> 6.0)
+ brakeman (~> 7.0)
browser
bundler-audit (~> 0.9)
capybara (~> 3.39)
@@ -947,7 +948,7 @@ DEPENDENCIES
memory_profiler
mime-types (~> 3.6.0)
mutex_m
- net-http (~> 0.5.0)
+ net-http (~> 0.6.0)
net-ldap (~> 0.18)
nokogiri (~> 1.15)
oj (~> 3.14)
@@ -985,9 +986,9 @@ DEPENDENCIES
rack-attack (~> 6.6)
rack-cors (~> 2.0)
rack-test (~> 2.1)
- rails (~> 7.2.0)
+ rails (~> 8.0)
rails-controller-testing (~> 1.0)
- rails-i18n (~> 7.0)
+ rails-i18n (~> 8.0)
rdf-normalize (~> 0.5)
redcarpet (~> 3.6)
redis (~> 4.5)
@@ -1006,7 +1007,7 @@ DEPENDENCIES
ruby-progressbar (~> 1.13)
ruby-vips (~> 2.2)
rubyzip (~> 2.3)
- sanitize (~> 6.0)
+ sanitize (~> 7.0)
scenic (~> 1.7)
selenium-webdriver
shoulda-matchers
@@ -1036,4 +1037,4 @@ RUBY VERSION
ruby 3.3.6p108
BUNDLED WITH
- 2.6.1
+ 2.6.2
diff --git a/app/javascript/mastodon/actions/notification_groups.ts b/app/javascript/mastodon/actions/notification_groups.ts
index aa7f50da4e..4386325481 100644
--- a/app/javascript/mastodon/actions/notification_groups.ts
+++ b/app/javascript/mastodon/actions/notification_groups.ts
@@ -155,7 +155,7 @@ export const processNewNotificationForGroups = createAppAsyncThunk(
const showInColumn =
activeFilter === 'all'
- ? notificationShows[notification.type]
+ ? notificationShows[notification.type] !== false
: activeFilter === notification.type;
if (!showInColumn) return;
diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js
index 4c6e27cd5f..3266df5a59 100644
--- a/app/javascript/mastodon/actions/notifications.js
+++ b/app/javascript/mastodon/actions/notifications.js
@@ -1,21 +1,13 @@
import { IntlMessageFormat } from 'intl-messageformat';
import { defineMessages } from 'react-intl';
-import { List as ImmutableList } from 'immutable';
-
-import { compareId } from 'mastodon/compare_id';
-import { usePendingItems as preferPendingItems } from 'mastodon/initial_state';
-
-import api, { getLinks } from '../api';
import { unescapeHTML } from '../utils/html';
import { requestNotificationPermission } from '../utils/notifications';
import { fetchFollowRequests } from './accounts';
import {
importFetchedAccount,
- importFetchedAccounts,
importFetchedStatus,
- importFetchedStatuses,
} from './importer';
import { submitMarkers } from './markers';
import { notificationsUpdate } from "./notifications_typed";
@@ -26,27 +18,11 @@ export * from "./notifications_typed";
export const NOTIFICATIONS_UPDATE_NOOP = 'NOTIFICATIONS_UPDATE_NOOP';
-export const NOTIFICATIONS_EXPAND_REQUEST = 'NOTIFICATIONS_EXPAND_REQUEST';
-export const NOTIFICATIONS_EXPAND_SUCCESS = 'NOTIFICATIONS_EXPAND_SUCCESS';
-export const NOTIFICATIONS_EXPAND_FAIL = 'NOTIFICATIONS_EXPAND_FAIL';
-
export const NOTIFICATIONS_FILTER_SET = 'NOTIFICATIONS_FILTER_SET';
-export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP';
-export const NOTIFICATIONS_LOAD_PENDING = 'NOTIFICATIONS_LOAD_PENDING';
-
-export const NOTIFICATIONS_MOUNT = 'NOTIFICATIONS_MOUNT';
-export const NOTIFICATIONS_UNMOUNT = 'NOTIFICATIONS_UNMOUNT';
-
-export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ';
-
export const NOTIFICATIONS_SET_BROWSER_SUPPORT = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
-export const NOTIFICATION_REQUESTS_ACCEPT_REQUEST = 'NOTIFICATION_REQUESTS_ACCEPT_REQUEST';
-export const NOTIFICATION_REQUESTS_ACCEPT_SUCCESS = 'NOTIFICATION_REQUESTS_ACCEPT_SUCCESS';
-export const NOTIFICATION_REQUESTS_ACCEPT_FAIL = 'NOTIFICATION_REQUESTS_ACCEPT_FAIL';
-
export const NOTIFICATION_REQUESTS_DISMISS_REQUEST = 'NOTIFICATION_REQUESTS_DISMISS_REQUEST';
export const NOTIFICATION_REQUESTS_DISMISS_SUCCESS = 'NOTIFICATION_REQUESTS_DISMISS_SUCCESS';
export const NOTIFICATION_REQUESTS_DISMISS_FAIL = 'NOTIFICATION_REQUESTS_DISMISS_FAIL';
@@ -56,10 +32,6 @@ defineMessages({
group: { id: 'notifications.group', defaultMessage: '{count} notifications' },
});
-export const loadPending = () => ({
- type: NOTIFICATIONS_LOAD_PENDING,
-});
-
export function updateNotifications(notification, intlMessages, intlLocale) {
return (dispatch, getState) => {
const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']);
@@ -96,8 +68,7 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
dispatch(importFetchedAccount(notification.report.target_account));
}
-
- dispatch(notificationsUpdate({ notification, preferPendingItems, playSound: playSound && !filtered}));
+ dispatch(notificationsUpdate({ notification, playSound: playSound && !filtered}));
} else if (playSound && !filtered) {
dispatch({
type: NOTIFICATIONS_UPDATE_NOOP,
@@ -120,116 +91,8 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
};
}
-const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS();
-
-const excludeTypesFromFilter = filter => {
- const allTypes = ImmutableList([
- 'follow',
- 'follow_request',
- 'favourite',
- 'reblog',
- 'mention',
- 'poll',
- 'status',
- 'update',
- 'admin.sign_up',
- 'admin.report',
- ]);
-
- return allTypes.filterNot(item => item === filter).toJS();
-};
-
const noOp = () => {};
-let expandNotificationsController = new AbortController();
-
-export function expandNotifications({ maxId = undefined, forceLoad = false }) {
- return async (dispatch, getState) => {
- const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']);
- const notifications = getState().get('notifications');
- const isLoadingMore = !!maxId;
-
- if (notifications.get('isLoading')) {
- if (forceLoad) {
- expandNotificationsController.abort();
- expandNotificationsController = new AbortController();
- } else {
- return;
- }
- }
-
- const params = {
- max_id: maxId,
- exclude_types: activeFilter === 'all'
- ? excludeTypesFromSettings(getState())
- : excludeTypesFromFilter(activeFilter),
- };
-
- if (!params.max_id && (notifications.get('items', ImmutableList()).size + notifications.get('pendingItems', ImmutableList()).size) > 0) {
- const a = notifications.getIn(['pendingItems', 0, 'id']);
- const b = notifications.getIn(['items', 0, 'id']);
-
- if (a && b && compareId(a, b) > 0) {
- params.since_id = a;
- } else {
- params.since_id = b || a;
- }
- }
-
- const isLoadingRecent = !!params.since_id;
-
- dispatch(expandNotificationsRequest(isLoadingMore));
-
- try {
- const response = await api().get('/api/v1/notifications', { params, signal: expandNotificationsController.signal });
- const next = getLinks(response).refs.find(link => link.rel === 'next');
-
- dispatch(importFetchedAccounts(response.data.map(item => item.account)));
- dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status)));
- dispatch(importFetchedAccounts(response.data.filter(item => item.report).map(item => item.report.target_account)));
-
- dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems));
- dispatch(submitMarkers());
- } catch(error) {
- dispatch(expandNotificationsFail(error, isLoadingMore));
- }
- };
-}
-
-export function expandNotificationsRequest(isLoadingMore) {
- return {
- type: NOTIFICATIONS_EXPAND_REQUEST,
- skipLoading: !isLoadingMore,
- };
-}
-
-export function expandNotificationsSuccess(notifications, next, isLoadingMore, isLoadingRecent, usePendingItems) {
- return {
- type: NOTIFICATIONS_EXPAND_SUCCESS,
- notifications,
- next,
- isLoadingRecent: isLoadingRecent,
- usePendingItems,
- skipLoading: !isLoadingMore,
- };
-}
-
-export function expandNotificationsFail(error, isLoadingMore) {
- return {
- type: NOTIFICATIONS_EXPAND_FAIL,
- error,
- skipLoading: !isLoadingMore,
- skipAlert: !isLoadingMore || error.name === 'AbortError',
- };
-}
-
-export function scrollTopNotifications(top) {
- return {
- type: NOTIFICATIONS_SCROLL_TOP,
- top,
- };
-}
-
export function setFilter (filterType) {
return dispatch => {
dispatch({
@@ -237,24 +100,10 @@ export function setFilter (filterType) {
path: ['notifications', 'quickFilter', 'active'],
value: filterType,
});
- dispatch(expandNotifications({ forceLoad: true }));
dispatch(saveSettings());
};
}
-export const mountNotifications = () => ({
- type: NOTIFICATIONS_MOUNT,
-});
-
-export const unmountNotifications = () => ({
- type: NOTIFICATIONS_UNMOUNT,
-});
-
-
-export const markNotificationsAsRead = () => ({
- type: NOTIFICATIONS_MARK_AS_READ,
-});
-
// Browser support
export function setupBrowserNotifications() {
return dispatch => {
diff --git a/app/javascript/mastodon/actions/notifications_migration.tsx b/app/javascript/mastodon/actions/notifications_migration.tsx
deleted file mode 100644
index cd9f5ca3d6..0000000000
--- a/app/javascript/mastodon/actions/notifications_migration.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { createAppAsyncThunk } from 'mastodon/store';
-
-import { fetchNotifications } from './notification_groups';
-
-export const initializeNotifications = createAppAsyncThunk(
- 'notifications/initialize',
- (_, { dispatch }) => {
- void dispatch(fetchNotifications());
- },
-);
diff --git a/app/javascript/mastodon/actions/notifications_typed.ts b/app/javascript/mastodon/actions/notifications_typed.ts
index 88d942d45e..3eb1230666 100644
--- a/app/javascript/mastodon/actions/notifications_typed.ts
+++ b/app/javascript/mastodon/actions/notifications_typed.ts
@@ -9,7 +9,6 @@ export const notificationsUpdate = createAction(
...args
}: {
notification: ApiNotificationJSON;
- usePendingItems: boolean;
playSound: boolean;
}) => ({
payload: args,
diff --git a/app/javascript/mastodon/actions/search.ts b/app/javascript/mastodon/actions/search.ts
index 7dd174e202..13a4ee4432 100644
--- a/app/javascript/mastodon/actions/search.ts
+++ b/app/javascript/mastodon/actions/search.ts
@@ -56,7 +56,7 @@ export const expandSearch = createDataLoadingThunk(
return apiGetSearch({
q,
type,
- limit: 11,
+ limit: 10,
offset,
});
},
diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js
index 30e643363a..478e0cae45 100644
--- a/app/javascript/mastodon/actions/streaming.js
+++ b/app/javascript/mastodon/actions/streaming.js
@@ -11,7 +11,7 @@ import {
} from './announcements';
import { updateConversations } from './conversations';
import { processNewNotificationForGroups, refreshStaleNotificationGroups, pollRecentNotifications as pollRecentGroupNotifications } from './notification_groups';
-import { updateNotifications, expandNotifications } from './notifications';
+import { updateNotifications } from './notifications';
import { updateStatus } from './statuses';
import {
updateTimeline,
@@ -107,9 +107,6 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
break;
}
case 'notifications_merged': {
- const state = getState();
- if (state.notifications.top || !state.notifications.mounted)
- dispatch(expandNotifications({ forceLoad: true, maxId: undefined }));
dispatch(refreshStaleNotificationGroups());
break;
}
diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx
index 9f57629807..fb1fcb87fe 100644
--- a/app/javascript/mastodon/components/status.jsx
+++ b/app/javascript/mastodon/components/status.jsx
@@ -167,7 +167,12 @@ class Status extends ImmutablePureComponent {
handleClick = e => {
e.preventDefault();
- this.handleHotkeyOpen(e);
+
+ if (e?.button === 0 && !(e?.ctrlKey || e?.metaKey)) {
+ this._openStatus();
+ } else if (e?.button === 1 || (e?.button === 0 && (e?.ctrlKey || e?.metaKey))) {
+ this._openStatus(true);
+ }
};
handleMouseUp = e => {
@@ -275,7 +280,11 @@ class Status extends ImmutablePureComponent {
this.props.onMention(this._properStatus().get('account'));
};
- handleHotkeyOpen = (e) => {
+ handleHotkeyOpen = () => {
+ this._openStatus();
+ };
+
+ _openStatus = (newTab = false) => {
if (this.props.onClick) {
this.props.onClick();
return;
@@ -290,10 +299,10 @@ class Status extends ImmutablePureComponent {
const path = `/@${status.getIn(['account', 'acct'])}/${status.get('id')}`;
- if (e?.button === 0 && !(e?.ctrlKey || e?.metaKey)) {
- history.push(path);
- } else if (e?.button === 1 || (e?.button === 0 && (e?.ctrlKey || e?.metaKey))) {
+ if (newTab) {
window.open(path, '_blank', 'noopener');
+ } else {
+ history.push(path);
}
};
@@ -384,6 +393,7 @@ class Status extends ImmutablePureComponent {
toggleHidden: this.handleHotkeyToggleHidden,
toggleSensitive: this.handleHotkeyToggleSensitive,
openMedia: this.handleHotkeyOpenMedia,
+ onTranslate: this.handleTranslate,
};
let media, statusAvatar, prepend, rebloggedByText;
diff --git a/app/javascript/mastodon/components/status_action_bar.jsx b/app/javascript/mastodon/components/status_action_bar.jsx
index 94cd7e3e07..9cd2d8d20c 100644
--- a/app/javascript/mastodon/components/status_action_bar.jsx
+++ b/app/javascript/mastodon/components/status_action_bar.jsx
@@ -47,6 +47,7 @@ const messages = defineMessages({
cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
favourite: { id: 'status.favourite', defaultMessage: 'Favorite' },
+ removeFavourite: { id: 'status.remove_favourite', defaultMessage: 'Remove from favorites' },
bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
removeBookmark: { id: 'status.remove_bookmark', defaultMessage: 'Remove bookmark' },
open: { id: 'status.open', defaultMessage: 'Expand this status' },
@@ -271,8 +272,6 @@ class StatusActionBar extends ImmutablePureComponent {
if (signedIn) {
menu.push(null);
- menu.push({ text: intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark), action: this.handleBookmarkClick });
-
if (writtenByMe && pinnableStatus) {
menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });
}
@@ -371,6 +370,9 @@ class StatusActionBar extends ImmutablePureComponent {
reblogIconComponent = RepeatDisabledIcon;
}
+
+ const bookmarkTitle = intl.formatMessage(status.get('bookmarked') ? messages.removeBookmark : messages.bookmark);
+ const favouriteTitle = intl.formatMessage(status.get('favourited') ? messages.removeFavourite : messages.favourite);
const isReply = status.get('in_reply_to_account_id') === status.getIn(['account', 'id']);
return (
@@ -382,10 +384,10 @@ class StatusActionBar extends ImmutablePureComponent {
%{comment}' private_comment_template: درونریخته از %{source} در %{date} title: درونریزی انسدادهای دامنه + invalid_domain_block: 'یک یا چند بلوک دامنه به دلیل خطا(های) زیر نادیده گرفته شد: %{error}' new: title: درونریزی انسدادهای دامنه no_file: هیچ پروندهای گزیده نشده @@ -465,10 +476,20 @@ fa: title: پیشنهادهای پیگیری unsuppress: بازگردانی پیشنهادهای پیگیری instances: + audit_log: + title: گزارش های حسابرسی اخیر + view_all: مشاهده گزارش های حسابرسی کامل availability: + description_html: + one: اگر تحویل به دامنه %{count} روز بدون موفقیت انجام نشد، هیچ تلاش دیگری برای تحویل انجام نخواهد شد مگر اینکه تحویل از دامنه دریافت شود. + other: اگر تحویل به دامنه در %{count} روزهای مختلف بدون موفقیت انجام نشد، هیچ تلاش دیگری برای تحویل انجام نخواهد شد مگر اینکه تحویل از دامنه دریافت شود. failure_threshold_reached: در %{date} به آستانهٔ شکست رسید. + failures_recorded: + one: تلاش ناموفق در %{count} روز. + other: تلاش ناموفق در %{count} روز مختلف. no_failures_recorded: هیچ شکستی در سابقه نیست. title: موجود بودن + warning: آخرین تلاش برای اتصال به این سرور ناموفق بوده است back_to_all: همه back_to_limited: محدود back_to_warning: هشدار @@ -476,6 +497,8 @@ fa: confirm_purge: آیا مطمئن هستید میخواهید داده را از این دامنه برای همیشه پاک کنید؟ content_policies: comment: یادداشت داخلی + description_html: میتوانید خطمشیهای محتوایی را تعریف کنید که برای همه حسابهای این دامنه و هر یک از زیر دامنههای آن اعمال شود. + limited_federation_mode_description_html: شما می توانید انتخاب کنید که آیا فدراسیون با این دامنه مجاز است یا خیر. policies: reject_media: رد کردن رسانه reject_reports: نپذیرفتن گزارشها @@ -515,12 +538,15 @@ fa: private_comment: یادداشت خصوصی public_comment: یادداشت عمومی purge: پاکسازی + purge_description_html: اگر فکر میکنید این دامنه برای همیشه آفلاین است، میتوانید تمام سوابق حساب و دادههای مرتبط با این دامنه را از فضای ذخیرهسازی خود حذف کنید. این ممکن است کمی طول بکشد. title: ارتباط همگانی total_blocked_by_us: مسدودشده از طرف ما total_followed_by_them: ما را پی میگیرند total_followed_by_us: ما پیگیرشان هستیم total_reported: گزارشها دربارهشان total_storage: عکسها و ویدیوها + totals_time_period_hint_html: مجموع نمایش داده شده در زیر شامل داده های تمام زمان است. + unknown_instance: در حال حاضر هیچ سابقه ای از این دامنه در این سرور وجود ندارد. invites: deactivate_all: غیرفعالکردن همه filter: @@ -531,7 +557,7 @@ fa: title: دعوتها ip_blocks: add_new: ایجاد قانون - created_msg: قانون IP جدید با موفقیت افزوده شد + created_msg: قانون آی پی جدید با موفقیت افزوده شد delete: پاک کردن expires_in: '1209600': ۲ هفته @@ -541,15 +567,15 @@ fa: '86400': ۱ روز '94670856': ۳ سال new: - title: ایجاد قانون جدید IP + title: ایجاد قانون جدید آی پی no_ip_block_selected: هیچ قاعدهٔ آیپیای تغییری نکرد زیرا هیچکدام گزیده نشده بودند - title: قوانین IP + title: قوانین آی پی relationships: title: روابط %{acct} relays: add_new: افزودن رلهٔ تازه delete: حذف - description_html: یک رلهٔ میانسروری (federation relay) یک سرور میانجی است که حجم زیادی از فرستههای عمومی را بین سرورهای گوناگونی که عضوش میشوند جابهجا میکند. رلهها به سرورهای کوچک و متوسط کمک میکنند تا مطالب عمومی بیشتری را بیابند. اگر رله نباشد، این مطالب عمومی تنها وقتی پیدا میشوند که کاربران محلی خودشان پیگیر کاربران روی سرورهای دیگر شوند. + description_html: "رله فدراسیون یک سرور واسطه است که حجم زیادی از پستهای عمومی را بین سرورهایی که مشترک و منتشر میکنند رد و بدل میکند. میتواند به سرورهای کوچک و متوسط کمک کند تا محتوایی را از طرف دیگر پیدا کنند، که در غیر این صورت از کاربران محلی میخواهد بهطور دستی افراد دیگر را در سرورهای راه دور دنبال کنند." disable: از کار انداختن disabled: از کار افتاده enable: به کار انداختن @@ -577,6 +603,11 @@ fa: mark_as_sensitive_description_html: رسانهٔ درون فرستهٔ گزارش شده به عنوان حسّاس علامت خورده و شکایتی ضبط خواهد شد تا بتوانید خلافهای آینده از همین حساب را بهتر مدیریت کنید. other_description_html: دیدن انتخاب های بیشتر برای کنترل رفتار حساب و سفارشی سازی ارتباط با حساب گزارش شده. resolve_description_html: هیچ کنشی علیه حساب گزارش شده انجام نخواهد شد. هیچ شکایتی ضبط نشده و گزارش بسته خواهد شد. + silence_description_html: این حساب فقط برای کسانی قابل مشاهده خواهد بود که قبلاً آن را دنبال می کنند یا به صورت دستی آن را جستجو می کنند و دسترسی آن را به شدت محدود می کند. همیشه می توان برگرداند. همه گزارشهای مربوط به این حساب را میبندد. + suspend_description_html: اکانت و تمامی محتویات آن غیرقابل دسترسی و در نهایت حذف خواهد شد و تعامل با آن غیر ممکن خواهد بود. قابل برگشت در عرض 30 روز همه گزارشهای مربوط به این حساب را میبندد. + actions_description_html: تصمیم بگیرید که چه اقدامی برای حل این گزارش انجام دهید. اگر اقدام تنبیهی علیه حساب گزارش شده انجام دهید، یک اعلان ایمیل برای آنها ارسال می شود، به جز زمانی که دسته هرزنامه انتخاب شده باشد. + actions_description_remote_html: تصمیم بگیرید که چه اقدامی برای حل این گزارش انجام دهید. این فقط بر نحوه ارتباط سرور شما با این حساب راه دور و مدیریت محتوای آن تأثیر می گذارد. + actions_no_posts: این گزارش هیچ پست مرتبطی برای حذف ندارد add_to_report: افزودن بیشتر به گزارش already_suspended_badges: local: از پیش روی این کارساز معلّق شده @@ -587,13 +618,16 @@ fa: by_target_domain: دامنهٔ حساب گزارششده cancel: لغو category: دسته + category_description_html: دلیل گزارش این حساب و/یا محتوا در ارتباط با حساب گزارش شده ذکر خواهد شد comment: none: هیچ + comment_description_html: 'برای ارائه اطلاعات بیشتر، %{name} نوشت:' confirm: تأیید confirm_action: تأیید کنش مدیریتی برای @%{acct} created_at: گزارششده delete_and_resolve: حذف فرستهها forwarded: هدایت شده + forwarded_replies_explanation: این گزارش از یک کاربر راه دور و در مورد محتوای راه دور است. برای شما ارسال شده است زیرا محتوای گزارش شده در پاسخ به یکی از کاربران شما است. forwarded_to: هدایت شده به %{domain} mark_as_resolved: علامتگذاری به عنوان حلشده mark_as_sensitive: علامت به حساس @@ -606,6 +640,9 @@ fa: delete: حذف placeholder: کارهایی را که در این باره انجام شده، یا هر بهروزرسانی دیگری را بنویسید... title: یادداشتها + notes_description_html: مشاهده کنید و یادداشت هایی را برای مدیران دیگر و خود آینده خود بگذارید + processed_msg: 'گزارش #%{id} با موفقیت پردازش شد' + quick_actions_description_html: 'یک اقدام سریع انجام دهید یا به پایین بروید تا محتوای گزارش شده را ببینید:' remote_user_placeholder: کاربر دوردست از %{instance} reopen: دوباره به جریان بیندازید report: 'گزارش #%{id}' @@ -617,8 +654,25 @@ fa: skip_to_actions: پرش به کنشها status: نوشته statuses: محتوای گزارش شده + statuses_description_html: محتوای توهین آمیز در ارتباط با حساب گزارش شده ذکر می شود summary: + action_preambles: + delete_html: 'شما در حال حذف برخی از پستهای @%{acct} هستید. این خواهد شد:' + mark_as_sensitive_html: 'شما در حال علامت گذاری برخی از پست های @%{acct} به عنوان حساس هستید. این خواهد شد:' + silence_html: 'شما در شرف محدود کردن @%{acct} هستید. این خواهد شد:' + suspend_html: 'شما در شرف تعلیق کردن @%{acct} هستید. این خواهد شد:' + actions: + delete_html: پست های توهین آمیز را حذف کنید + mark_as_sensitive_html: رسانه پست های توهین آمیز را به عنوان حساس علامت گذاری کنید + silence_html: دسترسی @%{acct} را به شدت محدود کنید و نمایه و محتویات آنها را فقط برای افرادی که قبلاً آنها را دنبال میکنند قابل مشاهده کنید یا به صورت دستی نمایه آن را جستجو کنید. + suspend_html: تعلیق @%{acct}، غیرقابل دسترس کردن نمایه و محتوای آنها و تعامل با آنها غیر ممکن + close_report: 'علامت گذاری گزارش #%{id} به عنوان حل شده است' + close_reports_html: "همه گزارشها در برابر @%{acct} را بهعنوان حلوفصل علامتگذاری کنید" + delete_data_html: نمایه و محتویات @%{acct} را 30 روز بعد حذف کنید، مگر اینکه در این مدت معلق نشوند + preview_preamble_html: "@%{acct} اخطاری با محتوای زیر دریافت خواهد کرد:" record_strike_html: ضبط شکایتی علیه @%{acct} برای کمک به تصمیمگیری برای قانونشکنیهای آیندهٔ این حساب + send_email_html: یک ایمیل هشدار به @%{acct} ارسال کنید + warning_placeholder: استدلال اضافی اختیاری برای اقدام تعدیل. target_origin: خاستگاه حساب گزارششده title: گزارشها unassign: پسگرفتن مسئولیت @@ -638,34 +692,54 @@ fa: moderation: نظارت special: ویژه delete: حذف + description_html: با نقشهای کاربر، میتوانید تنظیمات و مناطقی از ماستودون را که کاربران شما میتوانند به آن دسترسی داشته باشند، سفارشی کنید. edit: ویراش نقش %{name} everyone: اجازههای پیشگزیده + everyone_full_description_html: این نقش پایه است که بر همه کاربران تأثیر میگذارد، حتی آنهایی که نقش تعیینشده ندارند. همه نقش های دیگر مجوزها را از آن به ارث می برند. permissions_count: one: "%{count} اجازه" other: "%{count} اجازه" privileges: administrator: مدیر + administrator_description: کاربرانی که این مجوز را دارند از هر مجوزی عبور می کنند delete_user_data: حذف دادههای کاربر + delete_user_data_description: به کاربران این امکان را می دهد که بدون تاخیر داده های سایر کاربران را حذف کنند invite_users: دعوت کاربران + invite_users_description: به کاربران اجازه می دهد افراد جدیدی را به سرور دعوت کنند manage_announcements: مدیریت اعلامیهها + manage_announcements_description: به کاربران اجازه می دهد تا اعلان ها را روی سرور مدیریت کنند manage_appeals: مدیریت درخواستهای بازنگری + manage_appeals_description: به کاربران امکان میدهد درخواستهای تجدیدنظر علیه اقدامات تعدیل را بررسی کنند manage_blocks: مدیریت مسدودیها + manage_blocks_description: به کاربران اجازه می دهد تا ارائه دهندگان ایمیل و آدرس های آی پی را مسدود کنند manage_custom_emojis: مدیریت ایموجیهای سفارشی + manage_custom_emojis_description: به کاربران اجازه می دهد تا ایموجی های سفارشی را روی سرور مدیریت کنند manage_federation: مدیریت خودگردانی + manage_federation_description: به کاربران اجازه میدهد تا اتحاد با دامنههای دیگر را مسدود یا اجازه دهند و تحویلپذیری را کنترل کنند manage_invites: مدیریت دعوتها + manage_invites_description: به کاربران امکان می دهد پیوندهای دعوت را مرور و غیرفعال کنند manage_reports: مدیریت گزارشها + manage_reports_description: به کاربران امکان میدهد گزارشها را بررسی کنند و اقدامات تعدیل را علیه آنها انجام دهند manage_roles: مدیریت نقشها + manage_roles_description: به کاربران امکان می دهد نقش های زیر نقش خود را مدیریت و اختصاص دهند manage_rules: مدیریت قوانین manage_rules_description: اجازه به کاربران برای تغییر قوانین کارساز manage_settings: مدیریت تنظیمات manage_settings_description: اجازه به کاربران برای تغییر تنظیمات پایگاه manage_taxonomies: مدیریت طیقهبندیها + manage_taxonomies_description: به کاربران امکان میدهد محتوای پرطرفدار را بررسی کنند و تنظیمات هشتگ را بهروزرسانی کنند manage_user_access: مدیریت دسترسی کاربران + manage_user_access_description: به کاربران اجازه می دهد تا احراز هویت دو مرحله ای سایر کاربران را غیرفعال کنند، آدرس ایمیل آنها را تغییر دهند و رمز عبور خود را بازنشانی کنند manage_users: مدیریت کاربران + manage_users_description: به کاربران اجازه می دهد تا جزئیات سایر کاربران را مشاهده کنند و اقدامات تعدیل را علیه آنها انجام دهند manage_webhooks: مدیریت قلّابهای وب + manage_webhooks_description: به کاربران اجازه می دهد تا برای رویدادهای اداری، وب هوک ها را راهاندازی کنند + view_audit_log: مشاهده گزارش حسابرسی + view_audit_log_description: به کاربران اجازه می دهد تا تاریخچه ای از اقدامات مدیریتی روی سرور را مشاهده کنند view_dashboard: دیدن داشبورد view_dashboard_description: اجازه به کاربران برای دسترسی به داشتبورد و سنجههای مختلف view_devops: دواپس + view_devops_description: به کاربران امکان دسترسی به داشبورد Sidekiq و pgHero را می دهد title: نقشها rules: add_new: افزودن قانون @@ -677,18 +751,28 @@ fa: settings: about: manage_rules: مدیریت قانونهای کارساز + preamble: اطلاعات عمیقی در مورد نحوه کارکرد، تعدیل و تأمین مالی سرور ارائه دهید. + rules_hint: یک منطقه اختصاصی برای قوانینی وجود دارد که انتظار می رود کاربران شما به آن پایبند باشند. title: درباره appearance: preamble: سفارشیسازی رابطس وب ماستودون. title: ظاهر branding: + preamble: نام تجاری سرور شما آن را از سایر سرورهای شبکه متمایز می کند. این اطلاعات ممکن است در محیط های مختلفی مانند رابط وب ماستودون، برنامه های کاربردی بومی، در پیش نمایش پیوند در سایر وب سایت ها و در برنامه های پیام رسانی و غیره نمایش داده شود. به همین دلیل، بهتر است این اطلاعات واضح، کوتاه و مختصر باشد. title: ویژندگی + captcha_enabled: + desc_html: این متکی به اسکریپت های خارجی از hCaptcha است که ممکن است یک نگرانی امنیتی و حفظ حریم خصوصی باشد. علاوه بر این، این میتواند فرآیند ثبت نام را به میزان قابل توجهی برای برخی از افراد (به ویژه افراد ناتوان) کمتر در دسترس قرار دهد. به این دلایل، لطفاً اقدامات جایگزین مانند ثبت نام مبتنی بر تأیید یا دعوت را در نظر بگیرید. + title: کاربران جدید را ملزم به حل یک کپچا برای تأیید حساب خود کنید content_retention: danger_zone: منطقهٔ خطر + preamble: نحوه ذخیره محتوای تولید شده توسط کاربر در ماستودون را کنترل کنید. + title: حفظ محتوا default_noindex: + desc_html: بر همه کاربرانی که خودشان این تنظیم را تغییر نداده اند تأثیر می گذارد title: درخواست خروج از اندیسگذاری پیشگزیدهٔ موتور جستوجو discovery: follow_recommendations: پیروی از پیشنهادها + preamble: ارائه محتوای جالب در جذب کاربران جدیدی که ممکن است کسی ماستودون را نشناسند، مفید است. نحوه عملکرد ویژگیهای کشف مختلف روی سرور خود را کنترل کنید. profile_directory: شاخهٔ نمایه public_timelines: خط زمانیهای عمومی publish_discovered_servers: انتشار کارسازهای کشف شده @@ -700,18 +784,27 @@ fa: disabled: برای هیچکدام users: برای کاربران محلی واردشده registrations: + moderation_recommandation: لطفاً قبل از اینکه ثبت نام را برای همه باز کنید، مطمئن شوید که یک تیم نظارتی مناسب و واکنشی دارید! + preamble: کنترل کنید چه کسی می تواند در سرور شما یک حساب ایجاد کند. title: ثبتنامها registrations_mode: modes: approved: ثبت نام نیازمند تأیید مدیران است none: کسی نمیتواند ثبت نام کند open: همه میتوانند ثبت نام کنند + warning_hint: توصیه میکنیم از ”تأیید لازم برای ثبتنام” استفاده کنید، مگر اینکه مطمئن باشید تیم نظارتی شما میتواند هرزنامهها و ثبتهای مخرب را به موقع مدیریت کند. + security: + authorized_fetch: نیاز به احراز هویت از سرورهای فدرال + authorized_fetch_hint: نیاز به احراز هویت از سرورهای فدرال، اجرای دقیقتر بلوکهای سطح کاربر و سرور را ممکن میسازد. با این حال، این به قیمت جریمه عملکرد است، دسترسی به پاسخهای شما را کاهش میدهد و ممکن است مشکلات سازگاری با برخی از سرویسهای فدرال را ایجاد کند. علاوه بر این، این مانع از دریافت پستها و حسابهای عمومی شما توسط بازیگران اختصاصی نمیشود. + authorized_fetch_overridden_hint: شما در حال حاضر نمی توانید این تنظیم را تغییر دهید زیرا توسط یک متغیر محیطی لغو شده است. + federation_authentication: اجرای احراز هویت فدراسیون title: تنظیمات کارساز site_uploads: delete: پرونده بارگذاری شده را پاک کنید destroyed_msg: بارگذاری پایگاه با موفقیت حذف شد! software_updates: critical_update: بحرانی — لطفاً به سرعت بهروز کنید + description: توصیه می شود نصب ماستودون خود را به روز نگه دارید تا از آخرین اصلاحات و ویژگی ها بهره مند شوید. علاوه بر این، گاهی اوقات برای جلوگیری از مشکلات امنیتی، به روز رسانی ماستودون به موقع ضروری است. به این دلایل، ماستودون هر 30 دقیقه یکبار بهروزرسانیها را بررسی میکند و طبق اولویتهای اعلان ایمیل شما را مطلع میکند. documentation_link: بیشتر بیاموزید release_notes: یادداشتهای انتشار title: بهروز رسانیهای موجود @@ -719,6 +812,7 @@ fa: types: major: ارائه بزرگ minor: ارائه کوچک + patch: انتشار وصله - رفع اشکال و تغییرات آسان برای اعمال version: نگارش statuses: account: نگارنده @@ -726,8 +820,10 @@ fa: back_to_account: بازگشت به صفحهٔ حساب back_to_report: بازگشت به صفحهٔ گزارش batch: + add_to_report: 'افزودن به گزارش #%{id}' remove_from_report: برداشتن از گزارش report: گزارش + contents: مطالب deleted: پاکشده favourites: برگزیدهها history: تاریخچهٔ نگارش @@ -736,12 +832,17 @@ fa: media: title: رسانه metadata: فراداده + no_history: این پست ویرایش نشده است no_status_selected: هیچ فرستهای تغییری نکرد زیرا هیچکدام از آنها انتخاب نشده بودند open: گشودن فرسته original_status: فرستهٔ اصلی reblogs: تقویتها + replied_to_html: به %{acct_link} پاسخ داد status_changed: فرسته تغییر کرد + status_title: پست توسط @%{name} + title: پستهای حساب - @%{name} trending: پرطرفدار + view_publicly: مشاهده عمومی visibility: نمایانی with_media: دارای عکس یا ویدیو strikes: @@ -759,10 +860,22 @@ fa: system_checks: database_schema_check: message_html: تعداد مهاجرت پایگاه داده در انتظار انجام هستند. لطفا آنها را اجرا کنید تا اطمینان یابید که برنامه مطابق انتظار رفتار خواهد کرد + elasticsearch_health_red: + message_html: خوشه Elasticsearch ناسالم است (وضعیت قرمز)، ویژگی های جستجو در دسترس نیستند + elasticsearch_health_yellow: + message_html: خوشه Elasticsearch ناسالم است (وضعیت زرد)، ممکن است بخواهید دلیل آن را بررسی کنید + elasticsearch_index_mismatch: + message_html: نگاشت فهرست Elasticsearch منسوخ شده است. لطفاً
tootctl search deploy --only=%{value}
را اجرا کنید
elasticsearch_preset:
action: دیدن مستندات
+ message_html: خوشه Elasticsearch شما بیش از یک گره دارد، اما ماستودون برای استفاده از آنها پیکربندی نشده است.
elasticsearch_preset_single_node:
action: دیدن مستندات
+ message_html: خوشه Elasticsearch شما فقط یک گره دارد، ES_PRESET
باید روی single_node_cluster
تنظیم شود.
+ elasticsearch_reset_chewy:
+ message_html: فهرست سیستم Elasticsearch شما به دلیل تغییر تنظیمات قدیمی است. لطفاً برای به روز رسانی tootctl search deploy --reset-chewy
را اجرا کنید.
+ elasticsearch_running_check:
+ message_html: به Elasticsearch متصل نشد. لطفاً بررسی کنید که در حال اجرا است یا جستجوی متن کامل را غیرفعال کنید
elasticsearch_version_check:
message_html: 'نگارش الستیکسرچ ناسازگار: %{value}'
version_comparison: الستیکسرچ %{running_version} در حال اجراست، حال که %{required_version} لازم است
@@ -806,6 +919,35 @@ fa:
search: جستوجو
title: برچسبها
updated_msg: تنظیمات برچسبها با موفقیت بهروز شد
+ terms_of_service:
+ back: بازگشت به شرایط خدمات
+ changelog: چه چیزی تغییر کرده است
+ create: از خودت استفاده کن
+ current: فعلی
+ draft: پیش نویس
+ generate: از قالب استفاده کنید
+ generates:
+ action: ایجاد کنید
+ chance_to_review_html: "شرایط خدمات ایجاد شده به صورت خودکار منتشر نخواهد شد. شما فرصتی خواهید داشت که نتایج را بررسی کنید. لطفا مشخصات لازم را برای ادامه وارد کنید."
+ explanation_html: الگوی شرایط خدمات ارائه شده فقط برای اهداف اطلاعاتی است و نباید به عنوان مشاوره حقوقی در مورد هر موضوعی تلقی شود. لطفاً در مورد وضعیت خود و سؤالات حقوقی خاصی که دارید با مشاور حقوقی خود مشورت کنید.
+ title: راه اندازی شرایط خدمات
+ history: تاریخچه
+ live: زنده
+ no_history: هنوز هیچ تغییری در شرایط خدمات ثبت نشده است.
+ no_terms_of_service_html: شما در حال حاضر هیچ شرایط خدماتی را پیکربندی نکردهاید. شرایط خدمات به منظور ارائه وضوح و محافظت از شما در برابر مسئولیت های احتمالی در اختلافات با کاربران شما است.
+ notified_on_html: کاربران در %{date} مطلع شدند
+ notify_users: به کاربران اطلاع دهید
+ preview:
+ explanation_html: 'ایمیل برای %{display_count} کاربران که قبل از %{date} ثبت نام کرده اند ارسال خواهد شد. متن زیر در ایمیل درج خواهد شد:'
+ send_preview: ارسال پیش نمایش به %{email}
+ send_to_all:
+ one: "%{display_count} ایمیل ارسال کنید"
+ other: "%{display_count} ایمیل ارسال کنید"
+ title: پیش نمایش اعلان شرایط خدمات
+ publish: انتشار دهید
+ published_on_html: منتشر شده در %{date}
+ save_draft: ذخیره پیش نویس
+ title: شرایط خدمات
title: مدیریت
trends:
allow: اجازه
@@ -820,6 +962,7 @@ fa:
confirm_allow_provider: مطمئنید که میخواهید فراهمکنندههای گزیده را مجاز کنید؟
confirm_disallow: مطمئنید که می خواهید پیوندهای گزیده را ممنوع کنید؟
confirm_disallow_provider: مطمئنید که می خواهید فراهم کنندههای گزیده را ممنوع کنید؟
+ description_html: اینها پیوندهایی هستند که در حال حاضر توسط حساب هایی که سرور شما پست ها را از آنها می بیند به اشتراک گذاشته می شود. این می تواند به کاربران شما کمک کند تا بفهمند در جهان چه می گذرد. تا زمانی که ناشر را تأیید نکنید، هیچ پیوندی به صورت عمومی نمایش داده نمی شود. همچنین می توانید پیوندهای فردی را مجاز یا رد کنید.
disallow: اجازه ندادن به پیوند
disallow_provider: اجازه ندادن به ناشر
no_link_selected: هیچ پیوندی تغییر نکرد زیرا هیچکدام از آنها انتخاب نشده بودند
@@ -835,6 +978,7 @@ fa:
pending_review: بازبینی منتظر
preview_card_providers:
allowed: پیوندها از این ناشر میتوانند داغ شوند
+ description_html: اینها دامنه هایی هستند که پیوندهای آنها اغلب در سرور شما به اشتراک گذاشته می شود. پیوندها به صورت عمومی ترند نمی شوند مگر اینکه دامنه پیوند تأیید شود. تأیید (یا رد) شما به زیر دامنه ها نیز گسترش می یابد.
rejected: پیوندها از این ناشر داغ نخواهند شد
title: ناشران
rejected: رد شده
@@ -845,9 +989,11 @@ fa:
confirm_allow_account: مطمئنید که میخواهید حسابهای گزیده را مجاز کنید؟
confirm_disallow: مطمئنید که میخواهید وضعیتهای گزیده را ممنوع کنید؟
confirm_disallow_account: مطمئنید که میخواهید حسابهای گزیده را ممنوع کنید؟
+ description_html: اینها پست هایی هستند که سرور شما در مورد آنها می داند و در حال حاضر در حال به اشتراک گذاری و محبوبیت زیادی هستند. می تواند به کاربران جدید و بازگشتی شما کمک کند تا افراد بیشتری را برای دنبال کردن پیدا کنند. تا زمانی که نویسنده را تأیید نکنید، هیچ پستی به صورت عمومی نمایش داده نمیشود و نویسنده اجازه میدهد حساب خود را به دیگران پیشنهاد دهد. همچنین می توانید پست های فردی را مجاز یا رد کنید.
disallow: ممنوع کردن فرسته
disallow_account: ممنوع کردن نگارنده
no_status_selected: هیچ فرستهٔ داغی تغییری نکرد زیرا هیچکدام از آنها انتخاب نشده بودند
+ not_discoverable: نویسنده امکان کشف بودن را انتخاب نکرده است
shared_by:
one: یک بار برگزیده یا همرسانی شده
other: "%{friendly_count} بار برگزیده یا همرسانی شده"
@@ -860,25 +1006,37 @@ fa:
tag_servers_dimension: کارسازهای برتر
tag_servers_measure: کارسازهای گوناگون
tag_uses_measure: کل استفادهها
+ description_html: اینها هشتگ هایی هستند که در حال حاضر در بسیاری از پست هایی که سرور شما می بیند ظاهر می شوند. این می تواند به کاربران شما کمک کند تا بفهمند مردم در حال حاضر بیشتر درباره چه چیزی صحبت می کنند. تا زمانی که شما آن ها را تایید نکنید، هیچ هشتگ به صورت عمومی نمایش داده نمی شود.
listable: میتواند پیشنهاد شود
no_tag_selected: هیچ برچسبی تغییر نکرد زیرا هیچکدام گزیده نبودند
not_listable: پیشنهاد نخواهد شد
+ not_trendable: تحت روندها ظاهر نمی شود
not_usable: غیر قابل استفاده
+ peaked_on_and_decaying: در %{date} به اوج خود رسید، اکنون در حال زوال است
title: برچسبهای پرطرفدار
+ trendable: می تواند در زیر روندها ظاهر شود
trending_rank: 'پرطرفدار #%{rank}'
usable: قابل استفاده
+ usage_comparison: "%{today} بار امروز در مقایسه با %{yesterday} دیروز استفاده شد"
+ used_by_over_week:
+ one: در هفته گذشته توسط یک نفر استفاده شده است
+ other: در هفته گذشته توسط %{count} نفر استفاده شده است
+ title: توصیه ها و روندها
trending: پرطرفدار
warning_presets:
add_new: افزودن تازه
delete: زدودن
edit_preset: ویرایش هشدار پیشفرض
empty: هنز هیچ پیشتنظیم هشداری را تعریف نکردهاید.
+ title: از پیش تنظیم های هشدار
webhooks:
add_new: افزودن نقطهٔ پایانی
delete: حذف
+ description_html: یک وب هوک ماستودون را قادر میسازد تا اعلانهای همزمان در مورد رویدادهای انتخابی را به برنامه خود ارسال کند، بنابراین برنامه شما میتواند بهطور خودکار واکنشها را تحریک کند.
disable: از کار انداختن
disabled: از کار افتاده
edit: ویرایش نقطهٔ پایانی
+ empty: شما هنوز هیچ نقطه پایانی وبی هوک را پیکربندی نکردهاید.
enable: به کار انداختن
enabled: فعّال
enabled_events:
@@ -892,6 +1050,9 @@ fa:
title: قلابهای وب
webhook: قلاب وب
admin_mailer:
+ auto_close_registrations:
+ body: به دلیل عدم فعالیت اخیر ناظر، ثبت نام در %{instance} به طور خودکار به نیاز به بازبینی دستی تغییر یافته است تا از استفاده %{instance} به عنوان بستری برای بازیگران بد احتمالی جلوگیری شود. در هر زمان می توانید آن را به ثبت نام های باز تغییر دهید.
+ subject: ثبت نام برای %{instance} به طور خودکار به نیاز به تأیید تغییر یافته است
new_appeal:
actions:
delete_statuses: برای حذف فرستههایشان
@@ -901,6 +1062,12 @@ fa:
sensitive: برای علامت زدن حسابشان به عنوان حسّاس
silence: برای محدود کردن حساب آنها
suspend: برای تعلیق حسابشان
+ body: "%{target} برای یک تصمیم نظارتی توسط %{action_taken_by} از %{date} که %{type} بود، درخواست تجدیدنظر میکند. آنها نوشتند:"
+ next_steps: میتوانید برای لغو تصمیم تعدیل، درخواست تجدیدنظر را تأیید کنید یا آن را نادیده بگیرید.
+ subject: "%{username} در حال درخواست تجدیدنظر برای تصمیم نظارت در %{instance}"
+ new_critical_software_updates:
+ body: نسخه های انتقادی جدید ماستودون منتشر شده است، ممکن است بخواهید در اسرع وقت به روز رسانی کنید!
+ subject: بهروزرسانیهای ماستودون بحرانی برای %{instance} در دسترس هستند!
new_pending_account:
body: جزئیات حساب تازه اینجاست. شما میتوانید آن را تأیید یا رد کنید.
subject: حساب تازهای در %{instance} نیازمند بررسی است (%{username})
@@ -908,7 +1075,11 @@ fa:
body: کاربر %{reporter} کاربر %{target} را گزارش داد
body_remote: کسی از %{domain} گزارش %{target} را فرستاده
subject: گزارش تازهای برای %{instance} (#%{id})
+ new_software_updates:
+ body: نسخه های جدید ماستودون منتشر شده است، ممکن است بخواهید به روز رسانی کنید!
+ subject: نسخه های جدید ماستودون برای %{instance} در دسترس هستند!
new_trends:
+ body: 'موارد زیر قبل از نمایش عمومی نیاز به بررسی دارند:'
new_trending_links:
title: پیوندهای داغ
new_trending_statuses:
@@ -953,13 +1124,19 @@ fa:
auth:
apply_for_account: درخواست یک حساب
captcha_confirmation:
+ help_html: اگر مشکلی در حل کپچا دارید، می توانید از طریق %{email} با ما در تماس باشید و ما می توانیم به شما کمک کنیم.
+ hint_html: فقط یک چیز دیگر! ما باید تأیید کنیم که شما یک انسان هستید (این برای جلوگیری از هرزنامه است!). کپچا زیر را حل کنید و روی "ادامه" کلیک کنید.
title: بررسی های امنیتی
confirmations:
+ awaiting_review: آدرس ایمیل شما تایید شد! کارکنان %{domain} اکنون در حال بررسی ثبت نام شما هستند. اگر حساب شما را تایید کنند یک ایمیل دریافت خواهید کرد!
awaiting_review_title: ثبتنامتان دارد بررسی میشود
clicking_this_link: زدن این پیوند
login_link: ورود
proceed_to_login_html: میتوانید به %{login_link} ادامه دهید.
+ redirect_to_app_html: باید به برنامه %{app_name} هدایت میشوید. اگر این اتفاق نیفتاد، %{clicking_this_link} را امتحان کنید یا به صورت دستی به برنامه برگردید.
+ registration_complete: ثبت نام شما در %{domain} اکنون کامل شده است!
welcome_title: خوش آمدید، %{name}!
+ wrong_email_hint: اگر آن آدرس ایمیل درست نیست، میتوانید آن را در تنظیمات حساب تغییر دهید.
delete_account: پاککردن حساب
delete_account_html: اگر میخواهید حساب خود را پاک کنید، از اینجا پیش بروید. از شما درخواست تأیید خواهد شد.
description:
@@ -994,15 +1171,24 @@ fa:
accept: پذیرفتن
back: بازگشت
invited_by: 'با سپاس از دعوتی از این فرد دریافت کردهاید میتوانید به %{domain} بپیوندید:'
+ preamble: اینها توسط گردانندگان %{domain} تنظیم و اجرا می شوند.
+ preamble_invited: قبل از ادامه، لطفاً قوانین اساسی تنظیم شده توسط مدیران %{domain} را در نظر بگیرید.
+ title: برخی از قوانین اساسی.
title_invited: شما دعوت شده اید.
security: امنیت
set_new_password: تعین گذرواژه جدید
setup:
+ email_below_hint_html: پوشه هرزنامه خود را بررسی کنید یا یک پوشه دیگر درخواست کنید. در صورت اشتباه می توانید آدرس ایمیل خود را تصحیح کنید.
+ email_settings_hint_html: برای شروع استفاده از ماستودون روی پیوندی که به %{email} فرستادیم کلیک کنید. همین جا منتظر می مانیم.
link_not_received: پیوندی نگرفتید؟
+ new_confirmation_instructions_sent: تا چند دقیقه دیگر یک ایمیل جدید با لینک تایید دریافت خواهید کرد!
title: صندوق ورودیتان را بررسی کنید
sign_in:
+ preamble_html: با اطلاعات کاربری %{domain} خود وارد شوید. اگر حساب شما روی سرور دیگری میزبانی شود، نمی توانید در اینجا وارد شوید.
title: ورود به %{domain}
sign_up:
+ manual_review: ثبتنامها در %{domain} از طریق بازبینی دستی توسط گردانندگان ما انجام میشود. برای کمک به ما در پردازش ثبت نام خود، کمی در مورد خودتان و اینکه چرا می خواهید یک حساب در %{domain} داشته باشید، بنویسید.
+ preamble: با داشتن یک حساب کاربری در این سرور ماستودون، میتوانید هر شخص دیگری را در فدیورس دنبال کنید، صرف نظر از اینکه حساب او در کجا میزبانی میشود.
title: بیایید روی %{domain} برپایتان کنیم.
status:
account_status: وضعیت حساب
@@ -1010,11 +1196,14 @@ fa:
functional: حسابتان کاملاً قابل استفاده است.
pending: درخواستتان منتظر بازبینی مسئولان است. ممکن است کمی طول بکشد. اگر درخواستتان پذیرفته شود رایانامهای خواهید گرفت.
redirecting_to: حساب شما غیرفعال است زیرا هماکنون به %{acct} منتقل شده است.
+ self_destruct: از آنجایی که %{domain} در حال بسته شدن است، شما فقط دسترسی محدودی به حساب خود خواهید داشت.
view_strikes: دیدن شکایتهای گذشته از حسابتان
too_fast: فرم با سرعت بسیار زیادی فرستاده شد، دوباره تلاش کنید.
use_security_key: استفاده از کلید امنیتی
+ user_agreement_html: من خوانده ام و موافقم شرایط خدمات و سیاست حفظ حریم خصوصی
author_attribution:
example_title: متن نمونه
+ hint_html: آیا در خارج از ماستودون اخبار یا مقالات وبلاگ می نویسید؟ نحوه دریافت اعتبار زمانی که آنها در ماستودون به اشتراک گذاشته می شوند را کنترل کنید.
instructions: 'مطمئن شوید این کد در HTML مقالهتان وجود دارد:'
more_from_html: بیشتر از %{name}
s_blog: بلاگ %{name}
@@ -1146,6 +1335,7 @@ fa:
add_keyword: افزودن کلیدواژه
keywords: کلیدواژهها
statuses: فرستههای جدا
+ statuses_hint_html: این فیلتر برای انتخاب هر پست صرف نظر از مطابقت با کلمات کلیدی زیر اعمال می شود. پستها را از فیلتر بازبینی یا حذف کنید.
title: ویرایش پالایه
errors:
deprecated_api_multiple_keywords: این پارامترها نمیتوانند از این برنامه تغییر یابند؛ چرا که به بیش از یک کلیدواژهٔ پالایه اعمال میشود. از برنامهای جدیدتر یا میانای وب استفاده کنید.
@@ -1174,6 +1364,7 @@ fa:
batch:
remove: برداشتن از پالایه
index:
+ hint: این فیلتر برای انتخاب پست های فردی بدون توجه به معیارهای دیگر اعمال می شود. می توانید پست های بیشتری را از رابط وب به این فیلتر اضافه کنید.
title: فرستههای پالوده
generic:
all: همه
@@ -1208,11 +1399,37 @@ fa:
too_large: حجم فایل خیلی بزرگ است
failures: شکستها
imported: وارد شد
+ mismatched_types_warning: به نظر می رسد ممکن است نوع اشتباهی را برای این درون ریزی انتخاب کرده باشید، لطفاً دوباره بررسی کنید.
modes:
merge: ادغام
merge_long: دادههای فعلی را داشته باشید و دادههای تازهای بیفزایید
overwrite: بازنویسی
overwrite_long: دادههای فعلی را پاک کنید و دادههای تازهای بیفزایید
+ overwrite_preambles:
+ blocking_html:
+ one: میخواهید فهرست مسدود خود را با حداکثر %{count} حساب از %{filename} جایگزین کنید.
+ other: شما میخواهید فهرست مسدود خود را با حداکثر %{count} حساب از %{filename} جایگزین کنید.
+ bookmarks_html:
+ one: شما میخواهید نشانکهای خود را با حداکثر %{count} پست از %{filename} جایگزین کنید.
+ other: شما میخواهید نشانکهای خود را با حداکثر %{count} پست ها از %{filename} جایگزین کنید.
+ domain_blocking_html:
+ one: شما میخواهید لیست مسدودسازی دامنه خود را با حداکثر %{count} دامنه از %{filename} جایگزین کنید.
+ other: شما می خواهید لیست مسدودسازی دامنه خود را با حداکثر %{count} دامنه از %{filename} جایگزین کنید.
+ lists_html:
+ one: شما می خواهید لیست های خود را با محتوای %{filename} جایگزین کنید. حداکثر %{count} حساب به لیستهای جدید اضافه میشود.
+ other: شما می خواهید لیست های خود را با محتوای %{filename} جایگزین کنید. حداکثر %{count} حساب به لیستهای جدید اضافه میشود.
+ preambles:
+ blocking_html:
+ one: شما در شرف مسدود کردن حداکثر %{count} حساب از %{comment}' + private_comment_description_html: 'Para te ajudar a rastrear a origem dos bloqueios importados, estes serão criados com o seguinte comentário privado:
%{comment}' private_comment_template: Importado de %{source} em %{date} title: Importar bloqueios de domínio - invalid_domain_block: 'Um ou mais blocos de domínio foram ignorados devido o(s) seguinte(s) erro(s): %{error}' + invalid_domain_block: 'Um ou mais blocos de domínio foram ignorados devido ao(s) seguinte(s) erro(s): %{error}' new: title: Importar bloqueios de domínio no_file: Nenhum ficheiro selecionado @@ -489,12 +489,12 @@ pt-PT: view_all: Ver registos de auditoria completos availability: description_html: - one: Se a entrega ao domínio falhar %{count} dia(s) sem sucesso, não serão efetuadas mais tentativas de entrega, a menos que seja recebida uma entrega do domínio. - other: Se a entrega ao domínio falhar %{count} dias diferentes sem sucesso, não serão efetuadas mais tentativas de entrega, a menos que seja recebida uma entrega do domínio. + one: Se a entrega ao domínio falhar %{count} dia sem sucesso, não serão efetuadas mais tentativas de entrega, a não ser que seja recebida uma entrega do domínio. + other: Se a entrega ao domínio falhar %{count} dias diferentes sem sucesso, não serão efetuadas mais tentativas de entrega, a não ser que seja recebida uma entrega do domínio. failure_threshold_reached: Limite de falhas atingido em %{date}. failures_recorded: one: Tentativa falhada em %{count} dia. - other: Tentativas em %{count} dias diferentes. + other: Tentativas falhadas em %{count} dias diferentes. no_failures_recorded: Sem falhas registadas. title: Disponibilidade warning: A última tentativa de conectar a este servidor não foi bem sucedida @@ -519,7 +519,7 @@ pt-PT: instance_accounts_dimension: Contas mais seguidas instance_accounts_measure: contas armazenadas instance_followers_measure: nossos seguidores lá - instance_follows_measure: os seus seguidores aqui + instance_follows_measure: os seguidores deles aqui instance_languages_dimension: Idiomas mais populares instance_media_attachments_measure: anexos multimédia armazenados instance_reports_measure: denúncias sobre eles @@ -534,7 +534,7 @@ pt-PT: delivery_available: Entrega disponível delivery_error_days: Dias de erro de entrega delivery_error_hint: Se a entrega não for possível durante %{count} dias, será automaticamente marcada como não realizável. - destroyed_msg: Dados de %{domain} estão agora na fila para iminente eliminação. + destroyed_msg: Os dados de %{domain} estão agora na fila para iminente eliminação. empty: Não foram encontrados domínios. known_accounts: one: "%{count} conta conhecida" @@ -543,17 +543,17 @@ pt-PT: all: Todas limited: Limitadas title: Moderação - private_comment: Comentários privados - public_comment: Comentários públicos + private_comment: Comentário privado + public_comment: Comentário público purge: Purgar - purge_description_html: Se crê que este domínio está definitivamente fora de linha, pode apagar todos os seus registos de contas e dados associados do seu armazenamento. Isso pode demorar algum tempo. + purge_description_html: Se crês que este domínio está definitivamente desativado, podes eliminar todos os seus registos de contas e dados associados do seu armazenamento. Isso pode demorar algum tempo. title: Federação total_blocked_by_us: Bloqueado(s) por nós total_followed_by_them: Seguido(s) por eles total_followed_by_us: Seguido(s) por nós total_reported: Denúncias sobre eles total_storage: Anexos multimédia - totals_time_period_hint_html: Os totais exibidos abaixo incluem dados referentes ao tempo total. + totals_time_period_hint_html: Os totais mostrados abaixo incluem dados referentes ao tempo total. unknown_instance: Atualmente não há registo deste domínio neste servidor. invites: deactivate_all: Desativar todos @@ -592,7 +592,7 @@ pt-PT: inbox_url: URL do repetidor pending: À espera da aprovação do repetidor save_and_enable: Guardar e ativar - setup: Configurar uma ligação ao repetidor + setup: Configurar uma conexão ao repetidor signatures_not_enabled: Os repetidores não funcionarão corretamente enquanto o modo seguro ou o modo de lista branca estiverem ativados status: Estado title: Retransmissores @@ -607,15 +607,15 @@ pt-PT: action_log: Registo de auditoria action_taken_by: Ação tomada por actions: - delete_description_html: As publicações denunciadas serão eliminadas, e será registada uma reprimenda para ajudá-lo a tomar medidas em futuras infrações pela mesma conta. - mark_as_sensitive_description_html: A multimédia nas publicações denunciadas será marcada como problemática, e uma reprimenda será registada para ajudá-lo a tomar medidas em futuras infrações pela mesma conta. - other_description_html: Ver mais opções para controlar o comportamento da conta e personalizar a comunicação para a conta denunciada. - resolve_description_html: Nenhuma ação será tomada contra a conta denunciada, não será registada nenhuma reprimenda, e a denúncia será fechada. - silence_description_html: O perfil será visível apenas para aqueles que já o seguem ou o procurem manualmente, limitando fortemente o seu alcance. Pode sempre ser revertido. Encerrar todas as denúncias contra esta conta. + delete_description_html: As publicações denunciadas serão eliminadas e será registada uma reprimenda para ajudar-te a tomar medidas em futuras infrações pela mesma conta. + mark_as_sensitive_description_html: A multimédia nas publicações denunciadas será marcada como sensível e será registada uma reprimenda para ajudar-te a tomar medidas em futuras infrações pela mesma conta. + other_description_html: Veja mais opções para controlar o comportamento da conta e personalizar a comunicação para a conta denunciada. + resolve_description_html: Nenhuma ação será tomada contra a conta denunciada, não será registada nenhuma reprimenda e a denúncia será fechada. + silence_description_html: O perfil será visível apenas para aqueles que já o seguem ou o procurem manualmente, limitando fortemente o seu alcance. Pode sempre ser revertido. Encerra todas as denúncias contra esta conta. suspend_description_html: A conta e todo o seu conteúdo ficará inacessível e, eventualmente apagado, pelo que interagir com ela será impossível. Reversível durante 30 dias. Encerra todas as denúncias contra esta conta. actions_description_html: Decida a ação a tomar para resolver esta denúncia. Se decidir por uma ação punitiva contra a conta denunciada, um e-mail de notificação será enviado, excetuando quando selecionada a categoria Spam. actions_description_remote_html: Decida quais as medidas a tomar para resolver esta denúncia. Isso apenas afetará como o seu servido comunica com esta conta remota e gere o seu conteúdo. - actions_no_posts: Este relatório não tem nenhuma publicação associada para eliminar + actions_no_posts: Esta denúncia não tem nenhuma publicação associada para ser eliminada add_to_report: Adicionar mais à denúncia already_suspended_badges: local: Já suspenso neste servidor @@ -625,7 +625,7 @@ pt-PT: assigned: Atribuída ao moderador by_target_domain: Domínio da conta denunciada cancel: Cancelar - category: Categorização + category: Categoria category_description_html: A razão pela qual esta conta e/ou conteúdo foi denunciado será citada na comunicação com a conta denunciada comment: none: Nenhum @@ -638,8 +638,8 @@ pt-PT: forwarded_replies_explanation: Esta denúncia é de um utilizador remoto e sobre conteúdo remoto. Foi encaminhada para si porque o conteúdo denunciado é em resposta a um dos seus utilizadores. forwarded_to: Encaminhado para %{domain} mark_as_resolved: Marcar como resolvido - mark_as_sensitive: Marcar como problemático - mark_as_unresolved: Marcar como por resolver + mark_as_sensitive: Marcar como sensível + mark_as_unresolved: Marcar como não resolvido no_one_assigned: Ninguém notes: create: Adicionar nota @@ -648,15 +648,15 @@ pt-PT: delete: Eliminar placeholder: Descreve as ações que foram tomadas ou quaisquer outras atualizações relacionadas... title: Notas - notes_description_html: Visualize e deixe anotações para outros moderadores e para si próprio no futuro - processed_msg: 'Relatório #%{id} processado com sucesso' - quick_actions_description_html: 'Tome uma ação rápida ou deslize para baixo para ver o conteúdo denunciado:' + notes_description_html: Visualiza e deixa anotações para outros moderadores e para ti próprio no futuro + processed_msg: 'Denúncia #%{id} processada com sucesso' + quick_actions_description_html: 'Toma uma ação rápida ou desliza para baixo para ver o conteúdo denunciado:' remote_user_placeholder: o utilizador remoto de %{instance} reopen: Reabrir denúncia report: 'Denúncia #%{id}' reported_account: Conta denunciada reported_by: Denunciado por - reported_with_application: Reportado com a aplicação + reported_with_application: Denunciado com a aplicação resolved: Resolvido resolved_msg: Denúncia resolvida com sucesso! skip_to_actions: Passar para as ações @@ -665,22 +665,22 @@ pt-PT: statuses_description_html: O conteúdo ofensivo será citado na comunicação com a conta denunciada summary: action_preambles: - delete_html: 'Está prestes a remover algumas das publicações de @%{acct}. Isto irá:' - mark_as_sensitive_html: 'Está prestes a marcar algumas das publicações de @%{acct}como sensível. Isto irá:' - silence_html: 'Está prestes a limitar a conta de @%{acct}. Isto irá:' - suspend_html: 'Está prestes a suspender a conta de @%{acct}. Isto irá:' + delete_html: 'Estás prestes a remover algumas das publicações de @%{acct}. Isto irá:' + mark_as_sensitive_html: 'Estás prestes a marcar algumas das publicações de @%{acct}como sensíveis. Isto irá:' + silence_html: 'Estás prestes a limitar a conta de @%{acct}. Isto irá:' + suspend_html: 'Estás prestes a suspender a conta de @%{acct}. Isto irá:' actions: - delete_html: Excluir as publicações ofensivas + delete_html: Eliminar as publicações ofensivas mark_as_sensitive_html: Marcar a multimédia das publicações ofensivas como sensível - silence_html: Limitar firmemente o alcance de @%{acct}, tornando seus perfis e conteúdos apenas visíveis para pessoas que já os estão seguindo ou olhando manualmente no perfil - suspend_html: Suspender @%{acct}, tornando seu perfil e conteúdo inacessíveis e impossível de interagir - close_report: 'Marcar relatório #%{id} como resolvido' + silence_html: Limita fortemente o alcance de @%{acct}, tornando o seu perfil e conteúdo apenas visíveis para pessoas que já o está a seguir ou a procurar manualmente o perfil + suspend_html: Suspender @%{acct}, tornando o seu perfil e conteúdo inacessíveis e impossível de interagir + close_report: 'Marcar denúncia #%{id} como resolvida' close_reports_html: Marcar todas as denúncias contra @%{acct} como resolvidas - delete_data_html: Eliminar o perfil de @%{acct} e conteúdos daqui a 30 dias, a menos que entretanto sejam suspensos + delete_data_html: Eliminar o perfil de @%{acct} e conteúdos daqui a 30 dias, a não ser que entretanto seja suspenso preview_preamble_html: "@%{acct} receberá um aviso com o seguinte conteúdo:" - record_strike_html: Registar um ataque contra @%{acct} para ajudar a escalar futuras violações desta conta + record_strike_html: Registar uma reprimenda a @%{acct} para te ajudar a agravar futuras violações desta conta send_email_html: Enviar um e-mail de aviso a @%{acct} - warning_placeholder: Argumentos adicionais opcionais para a acção de moderação. + warning_placeholder: Argumentos adicionais opcionais para a ação de moderação. target_origin: Origem da conta denunciada title: Denúncias unassign: Não atribuir @@ -700,7 +700,7 @@ pt-PT: moderation: Moderação special: Especiais delete: Eliminar - description_html: Com as funções de utilizador, pode personalizar quais as funções e áreas do Mastodon a que os seus utilizadores podem aceder. + description_html: Com as funções de utilizador, podes personalizar quais as funções e áreas do Mastodon a que os teus utilizadores podem aceder. edit: Editar função '%{name}' everyone: Permissões padrão everyone_full_description_html: Esta é a função base que afeta todos os utilizadores, mesmo aqueles sem uma função atribuída. Todas as outras funções herdam as permissões desta. @@ -711,23 +711,23 @@ pt-PT: 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_description: Permite que os utilizadores eliminem os dados doutros utilizadores sem tempo de espera + delete_user_data_description: Permite que os utilizadores eliminem os dados de outros utilizadores sem tempo de espera 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_announcements: Gerir mensagens de manutenção + manage_announcements_description: Permite aos utilizadores gerirem as mensagem de manutenção no servidor + manage_appeals: Gerir contestações + manage_appeals_description: Permite aos utilizadores analisarem contestações contra ações de moderação manage_blocks: Gerir bloqueios - manage_blocks_description: Permite aos utilizadores bloquear fornecedores de e-mail e endereços IP + manage_blocks_description: Permite aos utilizadores bloquearem fornecedores de e-mail e endereços IP 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_description: Permite aos utilizadores bloquear ou permitir federação com outros domínios e controlar a entregabilidade + manage_federation_description: Permite aos utilizadores bloquearem ou permitirem a federação com outros domínios e controlar a entregabilidade manage_invites: Gerir convites - manage_invites_description: Permite aos utilizadores pesquisarem e desativarem ligações de convite + manage_invites_description: Permite aos utilizadores pesquisarem e desativarem hiperligações de convite manage_reports: Gerir denúncias - manage_reports_description: Permite aos utilizadores rever denúncias e executar ações de moderação contra eles + manage_reports_description: Permite aos utilizadores reverem denúncias e executarem 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 @@ -754,33 +754,33 @@ pt-PT: delete: Eliminar description_html: Embora a maioria afirme ter lido e concordado com os termos de serviço, geralmente as pessoas só os leem depois de lhes surgir um problema. Torne fácil a leitura rápida das regras do seu servidor, apresentando-as numa lista de tópicos. Tente que cada regra seja sucinta e simples, mas tente também não dividi-las num número excessivo de tópicos separados. edit: Editar regra - empty: Nenhuma regra de instância foi ainda definida. - title: Regras da instância + empty: Ainda não foi definida nenhuma regra do servidor. + title: Regras do servidor settings: about: manage_rules: Gerir regras do servidor preamble: Forneça informações aprofundadas sobre como o servidor é operado, moderado, financiado. - rules_hint: Existe uma área dedicada às regras a que os seus utilizadores devem aderir. - title: Acerca de + rules_hint: Existe uma área dedicada às regras a que os teus utilizadores devem aderir. + title: Sobre appearance: - preamble: Personalize a interface web do Mastodon. - title: Aspeto + preamble: Personaliza a interface web do Mastodon. + title: Aparência branding: - 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. + preamble: A marca do teu 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 + 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, considera medidas alternativas tais como registo mediante aprovação ou sob convite. + title: Requerer que novos utilizadores resolvam um CAPTCHA para confirmar a conta content_retention: danger_zone: Zona de perigo - preamble: Controle a forma como o conteúdo gerado pelo utilizador é armazenado no Mastodon. + preamble: Controla 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 + desc_html: Afeta todos os utilizadores que não tenham alterado esta configuração title: Desativar, por omissão, a indexação de utilizadores por parte dos motores de pesquisa discovery: - follow_recommendations: Recomendações para seguir - preamble: Revelar conteúdos interessantes é fundamental para a entrada de novos utilizadores que podem não conhecer ninguém no Mastodon. Controle como os vários recursos de descoberta funcionam no seu servidor. + follow_recommendations: Recomendações de contas + preamble: Revelar conteúdos interessantes é fundamental para a entrada de novos utilizadores que podem não conhecer ninguém no Mastodon. Controla como os vários recursos de descoberta funcionam no teu servidor. profile_directory: Diretório de perfis public_timelines: Cronologias públicas publish_discovered_servers: Publicar servidores descobertos @@ -825,17 +825,17 @@ pt-PT: statuses: account: Autor application: Aplicação - back_to_account: Voltar para página da conta + back_to_account: Voltar à página da conta back_to_report: Voltar à página da denúncia batch: - add_to_report: 'Adicionar ao relatório #%{id}' + add_to_report: 'Adicionar à denúncia #%{id}' remove_from_report: Remover da denúncia report: Denúncia contents: Conteúdo deleted: Eliminado favourites: Favoritos history: Histórico de versões - in_reply_to: A responder a + in_reply_to: Em resposta a language: Idioma media: title: Multimédia @@ -855,16 +855,16 @@ pt-PT: with_media: Com multimédia strikes: actions: - delete_statuses: "%{name} eliminou a publicação de %{target}" + delete_statuses: "%{name} eliminou as publicações de %{target}" disable: "%{name} congelou a conta de %{target}" - mark_statuses_as_sensitive: "%{name} marcou as publicações de %{target} como problemáticas" + mark_statuses_as_sensitive: "%{name} marcou as publicações de %{target} como sensíveis" none: "%{name} enviou uma advertência a %{target}" - sensitive: "%{name} marcou a conta de %{target} como problemática" + sensitive: "%{name} marcou a conta de %{target} como sensível" silence: "%{name} limitou a conta de %{target}" suspend: "%{name} suspendeu a conta de %{target}" - appeal_approved: Recorrido - appeal_pending: Recurso pendente - appeal_rejected: Recurso rejeitado + appeal_approved: Contestado + appeal_pending: Contestação pendente + appeal_rejected: Contestação rejeitada system_checks: database_schema_check: message_html: Existem migrações de bases de dados pendentes. Execute-as para garantir que a aplicação se comporta como esperado @@ -888,8 +888,8 @@ pt-PT: message_html: 'Versão de Elasticsearch incompatível: %{value}' version_comparison: A versão de Elasticsearch %{running_version} está em execução. No entanto, é obrigatória a versão %{required_version} rules_check: - action: Gerir regras da instância - message_html: Não definiu nenhuma regra para a instância. + action: Gerir regras do servidor + message_html: Não definiu nenhuma regra para o servidor. sidekiq_process_check: message_html: Nenhum processo Sidekiq em execução para a(s) fila(s) %{value}. Reveja a configuração do seu Sidekiq software_version_check: @@ -911,7 +911,7 @@ pt-PT: moderation: not_trendable: Não pode ser tendência not_usable: Não utilizável - pending_review: Pendente de revisão + pending_review: Revisão pendente review_requested: Revisão solicitada reviewed: Revista title: Estado @@ -921,7 +921,7 @@ pt-PT: name: Nome newest: Mais recente oldest: Mais antiga - open: Visualizar Publicamente + open: Ver publicamente reset: Repor review: Estado da revisão search: Pesquisar @@ -970,10 +970,10 @@ pt-PT: confirm_allow_provider: Tem a certeza que pretende permitir os fornecedores selecionados? confirm_disallow: Tem a certeza que pretende rejeitar as hiperligações selecionadas? confirm_disallow_provider: Tem a certeza que pretende rejeitar os fornecedores selecionados? - description_html: Estas são as ligações que presentemente estão a ser muito partilhadas por contas visíveis pelo seu servidor. Estas podem ajudar os seus utilizador a descobrir o que está a acontecer no mundo. Nenhuma ligação é exibida publicamente até que o editor a aprove. Também pode permitir ou rejeitar ligações em avulso. - disallow: Não permitir ligação + description_html: Estas são as hiperligações que presentemente estão a ser muito partilhadas por contas visíveis pelo seu servidor. Estas podem ajudar os seus utilizador a descobrir o que está a acontecer no mundo. Nenhuma hiperligação é mostrada publicamente até que o editor a aprove. Também pode permitir ou rejeitar hiperligações individuais. + disallow: Não permitir hiperligação disallow_provider: Não permitir editor - no_link_selected: Nenhuma ligação foi alterada, pois nenhuma foi selecionada + no_link_selected: Nenhuma hiperligação foi alterada, pois nenhuma foi selecionada publishers: no_publisher_selected: Nenhum editor foi alterado, pois nenhum foi selecionado shared_by_over_week: @@ -986,7 +986,7 @@ pt-PT: pending_review: Pendente de revisão preview_card_providers: allowed: As hiperligações deste editor podem ser tendência - description_html: Estes são os domínios a partir dos quais ligações são frequentemente partilhadas no seu servidor. As suas ligações não serão colocadas em alta a menos que o seu domínio de origem seja aprovado. A sua aprovação (ou rejeição) estende-se a subdomínios. + description_html: Estes são os domínios a partir dos quais hiperligações são frequentemente partilhadas no seu servidor. As suas hiperligações não serão colocadas em alta a menos que o seu domínio de origem seja aprovado. A sua aprovação (ou rejeição) estende-se a subdomínios. rejected: As hiperligações deste editor não podem ser tendência title: Editores rejected: Rejeitado @@ -1014,13 +1014,13 @@ pt-PT: tag_servers_dimension: Servidores mais populares tag_servers_measure: servidores diferentes tag_uses_measure: utilizações totais - description_html: 'Estas são as #etiquetas que aparecem atualmente com frequência em publicações visíveis pelo seu servidor. Isto pode ajudar os seus utilizadores a descobrir o que está ser mais falado no momento. Nenhuma #etiqueta será exibida publicamente até que a aprove.' + description_html: 'Estas são as #etiquetas que aparecem atualmente com frequência em publicações visíveis pelo seu servidor. Isto pode ajudar os seus utilizadores a descobrirem o que está ser mais falado no momento. Nenhuma #etiqueta será mostrada publicamente até que a aprove.' listable: Pode ser sugerida no_tag_selected: Nenhuma etiqueta foi alterada, pois nenhuma foi selecionada not_listable: Não será sugerida not_trendable: Não aparecerá nas tendências not_usable: Não pode ser utilizada - peaked_on_and_decaying: Máximo em %{date}, agora a decair + peaked_on_and_decaying: No auge em %{date}, agora em declínio title: Etiquetas em tendência trendable: Pode aparecer nas tendências trending_rank: 'Tendência #%{rank}' @@ -1059,20 +1059,20 @@ pt-PT: webhook: Webhook admin_mailer: auto_close_registrations: - body: Devido à falta de atividade recente dos moderadores, as inscrições em %{instance} foram automaticamente alteradas para requererem revisão manual, para evitar que %{instance} seja utilizada como plataforma para potenciais maus atores. Pode voltar a alterar para inscrições abertas em qualquer altura. - subject: As incrições em %{instance} foram automaticamente alteradas para requererem aprovação + body: Devido à falta de atividade recente dos moderadores, as inscrições em %{instance} foram automaticamente alteradas para requererem revisão manual, para evitar que %{instance} seja utilizada como plataforma para potenciais más intenções. Pode voltar a alterar para inscrições abertas em qualquer altura. + subject: As inscrições em %{instance} foram automaticamente alteradas para requererem aprovação new_appeal: actions: - delete_statuses: para eliminar as suas publicações - disable: para congelar a sua conta - mark_statuses_as_sensitive: para marcar as suas publicações como problemáticas + delete_statuses: para eliminar as publicações dele + disable: para congelar a conta dele + mark_statuses_as_sensitive: marcar as publicações dele como sensíveis none: uma advertência - sensitive: para marcar a sua conta como problemática - silence: para limitar a sua conta - suspend: para suspender a sua conta - body: "%{target} está a recorrer de uma decisão de moderação de %{action_taken_by} a %{date}, que consistiu em %{type}. Escreveu:" - next_steps: Pode aprovar o recurso para reverter a decisão de moderação, ou ignorá-lo. - subject: "%{username} está a recorrer da decisão de moderação em %{instance}" + sensitive: para marcar a conta dele como sensível + silence: para limitar a conta dele + suspend: para suspender a conta dele + body: "%{target} está a contestar uma decisão de moderação de %{action_taken_by} a %{date}, que consistiu em %{type}. Ele escreveu:" + next_steps: Podes aprovar a contestação para reverter a decisão de moderação ou ignorá-la. + subject: "%{username} está a contestar a decisão de moderação em %{instance}" new_critical_software_updates: body: Foram lançadas novas versões críticas do Mastodon. Pode querer atualizar assim que possível! subject: Estão disponíveis atualizações críticas do Mastodon para %{instance}! @@ -1094,17 +1094,17 @@ pt-PT: title: Publicações em tendência new_trending_tags: title: Etiquetas em tendência - subject: Novas tendências para revisão em %{instance} + subject: Novas tendências para serem revistas em %{instance} aliases: add_new: Criar pseudónimo - created_msg: Criou com sucesso um novo pseudónimo. Pode agora iniciar a migração da conta antiga. + created_msg: Criaste com sucesso um novo pseudónimo. Podes agora iniciar a migração da conta antiga. deleted_msg: O pseudónimo foi removido com êxito. Deixará de ser possível passar dessa conta para esta. - empty: Não tem pseudónimos. - hint_html: Se quiser mudar de outra conta para esta, pode criar aqui um pseudónimo, que é necessário antes de poder prosseguir com a migração de seguidores da conta antiga para esta. Esta ação por si só é inofensiva e reversível. A migração da conta é iniciada a partir da conta antiga. + empty: Não tens pseudónimos. + hint_html: Se quiseres mudar de outra conta para esta, podes criar aqui um pseudónimo, que é necessário antes de poderes prosseguir com a migração de seguidores da conta antiga para esta. Esta ação por si só é inofensiva e reversível. A migração da conta é iniciada a partir da conta antiga. remove: Desvincular pseudónimo appearance: advanced_web_interface: Interface web avançada - advanced_web_interface_hint: 'Se quiser utilizar toda a largura do seu ecrã, a interface web avançada permite-lhe configurar várias colunas diferentes para ver tanta informação ao mesmo tempo quanto quiser: página inicial, notificações, cronologia federada, qualquer número de listas e etiquetas.' + advanced_web_interface_hint: 'Se quiseres utilizar toda a largura do teu ecrã, a interface web avançada permite configurar várias colunas diferentes para veres tanta informação ao mesmo tempo quanto quiseres: página inicial, notificações, cronologia federada, qualquer número de listas e etiquetas.' animations_and_accessibility: Animações e acessibilidade confirmation_dialogs: Caixas de confirmação discovery: Descobrir @@ -1112,7 +1112,7 @@ pt-PT: body: O Mastodon é traduzido por voluntários. guide_link: https://pt.crowdin.com/project/mastodon/ guide_link_text: Todos podem contribuir. - sensitive_content: Conteúdo problemático + sensitive_content: Conteúdo sensível application_mailer: notification_preferences: Alterar preferências de e-mail salutation: "%{name}," @@ -1127,31 +1127,31 @@ pt-PT: logout: Sair regenerate_token: Regenerar token de acesso token_regenerated: Token de acesso regenerado com sucesso - warning: Cuidado com estes dados. Não partilhar com ninguém! - your_token: O seu token de acesso + warning: Cuidado com estes dados. Não partilhes com ninguém! + your_token: O teu token de acesso auth: apply_for_account: Solicitar uma conta captcha_confirmation: - help_html: Se tiver problemas a resolver o CAPTCHA, pode entrar em contacto connosco através de %{email} e poderemos ajudá-lo. - hint_html: Só mais uma coisa! Precisamos confirmar que você é um humano (isto para que possamos evitar spam!). Resolva o CAPTCHA abaixo e clique em "Continuar". + help_html: Se tiveres problemas a resolver o CAPTCHA, podes entrar em contacto connosco através de %{email} e poderemos ajudar-te. + hint_html: Só mais uma coisa! Precisamos confirmar que és um humano (isto para que possamos evitar spam!). Resolve o CAPTCHA abaixo e clica em "Continuar". title: Verificação de segurança confirmations: - awaiting_review: O seu endereço de e-mail está confirmado! A equipa de %{domain} está agora a analisar a sua inscrição. Receberá um e-mail se a sua conta for aprovada! - awaiting_review_title: A sua inscrição está a ser revista + awaiting_review: O teu endereço de e-mail está confirmado! A equipa de %{domain} está agora a analisar a tua inscrição. Receberás um e-mail se a tua conta for aprovada! + awaiting_review_title: A tua inscrição está a ser revista clicking_this_link: clicar nesta hiperligação login_link: iniciar sessão - proceed_to_login_html: Pode agora prosseguir para %{login_link}. - redirect_to_app_html: Devia ter sido reencaminhado para a aplicação %{app_name}. Se isso não aconteceu, tente %{clicking_this_link} ou volte manualmente para a aplicação. - registration_complete: O seu registo sem %{domain} está agora concluído! + proceed_to_login_html: Podes agora prosseguir para %{login_link}. + redirect_to_app_html: Devias ter sido reencaminhado para a aplicação %{app_name}. Se isso não aconteceu, tenta %{clicking_this_link} ou regressa manualmente para a aplicação. + registration_complete: O teu registo sem %{domain} está agora concluído! welcome_title: Bem-vindo(a), %{name}! - wrong_email_hint: Se este endereço de correio eletrónico não estiver correto, pode alterá-lo nas definições de conta. + wrong_email_hint: Se este endereço de correio eletrónico não estiver correto, podes alterá-lo nas definições de conta. delete_account: Eliminar conta - delete_account_html: Se pretender eliminar a sua conta, pode fazê-lo aqui. Ser-lhe-á pedida uma confirmação. + delete_account_html: Se pretenderes eliminar a tua conta, podes fazê-lo aqui. Será pedida uma confirmação. description: prefix_invited_by_user: "@%{name} convidou-o a juntar-se a esta instância do Mastodon!" prefix_sign_up: Inscreva-se hoje no Mastodon! suffix: Com uma conta, poderá seguir pessoas, publicar atualizações e trocar mensagens com utilizadores de qualquer instância Mastodon e muito mais! - didnt_get_confirmation: Não recebeu um link de confirmação? + didnt_get_confirmation: Não recebeu uma hiperligação de confirmação? dont_have_your_security_key: Não tem a sua chave de segurança? forgot_password: Esqueceu-se da palavra-passe? invalid_reset_password_token: Token de modificação da palavra-passe é inválido ou expirou. Por favor, solicita um novo. @@ -1161,11 +1161,11 @@ pt-PT: login: Entrar logout: Sair migrate_account: Mudar para uma conta diferente - migrate_account_html: Se deseja redirecionar esta conta para uma outra pode configurar isso aqui. + migrate_account_html: Se desejas redirecionar esta conta para uma outra podes configurar isso aqui. or_log_in_with: Ou iniciar sessão com progress: confirm: Confirmar e-mail - details: Os seus dados + details: Os teus dados review: A nossa avaliação rules: Aceitar regras providers: @@ -1173,11 +1173,11 @@ pt-PT: saml: SAML register: Registar registration_closed: "%{instance} não está a aceitar novos membros" - resend_confirmation: Reenviar link de confirmação + resend_confirmation: Reenviar hiperligação de confirmação reset_password: Criar nova palavra-passe rules: accept: Aceitar - back: Retroceder + back: Voltar invited_by: 'Pode inscrever-se em %{domain} graças ao convite que recebeu de:' preamble: Estas são definidas e aplicadas pelos moderadores de %{domain}. preamble_invited: Antes de prosseguir, por favor, considere as regras base definidas pelos moderadores de %{domain}. @@ -1188,40 +1188,40 @@ pt-PT: setup: email_below_hint_html: Verifique a sua pasta de spam ou solicite outra. Pode corrigir o seu endereço de e-mail se estiver errado. email_settings_hint_html: Clique na hiperligação que enviámos para %{email} para começar a utilizar o Mastodon. Estaremos à espera aqui mesmo. - link_not_received: Não recebeu um link? - new_confirmation_instructions_sent: Irá receber uma nova mensagem de e-mail com a ligação de confirmação dentro de alguns minutos! + link_not_received: Não recebeu uma hiperligação? + new_confirmation_instructions_sent: Irá receber uma nova mensagem de e-mail com a hiperligação de confirmação dentro de alguns minutos! title: Verifique a caixa de entrada do seu e-mail sign_in: preamble_html: Iniciar sessão com as suas credenciais de %{domain}. Se a sua conta estiver hospedada noutro servidor, não poderá iniciar sessão aqui. title: Iniciar sessão em %{domain} sign_up: - manual_review: Inscrições no %{domain} passam por uma revisão manual pelos nossos moderadores. Para nos ajudar a processar o seu pedido de inscrição, escreva um pouco sobre si e o porquê de quer uma conta no %{domain}. - preamble: Com uma conta neste servidor Mastodon, poderá seguir qualquer outra pessoa no fediverso, independentemente do local onde a sua conta está alojada. - title: Vamos lá inscrevê-lo em %{domain}. + manual_review: As inscrições em %{domain} passam por uma revisão manual pelos nossos moderadores. Para nos ajudar a processar o teu pedido de inscrição, escreve um pouco sobre ti e o motivo para quereres uma conta em %{domain}. + preamble: Com uma conta neste servidor Mastodon, poderás seguir qualquer outra pessoa no fediverso, independentemente do local onde a tua conta está alojada. + title: Vamos lá inscrever-te em %{domain}. status: account_status: Estado da conta confirming: A aguardar a confirmação do e-mail para ser concluída. - functional: A sua conta está totalmente operacional. - pending: A sua inscrição está a ser analisada pela nossa equipa. Este processo pode demorar algum tempo. Receberá um e-mail se a sua inscrição for aprovada. - redirecting_to: A sua conta está inativa porque está atualmente a ser redirecionada para %{acct}. - self_destruct: Como %{domain} vai fechar, só terá acesso limitado à sua conta. - view_strikes: Veja as reprimendas anteriores sobre a sua conta - too_fast: Formulário enviado demasiado rapidamente, tente novamente. + functional: A tua conta está totalmente operacional. + pending: A tua inscrição está a ser analisada pela nossa equipa. Este processo pode demorar algum tempo. Receberás um e-mail se a tua inscrição for aprovada. + redirecting_to: A tua conta está inativa porque está atualmente a ser redirecionada para %{acct}. + self_destruct: Como %{domain} vai fechar, só terás acesso limitado à tua conta. + view_strikes: Ver as reprimendas anteriores sobre a tua conta + too_fast: Formulário enviado demasiado rapidamente, tenta novamente. use_security_key: Usar chave de segurança user_agreement_html: Eu li e concordo com os termos do serviço e política de privacidade author_attribution: example_title: Texto de exemplo - hint_html: Está a escrever notícias ou artigos de blogue fora do Mastodon? Controle a forma como é creditado quando estes são partilhados no Mastodon. - instructions: 'Certifique-se de que este código está no HTML do seu artigo:' + hint_html: Estás a escrever notícias ou artigos de blogue fora do Mastodon? Controla a forma como és creditados quando estes são partilhados no Mastodon. + instructions: 'Certifica-te que este código está no HTML do teu artigo:' more_from_html: Mais de %{name} s_blog: Blogue de %{name} - then_instructions: Em seguida, adicione o nome de domínio da publicação no campo abaixo. - title: Atribuição de autor + then_instructions: Em seguida, adiciona o nome de domínio da publicação no campo abaixo. + title: Atribuição do autor challenge: confirm: Continuar - hint_html: "Dica: Não vamos pedir novamente a sua palavra-passe durante a próxima hora." + hint_html: "Dica: Não vamos pedir novamente a tua palavra-passe durante a próxima hora." invalid_password: Palavra-passe inválida - prompt: Confirmar a sua palavra-passe para continuar + prompt: Confirma a palavra-passe para continuar crypto: errors: invalid_key: não é uma chave Ed25519 ou Curve25519 válida @@ -1236,102 +1236,102 @@ pt-PT: about_x_years: "%{count} anos" almost_x_years: "%{count} anos" half_a_minute: Agora mesmo - less_than_x_minutes: "%{count} meses" + less_than_x_minutes: "%{count}m" less_than_x_seconds: Agora mesmo over_x_years: "%{count} anos" x_days: "%{count} dias" - x_minutes: "%{count} minutos" + x_minutes: "%{count}m" x_months: "%{count} meses" - x_seconds: "%{count} segundos" + x_seconds: "%{count}s" deletes: - challenge_not_passed: A informação que inseriu não estava correcta - confirm_password: Insira sua palavra-passe atual para verificar a sua identidade - confirm_username: Insira seu nome de utilizador para confirmar o procedimento + challenge_not_passed: A informação que inseriste não estava correta + confirm_password: Introduz a palavra-passe atual para verificar a tua identidade + confirm_username: Introduz o teu nome de utilizador para confirmar o procedimento proceed: Eliminar conta - success_msg: A sua conta foi eliminada com sucesso + success_msg: A tua conta foi eliminada com sucesso warning: - before: 'Antes de continuar, por favor leia cuidadosamente estas notas:' + before: 'Antes de continuares, por favor lê cuidadosamente estas notas:' caches: O conteúdo que foi armazenado em cache por outras instâncias pode perdurar - data_removal: As suas publicações e outros dados serão eliminados permanentemente - email_change_html: Pode alterar o seu e-mail sem eliminar a sua conta - email_contact_html: Se ainda assim não o recebeu, pode enviar um e-mail para %{email} para obter ajuda - email_reconfirmation_html: Se não recebeu a mensagem de e-mail de confirmação, pode solicitá-la novamente - irreversible: Não será possível restaurar ou reativar sua conta - more_details_html: Para mais pormenores, leia a política de privacidade. - username_available: O seu nome de utilizador ficará novamente disponível - username_unavailable: O seu nome de utilizador permanecerá indisponível + data_removal: As tuas publicações e outros dados serão eliminados permanentemente + email_change_html: Podes alterar o teu e-mail sem eliminar a tua conta + email_contact_html: Se ainda assim não o recebeste, podes enviar um e-mail para %{email} para obter ajuda + email_reconfirmation_html: Se não recebeste a mensagem de e-mail de confirmação, podes solicitá-la novamente + irreversible: Não será possível restaurar ou reativar a tua conta + more_details_html: Para mais pormenores, lê a política de privacidade. + username_available: O teu nome de utilizador ficará novamente disponível + username_unavailable: O teu nome de utilizador permanecerá indisponível disputes: strikes: action_taken: Ação tomada - appeal: Recorrer - appeal_approved: Esta reprimenda foi alvo dum recurso entretanto deferido, pelo que já não é válida - appeal_rejected: O recurso foi rejeitado - appeal_submitted_at: Recurso submetido - appealed_msg: O seu recurso foi submetido. Se ele for aprovado, será notificado. + appeal: Contestar + appeal_approved: Esta reprimenda foi alvo de uma contestação aceite, pelo que já não é válida + appeal_rejected: A contestação foi rejeitada + appeal_submitted_at: Contestação submetida + appealed_msg: A tua contestação foi submetida. Se for aprovada, receberás uma notificação. appeals: - submit: Submeter recurso - approve_appeal: Deferir recurso + submit: Submeter contestação + approve_appeal: Aprovar contestação associated_report: Denúncia associada created_at: Data - description_html: Estas são ações tomadas contra a sua conta e avisos que lhe foram enviados pela equipa de %{instance}. + description_html: Estas são as ações tomadas contra a tua conta e avisos que te foram enviados pela equipa de %{instance}. recipient: Endereçado a - reject_appeal: Indeferir recurso + reject_appeal: Rejeitar contestação status: 'Publicação #%{id}' status_removed: Publicação já eliminada do sistema title: "%{action} de %{date}" title_actions: - delete_statuses: Remoção de publicação + delete_statuses: Eliminação da publicação disable: Congelamento da conta - mark_statuses_as_sensitive: Marcação das publicações como problemáticas + mark_statuses_as_sensitive: Marcação das publicações como sensíveis none: Advertência - sensitive: Marcação da conta como problemática + sensitive: Marcação da conta como sensível silence: Limitação da conta suspend: Suspensão da conta - your_appeal_approved: O seu recurso foi deferido - your_appeal_pending: Submeteu um recurso - your_appeal_rejected: O seu recurso foi indeferido + your_appeal_approved: A tua contestação foi aprovada + your_appeal_pending: Submeteste uma contestação + your_appeal_rejected: A tua contestação foi rejeitada 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." + hint_html: "Personalizq o que as pessoas veem no teu perfil público e junto das tuas publicações. É mais provável que as outras pessoas te sigam de volta ou interajam contigo se tiveres um perfil preenchido e uma imagem de perfil." other: Outro errors: - '400': O pedido que submeteu foi inválido ou mal formulado. + '400': O pedido que submeteste foi inválido ou mal formulado. '403': Não tens a permissão necessária para ver esta página. - '404': A página que procura não existe. + '404': A página que procuras não existe. '406': Esta página não está disponível no formato solicitado. - '410': A página que procura já não existe. + '410': A página que procuras já não existe. '422': content: "A verificação de segurança falhou. \nDesativaste o uso de cookies?" title: A verificação de segurança falhou '429': Demasiados pedidos '500': - content: Desculpe, mas algo correu mal da nossa parte. + content: Pedimos desculpa, 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 web do Mastodon, ative o JavaScript. Alternativamente, experimente uma das aplicações nativas para o Mastodon na sua plataforma. + noscript_html: Para usar a aplicação web do Mastodon, ativa o JavaScript. Alternativamente, experimenta uma das aplicações nativas para o Mastodon na tua 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} exports: archive_takeout: date: Data - download: Descarregar o seu arquivo - hint_html: Pode pedir um arquivo das suas publicações e ficheiros de media carregados. Os dados no ficheiro exportado estarão no formato ActivityPub, que pode ser lido com qualquer programa compatível. Pode solicitar um arquivo a cada 7 dias. - in_progress: A compilar o seu arquivo... - request: Pedir o seu arquivo + download: Descarregar o teu arquivo + hint_html: Podes pedir um arquivo das tuas publicações e ficheiros multimédia enviados. Os dados no ficheiro exportado estarão no formato ActivityPub, que pode ser lido com qualquer programa compatível. Podes solicitar um arquivo a cada 7 dias. + in_progress: A compilar o teu arquivo... + request: Pedir o teu arquivo size: Tamanho blocks: Bloqueaste bookmarks: Marcadores csv: CSV domain_blocks: Bloqueios de domínio lists: Listas - mutes: Que ocultou + mutes: Que ocultaste storage: Armazenamento de multimédia featured_tags: add_new: Adicionar nova errors: - limit: Já destacou o número máximo de etiquetas permitido - hint_html: "Coloque as etiquetas mais importantes no seu perfil. Uma excelente ferramenta para acompanhar os seus trabalhos criativos e projetos a longo prazo, as etiquetas em destaque são apresentadas de forma proeminente no seu perfil e permitem um acesso rápido às suas próprias publicações." + limit: Já destacaste o número máximo de etiquetas permitido + hint_html: "Coloca as etiquetas mais importantes no teu perfil. Uma excelente ferramenta para acompanhar os teus trabalhos criativos e projetos a longo prazo, as etiquetas em destaque são apresentadas de forma proeminente no teu perfil e permitem um acesso rápido às tuas próprias publicações." filters: contexts: account: Perfis @@ -1343,15 +1343,15 @@ pt-PT: add_keyword: Adicionar palavra-chave keywords: Palavras-chave statuses: Publicações individuais - 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. + statuses_hint_html: Este filtro aplica-se a publicações individuais selecionadas independentemente de estas corresponderem às palavras-chave abaixo. Revê ou remove 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 de um filtro de palavra-chave. Use uma aplicação mais recente ou a interface web. + 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. Usa uma aplicação mais recente ou a interface web. invalid_context: Inválido ou nenhum contexto fornecido index: contexts: Filtros em %{contexts} delete: Eliminar - empty: Não tem filtros. + empty: Não tens filtros. expires_in: Expira em %{distance} expires_on: Expira em %{date} keywords: @@ -1372,16 +1372,16 @@ pt-PT: batch: remove: Retirar do filtro index: - hint: Este filtro aplica-se a publicações individuais selecionadas independentemente de outros critérios. Pode adicionar mais publicações a este filtro através da interface web. + hint: Este filtro aplica-se a publicações individuais selecionadas independentemente de outros critérios. Podes adicionar mais publicações a este filtro através da interface web. title: Publicações filtradas generic: all: Tudo all_items_on_page_selected_html: one: "%{count} item nesta página está selecionado." - other: Todo os %{count} items nesta página estão selecionados. + other: Todo os %{count} itens nesta página estão selecionados. all_matching_items_selected_html: - one: "%{count} item que corresponde à sua pesquisa está selecionado." - other: Todos os %{count} items que correspondem à sua pesquisa estão selecionados. + one: "%{count} item que corresponde à pesquisa está selecionado." + other: Todos os %{count} itens que correspondem à pesquisa estão selecionados. cancel: Cancelar changes_saved_msg: Alterações guardadas! confirm: Confirmar @@ -1392,12 +1392,12 @@ pt-PT: order_by: Ordenar por save_changes: Guardar alterações select_all_matching_items: - one: Selecione %{count} item que corresponde à sua pesquisa. - other: Selecione todos os %{count} items que correspondem à sua pesquisa. + one: Selecionar %{count} item que corresponde à pesquisa. + other: Selecionar todos os %{count} itens que correspondem à pesquisa. today: hoje validation_errors: - one: Algo não está correcto. Por favor analise o erro abaixo - other: Algo ainda não está correto! Reveja os %{count} erros abaixo + one: Algo ainda não está correto! Revê o erro abaixo + other: Algo ainda não está correto! Revê os %{count} erros abaixo imports: errors: empty: Ficheiro CSV vazio @@ -1407,50 +1407,50 @@ pt-PT: too_large: O ficheiro é demasiado grande failures: Falhas imported: Importado - mismatched_types_warning: Parece que selecionou o tipo errado para esta importação, por favor verifique novamente. + mismatched_types_warning: Parece que selecionaste o tipo errado para esta importação, por favor verifica novamente. modes: merge: Juntar merge_long: Manter os registos existentes e adicionar novos registos - overwrite: Escrever por cima + overwrite: Substituir overwrite_long: Substituir os registos atuais pelos novos overwrite_preambles: blocking_html: - one: Está prestes a substituir a sua lista de bloqueios com até conta%{count} de %{filename}. - other: Está prestes a substituir a sua lista de bloqueios com até %{count} contas de %{filename}. + one: Estás prestes a substituir a tua lista de bloqueios com até conta%{count} de %{filename}. + other: Estás prestes a substituir a tua lista de bloqueios com até %{count} contas de %{filename}. bookmarks_html: - one: Está prestes a substituir os seus marcadores com até %{count} publicações de %{filename}. - other: Está prestes a substituir os seus marcadores com até %{count} publicação de %{filename}. + one: Estás prestes a substituir os teus marcadores com até %{count} publicações de %{filename}. + other: Estás prestes a substituir os teus marcadores com até %{count} publicação de %{filename}. domain_blocking_html: - one: Está prestes a substituir a sua lista de bloqueios de domínio com até %{count} domínio de %{filename}. - other: Está prestes a substituir a sua lista de bloqueios de domínio com até %{count} domínios de %{filename}. + one: Estás prestes a substituir a tua lista de bloqueios de domínio com até %{count} domínio de %{filename}. + other: Estás prestes a substituir a tua lista de bloqueios de domínio com até %{count} domínios de %{filename}. following_html: - one: Está prestes a seguir até %{count} conta de %{filename} e parar de seguir quaisquer outras contas. - other: Está prestes a seguir até %{count} contas de %{filename} e parar de seguir quaisquer outras contas. + one: Estás prestes a seguir até %{count} conta de %{filename} e parar de seguir quaisquer outras contas. + other: Estás prestes a seguir até %{count} contas de %{filename} e parar de seguir quaisquer outras contas. lists_html: - one: Está prestes a substituir as suas listas pelo conteúdo de %{filename}. Até %{count} conta serão adicionadas a novas listas. - other: Está prestes a substituir as suas listas pelo conteúdo de %{filename}. Até %{count} contas serão adicionadas a novas listas. + one: Estás prestes a substituir as tuas listas pelo conteúdo de %{filename}. Até %{count} conta serão adicionadas a novas listas. + other: Estás prestes a substituir as tuas listas pelo conteúdo de %{filename}. Até %{count} contas serão adicionadas a novas listas. muting_html: - one: Está prestes a substituir a sua lista de conta ocultada com até %{count} conta de %{filename}. - other: Está prestes a substituir a sua lista de contas ocultadas com até %{count} contas de %{filename}. + one: Estás prestes a substituir a tua lista de conta ocultada com até %{count} conta de %{filename}. + other: Estás prestes a substituir a tua lista de contas ocultadas com até %{count} contas de %{filename}. preambles: blocking_html: - one: Está prestes a bloquear até %{count} conta de %{filename}. - other: Está prestes a bloquear até %{count} contas de %{filename}. + one: Estás prestes a bloquear até %{count} conta de %{filename}. + other: Estás prestes a bloquear até %{count} contas de %{filename}. bookmarks_html: - one: Está prestes a adicionar até %{count} publicação de %{filename} aos seus marcadores. - other: Está prestes a adicionar até %{count} publicações de %{filename} aos seus marcadores. + one: Estás prestes a adicionar até %{count} publicação de %{filename} aos teus marcadores. + other: Estás prestes a adicionar até %{count} publicações de %{filename} aos teus marcadores. domain_blocking_html: - one: Está prestes a bloquear até %{count} domínio de %{filename}. - other: Está prestes a bloquear até %{count} domínios de %{filename}. + one: Estás prestes a bloquear até %{count} domínio de %{filename}. + other: Estás prestes a bloquear até %{count} domínios de %{filename}. following_html: - one: Está prestes a seguir até %{count} conta de %{filename}. - other: Está prestes a seguir até %{count} contas de %{filename}. + one: Estás prestes a seguir até %{count} conta de %{filename}. + other: Estás prestes a seguir até %{count} contas de %{filename}. lists_html: - one: Está prestes a adicionar até %{count} conta do ficheiro %{filename} para as suas listas. Novas listas serão criadas se não existir uma lista onde as adicionar. - other: Está prestes a adicionar até %{count} contas do ficheiro %{filename} para as suas listas. Novas listas serão criadas se não existir uma lista onde as adicionar. + one: Estás prestes a adicionar até %{count} conta do ficheiro %{filename} para as tuas listas. Novas listas serão criadas se não existir uma lista onde as adicionar. + other: Estás prestes a adicionar até %{count} contas do ficheiro %{filename} para as tuas listas. Novas listas serão criadas se não existir uma lista onde as adicionar. muting_html: - one: Está prestes a ocultar até %{count} conta de %{filename}. - other: Está prestes a ocultar até %{count} contas de %{filename}. + one: Estás prestes a ocultar até %{count} conta de %{filename}. + other: Estás prestes a ocultar até %{count} contas de %{filename}. preface: Podes importar dados que tenhas exportado de outra instância, como a lista de pessoas que segues ou bloqueadas. recent_imports: Importações recentes states: @@ -1459,21 +1459,21 @@ pt-PT: scheduled: Agendado unconfirmed: Não confirmado status: Estado - success: Os seus dados foram enviados correctamente e serão processados em breve + success: Os teus dados foram enviados corretamente e serão processados em breve time_started: Iniciado em titles: - blocking: Importando contas bloqueadas - bookmarks: Importando marcadores - domain_blocking: Importando domínios bloqueados - following: Importando contas seguidas - lists: A importar listas - muting: Importando contas ocultadas + blocking: Importar contas bloqueadas + bookmarks: Importar marcadores + domain_blocking: Importar domínios bloqueados + following: Importar contas seguidas + lists: Importar listas + muting: Importar contas ocultadas type: Tipo de importação type_groups: constructive: Seguidores e marcadores destructive: Bloqueios e ocultados types: - blocking: Lista de bloqueio + blocking: Lista de bloqueios bookmarks: Marcadores domain_blocking: Lista de domínios bloqueados following: Lista de pessoas que estás a seguir @@ -1493,9 +1493,9 @@ pt-PT: expires_in_prompt: Nunca generate: Gerar hiperligação de convite invalid: Este convite não é válido - invited_by: 'Foi convidado por:' + invited_by: 'Foste convidado por:' max_uses: - one: 1 uso + one: 1 utilização other: "%{count} utilizações" max_uses_prompt: Sem limite prompt: Gerar e partilhar hiperligações com outras pessoas para permitir acesso a essa instância @@ -1505,76 +1505,76 @@ pt-PT: title: Convidar pessoas lists: errors: - limit: Atingiu o número máximo de listas permitido + limit: Atingiste o número máximo de listas permitido login_activities: authentication_methods: otp: aplicação de autenticação de dois fatores password: palavra-passe sign_in_token: código de segurança de e-mail webauthn: chaves de segurança - description_html: Se vir atividade que não reconhece, considere alterar a sua palavra-passe e ativar a autenticação de dois fatores. + description_html: Se vires atividade que não reconheces, considera alterar a tua palavra-passe e ativar a autenticação de dois fatores. empty: Sem histórico de autenticação disponível failed_sign_in_html: Tentativa falhada de início de sessão com %{method} de %{ip} (%{browser}) - successful_sign_in_html: Sessão correctamente iniciada com %{method} de %{ip} (%{browser}) + successful_sign_in_html: Sessão corretamente iniciada com %{method} de %{ip} (%{browser}) title: Histórico de autenticação mail_subscriptions: unsubscribe: action: Sim, cancelar subscrição - complete: Subscrição Cancelada - confirmation_html: Tem a certeza que deseja cancelar a subscrição para receber %{type} pelo Mastodon em %{domain} no seu e-mail em %{email}? Pode sempre subscrever novamente nas suas definições de notificação por e-mail. + complete: Subscrição cancelada + confirmation_html: Tens a certeza que desejas cancelar a subscrição para receber %{type} pelo Mastodon em %{domain} no teu e-mail em %{email}? Podes sempre subscrever novamente nas tuas definições de notificação por e-mail. emails: notification_emails: favourite: e-mails de notificação de favoritos follow: e-mails de notificação de seguidor follow_request: e-mails de pedido de seguidor mention: e-mails de notificação de menção - reblog: notificações por e-mail de impulsos - resubscribe_html: Se tiver anulado a subscrição por engano, pode voltar a subscrevê-la nas definições de notificação por e-mail. - success_html: Não receberá novamente %{type} do Mastodon em %{domain} para o seu e-mail em %{email}. + reblog: e-mails de notificação de impulsos + resubscribe_html: Se tiveres anulado a subscrição por engano, podes voltar a subscrevê-la nas definições de notificação por e-mail. + success_html: Não receberás novamente %{type} do Mastodon em %{domain} para o teu e-mail em %{email}. title: Cancelar subscrição media_attachments: validations: images_and_video: Não é possível anexar um vídeo a uma publicação que já contém imagens not_found: Multimédia %{ids} não encontrada ou já anexada a outra publicação - not_ready: Não é possível anexar ficheiros que ainda não acabaram de ser processados. Tente outra vez daqui a pouco! + not_ready: Não é possível anexar ficheiros que ainda não acabaram de ser processados. Tenta outra vez daqui a pouco! too_many: Não é possível anexar mais de 4 ficheiros migrations: acct: Mudou-se para cancel: Cancelar redirecionamento - cancel_explanation: Cancelar o redirecionamento irá reativar a sua conta atual, mas não trará de volta os seguidores que foram migrados para essa conta. - cancelled_msg: Cancelou corretamente o redirecionamento. + cancel_explanation: Se cancelares o redirecionamento irás reativar a tua conta atual, mas não trará de volta os seguidores que foram migrados para essa conta. + cancelled_msg: Redirecionamento cancelado corretamente. errors: - already_moved: é a mesma conta para a qual já migrou - missing_also_known_as: não é um pseudónimo dessa conta - move_to_self: não pode ser conta atual + already_moved: é a mesma conta para a qual já migraste + missing_also_known_as: não é um pseudónimo desta conta + move_to_self: não pode ser a conta atual not_found: não foi encontrado - on_cooldown: Você está no período de espera + on_cooldown: Estás no período de espera followers_count: Seguidores no momento da migração incoming_migrations: A migrar de uma conta diferente incoming_migrations_html: Para passar de outra conta para esta, primeiro é necessário criar um pseudónimo de conta. - moved_msg: A sua conta está agora a ser redirecionada para %{acct} e os seus seguidores estão a ser transferidos. - not_redirecting: A sua conta não está atualmente a ser redirecionada para nenhuma outra conta. - on_cooldown: Migrou recentemente a sua conta. Esta função ficará disponível novamente em %{count} dias. + moved_msg: A tua conta está agora a ser redirecionada para %{acct} e os teus seguidores estão a ser transferidos. + not_redirecting: A rua conta não está atualmente a ser redirecionada para nenhuma outra conta. + on_cooldown: Migraste recentemente a tua conta. Esta função ficará disponível novamente em %{count} dias. past_migrations: Migrações anteriores proceed_with_move: Migrar seguidores - redirected_msg: A sua conta está agora a ser redirecionada para %{acct}. - redirecting_to: A sua conta está a ser redirecionada para %{acct}. + redirected_msg: A tua conta está agora a redirecionar para %{acct}. + redirecting_to: A tua conta está a redirecionar para %{acct}. set_redirect: Definir redirecionamento warning: backreference_required: A nova conta deve primeiro ser configurada para que esta seja referenciada - before: 'Antes de continuar, leia cuidadosamente estas notas:' - cooldown: Após a migração, há um período de tempo de espera durante o qual não poderá voltar a migrar - disabled_account: Posteriormente, a sua conta atual não será totalmente utilizável. No entanto, continuará a ter acesso à exportação de dados, bem como à reativação. + before: 'Antes de continuares, lê cuidadosamente estas notas:' + cooldown: Após a migração, há um período de tempo de espera durante o qual não poderás voltar a migrar + disabled_account: Posteriormente, a tua conta atual não será totalmente utilizável. No entanto, continuarás a ter acesso à exportação de dados, bem como à reativação. followers: Esta ação irá migrar todos os seguidores da conta atual para a nova conta - only_redirect_html: Em alternativa, pode apenas colocar um redirecionamento no seu perfil. + only_redirect_html: Em alternativa, podes apenas colocar um redirecionamento no teu perfil. other_data: Nenhum outro dado será migrado automaticamente - redirect: O perfil da sua conta atual será atualizado com um aviso de redirecionamento e será excluído das pesquisas + redirect: O perfil da tua conta atual será atualizado com um aviso de redirecionamento e será excluído das pesquisas moderation: title: Moderação move_handler: - carry_blocks_over_text: Este utilizador migrou de %{acct}, que você tinha bloqueado. - carry_mutes_over_text: Este utilizador migrou de %{acct}, que você tinha ocultado. - copy_account_note_text: 'Este utilizador migrou de %{acct}, aqui estão as suas notas anteriores sobre ele:' + carry_blocks_over_text: Este utilizador migrou de %{acct}, que tinhas bloqueado. + carry_mutes_over_text: Este utilizador migrou de %{acct}, que tinhas ocultado. + copy_account_note_text: 'Este utilizador migrou de %{acct}, aqui estão as tuas notas anteriores sobre ele:' navigation: toggle_menu: Alternar o menu notification_mailer: @@ -1584,11 +1584,11 @@ pt-PT: sign_up: subject: "%{name} inscreveu-se" favourite: - body: 'A sua publicação foi adicionada aos favoritos por %{name}:' - subject: "%{name} adicionou a sua publicação aos favoritos" + body: 'A tua publicação foi adicionada aos favoritos por %{name}:' + subject: "%{name} adicionou a tua publicação aos favoritos" title: Novo favorito follow: - body: "%{name} é seu seguidor!" + body: "%{name} está a seguir-te!" subject: "%{name} começou a seguir-te" title: Novo seguidor follow_request: @@ -1602,10 +1602,10 @@ pt-PT: subject: "%{name} mencionou-te" title: Nova menção poll: - subject: A sondagem de %{name} encerrou + subject: A sondagem de %{name} terminou reblog: - body: 'A sua publicação foi impulsionada por %{name}:' - subject: "%{name} impulsionou a sua publicação" + body: 'A tua publicação foi impulsionada por %{name}:' + subject: "%{name} impulsionou a tua publicação" title: Novo impulso status: subject: "%{name} acabou de publicar" @@ -1614,7 +1614,7 @@ pt-PT: notifications: administration_emails: Notificações por e-mail do administrador email_events: Eventos para notificações por e-mail - email_events_hint: 'Selecione os casos para os quais deseja receber notificações:' + email_events_hint: 'Seleciona os casos para os quais desejas receber notificações:' number: human: decimal_units: @@ -1627,28 +1627,28 @@ pt-PT: trillion: T otp_authentication: code_hint: Introduz o código gerado pela tua aplicação de autenticação para confirmar - description_html: Se ativar a autenticação de dois fatores utilizando uma aplicação de autenticação, para iniciar sessão terá de estar na posse do seu telemóvel, que gerará tokens para introduzir. + description_html: Se ativares a autenticação de dois fatores utilizando uma aplicação de autenticação, para iniciar sessão terás de estar na posse do seu telemóvel, que gerará tokens para introduzires. enable: Ativar - instructions_html: "Digitalize este código QR no Google Authenticator ou numa aplicação TOTP semelhante a partir do seu telemóvel. A partir desse momento, essa aplicação irá gerar tokens que terá que inserir para aceder à sua conta." - manual_instructions: 'Se não conseguir digitalizar o código QR e precisar de o inserir manualmente, eis o código por extenso:' + instructions_html: "Digitaliza este código QR no Google Authenticator ou numa aplicação TOTP semelhante a partir do teu telemóvel. A partir desse momento, essa aplicação irá gerar tokens que terás que inserir para acederes à tua conta." + manual_instructions: 'Se não conseguires digitalizar o código QR e precisares de o inserir manualmente, eis o código por extenso:' setup: Configurar wrong_code: O código introduzido é inválido! A hora do servidor e a hora do dispositivo estão corretos? pagination: newer: Mais nova next: Seguinte - older: Mais velha + older: Mais antiga prev: Anterior truncate: "…" polls: errors: - already_voted: Tu já votaste nesta sondagem + already_voted: Já votaste nesta sondagem duplicate_options: contém itens duplicados duration_too_long: está demasiado à frente no futuro - duration_too_short: é demasiado em cima da hora + duration_too_short: é demasiado cedo expired: A sondagem já terminou invalid_choice: A opção de voto escolhida não existe over_character_limit: não pode ter mais do que %{max} caracteres cada um - self_vote: Não pode votar numa sondagem criada por si + self_vote: Não podes votar numa sondagem criada por ti too_few_options: tem de ter mais do que um item too_many_options: não pode conter mais do que %{max} itens preferences: @@ -1656,33 +1656,33 @@ pt-PT: posting_defaults: Padrões de publicação public_timelines: Cronologias públicas privacy: - hint_html: "Defina como quer que o seu perfil e as suas publicações sejam encontrados. Várias funcionalidades no Mastodon podem ajudar a alcançar um público mais amplo quando ativadas. Tire um momento para rever estas definições para garantir que se aplicam ao seu caso de uso." + hint_html: "Define como queres que o teu perfil e as tuas publicações são encontradas. Várias funcionalidades no Mastodon podem ajudar a alcançar um público mais amplo quando ativadas. Tira um momento para rever estas definições para garantir que se aplicam ao teu caso de utilização." privacy: Privacidade - privacy_hint_html: Controle quanto pretende partilhar para o benefício de outros. As pessoas descobrem perfis e aplicações interessantes navegando pelos seguidores de outras pessoas e vendo que aplicações eles usam para publicar, mas pode preferir não revelar essa informação. + privacy_hint_html: Controla quanto pretendes partilhar para o benefício de outros. As pessoas descobrem perfis e aplicações interessantes navegando pelos seguidores de outras pessoas e vendo que aplicações eles usam para publicar, mas podes preferir não revelar essa informação. reach: Alcance - reach_hint_html: Controle se quer ser descoberto e seguido por novas pessoas. Quer que as suas publicações apareçam no ecrã Explorar? Pretende que outras pessoas o vejam nas suas recomendações? Quer aceitar todos os novos seguidores automaticamente, ou ter um controlo individual sobre cada um? + reach_hint_html: Controla se queres ser descoberto e seguido por novas pessoas. Queres que as tuas publicações apareçam no ecrã Explorar? Pretendes que outras pessoas te vejam nas recomendações deles? Queres aceitar todos os novos seguidores automaticamente ou ter um controlo individual sobre cada um? search: Pesquisa - search_hint_html: Controle como deseja ser encontrado. Quer que as pessoas o encontrem com base nas suas publicações? Que pessoas fora do Mastodon encontrem o seu perfil quando pesquisarem na web? Note que a exclusão total de todos os motores de busca não pode ser garantida para informação pública. + search_hint_html: Controla como desejas ser encontrado. Queres que as pessoas te encontrem com base nas tuas publicações? Que pessoas fora do Mastodon encontrem o teu perfil quando pesquisarem na web? Nota que a exclusão total de todos os motores de busca não pode ser garantida para informação pública. title: Privacidade e alcance privacy_policy: title: Política de Privacidade reactions: errors: - limit_reached: Alcançado limite de reações diferentes + limit_reached: Foi atingido o limite de diferentes reações unrecognized_emoji: não é um emoji reconhecido redirects: - prompt: Se confia nesta hiperligação, clique nela para continuar. - title: Está a deixar %{instance}. + prompt: Se confias nesta hiperligação, clica nela para continuar. + title: Estás a deixar %{instance}. relationships: activity: Atividade da conta - confirm_follow_selected_followers: Tem a certeza que deseja seguir os seguidores selecionados? - confirm_remove_selected_followers: Tem a certeza que deseja seguir os seguidores selecionados? - confirm_remove_selected_follows: Tem certeza que deseja remover os seguidores selecionados? + confirm_follow_selected_followers: Tens a certeza que desejas seguir os seguidores selecionados? + confirm_remove_selected_followers: Tens a certeza que desejas seguir os seguidores selecionados? + confirm_remove_selected_follows: Tens certeza que desejas remover os seguidores selecionados? dormant: Inativo follow_failure: Não foi possível seguir algumas das contas selecionadas. follow_selected_followers: Seguir seguidores selecionados followers: Seguidores - following: A seguir + following: Seguindo invited: Convidado last_active: Última atividade most_recent: Mais recente @@ -1695,7 +1695,7 @@ pt-PT: remove_selected_follows: Deixar de seguir os utilizadores selecionados status: Estado da conta remote_follow: - missing_resource: Não foi possível encontrar o URL de redirecionamento para a sua conta + missing_resource: Não foi possível encontrar o URL de redirecionamento para a tua conta reports: errors: invalid_rules: não faz referência a regras válidas @@ -1705,11 +1705,11 @@ pt-PT: account: Publicações públicas de @%{acct} tag: 'Publicações públicas marcadas com #%{hashtag}' scheduled_statuses: - over_daily_limit: Excedeste o limite de %{limit} publicações agendadas para esse dia - over_total_limit: Tu excedeste o limite de %{limit} publicações agendadas + over_daily_limit: Excedeste o limite de %{limit} publicações agendadas para hoje + over_total_limit: Excedeste o limite de %{limit} publicações agendadas too_soon: a data tem de ser no futuro self_destruct: - lead_html: Infelizmente, %{domain} vai fechar definitivamente. Se lá tinha conta, não pode continuar a usá-la, mas ainda pode pedir uma cópia dos seus dados. + lead_html: Infelizmente, %{domain} vai fechar definitivamente. Se tinhas conta nele, não podes continuar a usá-lo, mas ainda podes pedir uma cópia dos teus dados. title: Este servidor vai fechar sessions: activity: Última atividade @@ -1732,7 +1732,7 @@ pt-PT: qq: QQ Browser safari: Safari uc_browser: Navegador UC - unknown_browser: Navegador Desconhecido + unknown_browser: Navegador desconhecido weibo: Weibo current_session: Sessão atual date: Data @@ -1749,14 +1749,14 @@ pt-PT: kai_os: KaiOS linux: Linux mac: macOS - unknown_platform: Plataforma Desconhecida + unknown_platform: Plataforma desconhecida windows: Windows windows_mobile: Windows Mobile windows_phone: Windows Phone revoke: Revogar - revoke_success: Sessão correctamente revogada + revoke_success: Sessão corretamente revogada title: Sessões - view_authentication_history: Ver histórico de autenticação da sua conta + view_authentication_history: Ver histórico de autenticação da tua conta settings: account: Conta account_settings: Definições da conta @@ -1777,20 +1777,20 @@ pt-PT: profile: Perfil relationships: Seguindo e seguidores severed_relationships: Relações cortadas - statuses_cleanup: Remoção automática da publicação - strikes: Punições de moderação + statuses_cleanup: Eliminação automática da publicação + strikes: Reprimendas de moderação two_factor_authentication: Autenticação de dois fatores webauthn_authentication: Chaves de segurança severed_relationships: - download: Transferir (%{count}) + download: Descarregar (%{count}) event_type: account_suspension: Suspensão de conta (%{target_name}) domain_block: Suspensão de servidor (%{target_name}) user_domain_block: Bloqueou %{target_name} lost_followers: Seguidores perdidos - lost_follows: Pessoas que segue perdidas - preamble: Pode perder seguidores e pessoas que segue quando bloqueia um domínio ou quando os seus moderadores decidem suspender um servidor remoto. Quando isso acontecer, poderá descarregar listas de relações cortadas, para serem inspecionadas e possivelmente importadas para outro servidor. - purged: Informações sobre este servidor foram purgadas pelos administradores do seu servidor. + lost_follows: Contas seguidas perdidas + preamble: Podes perder seguidores e pessoas que segues quando bloqueias um domínio ou quando os teus moderadores decidem suspender um servidor remoto. Quando isso acontecer, poderás descarregar as listas de relações cortadas, para serem inspecionadas e possivelmente importadas para outro servidor. + purged: As informações sobre este servidor foram purgadas pelos administradores do servidor. type: Evento statuses: attached: @@ -1809,15 +1809,15 @@ pt-PT: default_language: Igual ao idioma da interface disallowed_hashtags: one: 'continha uma #etiqueta proibida: %{tags}' - other: 'continha as hashtags proibidas: %{tags}' + other: 'continha as #etiquetas proibidas: %{tags}' edited_at_html: Editado em %{date} errors: - in_reply_not_found: A publicação a que está a tentar responder parece não existir. - over_character_limit: limite de caracter excedeu %{max} + in_reply_not_found: A publicação a que estás a tentar responder parece não existir. + over_character_limit: limite de caracteres %{max} excedido pin_errors: - direct: Publicações visíveis apenas para utilizadores mencionados não podem ser afixadas - limit: Já afixaste a quantidade máxima de publicações - ownership: Não podem ser afixadas publicações doutras pessoas + direct: As publicações que só são visíveis para os utilizadores mencionados não podem ser fixadas + limit: Já fixaste a quantidade máxima de publicações + ownership: Não podem ser fixadas publicações de outras pessoas reblog: Não é possível fixar um impulso title: '%{name}: "%{quote}"' visibilities: @@ -1829,26 +1829,26 @@ pt-PT: unlisted: Não inventariado unlisted_long: Todos podem ver, mas não será inventariado nas cronologias públicas statuses_cleanup: - enabled: Apagar publicações antigas automaticamente - enabled_hint: Apaga automaticamente as suas publicações assim que atingirem um certo limite de tempo, a não ser que correspondam a uma das seguintes excepções + enabled: Eliminar publicações antigas automaticamente + enabled_hint: Elimina automaticamente as tuas publicações assim que atingirem um certo limite de tempo, a não ser que correspondam a uma das seguintes exceções exceptions: Exceções - explanation: Como apagar publicações é uma operação custosa, isto é feito lentamente ao longo do tempo, quando o servidor não está ocupado. Por esta razão, as suas publicações podem ser apagadas um pouco depois de atingirem o limite de idade definido. + explanation: Como eliminar publicações é uma operação custosa, isto é feito lentamente ao longo do tempo, quando o servidor não está ocupado. Por esta razão, as tuas publicações podem ser eliminadas um pouco depois de atingirem o limite de idade definido. ignore_favs: Ignorar favoritos ignore_reblogs: Ignorar os impulsos interaction_exceptions: Exceções baseadas em interações - interaction_exceptions_explanation: Tenha em atenção que não há garantia de que as mensagens sejam eliminadas se ficarem abaixo do limite de favoritos ou de impulsionamento depois de os terem ultrapassado. + interaction_exceptions_explanation: Tem em atenção que não há garantia de que as mensagens sejam eliminadas se ficarem abaixo do limite de favoritos ou de impulsionamento depois de os terem ultrapassado. keep_direct: Manter mensagens diretas - keep_direct_hint: Não apaga nenhuma das suas mensagens diretas + keep_direct_hint: Não elimina nenhuma das tuas mensagens diretas keep_media: Manter publicações com anexos de multimédia - keep_media_hint: Não elimina nenhuma das suas publicações com multimédia anexada + keep_media_hint: Não elimina nenhuma das tuas publicações com multimédia anexada keep_pinned: Manter publicações afixadas - keep_pinned_hint: Não apagar nenhuma das suas publicações afixadas + keep_pinned_hint: Não elimina nenhuma das tuas publicações afixadas keep_polls: Manter sondagens - keep_polls_hint: Não apaga nenhuma das suas sondagens - keep_self_bookmark: Manter as publicações que marcou - keep_self_bookmark_hint: Não elimina as suas próprias publicações se as tiver nos marcadores - keep_self_fav: Manter as publicações que adicionou aos favoritos - keep_self_fav_hint: Não elimina as suas próprias publicações se as tiver adicionado aos favoritos + keep_polls_hint: Não elimina nenhuma das tuas sondagens + keep_self_bookmark: Manter as publicações que marquei + keep_self_bookmark_hint: Não elimina as tuas próprias publicações se as tiveres nos marcadores + keep_self_fav: Manter as publicações que adicionei aos favoritos + keep_self_fav_hint: Não elimina as tuas próprias publicações se as tiveres adicionado aos favoritos min_age: '1209600': 2 semanas '15778476': 6 meses @@ -1860,14 +1860,14 @@ pt-PT: '7889238': 3 meses min_age_label: Limite de idade min_favs: Manter publicações adicionadas aos favoritos pelos menos - min_favs_hint: Não elimina nenhuma das suas publicações que tenha sido adicionada aos favoritos este número de vezes. Deixe em branco para eliminar publicações, independentemente do número de vezes que tenham sido adicionadas aos favoritos + min_favs_hint: Não elimina nenhuma das tuas publicações que tenham sido adicionadas aos favoritos este número de vezes. Deixa em branco para eliminar publicações, independentemente do número de vezes que tenham sido adicionadas aos favoritos min_reblogs: Manter as publicações impulsionadas, pelo menos - min_reblogs_hint: Não elimina nenhuma das suas mensagens que tenha sido impulsionada pelo menos este número de vezes. Deixe em branco para apagar as mensagens independentemente do número de impulsionamentos + min_reblogs_hint: Não elimina nenhuma das tuas mensagens que tenham sido impulsionada pelo menos este número de vezes. Deixa em branco para eliminar as mensagens independentemente do número de impulsionamentos stream_entries: - sensitive_content: Conteúdo problemático + sensitive_content: Conteúdo sensível strikes: errors: - too_late: É tarde demais para recorrer desta reprimenda + too_late: É tarde demais para contestar esta reprimenda tags: does_not_match_previous_name: não coincide com o nome anterior terms_of_service: @@ -1895,109 +1895,109 @@ pt-PT: enabled: A autenticação de dois fatores está ativada enabled_success: Autenticação de dois fatores ativada com sucesso generate_recovery_codes: Gerar códigos para recuperar conta - lost_recovery_codes: Os códigos de recuperação permitem que recupere o acesso à sua conta caso perca o seu telemóvel. Se perder os códigos de recuperação, pode criar uns novos aqui. Os seus códigos antigos serão revogados. + lost_recovery_codes: Os códigos de recuperação permitem que recupere o acesso à tua conta caso percas o teu telemóvel. Se perderes os códigos de recuperação, podes criar uns novos aqui. Os teus códigos antigos serão revogados. methods: Métodos de autenticação de dois fatores otp: Aplicação de autenticação recovery_codes: Cópia de segurança dos códigos de recuperação recovery_codes_regenerated: Os códigos de recuperação foram corretamente gerados - recovery_instructions_html: Se perder o seu telemóvel, poderá usar um dos códigos de recuperação para voltar a ter acesso à sua conta. Guarde os códigos de recuperação em lugar seguro. Por exemplo, pode imprimi-los e guardá-los junto doutros documentos importantes. + recovery_instructions_html: Se perderes o seu telemóvel, poderás usar um dos códigos de recuperação para voltares a ter acesso à tua conta. Guarda os códigos de recuperação em lugar seguro. Por exemplo, podes imprimi-los e guardá-los junto a outros documentos importantes. webauthn: Chaves de segurança user_mailer: appeal_approved: - action: Configurações de Conta - explanation: O recurso à reprimenda contra a sua conta de %{strike_date}, enviado a %{appeal_date}, foi deferido. A sua conta encontra-se novamente em situação regular. - subject: O seu recurso de %{date} foi deferido - subtitle: A sua conta está em situação regular novamente. - title: Recurso deferido + action: Configurações da conta + explanation: A contestação à reprimenda contra a tua conta em %{strike_date}, enviada a %{appeal_date}, foi aceite. A tua conta encontra-se novamente em situação regular. + subject: A tua contestação em %{date} foi aceite + subtitle: A tua conta está em situação regular novamente. + title: Contestação aceite appeal_rejected: - explanation: O recurso à punição contra a sua conta de %{strike_date}, submetido em %{appeal_date}, foi indeferido. - subject: O seu recurso de %{date} foi indeferido - subtitle: O seu recurso foi rejeitado. - title: Recurso indeferido + explanation: A contestação à reprimenda contra a tua conta em %{strike_date}, submetida em %{appeal_date}, foi rejeitada. + subject: A tua contestação a %{date} foi rejeitada + subtitle: A tua contestação foi rejeitada. + title: Contestação rejeitada backup_ready: - explanation: Pediu uma cópia completa da sua conta Mastodon. - extra: Está pronta para transferir! - subject: O seu arquivo está pronto para ser descarregado + explanation: Pediste uma cópia de segurança da tua conta Mastodon. + extra: Está pronta para ser descarregada! + subject: O teu arquivo está pronto para ser descarregado title: Arquivo de ficheiros failed_2fa: - details: 'Aqui estão os detalhes da tentativa de entrada:' - explanation: Alguém tentou iniciar sessão na sua conta, mas forneceu um segundo fator de autenticação inválido. - further_actions_html: Se não foi você, recomendamos que %{action} imediatamente, pois pode a sua conta pode ter sido comprometida. + details: 'Eis os pormenores da tentativa de início de sessão:' + explanation: Alguém tentou iniciar sessão na tua conta, mas forneceu um segundo fator de autenticação inválido. + further_actions_html: Se não foste tu, recomendamos %{action} imediatamente, pois a conta pode ter sido comprometida. subject: Falha na autenticação do segundo fator title: Falha na autenticação do segundo fator suspicious_sign_in: - change_password: alterar a sua palavra-passe + change_password: alterar a palavra-passe details: 'Eis os pormenores do início de sessão:' - explanation: Detectámos um início de sessão na sua conta a partir dum endereço IP novo. - further_actions_html: Se não foi você, recomendamos que %{action} imediatamente e ative a autenticação de dois fatores para manter a sua conta segura. - subject: A sua conta foi acedida a partir dum endereço IP novo + explanation: Detetámos um início de sessão na tua conta a partir dum endereço IP novo. + further_actions_html: Se não foste tu, recomendamos %{action} imediatamente e ativar a autenticação de dois fatores para manter a conta segura. + subject: A tua conta foi acedida a partir de um endereço IP novo title: Um início de sessão novo terms_of_service_changed: - agreement: Ao continuar a utilizar %{domain}, concorda com estes termos. Se discordar dos termos atualizados, poderá rescindir o seu acordo com %{domain} a qualquer momento, eliminando a sua conta. - changelog: 'Em resumo, eis o que esta atualização significa para si:' - description: 'Está a receber esta mensagem de correio eletrónico porque estamos a fazer algumas alterações aos nossos termos de serviço em %{domain}. Recomendamos que reveja os termos atualizados na íntegra aqui:' - description_html: Está a receber esta mensagem de correio eletrónico porque estamos a fazer algumas alterações aos nossos termos de serviço em %{domain}. Recomendamos que reveja os termos atualizados na íntegra aqui. + agreement: Ao continuar a utilizar %{domain}, concordas com estes termos. Se discordares dos termos atualizados, poderás rescindir o teu acordo com %{domain} a qualquer momento através da eliminação da tua conta. + changelog: 'Em resumo, eis o que esta atualização significa para ti:' + description: 'Estás a receber esta mensagem de correio eletrónico porque estamos a fazer algumas alterações aos nossos termos de serviço em %{domain}. Recomendamos que revejas os termos atualizados na íntegra aqui:' + description_html: Estás a receber esta mensagem de correio eletrónico porque estamos a fazer algumas alterações aos nossos termos de serviço em %{domain}. Recomendamos que revejas os termos atualizados na íntegra aqui. sign_off: A equipa de %{domain} subject: Atualizações dos nossos termos de serviço subtitle: Os termos de serviço de %{domain} estão a mudar title: Atualização importante warning: - appeal: Submeter um recurso - appeal_description: Se acha que isso é um erro, pode submeter um recurso para a equipa de %{instance}. + appeal: Submeter uma contestação + appeal_description: Se achas que isto é um erro, podes submeter uma contestação para a equipa de %{instance}. categories: spam: Spam violation: O conteúdo infringe as seguintes diretrizes da comunidade explanation: - delete_statuses: Algumas das suas mensagens foram consideradas como violando uma ou mais diretrizes da comunidade e foram subsequentemente removidas pelos moderadores do %{instance}. - disable: Já não pode utilizar a sua conta, mas o seu perfil e outros dados permanecem intactos. Pode solicitar uma cópia de segurança dos seus dados, alterar as definições da conta ou eliminar a sua conta. - mark_statuses_as_sensitive: Algumas das suas publicações foram marcadas como problemáticas pelos moderadores de %{instance}. Isto significa que as pessoas terão de tocar/clicar nas publicações para que possa ser apresentada uma pré-visualização. No futuro, quando publicar, lembre-se que pode você próprio marcar os elementos multimédia como problemáticos. - sensitive: A partir de agora, todos os ficheiros multimédia que enviar serão marcados como problemáticos e escondidos sob um aviso pedido para tocar/clicar para os ver. - silence: Pode ainda utilizar a sua conta mas apenas as pessoas que já o seguem poderão ver as suas mensagens neste servidor, e poderá ser excluído de várias funcionalidades de divulgação. No entanto, outros poderão ainda segui-lo manualmente. - suspend: Não pode mais utilizar a sua conta, e o seu perfil e outros dados já não se encontram acessíveis. Poderá ainda iniciar sessão para solicitar uma cópia dos seus dados até os mesmos serem totalmente removidos em cerca de 30 dias, porém reteremos alguns dados básicos para o impedir evitar a suspensão. + delete_statuses: Algumas das tuas mensagens foram consideradas como violando uma ou mais diretrizes da comunidade e foram subsequentemente removidas pelos moderadores do %{instance}. + disable: Já não podes utilizar a tua conta, mas o teu perfil e outros dados permanecem intactos. Podes solicitar uma cópia de segurança dos teus dados, alterar as definições da conta ou eliminar a tua conta. + mark_statuses_as_sensitive: Algumas das tuas publicações foram marcadas como sensíveis pelos moderadores de %{instance}. Isto significa que as pessoas terão de tocar/clicar nas publicações para que possa ser apresentada uma pré-visualização. No futuro, quando publicares, lembra-te que podes marcar os elementos multimédia como problemáticos. + sensitive: A partir de agora, todos os ficheiros multimédia que enviares serão marcados como sensíveis e escondidos sob um aviso pedido para tocar/clicar para os ver. + silence: Podes ainda utilizar a tua conta, mas apenas as pessoas que já te seguem poderão ver as tuas mensagens neste servidor, e poderás ser excluído de várias funcionalidades de divulgação. No entanto, outros poderão ainda seguir-te manualmente. + suspend: Não podes mais utilizar a tua conta, e o teu perfil e outros dados já não se encontram acessíveis. Poderás ainda iniciar sessão para solicitar uma cópia dos teus dados até os mesmos serem totalmente removidos em cerca de 30 dias, porém reteremos alguns dados básicos para impedirmos que evites a suspensão. reason: 'Motivo:' statuses: 'Publicações citadas:' subject: - delete_statuses: As suas publicações em %{acct} foram removidas + delete_statuses: As tuas publicações em %{acct} foram removidas disable: A tua conta %{acct} foi congelada - mark_statuses_as_sensitive: As suas publicações em %{acct} foram marcadas como problemáticas + mark_statuses_as_sensitive: As tuas publicações em %{acct} foram marcadas como sensíveis none: Aviso para %{acct} - sensitive: A partir de agora, as suas publicações em %{acct} serão marcadas como problemáticas - silence: A sua conta %{acct} foi limitada - suspend: A sua conta %{acct} foi suspensa + sensitive: A partir de agora, as tuas publicações em %{acct} serão marcadas como sensíveis + silence: A tua conta %{acct} foi limitada + suspend: A tua conta %{acct} foi suspensa title: delete_statuses: Publicações removidas disable: Conta congelada - mark_statuses_as_sensitive: Publicações marcadas como problemáticas + mark_statuses_as_sensitive: Publicações marcadas como sensíveis none: Aviso - sensitive: Conta marcada como problemática + sensitive: Conta marcada como sensível silence: Conta limitada suspend: Conta suspensa welcome: - apps_android_action: Baixe no Google Play - apps_ios_action: Baixar na App Store - apps_step: Descarregue as nossas aplicações oficiais. - apps_title: Apps Mastodon + apps_android_action: Obter no Google Play + apps_ios_action: Obter na App Store + apps_step: Descarrega as nossas aplicações oficiais. + apps_title: Aplicações Mastodon checklist_subtitle: 'Vamos começar nesta nova fronteira social:' - checklist_title: Checklist de Boas-vindas + checklist_title: Passos de boas-vindas edit_profile_action: Personalizar - edit_profile_step: Aumente as suas interações com um perfil completo. - edit_profile_title: Personalize seu perfil + edit_profile_step: Aumenta as tuas interações com um perfil completo. + edit_profile_title: Personaliza o teu perfil explanation: Aqui estão algumas dicas para começar feature_action: Mais informações - 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 quer ver na cronologia da sua página inicial. 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_audience: O Mastodon oferece-te uma possibilidade única de gerir a tua audiência sem intermediários. O Mastodon implantado na sua própria infraestrutura permite seguires e seres seguido a partir de qualquer outro servidor Mastodon online e não está sob o controlo de ninguém a não ser o teu. + feature_audience_title: Conquista o teu público + feature_control: Sabes melhor o que queres ver na cronologia da tua página inicial. Não há algoritmos ou anúncios que te façam perder tempo. Segue qualquer pessoa em qualquer servidor Mastodon a partir de uma única conta e recebe as tuas mensagens por ordem cronológica, e torna o teu canto da Internet um pouco mais parecido contigo. + feature_control_title: Mantém o controlo da tua 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 te ajudar a expressares-te online. Quer estejas a publicar a tua arte, a tua música ou o teu podcast, o Mastodon está aqui para ti. feature_creativity_title: Criatividade inigualável - feature_moderation: O Mastodon coloca a tomada de decisões de volta nas 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 o mais flexível para responder às necessidades de diferentes grupos de pessoas. Junte-se a um servidor com as regras com as quais concorda ou aloje o seu próprio servidor. + feature_moderation: O Mastodon coloca a tomada de decisões de volta nas tuas 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 para responder às necessidades de diferentes grupos de pessoas. Junta-te a um servidor com as regras com as quais concordas ou aloja o teu próprio servidor. feature_moderation_title: Moderando como deve ser follow_action: Seguir - follow_step: Seguir pessoas interessantes é do que trata Mastodon. - follow_title: Personalize a cronologia na sua página inicial - follows_subtitle: Siga contas bem conhecidas + follow_step: Seguir pessoas interessantes é o objetivo do Mastodon. + follow_title: Personaliza a cronologia na tua página inicial + follows_subtitle: Segue contas conhecidas follows_title: Quem seguir - follows_view_more: Veja mais pessoas para seguir + follows_view_more: Ver mais pessoas para seguir hashtags_recent_count: one: "%{people} pessoa nos últimos 2 dias" other: "%{people} pessoas nos últimos 2 dias" @@ -2005,44 +2005,44 @@ 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 sondagens. - post_title: Faça a sua primeira publicação + post_step: Diz olá para o mundo com texto, fotos, vídeos ou sondagens. + post_title: Faz a tua primeira publicação share_action: Partilhar - share_step: Diga aos seus amigos como te encontrar no Mastodon. - share_title: Compartilhe seu perfil de Mastodon + share_step: Diz aos teus amigos como te podem encontrar no Mastodon. + share_title: Partilha o teu perfil de Mastodon sign_in_action: Iniciar sessão subject: Bem-vindo ao Mastodon title: Bem-vindo a bordo, %{name}! users: - follow_limit_reached: Não pode seguir mais do que %{limit} pessoas + follow_limit_reached: Não podes seguir mais do que %{limit} pessoas go_to_sso_account_settings: Ir para as definições de conta do seu fornecedor de identidade invalid_otp_token: Código de dois fatores inválido - otp_lost_help_html: Se perdeu o acesso a ambos, pode entrar em contacto com %{email} - rate_limited: Demasiadas tentativas de autenticação, tente novamente mais tarde. + otp_lost_help_html: Se perdeste o acesso a ambos, podes entrar em contacto com %{email} + rate_limited: Demasiadas tentativas de autenticação, tenta novamente mais tarde. seamless_external_login: A sessão foi iniciada através de um serviço externo, pelo que as definições de palavra-passe e e-mail não estão disponíveis. signed_in_as: 'Registado como:' verification: - extra_instructions_html: Dica: a hiperligação no seu site pode ser invisível. A parte importante é
rel="me"
que impede a falsificação de identidade em sítios na web com conteúdos gerados pelos utilizadores. Pode até utilizar uma etiqueta link
no cabeçalho da página ao invés de a
, mas o HTML deve ser acessível sem executar JavaScript.
- here_is_how: Veja como
- hint_html: "Verificar a sua identidade no Mastodon é para todos. Baseado em normas públicas da web, agora e para sempre gratuitas. Tudo o que precisa é de um site pessoal pelo qual as pessoas o reconheçam. Quando coloca no seu perfil uma hiperligação para esse site, vamos verificar que o site tem uma hiperligação de volta para o seu perfil e mostrar um indicador visual."
- instructions_html: Copie e cole o código abaixo no HTML do seu site. Em seguida, adicione o endereço do seu site num dos campos extras no seu perfil, na aba "Editar perfil" e guarde as alterações.
+ extra_instructions_html: Dica: a hiperligação no teu site pode ser invisível. A parte importante é rel="me"
que impede a falsificação de identidade em sítios na web com conteúdos gerados pelos utilizadores. Podes até utilizar uma etiqueta link
no cabeçalho da página ao invés de a
, mas o HTML deve ser acessível sem executar JavaScript.
+ here_is_how: Eis o que fazer
+ hint_html: "Verificar a sua identidade no Mastodon é para todos. Baseado em normas públicas da web, agora e para sempre gratuitas. Tudo o que precisas é de um site pessoal pelo qual as pessoas te reconheçam. Quando colocas no teu perfil uma hiperligação para esse site, vamos verificar que o site tem uma hiperligação de volta para o teu perfil e mostrar um indicador visual."
+ instructions_html: Copia e cola o código abaixo no HTML do teu site. Em seguida, adiciona o endereço do teu site num dos campos extras no teu perfil, na aba "Editar perfil" e guarda as alterações.
verification: Verificação
- verified_links: As suas ligações verificadas
+ verified_links: As tuas hiperligações verificadas
website_verification: Verificação do sítio web
webauthn_credentials:
add: Adicionar nova chave de segurança
create:
- error: Ocorreu um problema ao adicionar sua chave de segurança. Tente novamente.
- success: A sua chave de segurança foi correctamente adicionada.
+ error: Ocorreu um problema ao adicionar a chave de segurança. Tenta novamente.
+ success: A tua chave de segurança foi corretamente adicionada.
delete: Eliminar
- delete_confirmation: Tem a certeza de que pretende eliminar esta chave de segurança?
- description_html: Se activar a autenticação com chave de segurança, vai passar a precisar de usar uma das suas chaves de segurança para aceder à sua conta.
+ delete_confirmation: Tens a certeza de que pretendes eliminar esta chave de segurança?
+ description_html: Se ativares a autenticação com chave de segurança, vais passar a precisar de usar uma das suas chaves de segurança para aceder à tua conta.
destroy:
- error: Ocorreu um problema ao remover a sua chave de segurança. Tente novamente.
- success: A sua chave de segurança foi correctamente eliminada.
+ error: Ocorreu um problema ao remover a tua chave de segurança. Tenta novamente.
+ success: A tua chave de segurança foi corretamente eliminada.
invalid_credential: Chave de segurança inválida
- nickname_hint: Introduza a alcunha da sua nova chave de segurança
- not_enabled: Ainda não ativou o WebAuthn
+ nickname_hint: Introduz a alcunha da tua nova chave de segurança
+ not_enabled: Ainda não ativaste o WebAuthn
not_supported: Este navegador não funciona com chaves de segurança
- otp_required: Para utilizar chaves de segurança, ative primeiro a autenticação de dois fatores.
+ otp_required: Para utilizares chaves de segurança, ativa primeiro a autenticação de dois fatores.
registered_on: Registado em %{date}
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index ff35e13fa8..2db629cafc 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -965,10 +965,12 @@ ru:
generates:
action: Генерировать
chance_to_review_html: "Сгенерированное пользовательское соглашение не будет опубликовано автоматически. У вас будет возможность просмотреть результат. Введите все необходимые сведения, чтобы продолжить."
+ explanation_html: Шаблон пользовательского соглашения приводится исключительно в ознакомительных целях, и не может рассматриваться как юридическая консультация по тому или иному вопросу. Обратитесь к своему юрисконсульту насчёт вашей ситуации и имеющихся правовых вопросов.
title: Создание пользовательского соглашения
history: История
live: Действует
no_history: Нет зафиксированных изменений пользовательского соглашения.
+ no_terms_of_service_html: На данный момент у вас отсутствует пользовательское соглашение. Пользовательское соглашение призвано обеспечить ясность и защитить вас от возможной ответственности в спорных ситуациях с пользователями.
notified_on_html: 'Дата уведомления пользователей: %{date}'
notify_users: Уведомить пользователей
preview:
diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml
index d7be72b876..b68e03b057 100644
--- a/config/locales/simple_form.be.yml
+++ b/config/locales/simple_form.be.yml
@@ -313,6 +313,9 @@ be:
name: Хэштэг
trendable: Дазволіць паказ гэтага хэштэга ў трэндах
usable: Дазволіць допісам выкарыстоўваць гэты хэштэг лакальна
+ terms_of_service_generator:
+ domain: Дамэн
+ jurisdiction: Юрысдыкцыя
user:
role: Роля
time_zone: Часавы пояс
diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml
index 3e8666f38a..37ec359377 100644
--- a/config/locales/simple_form.el.yml
+++ b/config/locales/simple_form.el.yml
@@ -130,6 +130,16 @@ el:
show_application: Θα είσαι πάντα σε θέση να δεις ποια εφαρμογή δημοσίευσε την ανάρτησή σου όπως και να 'χει.
tag:
name: Μπορείς να αλλάξεις μόνο το πλαίσιο των χαρακτήρων, για παράδειγμα για να γίνει περισσότερο ευανάγνωστο
+ terms_of_service:
+ changelog: Μπορεί να δομηθεί με σύνταξη Markdown.
+ text: Μπορεί να δομηθεί με σύνταξη Markdown.
+ terms_of_service_generator:
+ admin_email: Οι νομικές ανακοινώσεις περιλαμβάνουν αντικρούσεις, δικαστικές αποφάσεις, αιτήματα που έχουν ληφθεί και αιτήματα επιβολής του νόμου.
+ arbitration_address: Μπορεί να είναι το ίδιο με τη φυσική διεύθυνση παραπάνω, ή “N/A” εάν χρησιμοποιείται email
+ arbitration_website: Μπορεί να είναι μια φόρμα ιστού, ή “N/A” εάν χρησιμοποιείται email
+ dmca_email: Μπορεί να είναι το ίδιο email που χρησιμοποιείται για “Διεύθυνση email για νομικές ανακοινώσεις” παραπάνω
+ domain: Μοναδικό αναγνωριστικό της διαδικτυακής υπηρεσίας που παρέχεις.
+ jurisdiction: Ανέφερε τη χώρα όπου ζει αυτός που πληρώνει τους λογαριασμούς. Εάν πρόκειται για εταιρεία ή άλλη οντότητα, ανέφερε τη χώρα όπου υφίσταται, και την πόλη, περιοχή, έδαφος ή πολιτεία ανάλογα με την περίπτωση.
user:
chosen_languages: Όταν ενεργοποιηθεί, στη δημόσια ροή θα εμφανίζονται τουτ μόνο από τις επιλεγμένες γλώσσες
role: Ο ρόλος ελέγχει ποια δικαιώματα έχει ο χρήστης.
@@ -319,6 +329,17 @@ el:
name: Ετικέτα
trendable: Εμφάνιση της ετικέτας στις τάσεις
usable: Να επιτρέπεται η τοπική χρήση αυτής της ετικέτας από αναρτήσεις
+ terms_of_service:
+ changelog: Τι άλλαξε;
+ text: Όροι Παροχής Υπηρεσιών
+ terms_of_service_generator:
+ admin_email: Διεύθυνση email για τις νομικές ανακοινώσεις
+ arbitration_address: Φυσική διεύθυνση για τις ανακοινώσεις διαιτησίας
+ arbitration_website: Ιστοσελίδα για την υποβολή ειδοποιήσεων διαιτησίας
+ dmca_address: Φυσική διεύθυνση για ειδοποιήσεις DMCA/πνευματικών δικαιωμάτων
+ dmca_email: Διεύθυνση email για ειδοποιήσεις DMCA/πνευματικών δικαιωμάτων
+ domain: Τομέας
+ jurisdiction: Νομική δικαιοδοσία
user:
role: Ρόλος
time_zone: Ζώνη ώρας
diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml
index 55865587a0..0959ac0d7b 100644
--- a/config/locales/simple_form.es-AR.yml
+++ b/config/locales/simple_form.es-AR.yml
@@ -60,7 +60,7 @@ es-AR:
setting_display_media_default: Ocultar medios marcados como sensibles
setting_display_media_hide_all: Siempre ocultar todos los medios
setting_display_media_show_all: Siempre mostrar todos los medios
- setting_system_scrollbars_ui: Solo aplica para navegadores de escritorio basados en Safari y Chrome
+ setting_system_scrollbars_ui: Solo aplica para navegadores web de escritorio basados en Safari y Chrome
setting_use_blurhash: Los gradientes se basan en los colores de las imágenes ocultas pero haciendo borrosos los detalles
setting_use_pending_items: Ocultar actualizaciones de la línea temporal detrás de un clic en lugar de desplazar automáticamente el flujo
username: Podés usar letras, números y subguiones ("_")
@@ -135,12 +135,12 @@ es-AR:
text: Se puede estructurar con sintaxis Markdown.
terms_of_service_generator:
admin_email: Los avisos legales incluyen devoluciones, órdenes judiciales, solicitudes de retiro y solicitudes de cumplimiento de la ley.
- arbitration_address: Puede ser la misma que la dirección física anterior, o "N/A" si utiliza correo electrónico
- arbitration_website: Puede ser un formulario web, o “N/A” si utiliza correo electrónico
- dmca_address: Para operadores estadounidenses, utilice la dirección registrada en el DMCA Designated Agent Directory. Un listado P.O. Box está disponible bajo petición directa, use la DMCA Designated Agent Post Office Box Waiver Request para enviar un correo electrónico a la Oficina de Derechos de Autor y describir que usted es un moderador de contenido basado en el hogar que teme venganza o represalia por sus acciones y que necesita usar un P.O. Box para eliminar su dirección postal de la vista pública.
- dmca_email: Puede ser el mismo correo electrónico utilizado para "Dirección de correo electrónico para avisos legales" de arriba
+ arbitration_address: Puede ser la misma que la dirección física anterior, o «N.D.» si utiliza correo electrónico
+ arbitration_website: Puede ser un formulario web, o «N.D.» si utiliza correo electrónico
+ dmca_address: Para operadores estadounidenses, usen la dirección registrada en el Directorio de Agente Designado del DMCA. Una lista de casillas de correo está disponible bajo petición directa, usen la solicitud de exención del apartado postal del agente designado de la DMCA para enviar un correo electrónico a la Oficina de Derechos de Autor y describir que ustedes son moderadores de contenido basado en el hogar que temen venganza o represalia por sus acciones y que necesitan usar una casilla de correo para eliminar su dirección postal de la vista pública.
+ dmca_email: Puede ser el mismo correo electrónico utilizado para «Dirección de correo electrónico para avisos legales» de arriba
domain: Identificación única del servicio en línea que estás proporcionando.
- jurisdiction: Lista el país donde vive quien paga las facturas. Si es una empresa u otra entidad, enumere el país donde está basada y la ciudad, región, territorio o estado según corresponda.
+ jurisdiction: Listá el país donde vive quien paga las facturas. Si es una empresa u otra entidad, enumerá el país donde está basada y la ciudad, región, territorio o provincia/estado, según corresponda.
user:
chosen_languages: Cuando estén marcados, sólo se mostrarán los mensajes en los idiomas seleccionados en las líneas temporales públicas
role: El rol controla qué permisos tiene el usuario.
@@ -235,7 +235,7 @@ es-AR:
setting_hide_network: Ocultá tu gráfica social
setting_reduce_motion: Reducir el movimiento de las animaciones
setting_system_font_ui: Utilizar la tipografía predeterminada del sistema
- setting_system_scrollbars_ui: Utilizar barra de desplazamiento predeterminada del sistema
+ setting_system_scrollbars_ui: Usar la barra de desplazamiento predeterminada del sistema operativo
setting_theme: Tema del sitio
setting_trends: Mostrar las tendencias de hoy
setting_unfollow_modal: Mostrar diálogo de confirmación antes de dejar de seguir a una cuenta
@@ -331,7 +331,7 @@ es-AR:
trendable: Permitir que esta etiqueta aparezca bajo tendencias
usable: Permitir que los mensajes usen esta etiqueta localmente
terms_of_service:
- changelog: "¿Qué ha cambiado?"
+ changelog: "¿Qué cambió?"
text: Términos del servicio
terms_of_service_generator:
admin_email: Dirección de correo electrónico para avisos legales
diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml
index 6b58e59fd4..e8df5dda47 100644
--- a/config/locales/simple_form.et.yml
+++ b/config/locales/simple_form.et.yml
@@ -128,6 +128,9 @@ et:
show_application: Sa saad sõltumata sellest vaadata, milline äpp su postituse postitas.
tag:
name: Saad muuta ainult tähtede suurtähelisust, näiteks selleks, et muuta seda loetavamaks
+ terms_of_service_generator:
+ dmca_address: USA operaatorite puhul kasuta DMCA määratud esindajate kataloogis registreeritud aadressi. Postkastide loetelu on saadaval otsese taotluse korral. Kasuta DMCA määratud esindaja postkastist loobumise taotlust, et saata e-kiri autoriõiguse ametile ja kirjeldada, et oled kodus asuv sisu moderaator, kes kardab kättemaksu või kättemaksu oma tegevuse eest ja vajab postkasti, et eemaldada oma kodune aadress avalikust nähtavusest.
+ jurisdiction: Nimeta riik, kus elab see, kes arveid maksab. Kui tegemist on äriühingu või muu üksusega, märgi riik, kus see on asutatud, ning vajaduse korral linn, piirkond, territoorium või osariik.
user:
chosen_languages: Keelte valimisel näidatakse avalikel ajajoontel ainult neis keeltes postitusi
role: Rollid määravad, millised õigused kasutajal on.
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index 7be25fd217..493f7972bd 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -10,6 +10,7 @@ fa:
indexable: ممکن است فرستههای عمومیتان در نتیجههای جستوجوی ماستودون ظاهر شود. افرادی که با فرستههایتان تعامل داشتند در هر صورت میتوانند جستوجویشان کنند.
note: 'میتوانید افراد دیگر را @نام برده یا #برچسب بزنید.'
show_collections: افراد خواهند توانست پیگیران و پیگرفته شدههایتان را مرور کنند. افرادی که پیمیگیریدشان در هر صورت خواهند دید که پیمیگیریدشان.
+ unlocked: افراد می توانند بدون درخواست تایید شما را دنبال کنند. اگر میخواهید درخواستهای فالو را بررسی کنید علامت آن را بردارید و انتخاب کنید که آیا دنبالکنندگان جدید را بپذیرید یا رد کنید.
account_alias:
acct: مشخّص کردن username@domain حسابی که میخواهید از آن منتقل شوید
account_migration:
@@ -59,6 +60,7 @@ fa:
setting_display_media_default: تصویرهایی را که به عنوان حساس علامت زده شدهاند پنهان کن
setting_display_media_hide_all: همیشه همهٔ عکسها و ویدیوها را پنهان کن
setting_display_media_show_all: همیشه تصویرهایی را که به عنوان حساس علامت زده شدهاند را نشان بده
+ setting_system_scrollbars_ui: فقط برای مرورگرهای دسکتاپ مبتنی بر سافاری و کروم اعمال می شود
setting_use_blurhash: سایهها بر اساس رنگهای بهکاررفته در تصویر پنهانشده ساخته میشوند ولی جزئیات تصویر در آنها آشکار نیست
setting_use_pending_items: به جای پیشرفتن خودکار در فهرست، بهروزرسانی فهرست نوشتهها را پشت یک کلیک پنهان کن
username: تنها میتوانید از حروف، اعداد، و زیرخط استفاده کنید
@@ -77,10 +79,15 @@ fa:
warn: نهفتن محتوای پالوده پشت هشداری که به عنوان پالایه اشاره میکند
form_admin_settings:
activity_api_enabled: تعداد بوقهای منتشرهٔ محلی، کاربران فعال، و کاربران تازه در هر هفته
+ app_icon: WEBP، PNG، GIF یا JPG. با یک نماد سفارشی، نماد برنامه پیشفرض را در دستگاههای تلفن همراه لغو میکند.
+ backups_retention_period: کاربران می توانند بایگانی هایی از پست های خود ایجاد کنند تا بعدا دانلود کنند. وقتی روی مقدار مثبت تنظیم شود، این بایگانیها پس از تعداد روزهای مشخص شده بهطور خودکار از فضای ذخیرهسازی شما حذف میشوند.
bootstrap_timeline_accounts: سنجاق کردنThese accounts will be pinned to the top of new users' follow recommendations.
closed_registrations_message: نمایش داده هنگام بسته بودن ثبتنامها
+ content_cache_retention_period: همه پستهای سرورهای دیگر (از جمله تقویتکنندهها و پاسخها) پس از چند روز مشخص شده، بدون توجه به هرگونه تعامل کاربر محلی با آن پستها، حذف خواهند شد. این شامل پست هایی می شود که یک کاربر محلی آن را به عنوان نشانک یا موارد دلخواه علامت گذاری کرده است. ذکر خصوصی بین کاربران از نمونه های مختلف نیز از بین خواهد رفت و بازیابی آنها غیرممکن است. استفاده از این تنظیم برای موارد با هدف خاص در نظر گرفته شده است و بسیاری از انتظارات کاربر را هنگامی که برای استفاده عمومی اجرا می شود، از بین می برد.
custom_css: میتوانیدروی نگارش وب ماستودون سبکهای سفارشی اعمال کنید.
+ favicon: WEBP، PNG، GIF یا JPG. فاویکون پیشفرض ماستودون را با یک نماد سفارشی لغو میکند.
mascot: نقش میانای وب پیشرفته را پایمال میکند.
+ media_cache_retention_period: فایل های رسانه ای از پست های ارسال شده توسط کاربران راه دور در سرور شما ذخیره می شوند. وقتی روی مقدار مثبت تنظیم شود، رسانه پس از تعداد روزهای مشخص حذف می شود. اگر دادههای رسانه پس از حذف درخواست شود، در صورتی که محتوای منبع هنوز در دسترس باشد، مجدداً بارگیری میشود. با توجه به محدودیتهایی که در مورد تعداد دفعات نظرسنجی کارتهای پیشنمایش پیوند از سایتهای شخص ثالث وجود دارد، توصیه میشود این مقدار را حداقل 14 روز تنظیم کنید، در غیر این صورت کارتهای پیشنمایش پیوند قبل از آن زمان بهروزرسانی نمیشوند.
peers_api_enabled: فهرستی از نامهای دامنهای که این کارساز در فدیورس با آن مواجه شده است. هیچ اطلاعاتی در مورد اینکه آیا شما با یک کارساز داده شده متعهد هستید، در اینجا گنجانده نشده است، فقط کارساز شما در مورد آن میداند. این توسط خدماتی استفاده میشود که آمار مربوط به فدراسیون را به معنای کلی جمعآوری میکنند.
profile_directory: شاخهٔ نمایه، همهٔ کاربرانی که کشفپذیری را برگزیدهاند سیاهه میکند.
require_invite_text: زمانی که نامنویسی ها نیازمند تایید دستی است، متن «چرا میخواهید بپیوندید؟» بخش درخواست دعوت را به جای اختیاری، اجباری کنید
@@ -90,7 +97,13 @@ fa:
site_short_description: شرحی کوتاه برای کمک به شناسایی یکتای کارسازتان. چهکسی میگرداندش و برای چه کسیست؟
site_terms: از سیاست محرمانگی خوتان استفاده کرده یا برای استفاده از سیاست پیشگزیده خالی بگذارید. میتواند در قالب مارکدون باشد.
site_title: چگونه مردم ممکن است به کارساز شما علاوه بر نام دامنه آن مراجعه کنند.
+ status_page_url: نشانی وب صفحهای که در آن افراد میتوانند وضعیت این سرور را در هنگام قطع شدن ببینند
theme: زمینهای که بینندگان خارج شده و کاربران جدید میبینند.
+ thumbnail: یک تصویر تقریباً 2:1 در کنار اطلاعات سرور شما نمایش داده می شود.
+ timeline_preview: بازدیدکنندگانی که از سیستم خارج شده اند می توانند جدیدترین پست های عمومی موجود در سرور را مرور کنند.
+ trendable_by_default: از بررسی دستی محتوای پرطرفدار صرف نظر کنید. آیتم های فردی هنوز هم می توانند پس از واقعیت از روند حذف شوند.
+ trends: روندها نشان میدهند که کدام پستها، هشتگها و داستانهای خبری در سرور شما مورد توجه قرار گرفتهاند.
+ trends_as_landing_page: به جای توضیح این سرور، محتوای پرطرفدار را به کاربران و بازدیدکنندگان از سیستم خارج شده نشان دهید. نیاز به فعال شدن روندها دارد.
form_challenge:
current_password: شما در حال ورود به یک منطقهٔ حفاظتشده هستید
imports:
@@ -107,6 +120,7 @@ fa:
sign_up_requires_approval: ثبتنامهای جدید، نیازمند تأییدتان خواهند بود
severity: بگزنید با درخواستها از این آیپی چه شود
rule:
+ hint: اختیاری. جزئیات بیشتری در مورد قانون ارائه دهید
text: قائده یا نیازمندیهایی را برای کاربران این کارساز تشریح کنید. سعی کنید آن را ساده و کوتاه نگاه دارید
sessions:
otp: 'کد تأیید دومرحلهای که کاره روی تلفن شما ساخته را وارد کنید یا یکی از کدهای بازیابی را به کار ببرید:'
@@ -116,10 +130,29 @@ fa:
show_application: خودتان همواره خواهید توانست ببینید که کدام کاره فرستهتان را منتشر کرده.
tag:
name: شما تنها میتوانید بزرگی و کوچکی حروف را تغییر دهید تا مثلاً آن را خواناتر کنید
+ terms_of_service:
+ changelog: می توان با دستور Markdown ساختار داد.
+ text: می توان با دستور Markdown ساختار داد.
+ terms_of_service_generator:
+ admin_email: اخطارهای حقوقی شامل اخطارهای متقابل، دستورها دادگاه، درخواستهای حذف و درخواستهای اجرای قانون است.
+ arbitration_address: میتواند مانند آدرس فیزیکی بالا باشد، یا در صورت استفاده از ایمیل، «N/A» باشد
+ arbitration_website: اگر از ایمیل استفاده می کنید، می تواند یک فرم وب یا "N/A" باشد
+ dmca_address: برای اپراتورهای ایالات متحده، از آدرس ثبت شده در دایرکتوری نماینده تعیین شده DMCA استفاده کنید. یک P.O. فهرست جعبه در صورت درخواست مستقیم در دسترس است، از درخواست چشم پوشی از صندوق پست دفتر پست DMCA برای ایمیل به دفتر حق نسخه برداری استفاده کنید و توضیح دهید که شما یک ناظر محتوای خانگی هستید که از انتقام یا تلافی برای اعمال خود می ترسید و باید از P.O استفاده کنید. کادری برای حذف آدرس خانه شما از نمای عمومی.
+ dmca_email: میتواند همان ایمیلی باشد که برای “آدرس ایمیل برای اطلاعیههای قانونی“ در بالا استفاده شده است
+ domain: شناسایی منحصر به فرد سرویس آنلاینی که ارائه می کنید.
+ jurisdiction: کشوری را که هر کسی که صورتحسابها را پرداخت می کند در آن زندگی می کند، فهرست کنید. اگر یک شرکت یا نهاد دیگری است، کشوری که در آن ثبت شده است و شهر، منطقه، قلمرو یا ایالت در صورت لزوم فهرست کنید.
user:
chosen_languages: اگر انتخاب کنید، تنها نوشتههایی که به زبانهای برگزیدهٔ شما نوشته شدهاند در فهرست نوشتههای عمومی نشان داده میشوند
+ role: نقش کنترل می کند که کاربر چه مجوزهایی دارد.
+ user_role:
+ color: رنگی که برای نقش در سرتاسر UI استفاده می شود، به عنوان RGB در قالب هگز
+ highlighted: این باعث می شود که نقش به طور عمومی قابل مشاهده باشد
+ name: نام عمومی نقش، اگر قرار است نقش به عنوان یک نشان نمایش داده شود
+ permissions_as_keys: کاربرانی که این نقش را دارند به...
+ position: نقش بالاتر در موقعیتهای خاص حل تعارض را تعیین میکند. برخی اقدامات را فقط می توان روی نقش هایی با اولویت کمتر انجام داد
webhook:
events: گزینش رویدادها برای فرستادن
+ template: بار JSON خود را با استفاده از درون یابی متغیر بنویسید. JSON پیش فرض را خالی بگذارید.
url: جایی که رویدادها فرستاده میشوند
labels:
account:
@@ -202,6 +235,7 @@ fa:
setting_hide_network: نهفتن شبکهٔ ارتباطی
setting_reduce_motion: کاستن از حرکت در پویانماییها
setting_system_font_ui: بهکاربردن قلم پیشفرض سیستم
+ setting_system_scrollbars_ui: از نوار اسکرول پیش فرض سیستم استفاده کنید
setting_theme: تم سایت
setting_trends: نشاندادن موضوعات پرطرفدار روز
setting_unfollow_modal: نمایش پیغام تأیید پیش از لغو پیگیری دیگران
@@ -228,6 +262,7 @@ fa:
backups_retention_period: دورهٔ نگهداری بایگانی کاربری
bootstrap_timeline_accounts: پیشنهاد همیشگی این حسابها به کاربران جدید
closed_registrations_message: پیام سفارشی هنگام در دسترس نبودن ثبتنامها
+ content_cache_retention_period: دوره نگهداری محتوا از راه دور
custom_css: سبک CSS سفارشی
favicon: نمادک
mascot: نشان سفارشی (قدیمی)
@@ -295,6 +330,17 @@ fa:
name: برچسب
trendable: بگذارید که این برچسب در موضوعات پرطرفدار دیده شود
usable: اجازه به فرستهها برای استفتاده از این برچسب به صورت محلی
+ terms_of_service:
+ changelog: چه چیزی تغییر کرده است؟
+ text: شرایط خدمات
+ terms_of_service_generator:
+ admin_email: آدرس ایمیل برای اطلاعیه های حقوقی
+ arbitration_address: آدرس فیزیکی اعلامیه های داوری
+ arbitration_website: وب سایت ارسال اخطارهای داوری
+ dmca_address: آدرس فیزیکی اعلامیههای DMCA/حق نسخهبرداری
+ dmca_email: آدرس ایمیل برای اعلامیههای DMCA/حق نسخهبرداری
+ domain: دامنه
+ jurisdiction: صلاحیت قانونی
user:
role: نقش
time_zone: منطقهٔ زمانی
@@ -306,6 +352,7 @@ fa:
position: اولویت
webhook:
events: رویدادهای به کار افتاده
+ template: قالب بار
url: نشانی نقطهٔ پایانی
'no': خیر
not_recommended: پیشنهاد نشده
diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml
index 7577bb2141..30f0822973 100644
--- a/config/locales/simple_form.nn.yml
+++ b/config/locales/simple_form.nn.yml
@@ -60,6 +60,7 @@ nn:
setting_display_media_default: Gøym media som er merka som sensitive
setting_display_media_hide_all: Alltid skjul alt media
setting_display_media_show_all: Vis alltid media
+ setting_system_scrollbars_ui: Gjeld berre skrivebordsnettlesarar som er bygde på Safari og Chrome
setting_use_blurhash: Overgangar er basert på fargane til skjulte grafikkelement, men gjer detaljar utydelege
setting_use_pending_items: Gøym tidslineoppdateringar bak eit klikk, i staden for å rulla ned automatisk
username: Du kan bruka bokstavar, tal og understrekar
@@ -101,7 +102,7 @@ nn:
thumbnail: Eit omlag 2:1 bilete vist saman med informasjon om tenaren.
timeline_preview: Besøkjande som ikkje er logga inn vil kunne bla gjennom dei siste offentlege innlegga på tenaren.
trendable_by_default: Hopp over manuell gjennomgang av populært innhald. Enkeltståande innlegg kan fjernast frå trendar i etterkant.
- trends: Trendar viser kva for nokre innlegg, emneknaggar og nyheiter som er i støytet på tenaren.
+ trends: Trendar viser kva for nokre innlegg, emneknaggar og nyheiter som er populære på tenaren.
trends_as_landing_page: Vis populært innhald til utlogga brukarar og folk som kjem innom sida i staden for ei skildring av tenaren. Du må ha skrudd på trendar for å kunna bruka dette.
form_challenge:
current_password: Du går inn i eit trygt område
@@ -129,6 +130,17 @@ nn:
show_application: Du vil uansett alltid kunna sjå kva app som la ut innlegga dine.
tag:
name: Du kan berre endra bruken av store/små bokstavar, t. d. for å gjera det meir leseleg
+ terms_of_service:
+ changelog: Du kan bruka Markdown-syntaks for struktur.
+ text: Du kan bruka Markdown-syntaks for struktur.
+ terms_of_service_generator:
+ admin_email: Juridiske merknader kan vera motsegner, rettsavgjerder, orskurdar eller førespurnader om sletting.
+ arbitration_address: Kan vera lik den fysiske adressa over, eller "N/A" viss du bruker epost
+ arbitration_website: Kan vera eit nettskjema, eller "N/A" viss du bruker epost
+ dmca_address: For US operators, use the address registered in the DMCA Designated Agent Directory. A P.O. Box listing is available upon direct request, use the DMCA Designated Agent Post Office Box Waiver Request to email the Copyright Office and describe that you are a home-based content moderator who fears revenge or retribution for your actions and need to use a P.O. Box to remove your home address from public view.
+ dmca_email: Kan vera den same epostadressa som adressa for juridiske merknader over
+ domain: Noko som identifiserer den nettenesta du tilbyr.
+ jurisdiction: Skriv kva land den som betaler rekningane bur i. Viss det er eit firma eller ein annan organisasjon, skriv du landet der organisasjonen held til, samt adressa som trengst.
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.
@@ -223,6 +235,7 @@ nn:
setting_hide_network: Gøym nettverket ditt
setting_reduce_motion: Minsk rørsle i animasjonar
setting_system_font_ui: Bruk standardskrifttypen på systemet
+ setting_system_scrollbars_ui: Bruk standardrullefeltet til systemet
setting_theme: Sidetema
setting_trends: Vis kva som er populært i dag
setting_unfollow_modal: Vis stadfesting før du sluttar å fylgja nokon
@@ -317,6 +330,17 @@ nn:
name: Emneknagg
trendable: Tillat denne emneknaggen til å synast under trendar
usable: Godta at innlegga kan bruka denne emneknaggen lokalt
+ terms_of_service:
+ changelog: Kva er endra?
+ text: Bruksvilkår
+ terms_of_service_generator:
+ admin_email: Epostadresse for juridiske merknader
+ arbitration_address: Fysisk adresse for skilsdomsvarsel
+ arbitration_website: Nettstad for å senda inn skilsdomsvarsel
+ dmca_address: Fysisk adresse for opphavsrettsvarsel
+ dmca_email: Epostadresse for opphavsrettsvarsel
+ domain: Domene
+ jurisdiction: Rettskrins
user:
role: Rolle
time_zone: Tidssone
diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml
index 74c6496cfe..f01d2bf84f 100644
--- a/config/locales/simple_form.pt-PT.yml
+++ b/config/locales/simple_form.pt-PT.yml
@@ -32,12 +32,12 @@ pt-PT:
warning_preset_id: Opcional. Tu ainda podes adicionar texto personalizado no fim do predefinido
announcement:
all_day: Quando marcado, apenas as datas do intervalo de tempo serão apresentadas
- ends_at: Opcional. O anúncio será automaticamente retirado de exibição neste momento
- scheduled_at: Deixe em branco para publicar o anúncio imediatamente
- starts_at: Opcional. Caso o seu anúncio seja vinculado a um intervalo de tempo específico
- text: Pode utilizar a sintaxe de publicações. Por favor, tenha em consideração o espaço que o comunicado ocupará no ecrã do utilizador
+ ends_at: Opcional. A mensagem de manutenção deixará de estar publicada neste momento
+ scheduled_at: Deixe em branco para publicar a mensagem de manutenção imediatamente
+ starts_at: Opcional. Caso a sua mensagem de manutenção seja vinculada a um intervalo de tempo específico
+ text: Pode utilizar a sintaxe de publicações. Por favor, tenha em consideração o espaço que a mensagem de manutenção ocupará no ecrã do utilizador
appeal:
- text: Só pode recorrer uma única vez de uma reprimenda
+ text: Só podes recorrer uma única vez de uma reprimenda
defaults:
autofollow: As pessoas que aderirem através do convite segui-lo-ão automaticamente
avatar: WEBP, PNG, GIF ou JPG. No máximo %{size}. Será reduzido para %{dimensions}px
@@ -57,7 +57,7 @@ pt-PT:
setting_aggregate_reblogs: Não mostrar os novos impulsos para publicações que tenham sido recentemente impulsionadas (apenas afeta os impulsos recentemente recebidos)
setting_always_send_emails: Normalmente as notificações por e-mail não serão enviadas quando estiver a utilizar ativamente o Mastodon
setting_default_sensitive: Os multimédia sensíveis são ocultados por predefinição e podem ser revelados com um clique/toque
- setting_display_media_default: Esconder multimédia marcada como problemática
+ setting_display_media_default: Esconder multimédia marcada como sensível
setting_display_media_hide_all: Esconder sempre toda a multimédia
setting_display_media_show_all: Mostrar sempre a multimédia
setting_system_scrollbars_ui: Aplica-se apenas a navegadores de desktop baseados no Safari e Chrome
@@ -112,7 +112,7 @@ pt-PT:
text: Isto vai ajudar-nos a analisar o seu pedido
ip_block:
comment: Opcional. Relembre-se por que adicionou esta regra.
- expires_in: Endereços IP são um recurso limitado, algumas vezes são compartilhados e muitas vezes mudam de mãos. Por essa razão, bloqueios de IP indefinidos não são recomendados.
+ expires_in: Os endereços de IP são um recurso limitado, algumas vezes são partilhados e muitas vezes mudam de mãos. Por essa razão, não são recomendados bloqueios de IP indefinidos.
ip: Introduza um endereço IPv4 ou IPv6. Pode bloquear intervalos inteiros usando a sintaxe CIDR. Tenha cuidado para não se bloquear a sí mesmo!
severities:
no_access: Bloquear o acesso a todos os recursos
@@ -137,7 +137,7 @@ pt-PT:
admin_email: Os avisos legais incluem contra-avisos, ordens judiciais, pedidos de remoção e pedidos de aplicação da lei.
arbitration_address: Pode ser o mesmo que o endereço físico acima ou “N/A” se utilizar e-mail
arbitration_website: Pode ser um formulário web ou “N/A” se for utilizado o e-mail
- dmca_address: Para operadores dos EUA, utilize o endereço registado no Diretório de Agentes Designados DMCA. A listagem de uma caixa postal está disponível mediante pedido direto. Utilize o DMCA Designated Agent Post Office Box Waiver Request para enviar uma mensagem de correio eletrónico ao Copyright Office e descreva que é um moderador de conteúdos baseado em casa que receia vingança ou represálias pelas suas acções e que necessita de utilizar uma caixa postal para retirar o seu endereço de casa da vista do público.
+ dmca_address: Para operadores dos EUA, utilize o endereço registado no Diretório de Agentes Designados DMCA. A listagem de uma caixa postal está disponível mediante pedido direto. Utilize o DMCA Designated Agent Post Office Box Waiver Request para enviar uma mensagem de correio eletrónico ao Copyright Office e descreva que é um moderador de conteúdos baseado em casa que receia vingança ou represálias pelas suas ações e que necessita de utilizar uma caixa postal para retirar o seu endereço de casa da vista do público.
dmca_email: Pode ser o mesmo e-mail utilizado para “Endereço de e-mail para avisos legais” acima
domain: Identificação única do serviço online que está a prestar.
jurisdiction: Indique o país de residência de quem paga as contas. Se se tratar de uma empresa ou outra entidade, indique o país onde está constituída, bem como a cidade, região, território ou estado, consoante o caso.
@@ -175,11 +175,11 @@ pt-PT:
include_statuses: Incluir no e-mail as publicações denunciadas
send_email_notification: Notificar o utilizador por e-mail
text: Aviso personalizado
- type: Acção
+ type: Ação
types:
disable: Congelar
none: Enviar um aviso
- sensitive: Problemático
+ sensitive: Sensível
silence: Limitar
suspend: Suspender
warning_preset_id: Usar um aviso pré-definido
@@ -188,9 +188,9 @@ pt-PT:
ends_at: Fim do evento
scheduled_at: Agendar publicação
starts_at: Início do evento
- text: Comunicado
+ text: Mensagem de manutenção
appeal:
- text: Explique porque esta decisão deve ser revertida
+ text: Explicar por que razão esta decisão deve ser anulada
defaults:
autofollow: Convidar para seguir a sua conta
avatar: Imagem de perfil
@@ -223,7 +223,7 @@ pt-PT:
setting_boost_modal: Mostrar caixa de diálogo de confirmação antes de impulsionar
setting_default_language: Idioma de publicação
setting_default_privacy: Privacidade da publicação
- setting_default_sensitive: Marcar sempre os multimédia como problemáticos
+ setting_default_sensitive: Marcar sempre os multimédia como sensíveis
setting_delete_modal: Solicitar confirmação antes de eliminar uma publicação
setting_disable_hover_cards: Desativar visualização de perfil ao passar o cursor
setting_disable_swiping: Desativar os movimentos de deslize
@@ -303,7 +303,7 @@ pt-PT:
sign_up_requires_approval: Limitar inscrições
severity: Regra
notification_emails:
- appeal: Alguém recorreu de uma decisão de moderação
+ appeal: Alguém contestou uma decisão de moderação
digest: Enviar e-mails de resumo
favourite: Quando alguém adiciona uma publicação sua aos favoritos
follow: Alguém começou a segui-lo
diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml
index 6a1e6db3f2..e24dac64b2 100644
--- a/config/locales/simple_form.ru.yml
+++ b/config/locales/simple_form.ru.yml
@@ -137,6 +137,9 @@ ru:
admin_email: Юридические уведомления включают в себя встречные уведомления, постановления суда, запросы на удаление и запросы правоохранительных органов.
arbitration_address: Может совпадать с почтовым адресом, указанным выше, либо «N/A» в случае электронной почты
arbitration_website: Веб-форма или «N/A» в случае электронной почты
+ dmca_address: Находящиеся в США операторы должны использовать адрес, зарегистрированный в DMCA Designated Agent Directory. Использовать абонентский ящик возможно при обращении в соответствующей просьбой, для чего нужно с помощью DMCA Designated Agent Post Office Box Waiver Request написать сообщение в Copyright Office и объяснить, что вы занимаетесь модерацией контента из дома и опасаетесь мести за свои действия, поэтому должны использовать абонентский ящик, чтобы убрать ваш домашний адрес из общего доступа.
+ dmca_email: Может совпадать с адресом электронной почты для юридических уведомлений, указанным выше
+ domain: Имя, позволяющее уникально идентифицировать ваш онлайн-ресурс.
jurisdiction: Впишите страну, где находится лицо, оплачивающее счета. Если это компания либо организация, впишите страну инкорпорации, включая город, регион, территорию или штат, если это необходимо.
user:
chosen_languages: Если выбрано, то в публичных лентах будут показаны только посты на выбранных языках.
diff --git a/lib/active_record/batches.rb b/lib/active_record/batches.rb
index 7960b6e10d..fb0b13954b 100644
--- a/lib/active_record/batches.rb
+++ b/lib/active_record/batches.rb
@@ -13,7 +13,9 @@ module ActiveRecord
column_names.unshift(primary_key)
- relation = relation.reorder(build_batch_orders(order).to_h).limit(batch_limit)
+ cursor = Array(primary_key)
+
+ relation = relation.reorder(build_batch_orders(cursor, order).to_h).limit(batch_limit)
relation.skip_query_cache!
batch_relation = relation
diff --git a/lib/tasks/statistics.rake b/lib/tasks/statistics.rake
deleted file mode 100644
index 82840f4fdc..0000000000
--- a/lib/tasks/statistics.rake
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-task stats: 'mastodon:stats'
-
-namespace :mastodon do
- desc 'Report code statistics (KLOCs, etc)'
- task :stats do
- require 'rails/code_statistics'
- [
- ['App Libraries', 'app/lib'],
- %w(Presenters app/presenters),
- %w(Policies app/policies),
- %w(Serializers app/serializers),
- %w(Services app/services),
- %w(Validators app/validators),
- %w(Workers app/workers),
- ].each do |name, dir|
- STATS_DIRECTORIES << [name, dir]
- end
- end
-end
diff --git a/package.json b/package.json
index 3fd1b22c6f..6eee16dc28 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "@mastodon/mastodon",
"license": "AGPL-3.0-or-later",
- "packageManager": "yarn@4.5.3",
+ "packageManager": "yarn@4.6.0",
"engines": {
"node": ">=18"
},
diff --git a/spec/controllers/admin/account_actions_controller_spec.rb b/spec/controllers/admin/account_actions_controller_spec.rb
index d513b3d4a0..fabe5cef4d 100644
--- a/spec/controllers/admin/account_actions_controller_spec.rb
+++ b/spec/controllers/admin/account_actions_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::AccountActionsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb
index a182300106..72ca2275cf 100644
--- a/spec/controllers/admin/accounts_controller_spec.rb
+++ b/spec/controllers/admin/accounts_controller_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Admin::AccountsController do
before { sign_in current_user, scope: :user }
describe 'GET #index' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
let(:params) do
{
origin: 'local',
@@ -53,7 +53,7 @@ RSpec.describe Admin::AccountsController do
end
describe 'GET #show' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
describe 'account moderation notes' do
let(:account) { Fabricate(:account) }
diff --git a/spec/controllers/admin/action_logs_controller_spec.rb b/spec/controllers/admin/action_logs_controller_spec.rb
index 3daf260672..d3108e8055 100644
--- a/spec/controllers/admin/action_logs_controller_spec.rb
+++ b/spec/controllers/admin/action_logs_controller_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe Admin::ActionLogsController do
describe 'GET #index' do
it 'returns 200' do
- sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin'))
+ sign_in Fabricate(:admin_user)
get :index, params: { page: 1 }
expect(response).to have_http_status(200)
diff --git a/spec/controllers/admin/base_controller_spec.rb b/spec/controllers/admin/base_controller_spec.rb
index 8b8b7fe63d..6e78ccb3b1 100644
--- a/spec/controllers/admin/base_controller_spec.rb
+++ b/spec/controllers/admin/base_controller_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe Admin::BaseController do
it 'returns private cache control headers' do
routes.draw { get 'success' => 'admin/base#success' }
- sign_in(Fabricate(:user, role: UserRole.find_by(name: 'Moderator')))
+ sign_in(Fabricate(:moderator_user))
get :success
expect(response.headers['Cache-Control']).to include('private, no-store')
@@ -28,14 +28,14 @@ RSpec.describe Admin::BaseController do
it 'renders admin layout as a moderator' do
routes.draw { get 'success' => 'admin/base#success' }
- sign_in(Fabricate(:user, role: UserRole.find_by(name: 'Moderator')))
+ sign_in(Fabricate(:moderator_user))
get :success
expect(response).to render_template layout: 'admin'
end
it 'renders admin layout as an admin' do
routes.draw { get 'success' => 'admin/base#success' }
- sign_in(Fabricate(:user, role: UserRole.find_by(name: 'Admin')))
+ sign_in(Fabricate(:admin_user))
get :success
expect(response).to render_template layout: 'admin'
end
diff --git a/spec/controllers/admin/change_emails_controller_spec.rb b/spec/controllers/admin/change_emails_controller_spec.rb
index dd8a764b64..899106e54e 100644
--- a/spec/controllers/admin/change_emails_controller_spec.rb
+++ b/spec/controllers/admin/change_emails_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::ChangeEmailsController do
render_views
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:admin) { Fabricate(:admin_user) }
before do
sign_in admin
diff --git a/spec/controllers/admin/confirmations_controller_spec.rb b/spec/controllers/admin/confirmations_controller_spec.rb
index 59ea0121ca..22035d15e6 100644
--- a/spec/controllers/admin/confirmations_controller_spec.rb
+++ b/spec/controllers/admin/confirmations_controller_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Admin::ConfirmationsController do
render_views
before do
- sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
+ sign_in Fabricate(:admin_user), scope: :user
end
describe 'POST #create' do
diff --git a/spec/controllers/admin/dashboard_controller_spec.rb b/spec/controllers/admin/dashboard_controller_spec.rb
index 9177be4b6d..5a1ea848cc 100644
--- a/spec/controllers/admin/dashboard_controller_spec.rb
+++ b/spec/controllers/admin/dashboard_controller_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Admin::DashboardController do
render_views
describe 'GET #index' do
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Owner')) }
+ let(:user) { Fabricate(:owner_user) }
before do
stub_system_checks
diff --git a/spec/controllers/admin/disputes/appeals_controller_spec.rb b/spec/controllers/admin/disputes/appeals_controller_spec.rb
index 678ceee115..b67ee30f74 100644
--- a/spec/controllers/admin/disputes/appeals_controller_spec.rb
+++ b/spec/controllers/admin/disputes/appeals_controller_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe Admin::Disputes::AppealsController do
let(:appeal) { Fabricate(:appeal, strike: strike, account: target_account) }
describe 'GET #index' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
before { appeal }
@@ -32,7 +32,7 @@ RSpec.describe Admin::Disputes::AppealsController do
describe 'POST #approve' do
subject { post :approve, params: { id: appeal.id } }
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
it 'redirects back to the strike page and notifies target account about approved appeal', :inline_jobs do
emails = capture_emails { subject }
@@ -56,7 +56,7 @@ RSpec.describe Admin::Disputes::AppealsController do
describe 'POST #reject' do
subject { post :reject, params: { id: appeal.id } }
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
it 'redirects back to the strike page and notifies target account about rejected appeal', :inline_jobs do
emails = capture_emails { subject }
diff --git a/spec/controllers/admin/domain_blocks_controller_spec.rb b/spec/controllers/admin/domain_blocks_controller_spec.rb
index a99ca6c641..4d48a0d9d3 100644
--- a/spec/controllers/admin/domain_blocks_controller_spec.rb
+++ b/spec/controllers/admin/domain_blocks_controller_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Admin::DomainBlocksController do
render_views
before do
- sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
+ sign_in Fabricate(:admin_user), scope: :user
end
describe 'GET #new' do
diff --git a/spec/controllers/admin/email_domain_blocks_controller_spec.rb b/spec/controllers/admin/email_domain_blocks_controller_spec.rb
index 4de3ef0f62..c7460c2110 100644
--- a/spec/controllers/admin/email_domain_blocks_controller_spec.rb
+++ b/spec/controllers/admin/email_domain_blocks_controller_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Admin::EmailDomainBlocksController do
render_views
before do
- sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
+ sign_in Fabricate(:admin_user), scope: :user
end
describe 'GET #index' do
diff --git a/spec/controllers/admin/export_domain_allows_controller_spec.rb b/spec/controllers/admin/export_domain_allows_controller_spec.rb
index 0a56394193..dcb1f55a99 100644
--- a/spec/controllers/admin/export_domain_allows_controller_spec.rb
+++ b/spec/controllers/admin/export_domain_allows_controller_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Admin::ExportDomainAllowsController do
render_views
before do
- sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
+ sign_in Fabricate(:admin_user), scope: :user
end
describe 'GET #new' do
diff --git a/spec/controllers/admin/export_domain_blocks_controller_spec.rb b/spec/controllers/admin/export_domain_blocks_controller_spec.rb
index 564f5a88c5..442f3e5a15 100644
--- a/spec/controllers/admin/export_domain_blocks_controller_spec.rb
+++ b/spec/controllers/admin/export_domain_blocks_controller_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Admin::ExportDomainBlocksController do
render_views
before do
- sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
+ sign_in Fabricate(:admin_user), scope: :user
end
describe 'GET #new' do
diff --git a/spec/controllers/admin/follow_recommendations_controller_spec.rb b/spec/controllers/admin/follow_recommendations_controller_spec.rb
index d614f2ef43..82446cd467 100644
--- a/spec/controllers/admin/follow_recommendations_controller_spec.rb
+++ b/spec/controllers/admin/follow_recommendations_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::FollowRecommendationsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/instances_controller_spec.rb b/spec/controllers/admin/instances_controller_spec.rb
index 1e65373e1f..83655bafa0 100644
--- a/spec/controllers/admin/instances_controller_spec.rb
+++ b/spec/controllers/admin/instances_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::InstancesController do
render_views
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
let!(:account_popular_main) { Fabricate(:account, domain: 'popular') }
diff --git a/spec/controllers/admin/relationships_controller_spec.rb b/spec/controllers/admin/relationships_controller_spec.rb
index 214be7c7cd..1d300459f6 100644
--- a/spec/controllers/admin/relationships_controller_spec.rb
+++ b/spec/controllers/admin/relationships_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::RelationshipsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/relays_controller_spec.rb b/spec/controllers/admin/relays_controller_spec.rb
deleted file mode 100644
index c6251a6d76..0000000000
--- a/spec/controllers/admin/relays_controller_spec.rb
+++ /dev/null
@@ -1,100 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-RSpec.describe Admin::RelaysController do
- render_views
-
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
-
- before do
- sign_in user, scope: :user
- end
-
- describe 'GET #index' do
- it 'returns http success' do
- get :index
-
- expect(response).to have_http_status(:success)
- end
- end
-
- describe 'GET #new' do
- it 'returns http success and renders view' do
- get :new
-
- expect(response).to have_http_status(:success)
- expect(response).to render_template(:new)
- end
- end
-
- describe 'POST #create' do
- context 'with valid data' do
- let(:inbox_url) { 'https://example.com/inbox' }
-
- before do
- stub_request(:post, inbox_url).to_return(status: 200)
- end
-
- it 'creates a new relay and redirects' do
- expect do
- post :create, params: { relay: { inbox_url: inbox_url } }
- end.to change(Relay, :count).by(1)
-
- expect(response).to redirect_to(admin_relays_path)
- end
- end
-
- context 'with invalid data' do
- it 'does not create new a relay and renders new' do
- expect do
- post :create, params: { relay: { inbox_url: 'invalid' } }
- end.to_not change(Relay, :count)
-
- expect(response).to have_http_status(:success)
- expect(response).to render_template(:new)
- end
- end
- end
-
- describe 'DELETE #destroy' do
- let(:relay) { Fabricate(:relay) }
-
- it 'deletes an existing relay' do
- delete :destroy, params: { id: relay.id }
-
- expect { relay.reload }.to raise_error(ActiveRecord::RecordNotFound)
- expect(response).to redirect_to(admin_relays_path)
- end
- end
-
- describe 'POST #enable' do
- let(:relay) { Fabricate(:relay, state: :idle) }
-
- before do
- stub_request(:post, /example.com/).to_return(status: 200)
- end
-
- it 'updates a relay from idle to pending' do
- post :enable, params: { id: relay.id }
-
- expect(relay.reload).to be_pending
- expect(response).to redirect_to(admin_relays_path)
- end
- end
-
- describe 'POST #disable' do
- let(:relay) { Fabricate(:relay, state: :pending) }
-
- before do
- stub_request(:post, /example.com/).to_return(status: 200)
- end
-
- it 'updates a relay from pending to idle' do
- post :disable, params: { id: relay.id }
-
- expect(relay.reload).to be_idle
- expect(response).to redirect_to(admin_relays_path)
- end
- end
-end
diff --git a/spec/controllers/admin/report_notes_controller_spec.rb b/spec/controllers/admin/report_notes_controller_spec.rb
deleted file mode 100644
index 423a64ebc4..0000000000
--- a/spec/controllers/admin/report_notes_controller_spec.rb
+++ /dev/null
@@ -1,104 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-RSpec.describe Admin::ReportNotesController do
- render_views
-
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
-
- before do
- sign_in user, scope: :user
- end
-
- describe 'POST #create' do
- subject { post :create, params: params }
-
- let(:report) { Fabricate(:report, action_taken_at: action_taken, action_taken_by_account_id: account_id) }
-
- context 'when parameter is valid' do
- context 'when report is unsolved' do
- let(:action_taken) { nil }
- let(:account_id) { nil }
-
- context 'when create_and_resolve flag is on' do
- let(:params) { { report_note: { report_id: report.id, content: 'test content' }, create_and_resolve: nil } }
-
- it 'creates a report note and resolves report' do
- expect { subject }.to change(ReportNote, :count).by(1)
- expect(report.reload).to be_action_taken
- expect(response).to redirect_to admin_reports_path
- end
- end
-
- context 'when create_and_resolve flag is false' do
- let(:params) { { report_note: { report_id: report.id, content: 'test content' } } }
-
- it 'creates a report note and does not resolve report' do
- expect { subject }.to change(ReportNote, :count).by(1)
- expect(report.reload).to_not be_action_taken
- expect(response).to redirect_to admin_report_path(report)
- end
- end
- end
-
- context 'when report is resolved' do
- let(:action_taken) { Time.now.utc }
- let(:account_id) { user.account.id }
-
- context 'when create_and_unresolve flag is on' do
- let(:params) { { report_note: { report_id: report.id, content: 'test content' }, create_and_unresolve: nil } }
-
- it 'creates a report note and unresolves report' do
- expect { subject }.to change(ReportNote, :count).by(1)
- expect(report.reload).to_not be_action_taken
- expect(response).to redirect_to admin_report_path(report)
- end
- end
-
- context 'when create_and_unresolve flag is false' do
- let(:params) { { report_note: { report_id: report.id, content: 'test content' } } }
-
- it 'creates a report note and does not unresolve report' do
- expect { subject }.to change(ReportNote, :count).by(1)
- expect(report.reload).to be_action_taken
- expect(response).to redirect_to admin_report_path(report)
- end
- end
- end
- end
-
- context 'when content is too short' do
- let(:params) { { report_note: { report_id: report.id, content: '' } } }
- let(:action_taken) { nil }
- let(:account_id) { nil }
-
- it 'renders admin/reports/show' do
- expect { subject }.to_not change(ReportNote, :count)
- expect(subject).to render_template 'admin/reports/show'
- end
- end
-
- context 'when content is too long' do
- let(:params) { { report_note: { report_id: report.id, content: 'test' * ReportNote::CONTENT_SIZE_LIMIT } } }
- let(:action_taken) { nil }
- let(:account_id) { nil }
-
- it 'renders admin/reports/show' do
- expect { subject }.to_not change(ReportNote, :count)
- expect(subject).to render_template 'admin/reports/show'
- end
- end
- end
-
- describe 'DELETE #destroy' do
- subject { delete :destroy, params: { id: report_note.id } }
-
- let!(:report_note) { Fabricate(:report_note) }
-
- it 'deletes note' do
- expect { subject }.to change(ReportNote, :count).by(-1)
- expect(response).to redirect_to admin_report_path(report_note.report)
- end
- end
-end
diff --git a/spec/controllers/admin/reports/actions_controller_spec.rb b/spec/controllers/admin/reports/actions_controller_spec.rb
index 6185702c30..87a48a7a3a 100644
--- a/spec/controllers/admin/reports/actions_controller_spec.rb
+++ b/spec/controllers/admin/reports/actions_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::Reports::ActionsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/reports_controller_spec.rb b/spec/controllers/admin/reports_controller_spec.rb
index 1252ceb1f4..4012204de1 100644
--- a/spec/controllers/admin/reports_controller_spec.rb
+++ b/spec/controllers/admin/reports_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::ReportsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/rules_controller_spec.rb b/spec/controllers/admin/rules_controller_spec.rb
deleted file mode 100644
index 1b2a2010d0..0000000000
--- a/spec/controllers/admin/rules_controller_spec.rb
+++ /dev/null
@@ -1,85 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-RSpec.describe Admin::RulesController do
- render_views
-
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
-
- before do
- sign_in user, scope: :user
- end
-
- describe 'GET #index' do
- it 'returns http success' do
- get :index
-
- expect(response).to have_http_status(:success)
- end
- end
-
- describe 'GET #edit' do
- let(:rule) { Fabricate(:rule) }
-
- it 'returns http success and renders edit' do
- get :edit, params: { id: rule.id }
-
- expect(response).to have_http_status(:success)
- expect(response).to render_template(:edit)
- end
- end
-
- describe 'POST #create' do
- context 'with valid data' do
- it 'creates a new rule and redirects' do
- expect do
- post :create, params: { rule: { text: 'The rule text.' } }
- end.to change(Rule, :count).by(1)
-
- expect(response).to redirect_to(admin_rules_path)
- end
- end
-
- context 'with invalid data' do
- it 'does creates a new rule and renders index' do
- expect do
- post :create, params: { rule: { text: '' } }
- end.to_not change(Rule, :count)
-
- expect(response).to render_template(:index)
- end
- end
- end
-
- describe 'PUT #update' do
- let(:rule) { Fabricate(:rule, text: 'Original text') }
-
- context 'with valid data' do
- it 'updates the rule and redirects' do
- put :update, params: { id: rule.id, rule: { text: 'Updated text.' } }
-
- expect(response).to redirect_to(admin_rules_path)
- end
- end
-
- context 'with invalid data' do
- it 'does not update the rule and renders index' do
- put :update, params: { id: rule.id, rule: { text: '' } }
-
- expect(response).to render_template(:edit)
- end
- end
- end
-
- describe 'DELETE #destroy' do
- let!(:rule) { Fabricate(:rule) }
-
- it 'destroys the rule and redirects' do
- delete :destroy, params: { id: rule.id }
-
- expect(rule.reload).to be_discarded
- expect(response).to redirect_to(admin_rules_path)
- end
- end
-end
diff --git a/spec/controllers/admin/settings/branding_controller_spec.rb b/spec/controllers/admin/settings/branding_controller_spec.rb
index 5e46910cc6..843021469e 100644
--- a/spec/controllers/admin/settings/branding_controller_spec.rb
+++ b/spec/controllers/admin/settings/branding_controller_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Admin::Settings::BrandingController do
describe 'When signed in as an admin' do
before do
- sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
+ sign_in Fabricate(:admin_user), scope: :user
end
describe 'PUT #update' do
diff --git a/spec/controllers/admin/site_uploads_controller_spec.rb b/spec/controllers/admin/site_uploads_controller_spec.rb
index 9c65c63b78..1fe5903498 100644
--- a/spec/controllers/admin/site_uploads_controller_spec.rb
+++ b/spec/controllers/admin/site_uploads_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::SiteUploadsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/statuses_controller_spec.rb b/spec/controllers/admin/statuses_controller_spec.rb
index e6053a6e8a..2809c8ec3f 100644
--- a/spec/controllers/admin/statuses_controller_spec.rb
+++ b/spec/controllers/admin/statuses_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::StatusesController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
let(:account) { Fabricate(:account) }
let!(:status) { Fabricate(:status, account: account) }
let(:media_attached_status) { Fabricate(:status, account: account, sensitive: !sensitive) }
diff --git a/spec/controllers/admin/terms_of_service/distributions_controller_spec.rb b/spec/controllers/admin/terms_of_service/distributions_controller_spec.rb
index b6d436a26f..63431c1336 100644
--- a/spec/controllers/admin/terms_of_service/distributions_controller_spec.rb
+++ b/spec/controllers/admin/terms_of_service/distributions_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::TermsOfService::DistributionsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
let(:terms_of_service) { Fabricate(:terms_of_service, notification_sent_at: nil) }
before do
diff --git a/spec/controllers/admin/terms_of_service/drafts_controller_spec.rb b/spec/controllers/admin/terms_of_service/drafts_controller_spec.rb
index 6c19b973d0..0a9c6e6b67 100644
--- a/spec/controllers/admin/terms_of_service/drafts_controller_spec.rb
+++ b/spec/controllers/admin/terms_of_service/drafts_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::TermsOfService::DraftsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/terms_of_service/generates_controller_spec.rb b/spec/controllers/admin/terms_of_service/generates_controller_spec.rb
index 2f85fbc25f..c1fc7faef9 100644
--- a/spec/controllers/admin/terms_of_service/generates_controller_spec.rb
+++ b/spec/controllers/admin/terms_of_service/generates_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::TermsOfService::GeneratesController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/terms_of_service/histories_controller_spec.rb b/spec/controllers/admin/terms_of_service/histories_controller_spec.rb
index d11ea2cd33..8c2c3a3de3 100644
--- a/spec/controllers/admin/terms_of_service/histories_controller_spec.rb
+++ b/spec/controllers/admin/terms_of_service/histories_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::TermsOfService::HistoriesController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/terms_of_service/previews_controller_spec.rb b/spec/controllers/admin/terms_of_service/previews_controller_spec.rb
index 5d923c9f30..3878bb4b6f 100644
--- a/spec/controllers/admin/terms_of_service/previews_controller_spec.rb
+++ b/spec/controllers/admin/terms_of_service/previews_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::TermsOfService::PreviewsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
let(:terms_of_service) { Fabricate(:terms_of_service, notification_sent_at: nil) }
before do
diff --git a/spec/controllers/admin/terms_of_service/tests_controller_spec.rb b/spec/controllers/admin/terms_of_service/tests_controller_spec.rb
index 281c4d28c5..777f699448 100644
--- a/spec/controllers/admin/terms_of_service/tests_controller_spec.rb
+++ b/spec/controllers/admin/terms_of_service/tests_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::TermsOfService::TestsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
let(:terms_of_service) { Fabricate(:terms_of_service, notification_sent_at: nil) }
before do
diff --git a/spec/controllers/admin/terms_of_service_controller_spec.rb b/spec/controllers/admin/terms_of_service_controller_spec.rb
index b7fdb90446..feefd312e3 100644
--- a/spec/controllers/admin/terms_of_service_controller_spec.rb
+++ b/spec/controllers/admin/terms_of_service_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::TermsOfServiceController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/trends/links/preview_card_providers_controller_spec.rb b/spec/controllers/admin/trends/links/preview_card_providers_controller_spec.rb
index ce62a13db6..aadf002dd6 100644
--- a/spec/controllers/admin/trends/links/preview_card_providers_controller_spec.rb
+++ b/spec/controllers/admin/trends/links/preview_card_providers_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::Trends::Links::PreviewCardProvidersController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/trends/links_controller_spec.rb b/spec/controllers/admin/trends/links_controller_spec.rb
index 984f3007c2..cd2cf6b852 100644
--- a/spec/controllers/admin/trends/links_controller_spec.rb
+++ b/spec/controllers/admin/trends/links_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::Trends::LinksController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/trends/statuses_controller_spec.rb b/spec/controllers/admin/trends/statuses_controller_spec.rb
index eecf4ab4f2..6570340b2d 100644
--- a/spec/controllers/admin/trends/statuses_controller_spec.rb
+++ b/spec/controllers/admin/trends/statuses_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::Trends::StatusesController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/trends/tags_controller_spec.rb b/spec/controllers/admin/trends/tags_controller_spec.rb
index 51ad1860c8..83ea23ed21 100644
--- a/spec/controllers/admin/trends/tags_controller_spec.rb
+++ b/spec/controllers/admin/trends/tags_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::Trends::TagsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/users/two_factor_authentications_controller_spec.rb b/spec/controllers/admin/users/two_factor_authentications_controller_spec.rb
index 1f0a6ac34d..39af2ca914 100644
--- a/spec/controllers/admin/users/two_factor_authentications_controller_spec.rb
+++ b/spec/controllers/admin/users/two_factor_authentications_controller_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Admin::Users::TwoFactorAuthenticationsController do
let(:user) { Fabricate(:user) }
before do
- sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
+ sign_in Fabricate(:admin_user), scope: :user
end
describe 'DELETE #destroy' do
diff --git a/spec/controllers/admin/warning_presets_controller_spec.rb b/spec/controllers/admin/warning_presets_controller_spec.rb
index 4171bbad82..d416b9c3cf 100644
--- a/spec/controllers/admin/warning_presets_controller_spec.rb
+++ b/spec/controllers/admin/warning_presets_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::WarningPresetsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/admin/webhooks/secrets_controller_spec.rb b/spec/controllers/admin/webhooks/secrets_controller_spec.rb
index 61ae8cdaa5..da3d4f1438 100644
--- a/spec/controllers/admin/webhooks/secrets_controller_spec.rb
+++ b/spec/controllers/admin/webhooks/secrets_controller_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe Admin::Webhooks::SecretsController do
render_views
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before do
sign_in user, scope: :user
diff --git a/spec/controllers/disputes/appeals_controller_spec.rb b/spec/controllers/disputes/appeals_controller_spec.rb
deleted file mode 100644
index 3e874bbdcc..0000000000
--- a/spec/controllers/disputes/appeals_controller_spec.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-RSpec.describe Disputes::AppealsController do
- render_views
-
- before { sign_in current_user, scope: :user }
-
- let!(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
-
- describe '#create' do
- subject { post :create, params: params }
-
- context 'with valid params' do
- let(:current_user) { Fabricate(:user) }
- let(:strike) { Fabricate(:account_warning, target_account: current_user.account) }
- let(:params) { { strike_id: strike.id, appeal: { text: 'Foo' } } }
-
- it 'notifies staff about new appeal and redirects back to strike page', :inline_jobs do
- emails = capture_emails { subject }
-
- expect(emails.size)
- .to eq(1)
- expect(emails.first)
- .to have_attributes(
- to: contain_exactly(admin.email),
- subject: eq(I18n.t('admin_mailer.new_appeal.subject', username: current_user.account.acct, instance: Rails.configuration.x.local_domain))
- )
- expect(response).to redirect_to(disputes_strike_path(strike.id))
- end
- end
-
- context 'with invalid params' do
- let(:current_user) { Fabricate(:user) }
- let(:strike) { Fabricate(:account_warning, target_account: current_user.account) }
- let(:params) { { strike_id: strike.id, appeal: { text: '' } } }
-
- it 'does not send email and renders strike show page', :inline_jobs do
- emails = capture_emails { subject }
-
- expect(emails).to be_empty
- expect(response).to render_template('disputes/strikes/show')
- end
- end
- end
-end
diff --git a/spec/fabricators/user_fabricator.rb b/spec/fabricators/user_fabricator.rb
index 0df7caea60..104d7f9931 100644
--- a/spec/fabricators/user_fabricator.rb
+++ b/spec/fabricators/user_fabricator.rb
@@ -13,3 +13,15 @@ Fabricator(:user) do
current_sign_in_at { Time.zone.now }
agreement true
end
+
+Fabricator(:admin_user, from: :user) do
+ role UserRole.find_by(name: 'Admin')
+end
+
+Fabricator(:moderator_user, from: :user) do
+ role UserRole.find_by(name: 'Moderator')
+end
+
+Fabricator(:owner_user, from: :user) do
+ role UserRole.find_by(name: 'Owner')
+end
diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb
index 342da29028..8be6766dad 100644
--- a/spec/lib/activitypub/activity/create_spec.rb
+++ b/spec/lib/activitypub/activity/create_spec.rb
@@ -768,7 +768,7 @@ RSpec.describe ActivityPub::Activity::Create do
expect { subject.perform }
.to change(sender.statuses, :count).by(1)
.and change { sender.featured_tags.first.reload.statuses_count }.by(1)
- .and change { sender.featured_tags.first.reload.last_status_at }.from(nil).to(be_within(0.1).of(Time.now.utc))
+ .and change { sender.featured_tags.first.reload.last_status_at }.from(nil).to(be_present)
status = sender.statuses.first
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index 69da7fdde6..24e748c43d 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -801,6 +801,10 @@ RSpec.describe Account do
it { is_expected.to_not allow_values(account_note_over_limit).for(:note) }
+ it { is_expected.to allow_value(fields_empty_name_value).for(:fields) }
+ it { is_expected.to_not allow_value(fields_over_limit).for(:fields) }
+ it { is_expected.to_not allow_value(fields_empty_name).for(:fields) }
+
it { is_expected.to allow_values([], ['example.com'], (1..100).to_a).for(:attribution_domains) }
it { is_expected.to_not allow_values(['example com'], ['@'], (1..101).to_a).for(:attribution_domains) }
end
@@ -835,6 +839,18 @@ RSpec.describe Account do
def account_note_over_limit
'a' * described_class::NOTE_LENGTH_LIMIT * 2
end
+
+ def fields_empty_name_value
+ Array.new(4) { { 'name' => '', 'value' => '' } }
+ end
+
+ def fields_over_limit
+ Array.new(5) { { 'name' => 'Name', 'value' => 'Value', 'verified_at' => '01/01/1970' } }
+ end
+
+ def fields_empty_name
+ [{ 'name' => '', 'value' => 'Value', 'verified_at' => '01/01/1970' }]
+ end
end
describe 'scopes' do
diff --git a/spec/models/admin/account_action_spec.rb b/spec/models/admin/account_action_spec.rb
index 49bc2b4a91..6032594850 100644
--- a/spec/models/admin/account_action_spec.rb
+++ b/spec/models/admin/account_action_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Admin::AccountAction do
describe '#save!' do
subject { account_action.save! }
- let(:account) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:account) { Fabricate(:admin_user).account }
let(:target_account) { Fabricate(:account) }
let(:type) { 'disable' }
diff --git a/spec/models/form/account_batch_spec.rb b/spec/models/form/account_batch_spec.rb
index 26fb1b953a..8db9a2a254 100644
--- a/spec/models/form/account_batch_spec.rb
+++ b/spec/models/form/account_batch_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Form::AccountBatch do
describe '#save' do
subject { account_batch.save }
- let(:account) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:account) { Fabricate(:admin_user).account }
let(:account_ids) { [] }
let(:query) { Account.none }
diff --git a/spec/models/form/custom_emoji_batch_spec.rb b/spec/models/form/custom_emoji_batch_spec.rb
index 180c6abd23..ca9740de3e 100644
--- a/spec/models/form/custom_emoji_batch_spec.rb
+++ b/spec/models/form/custom_emoji_batch_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Form::CustomEmojiBatch do
subject { described_class.new({ current_account: account }.merge(options)) }
let(:options) { {} }
- let(:account) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:account) { Fabricate(:admin_user).account }
context 'with empty custom_emoji_ids' do
let(:options) { { custom_emoji_ids: [] } }
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index f39b80c942..08d410bb16 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -601,7 +601,7 @@ RSpec.describe User do
end
describe '.those_who_can' do
- before { Fabricate(:user, role: UserRole.find_by(name: 'Moderator')) }
+ before { Fabricate(:moderator_user) }
context 'when there are not any user roles' do
before { UserRole.destroy_all }
@@ -618,7 +618,7 @@ RSpec.describe User do
end
context 'when there are users with roles' do
- let!(:admin_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let!(:admin_user) { Fabricate(:admin_user) }
it 'returns the users with the role' do
expect(described_class.those_who_can(:manage_blocks)).to eq([admin_user])
diff --git a/spec/models/webhook_spec.rb b/spec/models/webhook_spec.rb
index 18a6047dd0..59b4212d62 100644
--- a/spec/models/webhook_spec.rb
+++ b/spec/models/webhook_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe Webhook do
subject { Fabricate.build :webhook, current_account: account }
context 'with account that has permissions' do
- let(:account) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:account) { Fabricate(:admin_user).account }
it { is_expected.to allow_values(%w(account.created)).for(:events) }
end
diff --git a/spec/policies/account_moderation_note_policy_spec.rb b/spec/policies/account_moderation_note_policy_spec.rb
index 8b33a71012..2a9cdabaa2 100644
--- a/spec/policies/account_moderation_note_policy_spec.rb
+++ b/spec/policies/account_moderation_note_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe AccountModerationNotePolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :create? do
diff --git a/spec/policies/account_policy_spec.rb b/spec/policies/account_policy_spec.rb
index 75724e831b..8b2edb15b0 100644
--- a/spec/policies/account_policy_spec.rb
+++ b/spec/policies/account_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe AccountPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
let(:alice) { Fabricate(:account) }
@@ -70,7 +70,7 @@ RSpec.describe AccountPolicy do
end
permissions :suspend?, :silence? do
- let(:staff) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:staff) { Fabricate(:admin_user).account }
context 'when staff' do
context 'when record is staff' do
@@ -94,7 +94,7 @@ RSpec.describe AccountPolicy do
end
permissions :memorialize? do
- let(:other_admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:other_admin) { Fabricate(:admin_user).account }
context 'when admin' do
context 'when record is admin' do
diff --git a/spec/policies/account_warning_policy_spec.rb b/spec/policies/account_warning_policy_spec.rb
index 9abc9d35d6..75142e2071 100644
--- a/spec/policies/account_warning_policy_spec.rb
+++ b/spec/policies/account_warning_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe AccountWarningPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:account) { Fabricate(:account) }
permissions :show? do
diff --git a/spec/policies/account_warning_preset_policy_spec.rb b/spec/policies/account_warning_preset_policy_spec.rb
index 33f2fb1187..e8223ab1c7 100644
--- a/spec/policies/account_warning_preset_policy_spec.rb
+++ b/spec/policies/account_warning_preset_policy_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe AccountWarningPresetPolicy do
let(:policy) { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :create?, :update?, :destroy? do
diff --git a/spec/policies/admin/status_policy_spec.rb b/spec/policies/admin/status_policy_spec.rb
index 4df29393e3..5f8285c562 100644
--- a/spec/policies/admin/status_policy_spec.rb
+++ b/spec/policies/admin/status_policy_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe Admin::StatusPolicy do
let(:policy) { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
let(:status) { Fabricate(:status, visibility: status_visibility) }
let(:status_visibility) { :public }
diff --git a/spec/policies/announcement_policy_spec.rb b/spec/policies/announcement_policy_spec.rb
index ab0c1dbaf5..2fec34f8e4 100644
--- a/spec/policies/announcement_policy_spec.rb
+++ b/spec/policies/announcement_policy_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe AnnouncementPolicy do
let(:policy) { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :create?, :update?, :destroy? do
diff --git a/spec/policies/appeal_policy_spec.rb b/spec/policies/appeal_policy_spec.rb
index cdb93bf56c..e3e1d62ba7 100644
--- a/spec/policies/appeal_policy_spec.rb
+++ b/spec/policies/appeal_policy_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe AppealPolicy do
let(:policy) { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
let(:appeal) { Fabricate(:appeal) }
diff --git a/spec/policies/audit_log_policy_spec.rb b/spec/policies/audit_log_policy_spec.rb
index d9d9359433..b1769eb487 100644
--- a/spec/policies/audit_log_policy_spec.rb
+++ b/spec/policies/audit_log_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe AuditLogPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:account) { Fabricate(:account) }
permissions :index? do
diff --git a/spec/policies/canonical_email_block_policy_spec.rb b/spec/policies/canonical_email_block_policy_spec.rb
index b253b439a6..bf9503dc5c 100644
--- a/spec/policies/canonical_email_block_policy_spec.rb
+++ b/spec/policies/canonical_email_block_policy_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe CanonicalEmailBlockPolicy do
let(:policy) { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :show?, :test?, :create?, :destroy? do
diff --git a/spec/policies/custom_emoji_policy_spec.rb b/spec/policies/custom_emoji_policy_spec.rb
index 189885938c..9635da4496 100644
--- a/spec/policies/custom_emoji_policy_spec.rb
+++ b/spec/policies/custom_emoji_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe CustomEmojiPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :enable?, :disable? do
diff --git a/spec/policies/dashboard_policy_spec.rb b/spec/policies/dashboard_policy_spec.rb
index 90c71db381..711bea53ec 100644
--- a/spec/policies/dashboard_policy_spec.rb
+++ b/spec/policies/dashboard_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe DashboardPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:account) { Fabricate(:account) }
permissions :index? do
diff --git a/spec/policies/delivery_policy_spec.rb b/spec/policies/delivery_policy_spec.rb
index 8bc200159a..017a7f3c5e 100644
--- a/spec/policies/delivery_policy_spec.rb
+++ b/spec/policies/delivery_policy_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe DeliveryPolicy do
let(:policy) { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :clear_delivery_errors?, :restart_delivery?, :stop_delivery? do
diff --git a/spec/policies/domain_allow_policy_spec.rb b/spec/policies/domain_allow_policy_spec.rb
index 1d285065b8..1e29c4144f 100644
--- a/spec/policies/domain_allow_policy_spec.rb
+++ b/spec/policies/domain_allow_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe DomainAllowPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :show?, :create?, :destroy? do
diff --git a/spec/policies/domain_block_policy_spec.rb b/spec/policies/domain_block_policy_spec.rb
index 7c77d1870d..04081c5c9b 100644
--- a/spec/policies/domain_block_policy_spec.rb
+++ b/spec/policies/domain_block_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe DomainBlockPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :show?, :create?, :destroy?, :update? do
diff --git a/spec/policies/email_domain_block_policy_spec.rb b/spec/policies/email_domain_block_policy_spec.rb
index e98d65a3c7..6428a2b442 100644
--- a/spec/policies/email_domain_block_policy_spec.rb
+++ b/spec/policies/email_domain_block_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe EmailDomainBlockPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :show?, :create?, :destroy? do
diff --git a/spec/policies/follow_recommendation_policy_spec.rb b/spec/policies/follow_recommendation_policy_spec.rb
index 665ed9b059..181f0ed11c 100644
--- a/spec/policies/follow_recommendation_policy_spec.rb
+++ b/spec/policies/follow_recommendation_policy_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe FollowRecommendationPolicy do
let(:policy) { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :show?, :suppress?, :unsuppress? do
diff --git a/spec/policies/instance_policy_spec.rb b/spec/policies/instance_policy_spec.rb
index 6cdc738022..7ab843b83b 100644
--- a/spec/policies/instance_policy_spec.rb
+++ b/spec/policies/instance_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe InstancePolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :show?, :destroy? do
diff --git a/spec/policies/invite_policy_spec.rb b/spec/policies/invite_policy_spec.rb
index 3717a44999..bb3bddd4b8 100644
--- a/spec/policies/invite_policy_spec.rb
+++ b/spec/policies/invite_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe InvitePolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:user).account }
permissions :index? do
diff --git a/spec/policies/ip_block_policy_spec.rb b/spec/policies/ip_block_policy_spec.rb
index 33ea342c10..dcd9c19785 100644
--- a/spec/policies/ip_block_policy_spec.rb
+++ b/spec/policies/ip_block_policy_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe IpBlockPolicy do
let(:policy) { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :show?, :create?, :update?, :destroy? do
diff --git a/spec/policies/preview_card_policy_spec.rb b/spec/policies/preview_card_policy_spec.rb
index d02a6016cd..75fcf7b373 100644
--- a/spec/policies/preview_card_policy_spec.rb
+++ b/spec/policies/preview_card_policy_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe PreviewCardPolicy do
let(:policy) { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :review? do
diff --git a/spec/policies/preview_card_provider_policy_spec.rb b/spec/policies/preview_card_provider_policy_spec.rb
index 5e25b364a4..d3fbf44539 100644
--- a/spec/policies/preview_card_provider_policy_spec.rb
+++ b/spec/policies/preview_card_provider_policy_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe PreviewCardProviderPolicy do
let(:policy) { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :review? do
diff --git a/spec/policies/relay_policy_spec.rb b/spec/policies/relay_policy_spec.rb
index 5983b2d2ff..8d5ed4997e 100644
--- a/spec/policies/relay_policy_spec.rb
+++ b/spec/policies/relay_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe RelayPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :update? do
diff --git a/spec/policies/report_note_policy_spec.rb b/spec/policies/report_note_policy_spec.rb
index 02317f763a..9f0c525a3c 100644
--- a/spec/policies/report_note_policy_spec.rb
+++ b/spec/policies/report_note_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe ReportNotePolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :create? do
diff --git a/spec/policies/report_policy_spec.rb b/spec/policies/report_policy_spec.rb
index 67f40b5188..20b91c5fd0 100644
--- a/spec/policies/report_policy_spec.rb
+++ b/spec/policies/report_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe ReportPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :update?, :index?, :show? do
diff --git a/spec/policies/rule_policy_spec.rb b/spec/policies/rule_policy_spec.rb
index 3086f30446..70ae3f9417 100644
--- a/spec/policies/rule_policy_spec.rb
+++ b/spec/policies/rule_policy_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe RulePolicy do
let(:policy) { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :create?, :update?, :destroy? do
diff --git a/spec/policies/settings_policy_spec.rb b/spec/policies/settings_policy_spec.rb
index 48821c706a..d11c3c1fa7 100644
--- a/spec/policies/settings_policy_spec.rb
+++ b/spec/policies/settings_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe SettingsPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :update?, :show?, :destroy? do
diff --git a/spec/policies/software_update_policy_spec.rb b/spec/policies/software_update_policy_spec.rb
index 2bda84cce9..ab067dd17e 100644
--- a/spec/policies/software_update_policy_spec.rb
+++ b/spec/policies/software_update_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe SoftwareUpdatePolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Owner')).account }
+ let(:admin) { Fabricate(:owner_user).account }
let(:john) { Fabricate(:account) }
permissions :index? do
diff --git a/spec/policies/status_policy_spec.rb b/spec/policies/status_policy_spec.rb
index 538742610c..69c0bad026 100644
--- a/spec/policies/status_policy_spec.rb
+++ b/spec/policies/status_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe StatusPolicy, type: :model do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:admin) { Fabricate(:admin_user) }
let(:alice) { Fabricate(:account, username: 'alice') }
let(:bob) { Fabricate(:account, username: 'bob') }
let(:status) { Fabricate(:status, account: alice) }
diff --git a/spec/policies/tag_policy_spec.rb b/spec/policies/tag_policy_spec.rb
index 23166e4669..241f13dd3b 100644
--- a/spec/policies/tag_policy_spec.rb
+++ b/spec/policies/tag_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe TagPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :show?, :update?, :review? do
diff --git a/spec/policies/terms_of_service_policy_spec.rb b/spec/policies/terms_of_service_policy_spec.rb
index 18345d9fd0..0deab2fe9b 100644
--- a/spec/policies/terms_of_service_policy_spec.rb
+++ b/spec/policies/terms_of_service_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe TermsOfServicePolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :create? do
diff --git a/spec/policies/user_policy_spec.rb b/spec/policies/user_policy_spec.rb
index 11a166a24e..ba4e31189a 100644
--- a/spec/policies/user_policy_spec.rb
+++ b/spec/policies/user_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe UserPolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :reset_password?, :change_email? do
diff --git a/spec/policies/user_role_policy_spec.rb b/spec/policies/user_role_policy_spec.rb
index c48b345d68..7708dfea55 100644
--- a/spec/policies/user_role_policy_spec.rb
+++ b/spec/policies/user_role_policy_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe UserRolePolicy do
subject { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:account) { Fabricate(:account) }
permissions :index?, :create? do
diff --git a/spec/policies/webhook_policy_spec.rb b/spec/policies/webhook_policy_spec.rb
index 9899235d83..10b5968165 100644
--- a/spec/policies/webhook_policy_spec.rb
+++ b/spec/policies/webhook_policy_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe WebhookPolicy do
let(:policy) { described_class }
- let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account }
+ let(:admin) { Fabricate(:admin_user).account }
let(:john) { Fabricate(:account) }
permissions :index?, :create? do
diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb
index 574d543844..6564f17372 100644
--- a/spec/rails_helper.rb
+++ b/spec/rails_helper.rb
@@ -119,6 +119,11 @@ RSpec.configure do |config|
config.include CommandLineHelpers, type: :cli
config.include SystemHelpers, type: :system
+ # TODO: Remove when Devise fixes https://github.com/heartcombo/devise/issues/5705
+ config.before do
+ Rails.application.reload_routes_unless_loaded
+ end
+
config.around(:each, use_transactional_tests: false) do |example|
self.use_transactional_tests = false
example.run
diff --git a/spec/requests/api/v1/admin/dimensions_spec.rb b/spec/requests/api/v1/admin/dimensions_spec.rb
index 81fb580ba7..3a4cd91716 100644
--- a/spec/requests/api/v1/admin/dimensions_spec.rb
+++ b/spec/requests/api/v1/admin/dimensions_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin Dimensions' do
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
let(:account) { Fabricate(:account) }
diff --git a/spec/requests/api/v1/admin/measures_spec.rb b/spec/requests/api/v1/admin/measures_spec.rb
index 519b5cc7b3..b55cd0f1b2 100644
--- a/spec/requests/api/v1/admin/measures_spec.rb
+++ b/spec/requests/api/v1/admin/measures_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin Measures' do
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
let(:account) { Fabricate(:account) }
diff --git a/spec/requests/api/v1/admin/retention_spec.rb b/spec/requests/api/v1/admin/retention_spec.rb
index e28bc2a94f..25e626e259 100644
--- a/spec/requests/api/v1/admin/retention_spec.rb
+++ b/spec/requests/api/v1/admin/retention_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin Retention' do
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
let(:account) { Fabricate(:account) }
diff --git a/spec/requests/api/v1/reports_spec.rb b/spec/requests/api/v1/reports_spec.rb
index 18b894bf63..1f113c649e 100644
--- a/spec/requests/api/v1/reports_spec.rb
+++ b/spec/requests/api/v1/reports_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe 'Reports' do
post '/api/v1/reports', headers: headers, params: params
end
- let!(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let!(:admin) { Fabricate(:admin_user) }
let(:status) { Fabricate(:status) }
let(:target_account) { status.account }
let(:category) { 'other' }
diff --git a/spec/requests/cache_spec.rb b/spec/requests/cache_spec.rb
index 9cce241b38..2a52e4dea9 100644
--- a/spec/requests/cache_spec.rb
+++ b/spec/requests/cache_spec.rb
@@ -172,7 +172,7 @@ RSpec.describe 'Caching behavior' do
before_all do
alice = Fabricate(:account, username: 'alice')
- user = Fabricate(:user, email: 'user@host.example', role: UserRole.find_by(name: 'Moderator'))
+ user = Fabricate(:moderator_user, email: 'user@host.example')
status = Fabricate(:status, account: alice, id: 110_224_538_612_341_312)
Fabricate(:status, account: alice, id: 110_224_538_643_211_312, visibility: :private)
Fabricate(:invite, code: 'abcdef')
diff --git a/spec/services/activitypub/process_status_update_service_spec.rb b/spec/services/activitypub/process_status_update_service_spec.rb
index 176af7d432..1a8ea2d170 100644
--- a/spec/services/activitypub/process_status_update_service_spec.rb
+++ b/spec/services/activitypub/process_status_update_service_spec.rb
@@ -271,7 +271,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do
.to change { status.tags.reload.pluck(:name) }.from(%w(test foo)).to(%w(foo bar))
.and change { status.account.featured_tags.find_by(name: 'test').statuses_count }.by(-1)
.and change { status.account.featured_tags.find_by(name: 'bar').statuses_count }.by(1)
- .and change { status.account.featured_tags.find_by(name: 'bar').last_status_at }.from(nil).to(be_within(0.1).of(Time.now.utc))
+ .and change { status.account.featured_tags.find_by(name: 'bar').last_status_at }.from(nil).to(be_present)
end
end
diff --git a/spec/services/appeal_service_spec.rb b/spec/services/appeal_service_spec.rb
index 6a47bb2cea..a4b1acf9cf 100644
--- a/spec/services/appeal_service_spec.rb
+++ b/spec/services/appeal_service_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe AppealService, :inline_jobs do
describe '#call' do
- let!(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let!(:admin) { Fabricate(:admin_user) }
context 'with an existing strike' do
let(:strike) { Fabricate(:account_warning) }
diff --git a/spec/services/software_update_check_service_spec.rb b/spec/services/software_update_check_service_spec.rb
index 637e1e26c5..73ffe6b899 100644
--- a/spec/services/software_update_check_service_spec.rb
+++ b/spec/services/software_update_check_service_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe SoftwareUpdateCheckService do
let(:full_update_check_url) { "#{update_check_url}?version=#{Mastodon::Version.to_s.split('+')[0]}" }
let(:devops_role) { Fabricate(:user_role, name: 'DevOps', permissions: UserRole::FLAGS[:view_devops]) }
- let(:owner_user) { Fabricate(:user, role: UserRole.find_by(name: 'Owner')) }
+ let(:owner_user) { Fabricate(:owner_user) }
let(:old_devops_user) { Fabricate(:user) }
let(:none_user) { Fabricate(:user, role: devops_role) }
let(:patch_user) { Fabricate(:user, role: devops_role) }
diff --git a/spec/support/system_helpers.rb b/spec/support/system_helpers.rb
index 4cc1928701..18889844f8 100644
--- a/spec/support/system_helpers.rb
+++ b/spec/support/system_helpers.rb
@@ -2,7 +2,7 @@
module SystemHelpers
def admin_user
- Fabricate(:user, role: UserRole.find_by(name: 'Admin'))
+ Fabricate(:admin_user)
end
def submit_button
diff --git a/spec/system/admin/account_moderation_notes_spec.rb b/spec/system/admin/account_moderation_notes_spec.rb
index 5d195143c2..fa930cea2c 100644
--- a/spec/system/admin/account_moderation_notes_spec.rb
+++ b/spec/system/admin/account_moderation_notes_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin::AccountModerationNotes' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
let(:target_account) { Fabricate(:account) }
before { sign_in current_user }
diff --git a/spec/system/admin/accounts_spec.rb b/spec/system/admin/accounts_spec.rb
index c21e01e4f3..30504ce5d7 100644
--- a/spec/system/admin/accounts_spec.rb
+++ b/spec/system/admin/accounts_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin::Accounts' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
before do
sign_in current_user
diff --git a/spec/system/admin/announcements_spec.rb b/spec/system/admin/announcements_spec.rb
index 87b7332639..65768eb18b 100644
--- a/spec/system/admin/announcements_spec.rb
+++ b/spec/system/admin/announcements_spec.rb
@@ -121,6 +121,6 @@ RSpec.describe 'Admin::Announcements' do
end
def admin_user
- Fabricate(:user, role: UserRole.find_by(name: 'Admin'))
+ Fabricate(:admin_user)
end
end
diff --git a/spec/system/admin/custom_emojis_spec.rb b/spec/system/admin/custom_emojis_spec.rb
index d597e30313..1d54aa4d5e 100644
--- a/spec/system/admin/custom_emojis_spec.rb
+++ b/spec/system/admin/custom_emojis_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin::CustomEmojis' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
before { sign_in current_user }
diff --git a/spec/system/admin/domain_allows_spec.rb b/spec/system/admin/domain_allows_spec.rb
index 1c462ff7cc..bacbb53eac 100644
--- a/spec/system/admin/domain_allows_spec.rb
+++ b/spec/system/admin/domain_allows_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin::DomainAllows' do
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
let(:domain) { 'host.example' }
before do
diff --git a/spec/system/admin/domain_blocks_spec.rb b/spec/system/admin/domain_blocks_spec.rb
index f00d65dfe0..56a5d11984 100644
--- a/spec/system/admin/domain_blocks_spec.rb
+++ b/spec/system/admin/domain_blocks_spec.rb
@@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe 'blocking domains through the moderation interface' do
before do
allow(DomainBlockWorker).to receive(:perform_async).and_return(true)
- sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
+ sign_in Fabricate(:admin_user), scope: :user
end
context 'when silencing a new domain' do
diff --git a/spec/system/admin/email_domain_blocks_spec.rb b/spec/system/admin/email_domain_blocks_spec.rb
index a90bede827..acf5027eda 100644
--- a/spec/system/admin/email_domain_blocks_spec.rb
+++ b/spec/system/admin/email_domain_blocks_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin::EmailDomainBlocks' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
before do
sign_in current_user
diff --git a/spec/system/admin/invites_spec.rb b/spec/system/admin/invites_spec.rb
index f2cee626c6..cc1e4bae18 100644
--- a/spec/system/admin/invites_spec.rb
+++ b/spec/system/admin/invites_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe 'Admin Invites' do
describe 'Invite interaction' do
let!(:invite) { Fabricate(:invite, expires_at: nil) }
- let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:user) { Fabricate(:admin_user) }
before { sign_in user }
diff --git a/spec/system/admin/ip_blocks_spec.rb b/spec/system/admin/ip_blocks_spec.rb
index c101b8e1c6..8e8c8031c8 100644
--- a/spec/system/admin/ip_blocks_spec.rb
+++ b/spec/system/admin/ip_blocks_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin::IpBlocks' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
before { sign_in current_user }
diff --git a/spec/system/admin/relays_spec.rb b/spec/system/admin/relays_spec.rb
new file mode 100644
index 0000000000..a5b92a4d0d
--- /dev/null
+++ b/spec/system/admin/relays_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Relays' do
+ describe 'Managing relays' do
+ before { sign_in Fabricate(:admin_user) }
+
+ describe 'Viewing relays' do
+ let!(:relay) { Fabricate :relay }
+
+ it 'lists existing records' do
+ visit admin_relays_path
+
+ expect(page)
+ .to have_content(I18n.t('admin.relays.title'))
+ .and have_content(relay.inbox_url)
+ end
+ end
+
+ describe 'Creating a new relay' do
+ it 'creates new record with valid attributes' do
+ visit admin_relays_path
+
+ # Visit new page
+ click_on I18n.t('admin.relays.setup')
+ expect(page)
+ .to have_content(I18n.t('admin.relays.add_new'))
+
+ # Invalid submission
+ fill_in 'relay_inbox_url', with: ''
+ expect { submit_form }
+ .to_not change(Relay, :count)
+ expect(page)
+ .to have_content(/errors below/)
+
+ # Valid submission
+ fill_in 'relay_inbox_url', with: 'https://host.example/hooks/123'
+ expect { submit_form }
+ .to change(Relay, :count).by(1)
+ expect(page)
+ .to have_content(I18n.t('admin.relays.title'))
+ end
+
+ def submit_form
+ click_on I18n.t('admin.relays.save_and_enable')
+ end
+ end
+
+ describe 'Destroy a relay' do
+ let!(:relay) { Fabricate :relay }
+
+ it 'removes the record' do
+ visit admin_relays_path
+
+ expect { click_on I18n.t('admin.relays.delete') }
+ .to change(Relay, :count).by(-1)
+ expect { relay.reload }
+ .to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ describe 'Toggle state of relay' do
+ let!(:relay) { Fabricate :relay, state: :accepted }
+
+ it 'switches state as requested' do
+ visit admin_relays_path
+
+ # Disable the initially enabled record
+ expect { click_on I18n.t('admin.relays.disable') }
+ .to change { relay.reload.accepted? }.to(false)
+
+ relay.update(state: :rejected)
+ # Re-enable the record
+ expect { click_on I18n.t('admin.relays.enable') }
+ .to change { relay.reload.pending? }.to(true)
+ end
+ end
+ end
+end
diff --git a/spec/system/admin/report_notes_spec.rb b/spec/system/admin/report_notes_spec.rb
new file mode 100644
index 0000000000..143bc8ac7c
--- /dev/null
+++ b/spec/system/admin/report_notes_spec.rb
@@ -0,0 +1,130 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Report Notes' do
+ let(:user) { Fabricate(:admin_user) }
+
+ before { sign_in user }
+
+ describe 'Creating notes' do
+ context 'when report is unresolved' do
+ let(:report) { Fabricate(:report, action_taken_at: nil, action_taken_by_account_id: nil) }
+
+ context 'when resolve is selected' do
+ it 'creates a report note and resolves report' do
+ visit admin_report_path(report)
+
+ fill_in 'report_note_content', with: 'Report note text'
+ expect { submit_form }
+ .to change(ReportNote, :count).by(1)
+ expect(report.reload)
+ .to be_action_taken
+ expect(page)
+ .to have_content(success_message)
+ end
+
+ def submit_form
+ click_on I18n.t('admin.reports.notes.create_and_resolve')
+ end
+ end
+
+ context 'when resolve is not selected' do
+ it 'creates a report note and does not resolve report' do
+ visit admin_report_path(report)
+
+ fill_in 'report_note_content', with: 'Report note text'
+ expect { submit_form }
+ .to change(ReportNote, :count).by(1)
+ expect(report.reload)
+ .to_not be_action_taken
+ expect(page)
+ .to have_content(success_message)
+ end
+
+ def submit_form
+ click_on I18n.t('admin.reports.notes.create')
+ end
+ end
+ end
+
+ context 'when report is resolved' do
+ let(:report) { Fabricate(:report, action_taken_at: Time.current, action_taken_by_account_id: user.account.id) }
+
+ context 'when create_and_unresolve flag is on' do
+ it 'creates a report note and unresolves report' do
+ visit admin_report_path(report)
+
+ fill_in 'report_note_content', with: 'Report note text'
+ expect { submit_form }
+ .to change(ReportNote, :count).by(1)
+ expect(report.reload)
+ .to_not be_action_taken
+ expect(page)
+ .to have_content(success_message)
+ end
+
+ def submit_form
+ click_on I18n.t('admin.reports.notes.create_and_unresolve')
+ end
+ end
+
+ context 'when create_and_unresolve flag is false' do
+ it 'creates a report note and does not unresolve report' do
+ visit admin_report_path(report)
+
+ fill_in 'report_note_content', with: 'Report note text'
+ expect { submit_form }
+ .to change(ReportNote, :count).by(1)
+ expect(report.reload)
+ .to be_action_taken
+ expect(page)
+ .to have_content(success_message)
+ end
+
+ def submit_form
+ click_on I18n.t('admin.reports.notes.create')
+ end
+ end
+ end
+
+ context 'when content is not valid' do
+ let(:report) { Fabricate(:report) }
+
+ it 'does not create a note' do
+ visit admin_report_path(report)
+
+ fill_in 'report_note_content', with: ''
+ expect { submit_form }
+ .to_not change(ReportNote, :count)
+ expect(page)
+ .to have_content(/error below/)
+ end
+
+ def submit_form
+ click_on I18n.t('admin.reports.notes.create')
+ end
+ end
+
+ def success_message
+ I18n.t('admin.report_notes.created_msg')
+ end
+ end
+
+ describe 'Removing notes' do
+ let!(:report_note) { Fabricate(:report_note) }
+
+ it 'deletes note' do
+ visit admin_report_path(report_note.report)
+
+ expect { delete_note }
+ .to change(ReportNote, :count).by(-1)
+ expect(page)
+ .to have_content(I18n.t('admin.report_notes.destroyed_msg'))
+ end
+
+ def delete_note
+ click_on I18n.t('admin.reports.notes.delete')
+ end
+ end
+end
diff --git a/spec/system/admin/reset_spec.rb b/spec/system/admin/reset_spec.rb
index d0f70a93f0..5cd0c048bb 100644
--- a/spec/system/admin/reset_spec.rb
+++ b/spec/system/admin/reset_spec.rb
@@ -28,7 +28,7 @@ RSpec.describe 'Admin::Reset' do
end
def admin_user
- Fabricate(:user, role: UserRole.find_by(name: 'Admin'))
+ Fabricate(:admin_user)
end
def submit_reset
diff --git a/spec/system/admin/rules_spec.rb b/spec/system/admin/rules_spec.rb
new file mode 100644
index 0000000000..a7eb3a0fce
--- /dev/null
+++ b/spec/system/admin/rules_spec.rb
@@ -0,0 +1,83 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Admin Rules' do
+ describe 'Managing rules' do
+ before { sign_in Fabricate(:admin_user) }
+
+ describe 'Viewing rules' do
+ let!(:rule) { Fabricate :rule, text: 'This is a rule' }
+
+ it 'lists existing records' do
+ visit admin_rules_path
+
+ expect(page)
+ .to have_content(I18n.t('admin.rules.title'))
+ .and have_content(rule.text)
+
+ click_on(rule.text)
+ expect(page)
+ .to have_content(I18n.t('admin.rules.title'))
+ end
+ end
+
+ describe 'Creating a new rule' do
+ it 'creates new record with valid attributes' do
+ visit admin_rules_path
+
+ # Invalid submission
+ fill_in 'rule_text', with: ''
+ expect { submit_form }
+ .to_not change(Rule, :count)
+ expect(page)
+ .to have_content(/error below/)
+
+ # Valid submission
+ fill_in 'rule_text', with: 'No yelling on the bus!'
+ expect { submit_form }
+ .to change(Rule, :count).by(1)
+ expect(page)
+ .to have_content(I18n.t('admin.rules.title'))
+ end
+
+ def submit_form
+ click_on I18n.t('admin.rules.add_new')
+ end
+ end
+
+ describe 'Editing an existing rule' do
+ let!(:rule) { Fabricate :rule, text: 'Rule text' }
+
+ it 'updates with valid attributes' do
+ visit admin_rules_path
+
+ # Invalid submission
+ click_on rule.text
+ fill_in 'rule_text', with: ''
+ expect { submit_form }
+ .to_not change(rule.reload, :updated_at)
+
+ # Valid update
+ fill_in 'rule_text', with: 'What day is this?'
+ expect { submit_form }
+ .to(change { rule.reload.text })
+ end
+
+ def submit_form
+ click_on I18n.t('generic.save_changes')
+ end
+ end
+
+ describe 'Destroy a rule' do
+ let!(:rule) { Fabricate :rule }
+
+ it 'removes the record' do
+ visit admin_rules_path
+
+ expect { click_on I18n.t('admin.rules.delete') }
+ .to change { rule.reload.discarded? }.to(true)
+ end
+ end
+ end
+end
diff --git a/spec/system/admin/software_updates_spec.rb b/spec/system/admin/software_updates_spec.rb
index 77e9f16684..f49c5a3c87 100644
--- a/spec/system/admin/software_updates_spec.rb
+++ b/spec/system/admin/software_updates_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe 'finding software updates through the admin interface' do
before do
Fabricate(:software_update, version: '99.99.99', type: 'major', urgent: true, release_notes: 'https://github.com/mastodon/mastodon/releases/v99')
- sign_in Fabricate(:user, role: UserRole.find_by(name: 'Owner')), scope: :user
+ sign_in Fabricate(:owner_user), scope: :user
end
it 'shows a link to the software updates page, which links to release notes' do
diff --git a/spec/system/admin/statuses_spec.rb b/spec/system/admin/statuses_spec.rb
index bb76a2963d..998ffc89df 100644
--- a/spec/system/admin/statuses_spec.rb
+++ b/spec/system/admin/statuses_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin::Statuses' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
before do
sign_in current_user
diff --git a/spec/system/admin/tags_spec.rb b/spec/system/admin/tags_spec.rb
index a3eca80d13..91227f0ca7 100644
--- a/spec/system/admin/tags_spec.rb
+++ b/spec/system/admin/tags_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe 'Admin Tags' do
describe 'Tag interaction' do
let!(:tag) { Fabricate(:tag, name: 'test') }
- before { sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ before { sign_in Fabricate(:admin_user) }
it 'allows tags listing and editing' do
visit admin_tags_path
diff --git a/spec/system/admin/terms_of_service_spec.rb b/spec/system/admin/terms_of_service_spec.rb
index d6ee1469d2..0842138034 100644
--- a/spec/system/admin/terms_of_service_spec.rb
+++ b/spec/system/admin/terms_of_service_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe 'Admin Terms of services' do
describe 'Viewing terms of services index page' do
let!(:terms) { Fabricate :terms_of_service, text: 'Test terms' }
- before { sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ before { sign_in Fabricate(:admin_user) }
it 'allows tags listing and editing' do
visit admin_terms_of_service_index_path
diff --git a/spec/system/admin/trends/links/preview_card_providers_spec.rb b/spec/system/admin/trends/links/preview_card_providers_spec.rb
index 16343a6891..0a5b5a7581 100644
--- a/spec/system/admin/trends/links/preview_card_providers_spec.rb
+++ b/spec/system/admin/trends/links/preview_card_providers_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin::Trends::Links::PreviewCardProviders' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
before do
sign_in current_user
diff --git a/spec/system/admin/trends/links_spec.rb b/spec/system/admin/trends/links_spec.rb
index 7a51c337c9..15138f42d1 100644
--- a/spec/system/admin/trends/links_spec.rb
+++ b/spec/system/admin/trends/links_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin::Trends::Links' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
before do
sign_in current_user
diff --git a/spec/system/admin/trends/statuses_spec.rb b/spec/system/admin/trends/statuses_spec.rb
index 13fc966dfd..45c048afb0 100644
--- a/spec/system/admin/trends/statuses_spec.rb
+++ b/spec/system/admin/trends/statuses_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin::Trends::Statuses' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
before do
sign_in current_user
diff --git a/spec/system/admin/trends/tags_spec.rb b/spec/system/admin/trends/tags_spec.rb
index d914badbd4..30b0850b93 100644
--- a/spec/system/admin/trends/tags_spec.rb
+++ b/spec/system/admin/trends/tags_spec.rb
@@ -3,7 +3,7 @@
require 'rails_helper'
RSpec.describe 'Admin::Trends::Tags' do
- let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ let(:current_user) { Fabricate(:admin_user) }
before do
sign_in current_user
diff --git a/spec/system/admin/webhooks_spec.rb b/spec/system/admin/webhooks_spec.rb
index 69e8a7d69f..cd9eb96da2 100644
--- a/spec/system/admin/webhooks_spec.rb
+++ b/spec/system/admin/webhooks_spec.rb
@@ -4,7 +4,7 @@ require 'rails_helper'
RSpec.describe 'Admin Webhooks' do
describe 'Managing webhooks' do
- before { sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+ before { sign_in Fabricate(:admin_user) }
describe 'Viewing webhooks' do
let!(:webhook) { Fabricate :webhook }
@@ -77,7 +77,7 @@ RSpec.describe 'Admin Webhooks' do
# Valid update
fill_in 'webhook_url', with: 'https://host.example/new/value/123'
expect { submit_form }
- .to_not change(webhook.reload, :url)
+ .to(change { webhook.reload.url })
end
def submit_form
diff --git a/spec/system/disputes/appeals_spec.rb b/spec/system/disputes/appeals_spec.rb
new file mode 100644
index 0000000000..860b8fcfd1
--- /dev/null
+++ b/spec/system/disputes/appeals_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe 'Dispute Appeals' do
+ let(:user) { Fabricate(:user) }
+ let!(:admin) { Fabricate(:admin_user) }
+
+ before { sign_in user }
+
+ describe 'Submitting an appeal', :inline_jobs do
+ let(:strike) { Fabricate(:account_warning, target_account: user.account) }
+
+ it 'Submits the appeal and notifies admins' do
+ visit disputes_strike_path(strike)
+
+ # Invalid with missing attribute
+ fill_in 'appeal_text', with: ''
+ emails = capture_emails do
+ expect { submit_form }
+ .to_not change(Appeal, :count)
+ end
+ expect(emails)
+ .to be_empty
+ expect(page)
+ .to have_content(/can't be blank/)
+
+ # Valid with text
+ fill_in 'appeal_text', with: 'It wasnt me this time!'
+ emails = capture_emails do
+ expect { submit_form }
+ .to change(Appeal, :count).by(1)
+ end
+ expect(emails)
+ .to contain_exactly(
+ have_attributes(
+ to: contain_exactly(admin.email),
+ subject: eq(new_appeal_subject)
+ )
+ )
+ expect(page)
+ .to have_content(I18n.t('disputes.strikes.appealed_msg'))
+ end
+
+ def new_appeal_subject
+ I18n.t('admin_mailer.new_appeal.subject', username: user.account.acct, instance: Rails.configuration.x.local_domain)
+ end
+
+ def submit_form
+ click_on I18n.t('disputes.strikes.appeals.submit')
+ end
+ end
+end
diff --git a/spec/workers/scheduler/auto_close_registrations_scheduler_spec.rb b/spec/workers/scheduler/auto_close_registrations_scheduler_spec.rb
index d9355248ba..af3c3fba34 100644
--- a/spec/workers/scheduler/auto_close_registrations_scheduler_spec.rb
+++ b/spec/workers/scheduler/auto_close_registrations_scheduler_spec.rb
@@ -9,8 +9,8 @@ RSpec.describe Scheduler::AutoCloseRegistrationsScheduler do
let(:moderator_activity_date) { Time.now.utc }
before do
- Fabricate(:user, role: UserRole.find_by(name: 'Owner'), current_sign_in_at: 10.years.ago)
- Fabricate(:user, role: UserRole.find_by(name: 'Moderator'), current_sign_in_at: moderator_activity_date)
+ Fabricate(:owner_user, current_sign_in_at: 10.years.ago)
+ Fabricate(:moderator_user, current_sign_in_at: moderator_activity_date)
end
context 'when registrations are open' do
diff --git a/streaming/package.json b/streaming/package.json
index e40d262378..2419ffd273 100644
--- a/streaming/package.json
+++ b/streaming/package.json
@@ -1,7 +1,7 @@
{
"name": "@mastodon/streaming",
"license": "AGPL-3.0-or-later",
- "packageManager": "yarn@4.5.3",
+ "packageManager": "yarn@4.6.0",
"engines": {
"node": ">=18"
},
diff --git a/yarn.lock b/yarn.lock
index fe8446eb4d..8f948e7609 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1480,26 +1480,26 @@ __metadata:
languageName: node
linkType: hard
-"@csstools/css-calc@npm:^2.1.0":
- version: 2.1.0
- resolution: "@csstools/css-calc@npm:2.1.0"
+"@csstools/css-calc@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "@csstools/css-calc@npm:2.1.1"
peerDependencies:
"@csstools/css-parser-algorithms": ^3.0.4
"@csstools/css-tokenizer": ^3.0.3
- checksum: 10c0/c707bb533a6ea63ed5bb4b8f1ffcbf3cd2daf970a6d76d42b684243426f5aa7513179a8f34d2e3c5a85df3870f44d3bc2850ca40b085c5fe00b41a291a2ecae2
+ checksum: 10c0/857c8dac40eb6ba8810408dad141bbcad060b28bce69dfd3bcf095a060fcaa23d5c4dbf52be88fcb57e12ce32c666e855dc68de1d8020851f6b432e3f9b29950
languageName: node
linkType: hard
-"@csstools/css-color-parser@npm:^3.0.6":
- version: 3.0.6
- resolution: "@csstools/css-color-parser@npm:3.0.6"
+"@csstools/css-color-parser@npm:^3.0.7":
+ version: 3.0.7
+ resolution: "@csstools/css-color-parser@npm:3.0.7"
dependencies:
"@csstools/color-helpers": "npm:^5.0.1"
- "@csstools/css-calc": "npm:^2.1.0"
+ "@csstools/css-calc": "npm:^2.1.1"
peerDependencies:
"@csstools/css-parser-algorithms": ^3.0.4
"@csstools/css-tokenizer": ^3.0.3
- checksum: 10c0/7c4f42a704c8c44cece75f5dcd647a83634dec0f44d398ae1fbdc6e8527d4fbdc3a809eaaba3b739edf8e3c09d62c28234636f250f9b0b0d52a599e824c22047
+ checksum: 10c0/b81780e6c50f0b0605776bd39bbd6203780231a561601853a9835cc70788560e7a281d0fbfe47ebe8affcb07dd64b0b1dcd4b67552520cfbe0e5088df158f12c
languageName: node
linkType: hard
@@ -1541,33 +1541,33 @@ __metadata:
languageName: node
linkType: hard
-"@csstools/postcss-color-function@npm:^4.0.6":
- version: 4.0.6
- resolution: "@csstools/postcss-color-function@npm:4.0.6"
+"@csstools/postcss-color-function@npm:^4.0.7":
+ version: 4.0.7
+ resolution: "@csstools/postcss-color-function@npm:4.0.7"
dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
+ "@csstools/css-color-parser": "npm:^3.0.7"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
"@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
"@csstools/utilities": "npm:^2.0.0"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/facbae01fd58898a176219cfcffee9ffb06fb466a2c439fd28403819e48778b682621b86a69682c0f758c659f8ec5f14eca1a9612b12b8777a2198173f386b49
+ checksum: 10c0/0f466e1d8863800f6428d7801e2134a834c9ea4b8098f84df41379cd3c3ba84f62588b46e03b26cf13c7d61b1112d22bdfd72adbcec7f5cb27f1149e855cd3ab
languageName: node
linkType: hard
-"@csstools/postcss-color-mix-function@npm:^3.0.6":
- version: 3.0.6
- resolution: "@csstools/postcss-color-mix-function@npm:3.0.6"
+"@csstools/postcss-color-mix-function@npm:^3.0.7":
+ version: 3.0.7
+ resolution: "@csstools/postcss-color-mix-function@npm:3.0.7"
dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
+ "@csstools/css-color-parser": "npm:^3.0.7"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
"@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
"@csstools/utilities": "npm:^2.0.0"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/66b906b2425ed137b1c2ef3d166036719ae69039668385dccce4e02bd91e41733b37dd3c884b74a2999067bfe8a8d8d1afa4082ef21a0bf044ba7e7fffb77e01
+ checksum: 10c0/e663615c7fde6effe9888c049bf74373c55d7d69e36c239eb1343c4aa86810b2407baebedd9fd67c6374fbecc32b4b96d11cdba6099473e4551ce7a1e9613513
languageName: node
linkType: hard
@@ -1585,16 +1585,16 @@ __metadata:
languageName: node
linkType: hard
-"@csstools/postcss-exponential-functions@npm:^2.0.5":
- version: 2.0.5
- resolution: "@csstools/postcss-exponential-functions@npm:2.0.5"
+"@csstools/postcss-exponential-functions@npm:^2.0.6":
+ version: 2.0.6
+ resolution: "@csstools/postcss-exponential-functions@npm:2.0.6"
dependencies:
- "@csstools/css-calc": "npm:^2.1.0"
+ "@csstools/css-calc": "npm:^2.1.1"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/8935cb69f70d7448aa5a3dcdfd188bdcfbc34e9a99131306947df8847126272773212011dcff85e10bcee4c9d01f94f7f8557ef93933122a0b82743185684ab1
+ checksum: 10c0/e8b5bdde8e60cdd628c6654f2336921fa0df1a9468ce3b7cd40c9f27457cd1f8a2ffc9c6380487d55c6188bed6e772679cefa4dfa5ba90229957a030df9403ce
languageName: node
linkType: hard
@@ -1610,46 +1610,46 @@ __metadata:
languageName: node
linkType: hard
-"@csstools/postcss-gamut-mapping@npm:^2.0.6":
- version: 2.0.6
- resolution: "@csstools/postcss-gamut-mapping@npm:2.0.6"
+"@csstools/postcss-gamut-mapping@npm:^2.0.7":
+ version: 2.0.7
+ resolution: "@csstools/postcss-gamut-mapping@npm:2.0.7"
dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
+ "@csstools/css-color-parser": "npm:^3.0.7"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/8a3f012774ab261924cc9f3519caa87a25a6abcd70d78f622144d8e7126a687bddbdaa92995fc30f53355759cd5971e71ac099b6b8cb85c89d8ca86455588e3b
+ checksum: 10c0/823603b1083ce2372ccbb2c25b744739cec8371ce593460a85896163fc8eb2b8e992497611af22dd765c2fccd8998b3d683732d61579d40bda0d3f21e6d74e06
languageName: node
linkType: hard
-"@csstools/postcss-gradients-interpolation-method@npm:^5.0.6":
- version: 5.0.6
- resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.6"
+"@csstools/postcss-gradients-interpolation-method@npm:^5.0.7":
+ version: 5.0.7
+ resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.7"
dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
+ "@csstools/css-color-parser": "npm:^3.0.7"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
"@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
"@csstools/utilities": "npm:^2.0.0"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/0d97be76837f972ea323b58189ded2310b618ad94b40777464d0d8ac050b557ca9fd1f20af5ada105d61574cc9d8c119ae0daf294a3aacaaa89926f864d9d674
+ checksum: 10c0/2998d28cd27ecf052da08679ca2fc5c8fcee68ade96cc32db4b4ae44f2b364954804e1e182cb547d6e8e4b5c84d6269763e12e3dfe1fd47c165c539c423b2ea0
languageName: node
linkType: hard
-"@csstools/postcss-hwb-function@npm:^4.0.6":
- version: 4.0.6
- resolution: "@csstools/postcss-hwb-function@npm:4.0.6"
+"@csstools/postcss-hwb-function@npm:^4.0.7":
+ version: 4.0.7
+ resolution: "@csstools/postcss-hwb-function@npm:4.0.7"
dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
+ "@csstools/css-color-parser": "npm:^3.0.7"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
"@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
"@csstools/utilities": "npm:^2.0.0"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/e7bcc98095ef2873a7b1a7326f1618bbeecc1c78660b23805bbefd8ec067bf2f35f2a2d4675be51a02d2280046f36f74d55f6af78e3ce107b82624d1a421ffcf
+ checksum: 10c0/fa8e329ec92a9a04ba8d41d6640e39ea109c8d9ea1c90eaa141e303ae9bc41eca2c7bec72e4211f79a48b7e6746d754a66045b10da04ca9953c8a394a3bc1099
languageName: node
linkType: hard
@@ -1751,17 +1751,17 @@ __metadata:
languageName: node
linkType: hard
-"@csstools/postcss-media-minmax@npm:^2.0.5":
- version: 2.0.5
- resolution: "@csstools/postcss-media-minmax@npm:2.0.5"
+"@csstools/postcss-media-minmax@npm:^2.0.6":
+ version: 2.0.6
+ resolution: "@csstools/postcss-media-minmax@npm:2.0.6"
dependencies:
- "@csstools/css-calc": "npm:^2.1.0"
+ "@csstools/css-calc": "npm:^2.1.1"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
"@csstools/media-query-list-parser": "npm:^4.0.2"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/0d17782076fcaba2c3c85bd769fc102d95809e9ee6141ad9de706ee116466cada62424fd68623c58cc2456771725291c356e550377ba73a102ab6fe628931e30
+ checksum: 10c0/9cae49dcbba3f6818b679490665b48f13ab6c57f323a7e614e53a850503b6c5957a0de8dfff7184332c82f6f8570846283a96698791afb367457e4b24a4437f9
languageName: node
linkType: hard
@@ -1801,18 +1801,18 @@ __metadata:
languageName: node
linkType: hard
-"@csstools/postcss-oklab-function@npm:^4.0.6":
- version: 4.0.6
- resolution: "@csstools/postcss-oklab-function@npm:4.0.6"
+"@csstools/postcss-oklab-function@npm:^4.0.7":
+ version: 4.0.7
+ resolution: "@csstools/postcss-oklab-function@npm:4.0.7"
dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
+ "@csstools/css-color-parser": "npm:^3.0.7"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
"@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
"@csstools/utilities": "npm:^2.0.0"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/74ec74eb7171881deeff7a79e0dc696097fb53dcdcd9627d9559cd7be63f41adecec06c1e88ddd5d8a37f4705715d1c0c135ca2b001fb70fdc0b76ab1e491b66
+ checksum: 10c0/16d438aee2340dedd27249b540e261ea07bad56ceba507f6118e3eb44c693a977a374b554a1006a14c5d6d024f62d7cc468d7f4351a1c4e04e3a58142a3026a3
languageName: node
linkType: hard
@@ -1827,31 +1827,31 @@ __metadata:
languageName: node
linkType: hard
-"@csstools/postcss-random-function@npm:^1.0.1":
- version: 1.0.1
- resolution: "@csstools/postcss-random-function@npm:1.0.1"
+"@csstools/postcss-random-function@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "@csstools/postcss-random-function@npm:1.0.2"
dependencies:
- "@csstools/css-calc": "npm:^2.1.0"
+ "@csstools/css-calc": "npm:^2.1.1"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/5e8f29c024aa6ed1f89ee8b9c8ece39c8e72602d63faa82d9684e3183828f01971cf2f760b7d5b773605d44a4ea661d6d4389ec03f7e21002f9aa9e8db613a61
+ checksum: 10c0/b0bc235999685045ca91f8f18eb56ced68747aec6e8b7ff57ac86b1c385d6c2526a528fde5fd32e0987b4387b22a75c73e2d2ebd57974c4ca32d3d60a1eb093a
languageName: node
linkType: hard
-"@csstools/postcss-relative-color-syntax@npm:^3.0.6":
- version: 3.0.6
- resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.6"
+"@csstools/postcss-relative-color-syntax@npm:^3.0.7":
+ version: 3.0.7
+ resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.7"
dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
+ "@csstools/css-color-parser": "npm:^3.0.7"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
"@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
"@csstools/utilities": "npm:^2.0.0"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/207ae711831f8ae9170093dbea3727cd6f32ca31d22c1231b5b678592679eb49e329e87ea403714b8e10feb5b9137780364cc7e1e7d8cc4c90d47483a42132dc
+ checksum: 10c0/8741e3c337e5f321569fd41dac2442641390716bc67175faa3301bbbeaf23fe5b722b3b0b8f133ad0b927f32a2ed5fb73565fa8ee88685239d781f1826142405
languageName: node
linkType: hard
@@ -1866,29 +1866,29 @@ __metadata:
languageName: node
linkType: hard
-"@csstools/postcss-sign-functions@npm:^1.1.0":
- version: 1.1.0
- resolution: "@csstools/postcss-sign-functions@npm:1.1.0"
+"@csstools/postcss-sign-functions@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "@csstools/postcss-sign-functions@npm:1.1.1"
dependencies:
- "@csstools/css-calc": "npm:^2.1.0"
+ "@csstools/css-calc": "npm:^2.1.1"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/503bbaa8fe1d1a619880d5d6b838f07f1898a5820889e5db3c4e02bb8b340dab18b88f439f9f1da44c6669bab2d4ba3f9543643ccc459d8a21191c5d22109c9b
+ checksum: 10c0/d9ebbbba833307aba0f490e527dd88a4796e94cc3ae0ba8ad1ada2830cdadfd3f9c9c37e18152903277905f847b71dac2ac1f9f78752aabc4c03a5c5c10157b1
languageName: node
linkType: hard
-"@csstools/postcss-stepped-value-functions@npm:^4.0.5":
- version: 4.0.5
- resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.5"
+"@csstools/postcss-stepped-value-functions@npm:^4.0.6":
+ version: 4.0.6
+ resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.6"
dependencies:
- "@csstools/css-calc": "npm:^2.1.0"
+ "@csstools/css-calc": "npm:^2.1.1"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/76f1f60c24b9e6a80b044eb19f37c1816788a2335fbf7c25f3fbea1cd7104857f424a451dcff60e4f8841618c6b6ffa6091f8b840d6d5930c1c7100c2f8ae74b
+ checksum: 10c0/9da91f2ca041a4c4a3118c3ac92b9c9ae244442423bb2d20f6861c5e8225af8f7e05b0d794ae0600dd7a23ca565f7714e066e7a3ea180350534dc0a30ae0d7f4
languageName: node
linkType: hard
@@ -1904,16 +1904,16 @@ __metadata:
languageName: node
linkType: hard
-"@csstools/postcss-trigonometric-functions@npm:^4.0.5":
- version: 4.0.5
- resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.5"
+"@csstools/postcss-trigonometric-functions@npm:^4.0.6":
+ version: 4.0.6
+ resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.6"
dependencies:
- "@csstools/css-calc": "npm:^2.1.0"
+ "@csstools/css-calc": "npm:^2.1.1"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/b8518c8b81da047448dcee12a5f3716dbc19671333387a4a673991a16f1a120441d2768de8a30ce1e2ef8d0d76509b9509f506ef1e8630da84834451414b23a3
+ checksum: 10c0/b5aae978bbdca94c4a0f292ab5ec01750d8aeb62d68e0f9326b49ce94166886dfbfb48f169c9a053e874c9df78243053a30ceec91270a6022396d541d8c44ce9
languageName: node
linkType: hard
@@ -5858,12 +5858,12 @@ __metadata:
linkType: hard
"bufferutil@npm:^4.0.7":
- version: 4.0.8
- resolution: "bufferutil@npm:4.0.8"
+ version: 4.0.9
+ resolution: "bufferutil@npm:4.0.9"
dependencies:
node-gyp: "npm:latest"
node-gyp-build: "npm:^4.3.0"
- checksum: 10c0/36cdc5b53a38d9f61f89fdbe62029a2ebcd020599862253fefebe31566155726df9ff961f41b8c97b02b4c12b391ef97faf94e2383392654cf8f0ed68f76e47c
+ checksum: 10c0/f8a93279fc9bdcf32b42eba97edc672b39ca0fe5c55a8596099886cffc76ea9dd78e0f6f51ecee3b5ee06d2d564aa587036b5d4ea39b8b5ac797262a363cdf7d
languageName: node
linkType: hard
@@ -13352,8 +13352,8 @@ __metadata:
linkType: hard
"pino@npm:^9.0.0":
- version: 9.5.0
- resolution: "pino@npm:9.5.0"
+ version: 9.6.0
+ resolution: "pino@npm:9.6.0"
dependencies:
atomic-sleep: "npm:^1.0.0"
fast-redact: "npm:^3.1.1"
@@ -13368,7 +13368,7 @@ __metadata:
thread-stream: "npm:^3.0.0"
bin:
pino: bin.js
- checksum: 10c0/b06590c5f4da43df59905af1aac344432b43154c4c1569ebea168e7ae7fd0a4181ccabb769a6568cf3e781e1d1b9df13d65b3603e25ebb05539bcb02ea04215e
+ checksum: 10c0/bcd1e9d9b301bea13b95689ca9ad7105ae9451928fb6c0b67b3e58c5fe37cea1d40665f3d6641e3da00be0bbc17b89031e67abbc8ea6aac6164f399309fd78e7
languageName: node
linkType: hard
@@ -13456,18 +13456,18 @@ __metadata:
languageName: node
linkType: hard
-"postcss-color-functional-notation@npm:^7.0.6":
- version: 7.0.6
- resolution: "postcss-color-functional-notation@npm:7.0.6"
+"postcss-color-functional-notation@npm:^7.0.7":
+ version: 7.0.7
+ resolution: "postcss-color-functional-notation@npm:7.0.7"
dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
+ "@csstools/css-color-parser": "npm:^3.0.7"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
"@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
"@csstools/utilities": "npm:^2.0.0"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/15f6dfc9a24d6f5186fb054623a92bcf9e804f4eaa35b339551a8048cdb0c7bd2e4655fdbb09a0c9a89f854e9fb1d71e298e8749597660ac034e79bd0d38d7dd
+ checksum: 10c0/d9f64abb54da1e2e2641d68548e5fe3685e1b5f85cd39059f1e9312f9c897eef80a76d1e9b9271d4700a5954fc0c0b6494fc8ed4a25fe64a25525b3973be4a36
languageName: node
linkType: hard
@@ -13678,18 +13678,18 @@ __metadata:
languageName: node
linkType: hard
-"postcss-lab-function@npm:^7.0.6":
- version: 7.0.6
- resolution: "postcss-lab-function@npm:7.0.6"
+"postcss-lab-function@npm:^7.0.7":
+ version: 7.0.7
+ resolution: "postcss-lab-function@npm:7.0.7"
dependencies:
- "@csstools/css-color-parser": "npm:^3.0.6"
+ "@csstools/css-color-parser": "npm:^3.0.7"
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
"@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
"@csstools/utilities": "npm:^2.0.0"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/8b8d498dbc939ee79737b29232b39d09cbda26cc92e8926fb74fe56a1bb05af1198e85a67a822f39cc69109ac6757a6ff7b20842ba5ffafce891abc9bc1c3c68
+ checksum: 10c0/bee0f50c3f59da04b219b528cdd63b8f2600fd9bbaa02ba101593f29f4cd090c25acc40254a41a11e3db221cc98b7a1b2600fd3abe3065262c2cb5c7501a3dba
languageName: node
linkType: hard
@@ -14010,18 +14010,18 @@ __metadata:
linkType: hard
"postcss-preset-env@npm:^10.0.0":
- version: 10.1.2
- resolution: "postcss-preset-env@npm:10.1.2"
+ version: 10.1.3
+ resolution: "postcss-preset-env@npm:10.1.3"
dependencies:
"@csstools/postcss-cascade-layers": "npm:^5.0.1"
- "@csstools/postcss-color-function": "npm:^4.0.6"
- "@csstools/postcss-color-mix-function": "npm:^3.0.6"
+ "@csstools/postcss-color-function": "npm:^4.0.7"
+ "@csstools/postcss-color-mix-function": "npm:^3.0.7"
"@csstools/postcss-content-alt-text": "npm:^2.0.4"
- "@csstools/postcss-exponential-functions": "npm:^2.0.5"
+ "@csstools/postcss-exponential-functions": "npm:^2.0.6"
"@csstools/postcss-font-format-keywords": "npm:^4.0.0"
- "@csstools/postcss-gamut-mapping": "npm:^2.0.6"
- "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.6"
- "@csstools/postcss-hwb-function": "npm:^4.0.6"
+ "@csstools/postcss-gamut-mapping": "npm:^2.0.7"
+ "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.7"
+ "@csstools/postcss-hwb-function": "npm:^4.0.7"
"@csstools/postcss-ic-unit": "npm:^4.0.0"
"@csstools/postcss-initial": "npm:^2.0.0"
"@csstools/postcss-is-pseudo-class": "npm:^5.0.1"
@@ -14031,19 +14031,19 @@ __metadata:
"@csstools/postcss-logical-overscroll-behavior": "npm:^2.0.0"
"@csstools/postcss-logical-resize": "npm:^3.0.0"
"@csstools/postcss-logical-viewport-units": "npm:^3.0.3"
- "@csstools/postcss-media-minmax": "npm:^2.0.5"
+ "@csstools/postcss-media-minmax": "npm:^2.0.6"
"@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.4"
"@csstools/postcss-nested-calc": "npm:^4.0.0"
"@csstools/postcss-normalize-display-values": "npm:^4.0.0"
- "@csstools/postcss-oklab-function": "npm:^4.0.6"
+ "@csstools/postcss-oklab-function": "npm:^4.0.7"
"@csstools/postcss-progressive-custom-properties": "npm:^4.0.0"
- "@csstools/postcss-random-function": "npm:^1.0.1"
- "@csstools/postcss-relative-color-syntax": "npm:^3.0.6"
+ "@csstools/postcss-random-function": "npm:^1.0.2"
+ "@csstools/postcss-relative-color-syntax": "npm:^3.0.7"
"@csstools/postcss-scope-pseudo-class": "npm:^4.0.1"
- "@csstools/postcss-sign-functions": "npm:^1.1.0"
- "@csstools/postcss-stepped-value-functions": "npm:^4.0.5"
+ "@csstools/postcss-sign-functions": "npm:^1.1.1"
+ "@csstools/postcss-stepped-value-functions": "npm:^4.0.6"
"@csstools/postcss-text-decoration-shorthand": "npm:^4.0.1"
- "@csstools/postcss-trigonometric-functions": "npm:^4.0.5"
+ "@csstools/postcss-trigonometric-functions": "npm:^4.0.6"
"@csstools/postcss-unset-value": "npm:^4.0.0"
autoprefixer: "npm:^10.4.19"
browserslist: "npm:^4.23.1"
@@ -14053,7 +14053,7 @@ __metadata:
cssdb: "npm:^8.2.3"
postcss-attribute-case-insensitive: "npm:^7.0.1"
postcss-clamp: "npm:^4.1.0"
- postcss-color-functional-notation: "npm:^7.0.6"
+ postcss-color-functional-notation: "npm:^7.0.7"
postcss-color-hex-alpha: "npm:^10.0.0"
postcss-color-rebeccapurple: "npm:^10.0.0"
postcss-custom-media: "npm:^11.0.5"
@@ -14066,7 +14066,7 @@ __metadata:
postcss-font-variant: "npm:^5.0.0"
postcss-gap-properties: "npm:^6.0.0"
postcss-image-set-function: "npm:^7.0.0"
- postcss-lab-function: "npm:^7.0.6"
+ postcss-lab-function: "npm:^7.0.7"
postcss-logical: "npm:^8.0.0"
postcss-nesting: "npm:^13.0.1"
postcss-opacity-percentage: "npm:^3.0.0"
@@ -14078,7 +14078,7 @@ __metadata:
postcss-selector-not: "npm:^8.0.1"
peerDependencies:
postcss: ^8.4
- checksum: 10c0/bd40330867a525679d434ff9602efbf229da9e745a3759c2d0b3cff166dd0f17bf99b44673ebb316df1906c2bf2edef97aeef1840aa6be170b43a34404df396d
+ checksum: 10c0/0ae02015ad3ac69e8ef26afc1a06cb9fbb400104eca5c69a4baa20925e06364712f05b5d87ec9cf9445256e62344e6c2bad8d261a09b35a0e982e055564e3ba8
languageName: node
linkType: hard
@@ -17482,22 +17482,22 @@ __metadata:
linkType: hard
"typescript@npm:5, typescript@npm:^5.0.4":
- version: 5.6.3
- resolution: "typescript@npm:5.6.3"
+ version: 5.7.2
+ resolution: "typescript@npm:5.7.2"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
- checksum: 10c0/44f61d3fb15c35359bc60399cb8127c30bae554cd555b8e2b46d68fa79d680354b83320ad419ff1b81a0bdf324197b29affe6cc28988cd6a74d4ac60c94f9799
+ checksum: 10c0/a873118b5201b2ef332127ef5c63fb9d9c155e6fdbe211cbd9d8e65877283797cca76546bad742eea36ed7efbe3424a30376818f79c7318512064e8625d61622
languageName: node
linkType: hard
"typescript@patch:typescript@npm%3A5#optional!builtin