Merge commit '58b52b7a33717406faa8d988b7c05efa52f46f6a' into glitch-soc/merge-upstream

Conflicts:
- `app/models/account.rb`:
  Upstream added new validations close to lines on which glitch-soc had
  modified validations to handle custom limits set through environment
  variables.
  Ported upstream changes.
- `config/initializers/content_security_policy.rb`:
  Upstream added `AZURE_ALIAS_HOST`. Glitch-soc's version of the file is
  completely different.
  Added `AZURE_ALIAS_HOST` to our version of the file.
th-downstream
Claire 1 year ago
commit 2f3f1d75fa

@ -1,13 +1,13 @@
# This configuration was generated by
# `haml-lint --auto-gen-config`
# on 2023-07-18 11:56:05 -0400 using Haml-Lint version 0.48.0.
# on 2023-07-20 09:47:50 -0400 using Haml-Lint version 0.48.0.
# The point is for the user to remove these configuration records
# one by one as the lints are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of Haml-Lint, may require this file to be generated again.
linters:
# Offense count: 959
# Offense count: 951
LineLength:
enabled: false
@ -15,7 +15,7 @@ linters:
UnnecessaryStringOutput:
enabled: false
# Offense count: 63
# Offense count: 57
RuboCop:
enabled: false
@ -26,7 +26,7 @@ linters:
- 'app/views/admin/reports/show.html.haml'
- 'app/views/disputes/strikes/show.html.haml'
# Offense count: 40
# Offense count: 32
InstanceVariables:
exclude:
- 'app/views/admin/reports/_actions.html.haml'
@ -38,7 +38,6 @@ linters:
- 'app/views/invites/_form.html.haml'
- 'app/views/relationships/_account.html.haml'
- 'app/views/shared/_og.html.haml'
- 'app/views/statuses/_status.html.haml'
# Offense count: 3
IdNames:

@ -127,12 +127,6 @@ Lint/UselessAssignment:
- 'spec/services/resolve_url_service_spec.rb'
- 'spec/views/statuses/show.html.haml_spec.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: CheckForMethodsWithNoSideEffects.
Lint/Void:
Exclude:
- 'spec/services/resolve_account_service_spec.rb'
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
Metrics/AbcSize:
Max: 150

@ -18,6 +18,7 @@ gem 'aws-sdk-s3', '~> 1.123', require: false
gem 'fog-core', '<= 2.4.0'
gem 'fog-openstack', '~> 0.3', require: false
gem 'kt-paperclip', '~> 7.2'
gem 'md-paperclip-azure', '~> 2.2', require: false
gem 'blurhash', '~> 0.1'
gem 'active_model_serializers', '~> 0.10'

@ -118,6 +118,14 @@ GEM
aws-sigv4 (~> 1.6)
aws-sigv4 (1.6.0)
aws-eventstream (~> 1, >= 1.0.2)
azure-storage-blob (2.0.3)
azure-storage-common (~> 2.0)
nokogiri (~> 1, >= 1.10.8)
azure-storage-common (2.0.4)
faraday (~> 1.0)
faraday_middleware (~> 1.0, >= 1.0.0.rc1)
net-http-persistent (~> 4.0)
nokogiri (~> 1, >= 1.10.8)
bcrypt (3.1.18)
better_errors (2.10.1)
erubi (>= 1.0.0)
@ -261,6 +269,8 @@ GEM
faraday-patron (1.0.0)
faraday-rack (1.0.0)
faraday-retry (1.0.3)
faraday_middleware (1.2.0)
faraday (~> 1.0)
fast_blank (1.0.1)
fastimage (2.2.7)
ffi (1.15.5)
@ -410,6 +420,10 @@ GEM
mario-redis-lock (1.2.1)
redis (>= 3.0.5)
matrix (0.4.2)
md-paperclip-azure (2.2.0)
addressable (~> 2.5)
azure-storage-blob (~> 2.0.1)
hashie (~> 5.0)
memory_profiler (1.0.1)
method_source (1.0.0)
mime-types (3.4.1)
@ -423,6 +437,8 @@ GEM
multipart-post (2.3.0)
net-http (0.3.2)
uri
net-http-persistent (4.0.2)
connection_pool (~> 2.2)
net-imap (0.3.6)
date
net-protocol
@ -822,6 +838,7 @@ DEPENDENCIES
link_header (~> 0.0)
lograge (~> 0.12)
mario-redis-lock (~> 1.2)
md-paperclip-azure (~> 2.2)
memory_profiler
mime-types (~> 3.4.1)
net-http (~> 0.3.2)

@ -17,13 +17,16 @@ class Api::V1::Statuses::FavouritesController < Api::BaseController
if fav
@status = fav.status
count = [@status.favourites_count - 1, 0].max
UnfavouriteWorker.perform_async(current_account.id, @status.id)
else
@status = Status.find(params[:status_id])
count = @status.favourites_count
authorize @status, :show?
end
render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_account.id, favourites_map: { @status.id => false })
relationships = StatusRelationshipsPresenter.new([@status], current_account.id, favourites_map: { @status.id => false }, attributes_map: { @status.id => { favourites_count: count } })
render json: @status, serializer: REST::StatusSerializer, relationships: relationships
rescue Mastodon::NotPermittedError
not_found
end

@ -24,15 +24,18 @@ class Api::V1::Statuses::ReblogsController < Api::BaseController
if @status
authorize @status, :unreblog?
@reblog = @status.reblog
count = [@reblog.reblogs_count - 1, 0].max
@status.discard
RemovalWorker.perform_async(@status.id)
@reblog = @status.reblog
else
@reblog = Status.find(params[:status_id])
count = @reblog.reblogs_count
authorize @reblog, :show?
end
render json: @reblog, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_account.id, reblogs_map: { @reblog.id => false })
relationships = StatusRelationshipsPresenter.new([@status], current_account.id, reblogs_map: { @reblog.id => false }, attributes_map: { @reblog.id => { reblogs_count: count } })
render json: @reblog, serializer: REST::StatusSerializer, relationships: relationships
rescue Mastodon::NotPermittedError
not_found
end

@ -236,6 +236,6 @@ module ApplicationHelper
private
def storage_host_var
ENV.fetch('S3_ALIAS_HOST', nil) || ENV.fetch('S3_CLOUDFRONT_HOST', nil)
ENV.fetch('S3_ALIAS_HOST', nil) || ENV.fetch('S3_CLOUDFRONT_HOST', nil) || ENV.fetch('AZURE_ALIAS_HOST', nil)
end
end

@ -65,33 +65,6 @@ module StatusesHelper
embedded_view? ? '_blank' : nil
end
def style_classes(status, is_predecessor, is_successor, include_threads)
classes = ['entry']
classes << 'entry-predecessor' if is_predecessor
classes << 'entry-reblog' if status.reblog?
classes << 'entry-successor' if is_successor
classes << 'entry-center' if include_threads
classes.join(' ')
end
def microformats_classes(status, is_direct_parent, is_direct_child)
classes = []
classes << 'p-in-reply-to' if is_direct_parent
classes << 'p-repost-of' if status.reblog? && is_direct_parent
classes << 'p-comment' if is_direct_child
classes.join(' ')
end
def microformats_h_class(status, is_predecessor, is_successor, include_threads)
if is_predecessor || status.reblog? || is_successor
'h-cite'
elsif include_threads
''
else
'h-entry'
end
end
def fa_visibility_icon(status)
case status.visibility
when 'public'

@ -184,6 +184,7 @@ class SwitchingColumnsArea extends PureComponent {
{singleColumn ? <Redirect from='/deck' to='/home' exact /> : null}
{singleColumn && pathName.startsWith('/deck/') ? <Redirect from={pathName} to={pathName.slice(5)} /> : null}
{!singleColumn && pathName === '/getting-started' ? <Redirect from='/getting-started' to='/deck/getting-started' exact /> : null}
<WrappedRoute path='/getting-started' component={GettingStarted} content={children} />
<WrappedRoute path='/keyboard-shortcuts' component={KeyboardShortcuts} content={children} />

@ -5,11 +5,16 @@ import { normalizeStatusTranslation } from '../actions/importer/normalizer';
import {
REBLOG_REQUEST,
REBLOG_FAIL,
UNREBLOG_REQUEST,
UNREBLOG_FAIL,
FAVOURITE_REQUEST,
FAVOURITE_FAIL,
UNFAVOURITE_SUCCESS,
UNFAVOURITE_REQUEST,
UNFAVOURITE_FAIL,
BOOKMARK_REQUEST,
BOOKMARK_FAIL,
UNBOOKMARK_REQUEST,
UNBOOKMARK_FAIL,
} from '../actions/interactions';
import {
STATUS_MUTE_SUCCESS,
@ -72,18 +77,28 @@ export default function statuses(state = initialState, action) {
return importStatuses(state, action.statuses);
case FAVOURITE_REQUEST:
return state.setIn([action.status.get('id'), 'favourited'], true);
case UNFAVOURITE_SUCCESS:
return state.updateIn([action.status.get('id'), 'favourites_count'], x => Math.max(0, x - 1));
case FAVOURITE_FAIL:
return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'favourited'], false);
case UNFAVOURITE_REQUEST:
return state.setIn([action.status.get('id'), 'favourited'], false);
case UNFAVOURITE_FAIL:
return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'favourited'], true);
case BOOKMARK_REQUEST:
return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'bookmarked'], true);
case BOOKMARK_FAIL:
return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'bookmarked'], false);
case UNBOOKMARK_REQUEST:
return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'bookmarked'], false);
case UNBOOKMARK_FAIL:
return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'bookmarked'], true);
case REBLOG_REQUEST:
return state.setIn([action.status.get('id'), 'reblogged'], true);
case REBLOG_FAIL:
return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'reblogged'], false);
case UNREBLOG_REQUEST:
return state.setIn([action.status.get('id'), 'reblogged'], false);
case UNREBLOG_FAIL:
return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'reblogged'], true);
case STATUS_MUTE_SUCCESS:
return state.setIn([action.id, 'muted'], true);
case STATUS_UNMUTE_SUCCESS:

@ -93,12 +93,19 @@ class Account < ApplicationRecord
# Remote user validations, also applies to internal actors
validates :username, format: { with: USERNAME_ONLY_RE }, if: -> { (!local? || actor_type == 'Application') && will_save_change_to_username? }
# Remote user validations
validates :uri, presence: true, unless: :local?, on: :create
# Local user validations
validates :username, format: { with: /\A[a-z0-9_]+\z/i }, length: { maximum: 30 }, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' }
validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' }
validates :display_name, length: { maximum: MAX_DISPLAY_NAME_LENGTH }, if: -> { local? && will_save_change_to_display_name? }
validates :note, note_length: { maximum: MAX_NOTE_LENGTH }, if: -> { local? && will_save_change_to_note? }
validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? }
validates :uri, absence: true, if: :local?, on: :create
validates :inbox_url, absence: true, if: :local?, on: :create
validates :shared_inbox_url, absence: true, if: :local?, on: :create
validates :followers_url, absence: true, if: :local?, on: :create
scope :remote, -> { where.not(domain: nil) }
scope :local, -> { where(domain: nil) }

@ -4,7 +4,7 @@ class StatusRelationshipsPresenter
PINNABLE_VISIBILITIES = %w(public unlisted private).freeze
attr_reader :reblogs_map, :favourites_map, :mutes_map, :pins_map,
:bookmarks_map, :filters_map
:bookmarks_map, :filters_map, :attributes_map
def initialize(statuses, current_account_id = nil, **options)
if current_account_id.nil?
@ -26,6 +26,7 @@ class StatusRelationshipsPresenter
@bookmarks_map = Status.bookmarks_map(status_ids, current_account_id).merge(options[:bookmarks_map] || {})
@mutes_map = Status.mutes_map(conversation_ids, current_account_id).merge(options[:mutes_map] || {})
@pins_map = Status.pins_map(pinnable_status_ids, current_account_id).merge(options[:pins_map] || {})
@attributes_map = options[:attributes_map] || {}
end
end

@ -85,49 +85,57 @@ class REST::StatusSerializer < ActiveModel::Serializer
ActivityPub::TagManager.instance.url_for(object)
end
def reblogs_count
relationships&.attributes_map&.dig(object.id, :reblogs_count) || object.reblogs_count
end
def favourites_count
relationships&.attributes_map&.dig(object.id, :favourites_count) || object.favourites_count
end
def favourited
if instance_options && instance_options[:relationships]
instance_options[:relationships].favourites_map[object.id] || false
if relationships
relationships.favourites_map[object.id] || false
else
current_user.account.favourited?(object)
end
end
def reblogged
if instance_options && instance_options[:relationships]
instance_options[:relationships].reblogs_map[object.id] || false
if relationships
relationships.reblogs_map[object.id] || false
else
current_user.account.reblogged?(object)
end
end
def muted
if instance_options && instance_options[:relationships]
instance_options[:relationships].mutes_map[object.conversation_id] || false
if relationships
relationships.mutes_map[object.conversation_id] || false
else
current_user.account.muting_conversation?(object.conversation)
end
end
def bookmarked
if instance_options && instance_options[:relationships]
instance_options[:relationships].bookmarks_map[object.id] || false
if relationships
relationships.bookmarks_map[object.id] || false
else
current_user.account.bookmarked?(object)
end
end
def pinned
if instance_options && instance_options[:relationships]
instance_options[:relationships].pins_map[object.id] || false
if relationships
relationships.pins_map[object.id] || false
else
current_user.account.pinned?(object)
end
end
def filtered
if instance_options && instance_options[:relationships]
instance_options[:relationships].filters_map[object.id] || []
if relationships
relationships.filters_map[object.id] || []
else
current_user.account.status_matches_filters(object)
end
@ -148,6 +156,12 @@ class REST::StatusSerializer < ActiveModel::Serializer
object.active_mentions.to_a.sort_by(&:id)
end
private
def relationships
instance_options && instance_options[:relationships]
end
class ApplicationSerializer < ActiveModel::Serializer
attributes :name, :website

@ -79,7 +79,7 @@ class ActivityPub::ProcessAccountService < BaseService
set_immediate_protocol_attributes!
@account.save
@account.save!
end
def update_account

@ -27,7 +27,7 @@
%button.button= t('admin.accounts.search')
= link_to t('admin.accounts.reset'), admin_reports_path, class: 'button negative'
- @reports.group_by(&:target_account_id).each do |target_account_id, reports|
- @reports.group_by(&:target_account_id).each do |_target_account_id, reports|
- target_account = reports.first.target_account
.report-card
.report-card__profile

@ -33,7 +33,7 @@
.auto-dir
= status_content_format(status)
- if status.ordered_media_attachments.size > 0
- if status.ordered_media_attachments.size.positive?
%p
- status.ordered_media_attachments.each do |a|
- if status.local?

@ -14,5 +14,5 @@
%label= t('activerecord.attributes.doorkeeper/application.scopes')
%span.hint= t('simple_form.hints.defaults.scopes')
- Doorkeeper.configuration.scopes.group_by { |s| s.split(':').first }.each do |k, v|
= f.input :scopes, label: false, hint: false, collection: v.sort, wrapper: :with_block_label, include_blank: false, label_method: ->(scope) { safe_join([content_tag(:samp, scope, class: class_for_scope(scope)), content_tag(:span, t("doorkeeper.scopes.#{scope}"), class: 'hint')]) }, selected: f.object.scopes.all, required: false, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li'
- Doorkeeper.configuration.scopes.group_by { |s| s.split(':').first }.each do |_key, value|
= f.input :scopes, label: false, hint: false, collection: value.sort, wrapper: :with_block_label, include_blank: false, label_method: ->(scope) { safe_join([content_tag(:samp, scope, class: class_for_scope(scope)), content_tag(:span, t("doorkeeper.scopes.#{scope}"), class: 'hint')]) }, selected: f.object.scopes.all, required: false, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li'

@ -8,7 +8,7 @@
- poll.loaded_options.each_with_index do |option, index|
%li
- if show_results
- percent = total_votes_count > 0 ? 100 * option.votes_count / total_votes_count : 0
- percent = total_votes_count.positive? ? 100 * option.votes_count / total_votes_count : 0
%label.poll__option><
%span.poll__number><
= "#{percent.round}%"

@ -1,61 +1,2 @@
:ruby
pinned ||= false
include_threads ||= false
is_predecessor ||= false
is_successor ||= false
direct_reply_id ||= false
parent_id ||= false
is_direct_parent = direct_reply_id == status.id
is_direct_child = parent_id == status.in_reply_to_id
centered ||= include_threads && !is_predecessor && !is_successor
h_class = microformats_h_class(status, is_predecessor, is_successor, include_threads)
style_classes = style_classes(status, is_predecessor, is_successor, include_threads)
mf_classes = microformats_classes(status, is_direct_parent, is_direct_child)
entry_classes = "#{h_class} #{mf_classes} #{style_classes}"
- if status.reply? && include_threads
- if @next_ancestor
.entry{ class: entry_classes }
= link_to_older ActivityPub::TagManager.instance.url_for(@next_ancestor)
= render partial: 'statuses/status', collection: @ancestors, as: :status, locals: { is_predecessor: true, direct_reply_id: status.in_reply_to_id }
.entry{ class: entry_classes }
- if status.reblog?
.status__prepend
.status__prepend-icon-wrapper
%i.status__prepend-icon.fa.fa-fw.fa-retweet
%span
= link_to ActivityPub::TagManager.instance.url_for(status.account), class: 'status__display-name muted' do
%bdi
%strong.emojify= display_name(status.account, custom_emojify: true)
= t('stream_entries.reblogged')
- elsif pinned
.status__prepend
.status__prepend-icon-wrapper
%i.status__prepend-icon.fa.fa-fw.fa-thumb-tack
%span
= t('stream_entries.pinned')
= render (centered ? 'statuses/detailed_status' : 'statuses/simple_status'), status: status.proper, hide_show_thread: is_predecessor || is_successor
- if include_threads
- if @since_descendant_thread_id
.entry{ class: entry_classes }
= link_to_newer short_account_status_url(status.account.username, status, max_descendant_thread_id: @since_descendant_thread_id + 1)
- @descendant_threads.each do |thread|
= render partial: 'statuses/status', collection: thread[:statuses], as: :status, locals: { is_successor: true, parent_id: status.id }
- if thread[:next_status]
.entry{ class: entry_classes }
= link_to_newer ActivityPub::TagManager.instance.url_for(thread[:next_status])
- if @next_descendant_thread
.entry{ class: entry_classes }
= link_to_newer short_account_status_url(status.account.username, status, since_descendant_thread_id: @max_descendant_thread_id - 1)
- if include_threads && !embedded_view? && !user_signed_in?
.entry{ class: entry_classes }
= link_to_login class: 'load-more load-gap' do
= fa_icon 'comments'
= t('statuses.sign_in_to_participate')
.entry
= render (centered ? 'statuses/detailed_status' : 'statuses/simple_status'), status: status.proper, hide_show_thread: false

@ -9,7 +9,7 @@ if Rails.env.production?
data_hosts = [assets_host]
if ENV['S3_ENABLED'] == 'true'
attachments_host = "https://#{ENV['S3_ALIAS_HOST'] || ENV['S3_CLOUDFRONT_HOST'] || ENV['S3_HOSTNAME'] || "s3-#{ENV['S3_REGION'] || 'us-east-1'}.amazonaws.com"}"
attachments_host = "https://#{ENV['S3_ALIAS_HOST'] || ENV['S3_CLOUDFRONT_HOST'] || ENV['AZURE_ALIAS_HOST'] || ENV['S3_HOSTNAME'] || "s3-#{ENV['S3_REGION'] || 'us-east-1'}.amazonaws.com"}"
attachments_host = "https://#{Addressable::URI.parse(attachments_host).host}"
elsif ENV['SWIFT_ENABLED'] == 'true'
attachments_host = ENV['SWIFT_OBJECT_URL']

@ -131,6 +131,26 @@ elsif ENV['SWIFT_ENABLED'] == 'true'
fog_host: ENV['SWIFT_OBJECT_URL'],
fog_public: true
)
elsif ENV['AZURE_ENABLED'] == 'true'
require 'paperclip-azure'
Paperclip::Attachment.default_options.merge!(
storage: :azure,
azure_options: {
protocol: 'https',
},
azure_credentials: {
storage_account_name: ENV['AZURE_STORAGE_ACCOUNT'],
storage_access_key: ENV['AZURE_STORAGE_ACCESS_KEY'],
container: ENV['AZURE_CONTAINER_NAME'],
}
)
if ENV.has_key?('AZURE_ALIAS_HOST')
Paperclip::Attachment.default_options.merge!(
url: ':azure_alias_url',
azure_host_alias: ENV['AZURE_ALIAS_HOST']
)
end
else
Paperclip::Attachment.default_options.merge!(
storage: :filesystem,

@ -1488,7 +1488,6 @@ an:
show_newer: Amostrar mas recients
show_older: Amostrar mas antigos
show_thread: Amostrar discusión
sign_in_to_participate: Rechistra-te pa participar en a conversación
title: "%{name}: «%{quote}»"
visibilities:
direct: Directa
@ -1533,8 +1532,6 @@ an:
min_reblogs: Mantener publicacions reblogueadas mas de
min_reblogs_hint: No borra garra d'as publicacions que haigan estau reblogueadas mas d'este numero de vegadas. Deixa en blanco pa eliminar publicacions sin importar lo numero de reblogueos
stream_entries:
pinned: Publicación fixada
reblogged: retutau
sensitive_content: Conteniu sensible
strikes:
errors:

@ -1623,7 +1623,6 @@ ar:
show_newer: إظهار أحدث
show_older: إظهار أقدم
show_thread: اعرض خيط المحادثة
sign_in_to_participate: قم بتسجيل الدخول للمشاركة في هذه المحادثة
title: '%{name}: "%{quote}"'
visibilities:
direct: مباشرة
@ -1669,8 +1668,6 @@ ar:
min_reblogs: إبقاء المشاركات المعززة أكثر من
min_reblogs_hint: لن تُحذف أي من منشوراتك التي أعيد مشاركتها أكثر من هذا العدد من المرات. اتركه فارغاً لحذف المنشورات بغض النظر عن عدد إعادات المشاركة
stream_entries:
pinned: منشور مثبّت
reblogged: شارَكَه
sensitive_content: محتوى حساس
strikes:
errors:

@ -1698,7 +1698,6 @@ be:
show_newer: Паказаць навейшыя
show_older: Паказаць старэйшыя
show_thread: Паказаць ланцуг
sign_in_to_participate: Зарэгіструйцеся каб удзельнічаць у абмеркаванні
title: '%{name}: "%{quote}"'
visibilities:
direct: Асабіста
@ -1744,8 +1743,6 @@ be:
min_reblogs: Захаваць допісы, якія пашырылі хаця б
min_reblogs_hint: Не выдаляе вашыя допісы, якія пашырыла прынамсі вызначаная колькасць людзей. Пакіньце гэтае поле пустым, каб допісы выдаляліся незалежна ад гэтай колькасці
stream_entries:
pinned: Замацаваны допіс
reblogged: пашыраны
sensitive_content: Далікатны змест
strikes:
errors:

@ -1634,7 +1634,6 @@ bg:
show_newer: Показване на по-нови
show_older: Показване на по-стари
show_thread: Показване на нишката
sign_in_to_participate: Влезте, за да участвате в разговора
title: "%{name}: „%{quote}“"
visibilities:
direct: Директно
@ -1680,8 +1679,6 @@ bg:
min_reblogs: Запазване на публикации с поне толкова споделяния
min_reblogs_hint: Не се изтриват ваши публикации, споделени поне толкова пъти. Оставете празно, за да изтриете публикациите независимо от техния брой споделяния
stream_entries:
pinned: Закачена публикация
reblogged: подсилено
sensitive_content: Деликатно съдържание
strikes:
errors:

@ -502,9 +502,6 @@ br:
'604800': 1 sizhunvezh
'63113904': 2 vloavezh
'7889238': 3 months
stream_entries:
pinned: Toud spilhennet
reblogged: en·he deus skignet
themes:
default: Mastodoñ (Teñval)
mastodon-light: Mastodoñ (Sklaer)

@ -1634,7 +1634,6 @@ ca:
show_newer: Mostra els més nous
show_older: Mostra els més vells
show_thread: Mostra el fil
sign_in_to_participate: Inicia la sessió per participar a la conversa
title: '%{name}: "%{quote}"'
visibilities:
direct: Directe
@ -1680,8 +1679,6 @@ ca:
min_reblogs: Mantenir les publicacions impulsades més de
min_reblogs_hint: No suprimeix cap de les teves publicacions que s'hagin impulsat més que aquest nombre de vegades. Deixa-ho en blanc per a suprimir les publicacions independentment del nombre d'impulsos que tinguin.
stream_entries:
pinned: Publicació fixada
reblogged: ha impulsat
sensitive_content: Contingut sensible
strikes:
errors:

@ -996,7 +996,6 @@ ckb:
show_newer: نوێتر پیشان بدە
show_older: پیشاندانی کۆنتر
show_thread: نیشاندانی ڕشتە
sign_in_to_participate: بچۆ ژوورەوە بۆ بەشداریکردن لە گفتوگۆکەدا
visibilities:
private: شوێنکەوتوانی تەنها
private_long: تەنها بۆ شوێنکەوتوانی پیشان بدە
@ -1005,8 +1004,6 @@ ckb:
unlisted: پێرست نەبووە
unlisted_long: هەموو کەس دەتوانێت بیبینێت، بەڵام لە هێڵی کاتی گشتی دا نەریزراوە
stream_entries:
pinned: توتی چەسپکراو
reblogged: بەهێزکردن
sensitive_content: ناوەڕۆکی هەستیار
tags:
does_not_match_previous_name: لەگەڵ ناوی پێشوو یەک ناگرێتەوە

@ -983,7 +983,6 @@ co:
show_newer: Vede i più ricenti
show_older: Vede i più anziani
show_thread: Vede u filu
sign_in_to_participate: Cunnettatevi per participà à a cunversazione
title: '%{name}: "%{quote}"'
visibilities:
direct: Direttu
@ -1021,8 +1020,6 @@ co:
min_reblogs: Cunservà i statuti spartuti più di
min_reblogs_hint: Ùn sguassa micca i vostri statuti chì anu ricevuti più chì stu numeru di spartere. Lasciate viotu per sguassà i statuti senza piglià in contu u numaru di spartere
stream_entries:
pinned: Statutu puntarulatu
reblogged: hà spartutu
sensitive_content: Cuntenutu sensibile
tags:
does_not_match_previous_name: ùn currisponde micca à l'anzianu nome

@ -1642,7 +1642,6 @@ cs:
show_newer: Zobrazit novější
show_older: Zobrazit starší
show_thread: Zobrazit vlákno
sign_in_to_participate: Chcete-li se zúčastnit této konverzace, přihlaste se
title: "%{name}: „%{quote}“"
visibilities:
direct: Přímé
@ -1688,8 +1687,6 @@ cs:
min_reblogs: Zachovat příspěvky boostnuté alespoň
min_reblogs_hint: Nesmaže žádný z vašich příspěvků, který byl boostnut alespoň tolikrát. Ponechte prázdné pro mazání příspěvků bez ohledu na počet jejich boostnutí
stream_entries:
pinned: Připnutý příspěvek
reblogged: boostnul
sensitive_content: Citlivý obsah
strikes:
errors:

@ -1762,7 +1762,6 @@ cy:
show_newer: Dangos y diweddaraf
show_older: Dangos pethau hŷn
show_thread: Dangos trywydd
sign_in_to_participate: Mengofnodwch i gymryd rhan yn y sgwrs
title: '%{name}: "%{quote}"'
visibilities:
direct: Uniongyrchol
@ -1808,8 +1807,6 @@ cy:
min_reblogs: Cadw postiadau wedi eu hybu o leiaf
min_reblogs_hint: Nid yw'n dileu unrhyw un o'ch postiadau sydd wedi cael eu hybu o leiaf y nifer hwn o weithiau. Gadewch yn wag i ddileu postiadau waeth beth fo'u nifer o hybiadau
stream_entries:
pinned: Postiad wedi'i binio
reblogged: hybwyd
sensitive_content: Cynnwys sensitif
strikes:
errors:

@ -1634,7 +1634,6 @@ da:
show_newer: Vis nyere
show_older: Vis ældre
show_thread: Vis tråd
sign_in_to_participate: Log ind for at deltage i konversationen
title: '%{name}: "%{quote}"'
visibilities:
direct: Direkte
@ -1680,8 +1679,6 @@ da:
min_reblogs: Behold indlæg boostet mindst
min_reblogs_hint: Sletter ingen egne indlæg, som er boostet flere end dette antal gange. Lad stå tomt for at ignorere denne tærskel under sletning
stream_entries:
pinned: Fastgjort indlæg
reblogged: boostet
sensitive_content: Sensitivt indhold
strikes:
errors:

@ -1634,7 +1634,6 @@ de:
show_newer: Neuere anzeigen
show_older: Ältere anzeigen
show_thread: Thread anzeigen
sign_in_to_participate: Melde dich an, um an der Unterhaltung teilzunehmen
title: "%{name}: „%{quote}“"
visibilities:
direct: Direktnachricht
@ -1680,8 +1679,6 @@ de:
min_reblogs: Beiträge behalten, die mindestens so oft geteilt wurden
min_reblogs_hint: Löscht keine Beiträge, die mindestens so oft geteilt worden sind. Lass das Feld leer, um alle Beiträge unabhängig der Anzahl an geteilten Beiträgen zu löschen
stream_entries:
pinned: Angehefteter Beitrag
reblogged: teilte
sensitive_content: Inhaltswarnung
strikes:
errors:

@ -1570,7 +1570,6 @@ el:
show_newer: Εμφάνιση νεότερων
show_older: Εμφάνιση παλαιότερων
show_thread: Εμφάνιση νήματος
sign_in_to_participate: Συνδέσου για να συμμετάσχεις στη συζήτηση
title: '%{name}: "%{quote}"'
visibilities:
direct: Άμεση
@ -1616,8 +1615,6 @@ el:
min_reblogs: Διατήρηση αναρτήσεων που έχουν ενισχυθεί τουλάχιστον
min_reblogs_hint: Δεν διαγράφει καμία από τις δημοσιεύσεις σας που έχει λάβει τουλάχιστον αυτόν τον αριθμό ενισχύσεων. Αφήστε κενό για να διαγράψετε δημοσιεύσεις ανεξάρτητα από τον αριθμό των ενισχύσεων
stream_entries:
pinned: Καρφιτσωμένη ανάρτηση
reblogged: ενισχύθηκε
sensitive_content: Ευαίσθητο περιεχόμενο
strikes:
errors:

@ -1634,7 +1634,6 @@ en-GB:
show_newer: Show newer
show_older: Show older
show_thread: Show thread
sign_in_to_participate: Sign in to participate in the conversation
title: '%{name}: "%{quote}"'
visibilities:
direct: Direct
@ -1680,8 +1679,6 @@ en-GB:
min_reblogs: Keep posts boosted at least
min_reblogs_hint: Doesn't delete any of your posts that has been boosted at least this number of times. Leave blank to delete posts regardless of their number of boosts
stream_entries:
pinned: Pinned post
reblogged: boosted
sensitive_content: Sensitive content
strikes:
errors:

@ -770,7 +770,7 @@ en:
approved: Approval required for sign up
none: Nobody can sign up
open: Anyone can sign up
title: Server Settings
title: Server settings
site_uploads:
delete: Delete uploaded file
destroyed_msg: Site upload successfully deleted!
@ -1635,7 +1635,6 @@ en:
show_newer: Show newer
show_older: Show older
show_thread: Show thread
sign_in_to_participate: Login to participate in the conversation
title: '%{name}: "%{quote}"'
visibilities:
direct: Direct
@ -1681,8 +1680,6 @@ en:
min_reblogs: Keep posts boosted at least
min_reblogs_hint: Doesn't delete any of your posts that has been boosted at least this number of times. Leave blank to delete posts regardless of their number of boosts
stream_entries:
pinned: Pinned post
reblogged: boosted
sensitive_content: Sensitive content
strikes:
errors:

@ -1589,7 +1589,6 @@ eo:
show_newer: Montri pli novajn
show_older: Montri pli malnovajn
show_thread: Montri la mesaĝaron
sign_in_to_participate: Ensalutu por partopreni la konversacion
title: "%{name}: “%{quote}”"
visibilities:
direct: Rekta
@ -1635,8 +1634,6 @@ eo:
min_reblogs: Konservi diskonitajn mesaĝojn almenau
min_reblogs_hint: Oni ne forigas viajn afiŝojn kiuj estas diskonigitaj almenaŭ ĉi tiun nombron da fojoj. Lasu malplena por forigi afiŝojn sendepende de iliaj nombroj da diskonigoj
stream_entries:
pinned: Fiksita afiŝo
reblogged: diskonigita
sensitive_content: Tikla enhavo
strikes:
errors:

@ -1634,7 +1634,6 @@ es-AR:
show_newer: Mostrar más recientes
show_older: Mostrar más antiguos
show_thread: Mostrar hilo
sign_in_to_participate: Iniciá sesión para participar en la conversación
title: '%{name}: "%{quote}"'
visibilities:
direct: Directo
@ -1680,8 +1679,6 @@ es-AR:
min_reblogs: Conservar adhesiones de por lo menos
min_reblogs_hint: No elimina ninguno de tus mensajes que haya recibido más de esta cantidad de adhesiones. Dejá en blanco para eliminar mensajes independientemente de su número de adhesiones.
stream_entries:
pinned: Mensaje fijado
reblogged: adhirió a este mensaje
sensitive_content: Contenido sensible
strikes:
errors:

@ -1634,7 +1634,6 @@ es-MX:
show_newer: Mostrar más recientes
show_older: Mostrar más antiguos
show_thread: Mostrar discusión
sign_in_to_participate: Regístrate para participar en la conversación
title: "%{name}: «%{quote}»"
visibilities:
direct: Directa
@ -1680,8 +1679,6 @@ es-MX:
min_reblogs: Mantener publicaciones reblogueadas más de
min_reblogs_hint: No borra ninguna de las publicaciones que hayan sido reblogueadas más de este número de veces. Deja en blanco para eliminar publicaciones sin importar el número de reblogueos
stream_entries:
pinned: Toot fijado
reblogged: retooteado
sensitive_content: Contenido sensible
strikes:
errors:

@ -1634,7 +1634,6 @@ es:
show_newer: Mostrar más recientes
show_older: Mostrar más antiguos
show_thread: Mostrar discusión
sign_in_to_participate: Inicia sesión para participar en la conversación
title: "%{name}: «%{quote}»"
visibilities:
direct: Directa
@ -1680,8 +1679,6 @@ es:
min_reblogs: Mantener publicaciones reblogueadas más de
min_reblogs_hint: No borra ninguna de las publicaciones que hayan sido reblogueadas más de este número de veces. Deja en blanco para eliminar publicaciones sin importar el número de reblogueos
stream_entries:
pinned: Publicación fijada
reblogged: impulsó
sensitive_content: Contenido sensible
strikes:
errors:

@ -1634,7 +1634,6 @@ et:
show_newer: Uuemate kuvamine
show_older: Vanemate kuvamine
show_thread: Kuva lõim
sign_in_to_participate: Logi sisse, et liituda vestlusega
title: '%{name}: "%{quote}"'
visibilities:
direct: Otsene
@ -1682,8 +1681,6 @@ et:
min_reblogs: Säilita postitused jagatud vähemalt
min_reblogs_hint: Ei kustuta postitusi, kui need on jagatud vähemalt nii mitu korda. Tühjaks jättes kustuvad postitused olenemata jagamistest
stream_entries:
pinned: Kinnitatud postitus
reblogged: jagatud
sensitive_content: Tundlik sisu
strikes:
errors:

@ -1592,7 +1592,6 @@ eu:
show_newer: Erakutsi berriagoak
show_older: Erakutsi zaharragoak
show_thread: Erakutsi haria
sign_in_to_participate: Eman izena elkarrizketan parte hartzeko
title: '%{name}: "%{quote}"'
visibilities:
direct: Zuzena
@ -1638,8 +1637,6 @@ eu:
min_reblogs: Mantendu bultzada kopuru hau duten bidalketak
min_reblogs_hint: Gutxienez bultzada kopuru hau jaso duten zure bidalketak ez dira ezabatuko. Hutsik utziz gero bultzada kopurua ez da kontuan hartuko bidalketak ezabatzean
stream_entries:
pinned: Finkatutako bidalketa
reblogged: "(r)en bultzada"
sensitive_content: 'Kontuz: Eduki hunkigarria'
strikes:
errors:

@ -1403,7 +1403,6 @@ fa:
show_newer: نمایش جدیدتر
show_older: نمایش قدیمی‌تر
show_thread: نمایش رشته
sign_in_to_participate: برای شرکت در گفتگو وارد حساب خود شوید
title: "%{name}: «%{quote}»"
visibilities:
direct: مستقیم
@ -1449,8 +1448,6 @@ fa:
min_reblogs: نگه داشتن فرسته‌هایی با تقویت بیش از
min_reblogs_hint: هیچ یک از فرسته‌هایتان را که بیش از این تعداد تقویت شده باشند، حذف نمی‌کند. برای حذف فرسته‌ها فارغ از تعداد تقویت‌هایشان، خالی بگذارید
stream_entries:
pinned: نوشته‌های ثابت
reblogged: تقویت شده
sensitive_content: محتوای حساس
strikes:
errors:

@ -1634,7 +1634,6 @@ fi:
show_newer: Näytä uudemmat
show_older: Näytä vanhempi
show_thread: Näytä ketju
sign_in_to_participate: Kirjaudu osallistuaksesi keskusteluun
title: "%{name}: ”%{quote}”"
visibilities:
direct: Suoraan
@ -1680,8 +1679,6 @@ fi:
min_reblogs: Pidä viestit tehostettuna vähintään
min_reblogs_hint: Ei poista yhtään viestiäsi, jota on tehostettu vähintään näin monta kertaa. Jätä tyhjäksi poistaaksesi viestejä riippumatta niiden tehosteiden määrästä
stream_entries:
pinned: Kiinnitetty tuuttaus
reblogged: tehosti
sensitive_content: Arkaluontoista sisältöä
strikes:
errors:

@ -1634,7 +1634,6 @@ fo:
show_newer: Vís nýggjari
show_older: Vís eldri
show_thread: Vís tráð
sign_in_to_participate: Rita inn fyri at luttaka í samrøðuni
title: '%{name}: "%{quote}"'
visibilities:
direct: Beinleiðis
@ -1680,8 +1679,6 @@ fo:
min_reblogs: Varðveit postar, sum eru stimbraðir í minsta lagi
min_reblogs_hint: Strikar ikki postar hjá tær, sum eru stimbraðir í minsta lagi so ofta. Lat vera blankt, um postar skulu strikast óansæð, hvussu ofta teir eru stimbraðir
stream_entries:
pinned: Festir postar
reblogged: stimbraður
sensitive_content: Viðkvæmt innihald
strikes:
errors:

@ -1634,7 +1634,6 @@ fr-QC:
show_newer: Plus récents
show_older: Plus anciens
show_thread: Afficher le fil de discussion
sign_in_to_participate: Inscrivez-vous pour prendre part à la conversation
title: "%{name}: « %{quote} »"
visibilities:
direct: Direct
@ -1680,8 +1679,6 @@ fr-QC:
min_reblogs: Conserver les messages partagés au moins
min_reblogs_hint: Ne supprime aucun de vos messages qui ont été partagés au moins ce nombre de fois. Laisser vide pour supprimer les messages indépendamment de leur nombre de partages
stream_entries:
pinned: Message épinglé
reblogged: a partagé
sensitive_content: Contenu sensible
strikes:
errors:

@ -1634,7 +1634,6 @@ fr:
show_newer: Plus récents
show_older: Plus anciens
show_thread: Afficher le fil de discussion
sign_in_to_participate: Inscrivez-vous pour prendre part à la conversation
title: "%{name}: « %{quote} »"
visibilities:
direct: Direct
@ -1680,8 +1679,6 @@ fr:
min_reblogs: Conserver les messages partagés au moins
min_reblogs_hint: Ne supprime aucun de vos messages qui ont été partagés au moins ce nombre de fois. Laisser vide pour supprimer les messages indépendamment de leur nombre de partages
stream_entries:
pinned: Message épinglé
reblogged: a partagé
sensitive_content: Contenu sensible
strikes:
errors:

@ -1634,7 +1634,6 @@ fy:
show_newer: Nijere toane
show_older: Aldere toane
show_thread: Petear toane
sign_in_to_participate: Meld jo oan om oan dit petear mei te dwaan
title: '%{name}: "%{quote}"'
visibilities:
direct: Direkt
@ -1680,8 +1679,6 @@ fy:
min_reblogs: Berjochten dyt op syn minst safolle kear boost binne behâlde
min_reblogs_hint: Smyt gjin berjochten dyt op syn minst safolle kear boost binne fuort. Lit leech om berjochten likefolle it tal boosts fuort te smiten
stream_entries:
pinned: Fêstsette berjocht
reblogged: boostte
sensitive_content: Gefoelige ynhâld
strikes:
errors:

@ -501,7 +501,6 @@ ga:
'63113904': 2 bhliain
'7889238': 3 mhí
stream_entries:
pinned: Postáil pionnáilte
sensitive_content: Ábhar íogair
two_factor_authentication:
edit: Cuir in eagar

@ -1698,7 +1698,6 @@ gd:
show_newer: Seall feadhainn as ùire
show_older: Seall feadhainn as sine
show_thread: Seall an snàithlean
sign_in_to_participate: Clàraich a-steach a ghabhail pàirt sa chòmhradh
title: "%{name}: “%{quote}”"
visibilities:
direct: Dìreach
@ -1744,8 +1743,6 @@ gd:
min_reblogs: Cùm na tha ga bhrosnachadh le co-dhiù
min_reblogs_hint: Cha dèid gin dhe na postaichean agad a sguabadh às a tha gam brosnachadh an àireamh de thursan seo air a char as lugha. Fàg seo bàn airson postaichean a sguabadh às ge b e co mheud turas a tha iad gam brosnachadh
stream_entries:
pinned: Post prìnichte
reblogged: "ga bhrosnachadh"
sensitive_content: Susbaint fhrionasach
strikes:
errors:

@ -1634,7 +1634,6 @@ gl:
show_newer: Mostrar o máis novo
show_older: Mostrar o máis vello
show_thread: Amosar fío
sign_in_to_participate: Accede e participa na conversa
title: '%{name}: "%{quote}"'
visibilities:
direct: Directa
@ -1680,8 +1679,6 @@ gl:
min_reblogs: Manter publicacións promovidas máis de
min_reblogs_hint: Non elimina ningunha das túas publicacións se foron promovidas máis deste número de veces. Deixa en branco para eliminar publicacións independentemente do seu número de promocións
stream_entries:
pinned: Publicación fixada
reblogged: promoveu
sensitive_content: Contido sensible
strikes:
errors:

@ -1698,7 +1698,6 @@ he:
show_newer: הצג חדשים יותר
show_older: הצג ישנים יותר
show_thread: הצג שרשור
sign_in_to_participate: הכנס כדי להשתתף בשיחה
title: '%{name}: "%{quote}"'
visibilities:
direct: ישיר
@ -1744,8 +1743,6 @@ he:
min_reblogs: שמור הודעות מהודהדות לפחות
min_reblogs_hint: לא מוחק מי מהודעותיך שקיבלו לפחות את המספר הזה של הדהודים. להשאיר ריק כדי למחוק הודעות ללא קשר למספר ההדהודים שקיבלו
stream_entries:
pinned: הודעה נעוצה
reblogged: הודהד
sensitive_content: תוכן רגיש
strikes:
errors:

@ -207,7 +207,6 @@ hr:
public: Javno
unlisted: Neprikazano
stream_entries:
reblogged: boostano
sensitive_content: Osjetljivi sadržaj
two_factor_authentication:
disable: Onemogući 2FA

@ -1634,7 +1634,6 @@ hu:
show_newer: Újabbak mutatása
show_older: Régebbiek mutatása
show_thread: Szál mutatása
sign_in_to_participate: Bejelentkezés a beszélgetésben részvételhez
title: "%{name}: „%{quote}”"
visibilities:
direct: Közvetlen
@ -1680,8 +1679,6 @@ hu:
min_reblogs: Bejegyzések megtartása, melyeket többször toltak meg, mint
min_reblogs_hint: Egyetlen olyan bejegyzésedet sem törli, melyet ennél többször toltak meg. Hagyd üresen, hogy a megtolások számától függetlenül töröljük a bejegyzéseket
stream_entries:
pinned: Kitűzött bejegyzés
reblogged: megtolta
sensitive_content: Kényes tartalom
strikes:
errors:

@ -802,7 +802,6 @@ hy:
show_newer: Ցուցադրել նորերը
show_older: Ցուցադրել հները
show_thread: Բացել շղթան
sign_in_to_participate: Մուտք գործէք՝ զրոյցին միանալու համար
title: '%{name}: "%{quote}"'
visibilities:
direct: Հասցէագրուած
@ -824,8 +823,6 @@ hy:
'63113904': 2 տարի
'7889238': 3 ամիս
stream_entries:
pinned: Ամրացուած գրառում
reblogged: տարածուած
sensitive_content: Կասկածելի բովանդակութիւն
themes:
contrast: Mastodon (բարձր կոնտրաստով)

@ -1448,7 +1448,6 @@ id:
show_newer: Tampilkan lebih baru
show_older: Tampilkan lebih lama
show_thread: Tampilkan utas
sign_in_to_participate: Masuk untuk mengikuti percakapan
title: '%{name}: "%{quote}"'
visibilities:
direct: Langsung
@ -1493,8 +1492,6 @@ id:
min_reblogs: Simpan kiriman yang di-boost lebih dari
min_reblogs_hint: Tidak menghapus kiriman Anda yang di-boost lebih dari sekian kali. Kosongkan bila ingin menghapus kiriman tanpa peduli jumlah boost-nya
stream_entries:
pinned: Kiriman tersemat
reblogged: di-boost-kan
sensitive_content: Konten sensitif
strikes:
errors:

@ -1437,7 +1437,6 @@ io:
show_newer: Montrez plu nova kozo
show_older: Montrez plu olda kozo
show_thread: Montrez postaro
sign_in_to_participate: Registrez por partoprenar en konverso
title: '%{name}: "%{quote}"'
visibilities:
direct: Direta
@ -1482,8 +1481,6 @@ io:
min_reblogs: Retenez bustita posti mine
min_reblogs_hint: Ne efacas irga vua posti quo bustigesos mine ca foyoquanto. Restez quale vakua por efacar posti sen suciar olia foyoquanto
stream_entries:
pinned: Pinglagita posto
reblogged: diskonocigita
sensitive_content: Titiliva kontenajo
strikes:
errors:

@ -1638,7 +1638,6 @@ is:
show_newer: Sýna nýrri
show_older: Sýna eldri
show_thread: Birta þráð
sign_in_to_participate: Skráðu þig inn til að taka þátt í samtalinu
title: "%{name}: „%{quote}‟"
visibilities:
direct: Beint
@ -1684,8 +1683,6 @@ is:
min_reblogs: Halda færslum sem eru endurbirtar oftar en
min_reblogs_hint: Eyðir ekki þínum eigin færslum sem endurbirtar hafa verið þetta oft. Skildu þetta eftir autt til að eyða færslum burtséð frá fjölda endurbirtinga
stream_entries:
pinned: Fest færsla
reblogged: endurbirt
sensitive_content: Viðkvæmt efni
strikes:
errors:

@ -1636,7 +1636,6 @@ it:
show_newer: Mostra più nuovi
show_older: Mostra più vecchi
show_thread: Mostra thread
sign_in_to_participate: Accedi per partecipare alla conversazione
title: '%{name}: "%{quote}"'
visibilities:
direct: Diretto
@ -1682,8 +1681,6 @@ it:
min_reblogs: Conserva i post condivisi più di
min_reblogs_hint: Non cancella nessuno dei tuoi post che è stato condiviso più di questo numero di volte. Lascia vuoto per cancellare i post indipendentemente dal loro numero di condivisioni
stream_entries:
pinned: Post fissato in cima
reblogged: condiviso
sensitive_content: Materiale sensibile
strikes:
errors:

@ -1602,7 +1602,6 @@ ja:
show_newer: 新しいものを表示
show_older: 古いものを表示
show_thread: スレッドを表示
sign_in_to_participate: ログインして会話に参加
title: '%{name}: "%{quote}"'
visibilities:
direct: ダイレクト
@ -1648,8 +1647,6 @@ ja:
min_reblogs: ブーストの基準値
min_reblogs_hint: この数以上、ブーストされた投稿を削除せずに残します。空白にしておくと、ブーストされた数に関わらず投稿を削除します。
stream_entries:
pinned: 固定された投稿
reblogged: さんがブースト
sensitive_content: 閲覧注意
strikes:
errors:

@ -457,7 +457,6 @@ ka:
ownership: სხვისი ტუტი ვერ აიპინება
reblog: ბუსტი ვერ აიპინება
show_more: მეტის ჩვენება
sign_in_to_participate: საუბარში მონაწილეობისთვის გაიარეთ ავტორიზაცია
visibilities:
private: მხოლოდ-მიმდევრები
private_long: აჩვენე მხოლოდ მიმდევრებს
@ -466,8 +465,6 @@ ka:
unlisted: ჩამოუთვლელი
unlisted_long: ხედავს ყველა, მაგრამ არ ჩანს საჯარო თაიმლაინებში
stream_entries:
pinned: აპინული ტუტი
reblogged: გაზრდილი
sensitive_content: მგრძნობიარე კონტენტი
themes:
contrast: მაღალი კონტრასტი

@ -713,7 +713,6 @@ kab:
show_more: Ssken-d ugar
show_newer: Ssken-d timaynutin
show_thread: Ssken-d lxiḍ
sign_in_to_participate: Qqen i waken ad tzeddiḍ deg udiwenni
title: '%{name}: "%{quote}"'
visibilities:
direct: Usrid
@ -733,7 +732,6 @@ kab:
'63113904': 2 n yiseggasen
'7889238': 3 n wayyuren
stream_entries:
pinned: Tijewwiqt yettwasentḍen
sensitive_content: Agbur amḥulfu
themes:
contrast: Maṣṭudun (agnil awriran)

@ -691,7 +691,6 @@ kk:
vote: Дауыс беру
show_more: Тағы әкел
show_thread: Тақырыпты көрсет
sign_in_to_participate: Сұхбатқа қатысу үшін кіріңіз
visibilities:
private: Тек оқырмандарға
private_long: Тек оқырмандарға ғана көрінеді
@ -700,8 +699,6 @@ kk:
unlisted: Тізімге енбеген
unlisted_long: Бәрі көре алады, бірақ ашық тізімдерге ене алмайды
stream_entries:
pinned: Жабыстырылған жазба
reblogged: бөлісті
sensitive_content: Нәзік мазмұн
tags:
does_not_match_previous_name: алдыңғы атқа сәйкес келмейді

@ -1604,7 +1604,6 @@ ko:
show_newer: 새로운 것 표시
show_older: 오래된 것 표시
show_thread: 글타래 보기
sign_in_to_participate: 대화에 참여 위해 로그인 하기
title: '%{name}: "%{quote}"'
visibilities:
direct: 다이렉트
@ -1650,8 +1649,6 @@ ko:
min_reblogs: 해당 횟수 이상 부스트된 게시물 유지
min_reblogs_hint: 이 횟수 이상의 부스트가 된 게시물은 삭제하지 않습니다. 부스트 수와 관계없이 게시물을 지우고 싶다면 공백으로 두세요
stream_entries:
pinned: 고정된 게시물
reblogged: 님이 부스트 했습니다
sensitive_content: 민감한 내용
strikes:
errors:

@ -1482,7 +1482,6 @@ ku:
show_newer: Nûtirîn nîşan bide
show_older: Kevntirîn nîşan bide
show_thread: Mijarê nîşan bide
sign_in_to_participate: Ji bo tevlî sohbetê bibî xwe tomar bike
title: "%{name}%{quote}"
visibilities:
direct: Rasterast
@ -1527,8 +1526,6 @@ ku:
min_reblogs: Şandiyên ku bêtir hatine bilindkirin veşêre
min_reblogs_hint: Şandî ku ji ji vê hejmarê bêtir bilindkirin wergirtibe nayê jêbirin. Vala bihêle da ku şandiyan jê bibî tevlî ku çiqas hezkirin wergirtibe
stream_entries:
pinned: Şandiya derzîkirî
reblogged: bilindkirî
sensitive_content: Naveroka hestiyarî
strikes:
errors:

@ -458,7 +458,6 @@ lt:
ownership: Kitų vartotojų toot'ai negali būti prisegti
reblog: Pakeltos žinutės negali būti prisegtos
show_more: Daugiau
sign_in_to_participate: Prisijunkite jeigu norite dalyvauti pokalbyje
visibilities:
private: Tik sekėjams
private_long: Rodyti tik sekėjams
@ -467,8 +466,6 @@ lt:
unlisted: Neįtrauktas į sąrašus
unlisted_long: Matyti gali visi, tačiau nėra įtraukta į viešas laiko juostas
stream_entries:
pinned: Prisegtas toot'as
reblogged: pakeltas
sensitive_content: Jautrus turinys
themes:
contrast: Mastodon (Didelio Kontrasto)

@ -1625,7 +1625,6 @@ lv:
show_newer: Nekad nerādīt
show_older: Rādīt senākus
show_thread: Rādīt tematu
sign_in_to_participate: Lai piedalītos sarunā, pieraksties
title: "%{name}: “%{quote}”"
visibilities:
direct: Tiešs
@ -1671,8 +1670,6 @@ lv:
min_reblogs: Saglabāt ziņas izceltas vismaz
min_reblogs_hint: Neizdzēš nevienu no tavām ziņām, kas ir izceltas vismaz tik reižu. Atstāj tukšu, lai dzēstu ziņas neatkarīgi no to izcēlumu skaita
stream_entries:
pinned: Piespraustā ziņa
reblogged: izceltie
sensitive_content: Sensitīvs saturs
strikes:
errors:

@ -942,7 +942,6 @@ ms:
edited_at_html: Disunting %{date}
poll:
vote: Undi
sign_in_to_participate: Daftar masuk untuk menyertai perbualan
visibilities:
direct: Terus
private: Pengikut sahaja
@ -968,7 +967,6 @@ ms:
'7889238': 3 bulan
min_favs: Simpan hantaran digemarkan sekurang-kurangnya
stream_entries:
pinned: Hantaran disemat
sensitive_content: Kandungan sensitif
strikes:
errors:

@ -1602,7 +1602,6 @@ my:
show_newer: ပို့စ်အသစ်များပြရန်
show_older: ပို့စ်အဟောင်းများပြရန်
show_thread: Thread ကို ပြပါ
sign_in_to_participate: စကားဝိုင်းတွင် ပါဝင်ရန် အကောင့်ဝင်ပါ
title: '%{name}: "%{quote}"'
visibilities:
direct: တိုက်ရိုက်
@ -1648,8 +1647,6 @@ my:
min_reblogs: အနည်းဆုံးအားဖြင့် Boost လုပ်ထားသည့်ပို့စ်များကို သိမ်းဆည်းပါ
min_reblogs_hint: အနည်းဆုံး ဤအကြိမ်အရေအတွက်ကို မြှင့်တင်ထားသည့် သင့်ပို့စ်များကို မဖျက်ပါ။ ၎င်းတို့၏ မြှင့်တင်မှုအရေအတွက်ကို မခွဲခြားဘဲ ပို့စ်များကို ဖျက်ရန် ချန်ထားပါ
stream_entries:
pinned: ပင်တွဲထားသောပို့စ်
reblogged: Boost လုပ်ခဲ့သည်
sensitive_content: သတိထားရသော အကြောင်းအရာ
strikes:
errors:

@ -1634,7 +1634,6 @@ nl:
show_newer: Nieuwere tonen
show_older: Oudere tonen
show_thread: Gesprek tonen
sign_in_to_participate: Log in om deel te nemen aan het gesprek
title: '%{name}: "%{quote}"'
visibilities:
direct: Privébericht
@ -1680,8 +1679,6 @@ nl:
min_reblogs: Berichten die minstens zoveel keer zijn geboost behouden
min_reblogs_hint: Verwijdert geen berichten die tenminste zoveel keer zijn geboost. Laat leeg om berichten ongeacht het aantal boosts te verwijderen
stream_entries:
pinned: Vastgemaakt bericht
reblogged: boostte
sensitive_content: Gevoelige inhoud
strikes:
errors:

@ -1609,7 +1609,6 @@ nn:
show_newer: Vis nyere
show_older: Vis eldre
show_thread: Vis tråden
sign_in_to_participate: Logg inn for å verta med i samtalen
title: "%{name}: «%{quote}»"
visibilities:
direct: Direkte
@ -1655,8 +1654,6 @@ nn:
min_reblogs: Behold innlegg fremhevet av minst
min_reblogs_hint: Sletter ikke noen av dine innlegg som har blitt fremhevet minst dette antall ganger. La stå tom for å slette innlegg uavhengig av antall fremhevinger
stream_entries:
pinned: Festa tut
reblogged: framheva
sensitive_content: Ømtolig innhald
strikes:
errors:

@ -1556,7 +1556,6 @@
show_newer: Vis nyere
show_older: Vis eldre
show_thread: Vis tråden
sign_in_to_participate: Logg på for å delta i samtalen
title: "%{name}: «%{quote}»"
visibilities:
direct: Direkte
@ -1602,8 +1601,6 @@
min_reblogs: Behold innlegg fremhevet av minst
min_reblogs_hint: Sletter ikke noen av dine innlegg som har blitt fremhevet minst dette antall ganger. La stå tom for å slette innlegg uavhengig av antall fremhevinger
stream_entries:
pinned: Festet innlegg
reblogged: fremhevet
sensitive_content: Følsomt innhold
strikes:
errors:

@ -890,7 +890,6 @@ oc:
show_newer: Veire mai recents
show_older: Veire mai ancians
show_thread: Mostrar lo fil
sign_in_to_participate: Inscrivètz-vos per participar a la conversacion
title: '%{name}: "%{quote}"'
visibilities:
direct: Dirècte
@ -933,8 +932,6 @@ oc:
min_reblogs: Gardar las publicacions partejadas al mens
min_reblogs_hint: Suprimís pas vòstras publicacions quan agut aqueste nombre de partiment. Daissar blanc per suprimir las publicacions sens far cas als partiments
stream_entries:
pinned: Tut penjat
reblogged: a partejat
sensitive_content: Contengut sensible
tags:
does_not_match_previous_name: correspond pas al nom precedent

@ -1698,7 +1698,6 @@ pl:
show_newer: Pokaż nowsze
show_older: Pokaż starsze
show_thread: Pokaż wątek
sign_in_to_participate: Zaloguj się, aby udzielić się w tej konwersacji
title: '%{name}: "%{quote}"'
visibilities:
direct: Bezpośredni
@ -1744,8 +1743,6 @@ pl:
min_reblogs: Utrzymuj posty wzmocnione więcej niż
min_reblogs_hint: Nie usuwa żadnego z Twoich wpisów, które zostały wzmocnione więcej niż tyle razy. Pozostaw puste, aby usunąć posty bez względu na ich liczbę wzmocnień
stream_entries:
pinned: Przypięty wpis
reblogged: podbił
sensitive_content: Wrażliwa zawartość
strikes:
errors:

@ -1634,7 +1634,6 @@ pt-BR:
show_newer: Mostrar mais recentes
show_older: Mostrar mais antigos
show_thread: Mostrar conversa
sign_in_to_participate: Entre para participar dessa conversa
title: '%{name}: "%{quote}"'
visibilities:
direct: Direto
@ -1680,8 +1679,6 @@ pt-BR:
min_reblogs: Manter publicações impulsionadas por ao menos
min_reblogs_hint: Não exclui publicações que receberam pelo menos esta quantidade de impulsos. Deixe em branco para excluir publicações independentemente da quantidade de impulsos
stream_entries:
pinned: Toot fixado
reblogged: deu boost
sensitive_content: Conteúdo sensível
strikes:
errors:

@ -1634,7 +1634,6 @@ pt-PT:
show_newer: Mostrar mais recentes
show_older: Mostrar mais antigos
show_thread: Mostrar conversa
sign_in_to_participate: Inicie a sessão para participar na conversa
title: '%{name}: "%{quote}"'
visibilities:
direct: Direto
@ -1680,8 +1679,6 @@ pt-PT:
min_reblogs: Manter as publicações reforçadas mais de
min_reblogs_hint: Não apaga nenhuma das suas publicações que tenha sido partilhada mais do que este número de vezes. Deixe em branco para apagar as publicações, independentemente do número de partilhas
stream_entries:
pinned: Publicação afixada
reblogged: reforçada
sensitive_content: Conteúdo problemático
strikes:
errors:

@ -679,7 +679,6 @@ ro:
vote: Votează
show_more: Arată mai mult
show_thread: Arată discuția
sign_in_to_participate: Conectează-te pentru a participa la conversație
visibilities:
private: Doar urmăritorii
private_long: Arată doar urmăritorilor
@ -687,8 +686,6 @@ ro:
unlisted: Nelistat
unlisted_long: Toată lumea poate vedea, dar nu este listată pe fluxurile publice
stream_entries:
pinned: Postare fixată
reblogged: impulsionată
sensitive_content: Conținut sensibil
tags:
does_not_match_previous_name: nu se potrivește cu numele anterior

@ -1674,7 +1674,6 @@ ru:
show_newer: Показать более новое
show_older: Показать старые
show_thread: Открыть обсуждение
sign_in_to_participate: Войдите, чтобы принять участие в дискуссии
title: '%{name}: "%{quote}"'
visibilities:
direct: Адресованный
@ -1720,8 +1719,6 @@ ru:
min_reblogs: Порог продвижений
min_reblogs_hint: Не удаляет ваши посты, количество продвижений которых достигло указанного выше значения. Оставьте поле пустым, чтобы удалять посты независимо от количества продвижений.
stream_entries:
pinned: Закреплённый пост
reblogged: продвинул(а)
sensitive_content: Содержимое деликатного характера
strikes:
errors:

@ -931,7 +931,6 @@ sc:
show_newer: Ammustra is prus noos
show_older: Ammustra is prus betzos
show_thread: Ammustra su tema
sign_in_to_participate: Identìfica·ti pro partetzipare in s'arresonada
title: '%{name}: "%{quote}"'
visibilities:
direct: Deretu
@ -952,8 +951,6 @@ sc:
'63113904': 2 annos
'7889238': 3 meses
stream_entries:
pinned: Tut apicadu
reblogged: cumpartzidu
sensitive_content: Cuntenutu sensìbile
tags:
does_not_match_previous_name: non cointzidet cun su nòmine anteriore

@ -1472,7 +1472,6 @@ sco:
show_newer: Shaw newer
show_older: Shaw aulder
show_thread: Shaw threid
sign_in_to_participate: Sign in fir tae tak pairt in the conversation
title: '%{name}: "%{quote}"'
visibilities:
direct: Direck
@ -1517,8 +1516,6 @@ sco:
min_reblogs: Keep posts heezed at least
min_reblogs_hint: Disnae delete onie o yer posts thit's been heezed at least this nummer o times. Lea blank fir tae delete posts regairdless o their number o heezes
stream_entries:
pinned: Preent post
reblogged: heezed
sensitive_content: Sensitive content
strikes:
errors:

@ -1265,7 +1265,6 @@ si:
show_newer: අලුත්ම පෙන්වන්න
show_older: පැරණි පෙන්වන්න
show_thread: නූල් පෙන්වන්න
sign_in_to_participate: සංවාදයට සහභාගී වීමට පුරන්න
title: '%{name}: "%{quote}"'
visibilities:
direct: සෘජු
@ -1310,8 +1309,6 @@ si:
min_reblogs: අඩුම තරමේ පෝස්ට් බූස්ට් කරගෙන තියාගන්න
min_reblogs_hint: අඩුම තරමින් මෙම වාර ගණන වැඩි කර ඇති ඔබගේ පළ කිරීම් කිසිවක් මකා නොදමන්න. බූස්ට් ගණන නොතකා පළ කිරීම් මැකීමට හිස්ව තබන්න
stream_entries:
pinned: ඇමිණූ ලිපිය
reblogged: ඉහල නැංවීය
sensitive_content: සංවේදී අන්තර්ගතයකි
strikes:
errors:

@ -1124,7 +1124,6 @@ sk:
vote: Hlasuj
show_more: Ukáž viac
show_thread: Ukáž diskusné vlákno
sign_in_to_participate: Prihlás sa pre zapojenie do diskusie
title: '%{name}: „%{quote}"'
visibilities:
private: Iba pre sledovateľov
@ -1138,8 +1137,6 @@ sk:
keep_pinned_hint: Nevymaže žiadne s tvojich pripnutých príspevkov
keep_self_bookmark: Ponechaj príspevky, ktoré sú záložkami
stream_entries:
pinned: Pripnutý príspevok
reblogged: vyzdvihli
sensitive_content: Senzitívny obsah
tags:
does_not_match_previous_name: nezhoduje sa s predošlým názvom

@ -1659,7 +1659,6 @@ sl:
show_newer: Pokaži novejše
show_older: Pokaži starejše
show_thread: Pokaži nit
sign_in_to_participate: Prijavite se, če želite sodelovati v pogovoru
title: "%{name}: »%{quote}«"
visibilities:
direct: Neposredno
@ -1705,8 +1704,6 @@ sl:
min_reblogs: Obdrži objave izpostavljene vsaj
min_reblogs_hint: Ne izbriše nobene od vaših objav, ki je bila vsaj tolikokrat podprta. Pustite prazno, če želite izbrisati objave ne glede na število izpostavitev
stream_entries:
pinned: Pripeta objava
reblogged: izpostavljeno
sensitive_content: Občutljiva vsebina
strikes:
errors:

@ -1634,7 +1634,6 @@ sq:
show_newer: Shfaq më të reja
show_older: Shfaq më të vjetra
show_thread: Shfaq rrjedhën
sign_in_to_participate: Bëni hyrjen, që të merrni pjesë te biseda
title: '%{name}: "%{quote}"'
visibilities:
direct: I drejtpërdrejtë
@ -1680,8 +1679,6 @@ sq:
min_reblogs: Mbaji postimet e përforcuara më shumë se
min_reblogs_hint: Nuk fshihet ndonjë nga postimet tuaja që kanë marrë më shumë se sa ky numër përforcimesh. Lëreni të zbrazët për të fshirë postimet, pavarësisht të numrit të përforcimeve për to
stream_entries:
pinned: Mesazh i fiksuar
reblogged: të përforcuara
sensitive_content: Lëndë rezervat
strikes:
errors:

@ -1666,7 +1666,6 @@ sr-Latn:
show_newer: Nikad ne prikazuj
show_older: Prikaži starije
show_thread: Prikaži niz
sign_in_to_participate: Prijavite se da učestvujete u razgovoru
title: "%{name}: „%{quote}”"
visibilities:
direct: Direktno
@ -1712,8 +1711,6 @@ sr-Latn:
min_reblogs: Zadrži objave podržane barem
min_reblogs_hint: Ne briše nijednu vašu objavu koja je bila podržana najmanje ovoliko puta. Ostavite prazno za brisanje objava bez obzira na njihov broj podržavanja
stream_entries:
pinned: Zakačena objava
reblogged: podržano
sensitive_content: Osetljiv sadržaj
strikes:
errors:

@ -1666,7 +1666,6 @@ sr:
show_newer: Никад не приказуј
show_older: Прикажи старије
show_thread: Прикажи низ
sign_in_to_participate: Пријавите се да учествујете у разговору
title: "%{name}: „%{quote}”"
visibilities:
direct: Директно
@ -1712,8 +1711,6 @@ sr:
min_reblogs: Задржи објаве подржане барем
min_reblogs_hint: Не брише ниједну вашу објаву која је била подржана најмање оволико пута. Оставите празно за брисање објава без обзира на њихов број подржавања
stream_entries:
pinned: Закачена објава
reblogged: подржано
sensitive_content: Осетљив садржај
strikes:
errors:

@ -1570,7 +1570,6 @@ sv:
show_newer: Visa nyare
show_older: Visa äldre
show_thread: Visa tråd
sign_in_to_participate: Logga in för att delta i konversationen
title: '%{name}: "%{quote}"'
visibilities:
direct: Direkt
@ -1616,8 +1615,6 @@ sv:
min_reblogs: Behåll boostade inlägg i minst
min_reblogs_hint: Raderar inte något av dina inlägg som har blivit boostat minst detta antal gånger. Lämna tomt för att radera inlägg oavsett antal boostar
stream_entries:
pinned: Fäst inlägg
reblogged: boostad
sensitive_content: Känsligt innehåll
strikes:
errors:

@ -1602,7 +1602,6 @@ th:
show_newer: แสดงที่ใหม่กว่า
show_older: แสดงที่เก่ากว่า
show_thread: แสดงกระทู้
sign_in_to_participate: เข้าสู่ระบบเพื่อเข้าร่วมการสนทนา
title: '%{name}: "%{quote}"'
visibilities:
direct: โดยตรง
@ -1648,8 +1647,6 @@ th:
min_reblogs: เก็บโพสต์ที่ได้รับการดันอย่างน้อย
min_reblogs_hint: ไม่ลบโพสต์ใดก็ตามของคุณที่ได้รับจำนวนครั้งการดันอย่างน้อยเท่านี้ เว้นว่างไว้เพื่อลบโพสต์โดยไม่คำนึงถึงจำนวนการดันของโพสต์
stream_entries:
pinned: โพสต์ที่ปักหมุด
reblogged: ดันแล้ว
sensitive_content: เนื้อหาที่ละเอียดอ่อน
strikes:
errors:

@ -1634,7 +1634,6 @@ tr:
show_newer: Yenileri göster
show_older: Eskileri göster
show_thread: Konuyu göster
sign_in_to_participate: Sohbete katılmak için oturum açın
title: '%{name}: "%{quote}"'
visibilities:
direct: Doğrudan
@ -1680,8 +1679,6 @@ tr:
min_reblogs: Şundan daha fazla teşvik edilen gönderileri sakla
min_reblogs_hint: Bu belirtilenden daha fazla teşvik edilen gönderilerinizin herhangi birini silmez. Teşvik sayısından bağımsız olarak gönderilerin silinmesi için burayı boş bırakın
stream_entries:
pinned: Sabitlenmiş gönderi
reblogged: boostladı
sensitive_content: Hassas içerik
strikes:
errors:

@ -1698,7 +1698,6 @@ uk:
show_newer: Показати новіші
show_older: Показати давніші
show_thread: Відкрити обговорення
sign_in_to_participate: Увійдіть для участі в бесіді
title: '%{name}: "%{quote}"'
visibilities:
direct: Особисто
@ -1744,8 +1743,6 @@ uk:
min_reblogs: Залишати дописи, поширені більше ніж
min_reblogs_hint: Не видаляти ваших дописів, що були поширені більш ніж вказану кількість разів. Залиште порожнім, щоб видаляти дописи, попри кількість їхніх поширень
stream_entries:
pinned: Закріплений допис
reblogged: поширив
sensitive_content: Дражливий зміст
strikes:
errors:

@ -1602,7 +1602,6 @@ vi:
show_newer: Mới hơn
show_older: Cũ hơn
show_thread: Trích nguyên văn
sign_in_to_participate: Đăng nhập để trả lời tút này
title: '%{name}: "%{quote}"'
visibilities:
direct: Nhắn riêng
@ -1648,8 +1647,6 @@ vi:
min_reblogs: Giữ những tút đã đăng lại lâu hơn
min_reblogs_hint: Những tút có lượt đăng lại nhiều hơn số này sẽ không bị xóa. Để trống nếu bạn muốn xóa hết
stream_entries:
pinned: Tút đã ghim
reblogged: đăng lại
sensitive_content: NSFW
strikes:
errors:

@ -1602,7 +1602,6 @@ zh-CN:
show_newer: 显示更新内容
show_older: 显示更早内容
show_thread: 显示全部对话
sign_in_to_participate: 登录以加入对话
title: "%{name}:“%{quote}”"
visibilities:
direct: 私信
@ -1648,8 +1647,6 @@ zh-CN:
min_reblogs: 保留如下嘟文:转嘟数超过
min_reblogs_hint: 转嘟数超过该阈值的的嘟文不会被删除。如果留空,则无论嘟文获得多少转嘟,都将被删除。
stream_entries:
pinned: 置顶嘟文
reblogged: 转嘟
sensitive_content: 敏感内容
strikes:
errors:

@ -1507,7 +1507,6 @@ zh-HK:
show_newer: 顯示較新嘟文
show_older: 顯示較舊嘟文
show_thread: 顯示討論串
sign_in_to_participate: 登入以加入討論
title: "%{name}:「%{quote}」"
visibilities:
direct: 私人訊息
@ -1553,8 +1552,6 @@ zh-HK:
min_reblogs: 保留超過嘟文轉嘟門檻
min_reblogs_hint: 如果您嘟文已收到超過轉嘟門檻則不會刪除。留白表示不論轉嘟數量皆刪除嘟文。
stream_entries:
pinned: 置頂文章
reblogged: 轉推
sensitive_content: 敏感內容
strikes:
errors:

@ -1606,7 +1606,6 @@ zh-TW:
show_newer: 顯示較新嘟文
show_older: 顯示較舊嘟文
show_thread: 顯示討論串
sign_in_to_participate: 登入以加入討論
title: "%{name}:「%{quote}」"
visibilities:
direct: 私訊
@ -1652,8 +1651,6 @@ zh-TW:
min_reblogs: 保留超過嘟文轉嘟門檻
min_reblogs_hint: 如果您嘟文已收到超過轉嘟門檻則不會刪除。留白表示不論轉嘟數量皆刪除該嘟文。
stream_entries:
pinned: 釘選嘟文
reblogged: 轉嘟
sensitive_content: 敏感內容
strikes:
errors:

@ -10,6 +10,12 @@ describe Api::V1::Statuses::ReblogsController do
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:statuses', application: app) }
context 'with an oauth token' do
around do |example|
Sidekiq::Testing.fake! do
example.run
end
end
before do
allow(controller).to receive(:doorkeeper_token) { token }
end

@ -13,5 +13,6 @@ Fabricator(:account) do
suspended_at { |attrs| attrs[:suspended] ? Time.now.utc : nil }
silenced_at { |attrs| attrs[:silenced] ? Time.now.utc : nil }
user { |attrs| attrs[:domain].nil? ? Fabricate.build(:user, account: nil) : nil }
uri { |attrs| attrs[:domain].nil? ? '' : "https://#{attrs[:domain]}/users/#{attrs[:username]}" }
discoverable true
end

@ -114,129 +114,4 @@ describe StatusesHelper do
params[:controller] = StatusesHelper::EMBEDDED_CONTROLLER
params[:action] = StatusesHelper::EMBEDDED_ACTION
end
describe '#style_classes' do
it do
status = instance_double(Status, reblog?: false)
classes = helper.style_classes(status, false, false, false)
expect(classes).to eq 'entry'
end
it do
status = instance_double(Status, reblog?: true)
classes = helper.style_classes(status, false, false, false)
expect(classes).to eq 'entry entry-reblog'
end
it do
status = instance_double(Status, reblog?: false)
classes = helper.style_classes(status, true, false, false)
expect(classes).to eq 'entry entry-predecessor'
end
it do
status = instance_double(Status, reblog?: false)
classes = helper.style_classes(status, false, true, false)
expect(classes).to eq 'entry entry-successor'
end
it do
status = instance_double(Status, reblog?: false)
classes = helper.style_classes(status, false, false, true)
expect(classes).to eq 'entry entry-center'
end
it do
status = instance_double(Status, reblog?: true)
classes = helper.style_classes(status, true, true, true)
expect(classes).to eq 'entry entry-predecessor entry-reblog entry-successor entry-center'
end
end
describe '#microformats_classes' do
it do
status = instance_double(Status, reblog?: false)
classes = helper.microformats_classes(status, false, false)
expect(classes).to eq ''
end
it do
status = instance_double(Status, reblog?: false)
classes = helper.microformats_classes(status, true, false)
expect(classes).to eq 'p-in-reply-to'
end
it do
status = instance_double(Status, reblog?: false)
classes = helper.microformats_classes(status, false, true)
expect(classes).to eq 'p-comment'
end
it do
status = instance_double(Status, reblog?: true)
classes = helper.microformats_classes(status, true, false)
expect(classes).to eq 'p-in-reply-to p-repost-of'
end
it do
status = instance_double(Status, reblog?: true)
classes = helper.microformats_classes(status, true, true)
expect(classes).to eq 'p-in-reply-to p-repost-of p-comment'
end
end
describe '#microformats_h_class' do
it do
status = instance_double(Status, reblog?: false)
css_class = helper.microformats_h_class(status, false, false, false)
expect(css_class).to eq 'h-entry'
end
it do
status = instance_double(Status, reblog?: true)
css_class = helper.microformats_h_class(status, false, false, false)
expect(css_class).to eq 'h-cite'
end
it do
status = instance_double(Status, reblog?: false)
css_class = helper.microformats_h_class(status, true, false, false)
expect(css_class).to eq 'h-cite'
end
it do
status = instance_double(Status, reblog?: false)
css_class = helper.microformats_h_class(status, false, true, false)
expect(css_class).to eq 'h-cite'
end
it do
status = instance_double(Status, reblog?: false)
css_class = helper.microformats_h_class(status, false, false, true)
expect(css_class).to eq ''
end
it do
status = instance_double(Status, reblog?: true)
css_class = helper.microformats_h_class(status, true, true, true)
expect(css_class).to eq 'h-cite'
end
end
end

@ -5,15 +5,15 @@ require 'rails_helper'
RSpec.describe AccountReachFinder do
let(:account) { Fabricate(:account) }
let(:ap_follower_example_com) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-1') }
let(:ap_follower_example_org) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.org/inbox-2') }
let(:ap_follower_with_shared) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/users/a/inbox', shared_inbox_url: 'https://foo.bar/inbox') }
let(:ap_follower_example_com) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-1', domain: 'example.com') }
let(:ap_follower_example_org) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.org/inbox-2', domain: 'example.org') }
let(:ap_follower_with_shared) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/users/a/inbox', domain: 'foo.bar', shared_inbox_url: 'https://foo.bar/inbox') }
let(:ap_mentioned_with_shared) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/users/b/inbox', shared_inbox_url: 'https://foo.bar/inbox') }
let(:ap_mentioned_example_com) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-3') }
let(:ap_mentioned_example_org) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.org/inbox-4') }
let(:ap_mentioned_with_shared) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/users/b/inbox', domain: 'foo.bar', shared_inbox_url: 'https://foo.bar/inbox') }
let(:ap_mentioned_example_com) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-3', domain: 'example.com') }
let(:ap_mentioned_example_org) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.org/inbox-4', domain: 'example.org') }
let(:unrelated_account) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/unrelated-inbox') }
let(:unrelated_account) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/unrelated-inbox', domain: 'example.com') }
before do
ap_follower_example_com.follow!(account)

@ -5,7 +5,7 @@ require 'rails_helper'
RSpec.describe ActivityPub::Activity::Announce do
subject { described_class.new(json, sender) }
let(:sender) { Fabricate(:account, followers_url: 'http://example.com/followers', uri: 'https://example.com/actor') }
let(:sender) { Fabricate(:account, followers_url: 'http://example.com/followers', uri: 'https://example.com/actor', domain: 'example.com') }
let(:recipient) { Fabricate(:account) }
let(:status) { Fabricate(:status, account: recipient) }
@ -114,7 +114,7 @@ RSpec.describe ActivityPub::Activity::Announce do
context 'when the sender is relayed' do
subject { described_class.new(json, sender, relayed_through_actor: relay_account) }
let!(:relay_account) { Fabricate(:account, inbox_url: 'https://relay.example.com/inbox') }
let!(:relay_account) { Fabricate(:account, inbox_url: 'https://relay.example.com/inbox', domain: 'relay.example.com') }
let!(:relay) { Fabricate(:relay, inbox_url: 'https://relay.example.com/inbox') }
let(:object_json) { 'https://example.com/actor/hello-world' }

@ -5,22 +5,38 @@ require 'rails_helper'
RSpec.describe ActivityPub::Activity::Update do
subject { described_class.new(json, sender) }
let!(:sender) { Fabricate(:account) }
before do
sender.update!(uri: ActivityPub::TagManager.instance.uri_for(sender))
end
let!(:sender) { Fabricate(:account, domain: 'example.com', inbox_url: 'https://example.com/foo/inbox', outbox_url: 'https://example.com/foo/outbox') }
describe '#perform' do
context 'with an Actor object' do
let(:modified_sender) do
sender.tap do |modified_sender|
modified_sender.display_name = 'Totally modified now'
end
end
let(:actor_json) do
ActiveModelSerializers::SerializableResource.new(modified_sender, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter).as_json
{
'@context': [
'https://www.w3.org/ns/activitystreams',
'https://w3id.org/security/v1',
{
manuallyApprovesFollowers: 'as:manuallyApprovesFollowers',
toot: 'http://joinmastodon.org/ns#',
featured: { '@id': 'toot:featured', '@type': '@id' },
featuredTags: { '@id': 'toot:featuredTags', '@type': '@id' },
},
],
id: sender.uri,
type: 'Person',
following: 'https://example.com/users/dfsdf/following',
followers: 'https://example.com/users/dfsdf/followers',
inbox: sender.inbox_url,
outbox: sender.outbox_url,
featured: 'https://example.com/users/dfsdf/featured',
featuredTags: 'https://example.com/users/dfsdf/tags',
preferredUsername: sender.username,
name: 'Totally modified now',
publicKey: {
id: "#{sender.uri}#main-key",
owner: sender.uri,
publicKeyPem: sender.public_key,
},
}
end
let(:json) do
@ -28,7 +44,7 @@ RSpec.describe ActivityPub::Activity::Update do
'@context': 'https://www.w3.org/ns/activitystreams',
id: 'foo',
type: 'Update',
actor: ActivityPub::TagManager.instance.uri_for(sender),
actor: sender.uri,
object: actor_json,
}.with_indifferent_access
end
@ -38,6 +54,7 @@ RSpec.describe ActivityPub::Activity::Update do
stub_request(:get, actor_json[:followers]).to_return(status: 404)
stub_request(:get, actor_json[:following]).to_return(status: 404)
stub_request(:get, actor_json[:featured]).to_return(status: 404)
stub_request(:get, actor_json[:featuredTags]).to_return(status: 404)
subject.perform
end
@ -49,17 +66,17 @@ RSpec.describe ActivityPub::Activity::Update do
context 'with a Question object' do
let!(:at_time) { Time.now.utc }
let!(:status) { Fabricate(:status, account: sender, poll: Poll.new(account: sender, options: %w(Bar Baz), cached_tallies: [0, 0], expires_at: at_time + 5.days)) }
let!(:status) { Fabricate(:status, uri: 'https://example.com/statuses/poll', account: sender, poll: Poll.new(account: sender, options: %w(Bar Baz), cached_tallies: [0, 0], expires_at: at_time + 5.days)) }
let(:json) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
id: 'foo',
type: 'Update',
actor: ActivityPub::TagManager.instance.uri_for(sender),
actor: sender.uri,
object: {
type: 'Question',
id: ActivityPub::TagManager.instance.uri_for(status),
id: status.uri,
content: 'Foo',
endTime: (at_time + 5.days).iso8601,
oneOf: [

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save