Merge branch 'master' into glitch-soc/merge-upstream

Conflicts:
	app/lib/user_settings_decorator.rb
	app/models/user.rb
	app/serializers/initial_state_serializer.rb
	app/views/stream_entries/_simple_status.html.haml
	config/locales/simple_form.en.yml
	config/locales/simple_form.ja.yml
	config/locales/simple_form.pl.yml
	config/routes.rb
This commit is contained in:
Thibaut Girka 2018-10-01 12:43:20 +02:00
commit c91d9b7389
181 changed files with 1321 additions and 762 deletions

20
Gemfile
View file

@ -12,7 +12,7 @@ gem 'thor', '~> 0.20'
gem 'hamlit-rails', '~> 0.2' gem 'hamlit-rails', '~> 0.2'
gem 'pg', '~> 1.0' gem 'pg', '~> 1.0'
gem 'makara', '~> 0.4' gem 'makara', '~> 0.4'
gem 'pghero', '~> 2.1' gem 'pghero', '~> 2.2'
gem 'dotenv-rails', '~> 2.2', '< 2.3' gem 'dotenv-rails', '~> 2.2', '< 2.3'
gem 'aws-sdk-s3', '~> 1.9', require: false gem 'aws-sdk-s3', '~> 1.9', require: false
@ -24,13 +24,13 @@ gem 'streamio-ffmpeg', '~> 3.0'
gem 'active_model_serializers', '~> 0.10' gem 'active_model_serializers', '~> 0.10'
gem 'addressable', '~> 2.5' gem 'addressable', '~> 2.5'
gem 'bootsnap', '~> 1.3' gem 'bootsnap', '~> 1.3', require: false
gem 'browser' gem 'browser'
gem 'charlock_holmes', '~> 0.7.6' gem 'charlock_holmes', '~> 0.7.6'
gem 'iso-639' gem 'iso-639'
gem 'chewy', '~> 5.0' gem 'chewy', '~> 5.0'
gem 'cld3', '~> 3.2.0' gem 'cld3', '~> 3.2.0'
gem 'devise', '~> 4.4' gem 'devise', '~> 4.5'
gem 'devise-two-factor', '~> 3.0' gem 'devise-two-factor', '~> 3.0'
group :pam_authentication, optional: true do group :pam_authentication, optional: true do
@ -57,10 +57,10 @@ gem 'httplog', '~> 1.0'
gem 'idn-ruby', require: 'idn' gem 'idn-ruby', require: 'idn'
gem 'kaminari', '~> 1.1' gem 'kaminari', '~> 1.1'
gem 'link_header', '~> 0.0' gem 'link_header', '~> 0.0'
gem 'mime-types', '~> 3.1', require: 'mime/types/columnar' gem 'mime-types', '~> 3.2', require: 'mime/types/columnar'
gem 'nokogiri', '~> 1.8' gem 'nokogiri', '~> 1.8'
gem 'nsa', '~> 0.2' gem 'nsa', '~> 0.2'
gem 'oj', '~> 3.5' gem 'oj', '~> 3.6'
gem 'ostatus2', '~> 2.0' gem 'ostatus2', '~> 2.0'
gem 'ox', '~> 2.9' gem 'ox', '~> 2.9'
gem 'posix-spawn', git: 'https://github.com/rtomayko/posix-spawn', ref: '58465d2e213991f8afb13b984854a49fcdcc980c' gem 'posix-spawn', git: 'https://github.com/rtomayko/posix-spawn', ref: '58465d2e213991f8afb13b984854a49fcdcc980c'
@ -75,8 +75,8 @@ gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
gem 'rqrcode', '~> 0.10' gem 'rqrcode', '~> 0.10'
gem 'ruby-progressbar', '~> 1.4' gem 'ruby-progressbar', '~> 1.4'
gem 'sanitize', '~> 4.6' gem 'sanitize', '~> 4.6'
gem 'sidekiq', '~> 5.1' gem 'sidekiq', '~> 5.2'
gem 'sidekiq-scheduler', '~> 2.2' gem 'sidekiq-scheduler', '~> 3.0'
gem 'sidekiq-unique-jobs', '~> 5.0' gem 'sidekiq-unique-jobs', '~> 5.0'
gem 'sidekiq-bulk', '~>0.1.1' gem 'sidekiq-bulk', '~>0.1.1'
gem 'simple-navigation', '~> 4.0' gem 'simple-navigation', '~> 4.0'
@ -85,7 +85,7 @@ gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie'
gem 'stoplight', '~> 2.1.3' gem 'stoplight', '~> 2.1.3'
gem 'strong_migrations', '~> 0.2' gem 'strong_migrations', '~> 0.2'
gem 'tty-command', '~> 0.8', require: false gem 'tty-command', '~> 0.8', require: false
gem 'tty-prompt', '~> 0.16', require: false gem 'tty-prompt', '~> 0.17', require: false
gem 'twitter-text', '~> 1.14' gem 'twitter-text', '~> 1.14'
gem 'tzinfo-data', '~> 1.2018' gem 'tzinfo-data', '~> 1.2018'
gem 'webpacker', '~> 3.5' gem 'webpacker', '~> 3.5'
@ -104,7 +104,7 @@ group :development, :test do
end end
group :production, :test do group :production, :test do
gem 'private_address_check', '~> 0.4.1' gem 'private_address_check', '~> 0.5'
end end
group :test do group :test do
@ -133,7 +133,7 @@ group :development do
gem 'bundler-audit', '~> 0.6', require: false gem 'bundler-audit', '~> 0.6', require: false
gem 'scss_lint', '~> 0.57', require: false gem 'scss_lint', '~> 0.57', require: false
gem 'capistrano', '~> 3.10' gem 'capistrano', '~> 3.11'
gem 'capistrano-rails', '~> 1.3' gem 'capistrano-rails', '~> 1.3'
gem 'capistrano-rbenv', '~> 2.1' gem 'capistrano-rbenv', '~> 2.1'
gem 'capistrano-yarn', '~> 2.0' gem 'capistrano-yarn', '~> 2.0'

View file

@ -96,7 +96,7 @@ GEM
rack (>= 0.9.0) rack (>= 0.9.0)
binding_of_caller (0.8.0) binding_of_caller (0.8.0)
debug_inspector (>= 0.0.1) debug_inspector (>= 0.0.1)
bootsnap (1.3.0) bootsnap (1.3.2)
msgpack (~> 1.0) msgpack (~> 1.0)
brakeman (4.2.1) brakeman (4.2.1)
browser (2.5.3) browser (2.5.3)
@ -108,7 +108,7 @@ GEM
bundler (~> 1.2) bundler (~> 1.2)
thor (~> 0.18) thor (~> 0.18)
byebug (10.0.2) byebug (10.0.2)
capistrano (3.10.2) capistrano (3.11.0)
airbrussh (>= 1.0.0) airbrussh (>= 1.0.0)
i18n i18n
rake (>= 10.0.0) rake (>= 10.0.0)
@ -147,7 +147,7 @@ GEM
coderay (1.1.2) coderay (1.1.2)
colorize (0.8.1) colorize (0.8.1)
concurrent-ruby (1.0.5) concurrent-ruby (1.0.5)
connection_pool (2.2.1) connection_pool (2.2.2)
crack (0.4.3) crack (0.4.3)
safe_yaml (~> 1.0.0) safe_yaml (~> 1.0.0)
crass (1.0.4) crass (1.0.4)
@ -162,7 +162,7 @@ GEM
rack (>= 1) rack (>= 1)
rake (> 10, < 13) rake (> 10, < 13)
thor (~> 0.19) thor (~> 0.19)
devise (4.4.3) devise (4.5.0)
bcrypt (~> 3.0) bcrypt (~> 3.0)
orm_adapter (~> 0.1) orm_adapter (~> 0.1)
railties (>= 4.1.0, < 6.0) railties (>= 4.1.0, < 6.0)
@ -202,7 +202,7 @@ GEM
encryptor (3.0.0) encryptor (3.0.0)
equatable (0.5.0) equatable (0.5.0)
erubi (1.7.1) erubi (1.7.1)
et-orbi (1.1.0) et-orbi (1.1.6)
tzinfo tzinfo
excon (0.62.0) excon (0.62.0)
fabrication (2.20.1) fabrication (2.20.1)
@ -212,7 +212,7 @@ GEM
multipart-post (>= 1.2, < 3) multipart-post (>= 1.2, < 3)
fast_blank (1.0.0) fast_blank (1.0.0)
fastimage (2.1.1) fastimage (2.1.1)
ffi (1.9.23) ffi (1.9.25)
fog-core (1.45.0) fog-core (1.45.0)
builder builder
excon (~> 0.58) excon (~> 0.58)
@ -225,6 +225,9 @@ GEM
fog-json (>= 1.0) fog-json (>= 1.0)
ipaddress (>= 0.8) ipaddress (>= 0.8)
formatador (0.2.5) formatador (0.2.5)
fugit (1.1.6)
et-orbi (~> 1.1, >= 1.1.6)
raabro (~> 1.1)
fuubar (2.3.1) fuubar (2.3.1)
rspec-core (~> 3.0) rspec-core (~> 3.0)
ruby-progressbar (~> 1.4) ruby-progressbar (~> 1.4)
@ -252,7 +255,7 @@ GEM
heapy (0.1.3) heapy (0.1.3)
highline (1.7.10) highline (1.7.10)
hiredis (0.6.1) hiredis (0.6.1)
hitimes (1.2.6) hitimes (1.3.0)
hkdf (0.3.0) hkdf (0.3.0)
html2text (0.2.1) html2text (0.2.1)
nokogiri (~> 1.6) nokogiri (~> 1.6)
@ -328,14 +331,14 @@ GEM
mimemagic (~> 0.3.2) mimemagic (~> 0.3.2)
mario-redis-lock (1.2.1) mario-redis-lock (1.2.1)
redis (>= 3.0.5) redis (>= 3.0.5)
memory_profiler (0.9.10) memory_profiler (0.9.11)
method_source (0.9.0) method_source (0.9.0)
microformats (4.0.7) microformats (4.0.7)
json json
nokogiri nokogiri
mime-types (3.1) mime-types (3.2.2)
mime-types-data (~> 3.2015) mime-types-data (~> 3.2015)
mime-types-data (3.2016.0521) mime-types-data (3.2018.0812)
mimemagic (0.3.2) mimemagic (0.3.2)
mini_mime (1.0.0) mini_mime (1.0.0)
mini_portile2 (2.3.0) mini_portile2 (2.3.0)
@ -347,7 +350,7 @@ GEM
net-ldap (0.16.1) net-ldap (0.16.1)
net-scp (1.2.1) net-scp (1.2.1)
net-ssh (>= 2.6.5) net-ssh (>= 2.6.5)
net-ssh (4.2.0) net-ssh (5.0.2)
nio4r (2.3.1) nio4r (2.3.1)
nokogiri (1.8.4) nokogiri (1.8.4)
mini_portile2 (~> 2.3.0) mini_portile2 (~> 2.3.0)
@ -358,7 +361,7 @@ GEM
concurrent-ruby (~> 1.0.0) concurrent-ruby (~> 1.0.0)
sidekiq (>= 3.5.0) sidekiq (>= 3.5.0)
statsd-ruby (~> 1.2.0) statsd-ruby (~> 1.2.0)
oj (3.5.1) oj (3.6.11)
omniauth (1.8.1) omniauth (1.8.1)
hashie (>= 3.4.6, < 3.6.0) hashie (>= 3.4.6, < 3.6.0)
rack (>= 1.6.2, < 3) rack (>= 1.6.2, < 3)
@ -393,9 +396,9 @@ GEM
equatable (~> 0.5.0) equatable (~> 0.5.0)
tty-color (~> 0.4.0) tty-color (~> 0.4.0)
pg (1.0.0) pg (1.0.0)
pghero (2.1.0) pghero (2.2.0)
activerecord activerecord
pkg-config (1.3.0) pkg-config (1.3.1)
powerpack (0.1.1) powerpack (0.1.1)
premailer (1.11.1) premailer (1.11.1)
addressable addressable
@ -404,7 +407,7 @@ GEM
premailer-rails (1.10.2) premailer-rails (1.10.2)
actionmailer (>= 3, < 6) actionmailer (>= 3, < 6)
premailer (~> 1.7, >= 1.7.9) premailer (~> 1.7, >= 1.7.9)
private_address_check (0.4.1) private_address_check (0.5.0)
pry (0.11.3) pry (0.11.3)
coderay (~> 1.1.0) coderay (~> 1.1.0)
method_source (~> 0.9.0) method_source (~> 0.9.0)
@ -417,11 +420,12 @@ GEM
puma (3.11.4) puma (3.11.4)
pundit (1.1.0) pundit (1.1.0)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
raabro (1.1.6)
rack (2.0.5) rack (2.0.5)
rack-attack (5.2.0) rack-attack (5.2.0)
rack rack
rack-cors (1.0.2) rack-cors (1.0.2)
rack-protection (2.0.1) rack-protection (2.0.4)
rack rack
rack-proxy (0.6.4) rack-proxy (0.6.4)
rack rack
@ -528,10 +532,10 @@ GEM
ruby-progressbar (1.9.0) ruby-progressbar (1.9.0)
ruby-saml (1.7.2) ruby-saml (1.7.2)
nokogiri (>= 1.5.10) nokogiri (>= 1.5.10)
rufus-scheduler (3.4.2) rufus-scheduler (3.5.2)
et-orbi (~> 1.0) fugit (~> 1.1, >= 1.1.5)
safe_yaml (1.0.4) safe_yaml (1.0.4)
sanitize (4.6.4) sanitize (4.6.6)
crass (~> 1.0.2) crass (~> 1.0.2)
nokogiri (>= 1.4.4) nokogiri (>= 1.4.4)
nokogumbo (~> 1.4) nokogumbo (~> 1.4)
@ -543,15 +547,14 @@ GEM
scss_lint (0.57.0) scss_lint (0.57.0)
rake (>= 0.9, < 13) rake (>= 0.9, < 13)
sass (~> 3.5.5) sass (~> 3.5.5)
sidekiq (5.1.3) sidekiq (5.2.2)
concurrent-ruby (~> 1.0) connection_pool (~> 2.2, >= 2.2.2)
connection_pool (~> 2.2, >= 2.2.0)
rack-protection (>= 1.5.0) rack-protection (>= 1.5.0)
redis (>= 3.3.5, < 5) redis (>= 3.3.5, < 5)
sidekiq-bulk (0.1.1) sidekiq-bulk (0.1.1)
activesupport activesupport
sidekiq sidekiq
sidekiq-scheduler (2.2.1) sidekiq-scheduler (3.0.0)
redis (>= 3, < 5) redis (>= 3, < 5)
rufus-scheduler (~> 3.2) rufus-scheduler (~> 3.2)
sidekiq (>= 3) sidekiq (>= 3)
@ -561,9 +564,9 @@ GEM
thor (~> 0) thor (~> 0)
simple-navigation (4.0.5) simple-navigation (4.0.5)
activesupport (>= 2.3.2) activesupport (>= 2.3.2)
simple_form (4.0.0) simple_form (4.0.1)
actionpack (> 4) actionpack (>= 5.0)
activemodel (> 4) activemodel (>= 5.0)
simplecov (0.16.1) simplecov (0.16.1)
docile (~> 1.1) docile (~> 1.1)
json (>= 1.8, < 3) json (>= 1.8, < 3)
@ -576,15 +579,15 @@ GEM
actionpack (>= 4.0) actionpack (>= 4.0)
activesupport (>= 4.0) activesupport (>= 4.0)
sprockets (>= 3.0.0) sprockets (>= 3.0.0)
sshkit (1.16.0) sshkit (1.17.0)
net-scp (>= 1.1.2) net-scp (>= 1.1.2)
net-ssh (>= 2.8.0) net-ssh (>= 2.8.0)
stackprof (0.2.11) stackprof (0.2.12)
statsd-ruby (1.2.1) statsd-ruby (1.2.1)
stoplight (2.1.3) stoplight (2.1.3)
streamio-ffmpeg (3.0.2) streamio-ffmpeg (3.0.2)
multi_json (~> 1.8) multi_json (~> 1.8)
strong_migrations (0.2.2) strong_migrations (0.2.3)
activerecord (>= 3.2.0) activerecord (>= 3.2.0)
temple (0.8.0) temple (0.8.0)
terminal-table (1.8.0) terminal-table (1.8.0)
@ -597,26 +600,26 @@ GEM
tilt (2.0.8) tilt (2.0.8)
timers (4.1.2) timers (4.1.2)
hitimes hitimes
tty-color (0.4.2) tty-color (0.4.3)
tty-command (0.8.0) tty-command (0.8.2)
pastel (~> 0.7.0) pastel (~> 0.7.0)
tty-cursor (0.5.0) tty-cursor (0.6.0)
tty-prompt (0.16.0) tty-prompt (0.17.0)
necromancer (~> 0.4.0) necromancer (~> 0.4.0)
pastel (~> 0.7.0) pastel (~> 0.7.0)
timers (~> 4.0) timers (~> 4.0)
tty-cursor (~> 0.5.0) tty-cursor (~> 0.6.0)
tty-reader (~> 0.2.0) tty-reader (~> 0.4.0)
tty-reader (0.2.0) tty-reader (0.4.0)
tty-cursor (~> 0.5.0) tty-cursor (~> 0.6.0)
tty-screen (~> 0.6.4) tty-screen (~> 0.6.4)
wisper (~> 2.0.0) wisper (~> 2.0.0)
tty-screen (0.6.4) tty-screen (0.6.5)
twitter-text (1.14.7) twitter-text (1.14.7)
unf (~> 0.1.0) unf (~> 0.1.0)
tzinfo (1.2.5) tzinfo (1.2.5)
thread_safe (~> 0.1) thread_safe (~> 0.1)
tzinfo-data (1.2018.4) tzinfo-data (1.2018.5)
tzinfo (>= 1.0.0) tzinfo (>= 1.0.0)
unf (0.1.4) unf (0.1.4)
unf_ext unf_ext
@ -659,7 +662,7 @@ DEPENDENCIES
browser browser
bullet (~> 5.7) bullet (~> 5.7)
bundler-audit (~> 0.6) bundler-audit (~> 0.6)
capistrano (~> 3.10) capistrano (~> 3.11)
capistrano-rails (~> 1.3) capistrano-rails (~> 1.3)
capistrano-rbenv (~> 2.1) capistrano-rbenv (~> 2.1)
capistrano-yarn (~> 2.0) capistrano-yarn (~> 2.0)
@ -669,7 +672,7 @@ DEPENDENCIES
cld3 (~> 3.2.0) cld3 (~> 3.2.0)
climate_control (~> 0.2) climate_control (~> 0.2)
derailed_benchmarks derailed_benchmarks
devise (~> 4.4) devise (~> 4.5)
devise-two-factor (~> 3.0) devise-two-factor (~> 3.0)
devise_pam_authenticatable2 (~> 9.2) devise_pam_authenticatable2 (~> 9.2)
doorkeeper (~> 5.0) doorkeeper (~> 5.0)
@ -703,11 +706,11 @@ DEPENDENCIES
mario-redis-lock (~> 1.2) mario-redis-lock (~> 1.2)
memory_profiler memory_profiler
microformats (~> 4.0) microformats (~> 4.0)
mime-types (~> 3.1) mime-types (~> 3.2)
net-ldap (~> 0.10) net-ldap (~> 0.10)
nokogiri (~> 1.8) nokogiri (~> 1.8)
nsa (~> 0.2) nsa (~> 0.2)
oj (~> 3.5) oj (~> 3.6)
omniauth (~> 1.2) omniauth (~> 1.2)
omniauth-cas (~> 1.1) omniauth-cas (~> 1.1)
omniauth-saml (~> 1.10) omniauth-saml (~> 1.10)
@ -717,11 +720,11 @@ DEPENDENCIES
paperclip-av-transcoder (~> 0.6) paperclip-av-transcoder (~> 0.6)
parallel_tests (~> 2.21) parallel_tests (~> 2.21)
pg (~> 1.0) pg (~> 1.0)
pghero (~> 2.1) pghero (~> 2.2)
pkg-config (~> 1.3) pkg-config (~> 1.3)
posix-spawn! posix-spawn!
premailer-rails premailer-rails
private_address_check (~> 0.4.1) private_address_check (~> 0.5)
pry-byebug (~> 3.6) pry-byebug (~> 3.6)
pry-rails (~> 0.3) pry-rails (~> 0.3)
puma (~> 3.11) puma (~> 3.11)
@ -743,9 +746,9 @@ DEPENDENCIES
ruby-progressbar (~> 1.4) ruby-progressbar (~> 1.4)
sanitize (~> 4.6) sanitize (~> 4.6)
scss_lint (~> 0.57) scss_lint (~> 0.57)
sidekiq (~> 5.1) sidekiq (~> 5.2)
sidekiq-bulk (~> 0.1.1) sidekiq-bulk (~> 0.1.1)
sidekiq-scheduler (~> 2.2) sidekiq-scheduler (~> 3.0)
sidekiq-unique-jobs (~> 5.0) sidekiq-unique-jobs (~> 5.0)
simple-navigation (~> 4.0) simple-navigation (~> 4.0)
simple_form (~> 4.0) simple_form (~> 4.0)
@ -757,7 +760,7 @@ DEPENDENCIES
strong_migrations (~> 0.2) strong_migrations (~> 0.2)
thor (~> 0.20) thor (~> 0.20)
tty-command (~> 0.8) tty-command (~> 0.8)
tty-prompt (~> 0.16) tty-prompt (~> 0.17)
twitter-text (~> 1.14) twitter-text (~> 1.14)
tzinfo-data (~> 1.2018) tzinfo-data (~> 1.2018)
webmock (~> 3.3) webmock (~> 3.3)

View file

@ -53,6 +53,10 @@ class Api::BaseController < ApplicationController
[params[:limit].to_i.abs, default_limit * 2].min [params[:limit].to_i.abs, default_limit * 2].min
end end
def params_slice(*keys)
params.slice(*keys).permit(*keys)
end
def current_resource_owner def current_resource_owner
@current_user ||= User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token @current_user ||= User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
end end

View file

@ -28,10 +28,9 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
def account_statuses def account_statuses
statuses = truthy_param?(:pinned) ? pinned_scope : permitted_account_statuses statuses = truthy_param?(:pinned) ? pinned_scope : permitted_account_statuses
statuses = statuses.paginate_by_max_id( statuses = statuses.paginate_by_id(
limit_param(DEFAULT_STATUSES_LIMIT), limit_param(DEFAULT_STATUSES_LIMIT),
params[:max_id], params_slice(:max_id, :since_id, :min_id)
params[:since_id]
) )
statuses.merge!(only_media_scope) if truthy_param?(:only_media) statuses.merge!(only_media_scope) if truthy_param?(:only_media)
@ -82,7 +81,7 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
def prev_path def prev_path
unless @statuses.empty? unless @statuses.empty?
api_v1_account_statuses_url pagination_params(since_id: pagination_since_id) api_v1_account_statuses_url pagination_params(min_id: pagination_since_id)
end end
end end

View file

@ -26,10 +26,9 @@ class Api::V1::FavouritesController < Api::BaseController
end end
def results def results
@_results ||= account_favourites.paginate_by_max_id( @_results ||= account_favourites.paginate_by_id(
limit_param(DEFAULT_STATUSES_LIMIT), limit_param(DEFAULT_STATUSES_LIMIT),
params[:max_id], params_slice(:max_id, :since_id, :min_id)
params[:since_id]
) )
end end
@ -49,7 +48,7 @@ class Api::V1::FavouritesController < Api::BaseController
def prev_path def prev_path
unless results.empty? unless results.empty?
api_v1_favourites_url pagination_params(since_id: pagination_since_id) api_v1_favourites_url pagination_params(min_id: pagination_since_id)
end end
end end

View file

@ -4,6 +4,8 @@ class Api::V1::InstancesController < Api::BaseController
respond_to :json respond_to :json
def show def show
render json: {}, serializer: REST::InstanceSerializer render_cached_json('api:v1:instances', expires_in: 5.minutes) do
ActiveModelSerializers::SerializableResource.new({}, serializer: REST::InstanceSerializer)
end
end end
end end

View file

@ -46,10 +46,9 @@ class Api::V1::NotificationsController < Api::BaseController
end end
def paginated_notifications def paginated_notifications
browserable_account_notifications.paginate_by_max_id( browserable_account_notifications.paginate_by_id(
limit_param(DEFAULT_NOTIFICATIONS_LIMIT), limit_param(DEFAULT_NOTIFICATIONS_LIMIT),
params[:max_id], params_slice(:max_id, :since_id, :min_id)
params[:since_id]
) )
end end
@ -73,7 +72,7 @@ class Api::V1::NotificationsController < Api::BaseController
def prev_path def prev_path
unless @notifications.empty? unless @notifications.empty?
api_v1_notifications_url pagination_params(since_id: pagination_since_id) api_v1_notifications_url pagination_params(min_id: pagination_since_id)
end end
end end

View file

@ -7,11 +7,6 @@ class Api::V1::ReportsController < Api::BaseController
respond_to :json respond_to :json
def index
@reports = current_account.reports
render json: @reports, each_serializer: REST::ReportSerializer
end
def create def create
@report = ReportService.new.call( @report = ReportService.new.call(
current_account, current_account,

View file

@ -30,7 +30,8 @@ class Api::V1::Timelines::HomeController < Api::BaseController
account_home_feed.get( account_home_feed.get(
limit_param(DEFAULT_STATUSES_LIMIT), limit_param(DEFAULT_STATUSES_LIMIT),
params[:max_id], params[:max_id],
params[:since_id] params[:since_id],
params[:min_id]
) )
end end
@ -51,7 +52,7 @@ class Api::V1::Timelines::HomeController < Api::BaseController
end end
def prev_path def prev_path
api_v1_timelines_home_url pagination_params(since_id: pagination_since_id) api_v1_timelines_home_url pagination_params(min_id: pagination_since_id)
end end
def pagination_max_id def pagination_max_id

View file

@ -32,7 +32,8 @@ class Api::V1::Timelines::ListController < Api::BaseController
list_feed.get( list_feed.get(
limit_param(DEFAULT_STATUSES_LIMIT), limit_param(DEFAULT_STATUSES_LIMIT),
params[:max_id], params[:max_id],
params[:since_id] params[:since_id],
params[:min_id]
) )
end end
@ -53,7 +54,7 @@ class Api::V1::Timelines::ListController < Api::BaseController
end end
def prev_path def prev_path
api_v1_timelines_list_url params[:id], pagination_params(since_id: pagination_since_id) api_v1_timelines_list_url params[:id], pagination_params(min_id: pagination_since_id)
end end
def pagination_max_id def pagination_max_id

View file

@ -21,10 +21,9 @@ class Api::V1::Timelines::PublicController < Api::BaseController
end end
def public_statuses def public_statuses
statuses = public_timeline_statuses.paginate_by_max_id( statuses = public_timeline_statuses.paginate_by_id(
limit_param(DEFAULT_STATUSES_LIMIT), limit_param(DEFAULT_STATUSES_LIMIT),
params[:max_id], params_slice(:max_id, :since_id, :min_id)
params[:since_id]
) )
if truthy_param?(:only_media) if truthy_param?(:only_media)
@ -53,7 +52,7 @@ class Api::V1::Timelines::PublicController < Api::BaseController
end end
def prev_path def prev_path
api_v1_timelines_public_url pagination_params(since_id: pagination_since_id) api_v1_timelines_public_url pagination_params(min_id: pagination_since_id)
end end
def pagination_max_id def pagination_max_id

View file

@ -29,10 +29,9 @@ class Api::V1::Timelines::TagController < Api::BaseController
if @tag.nil? if @tag.nil?
[] []
else else
statuses = tag_timeline_statuses.paginate_by_max_id( statuses = tag_timeline_statuses.paginate_by_id(
limit_param(DEFAULT_STATUSES_LIMIT), limit_param(DEFAULT_STATUSES_LIMIT),
params[:max_id], params_slice(:max_id, :since_id, :min_id)
params[:since_id]
) )
if truthy_param?(:only_media) if truthy_param?(:only_media)
@ -62,7 +61,7 @@ class Api::V1::Timelines::TagController < Api::BaseController
end end
def prev_path def prev_path
api_v1_timelines_tag_url params[:id], pagination_params(since_id: pagination_since_id) api_v1_timelines_tag_url params[:id], pagination_params(min_id: pagination_since_id)
end end
def pagination_max_id def pagination_max_id

View file

@ -37,7 +37,8 @@ class Settings::PreferencesController < Settings::BaseController
:setting_favourite_modal, :setting_favourite_modal,
:setting_delete_modal, :setting_delete_modal,
:setting_auto_play_gif, :setting_auto_play_gif,
:setting_display_sensitive_media, :setting_display_media,
:setting_expand_spoilers,
:setting_reduce_motion, :setting_reduce_motion,
:setting_system_font_ui, :setting_system_font_ui,
:setting_noindex, :setting_noindex,

View file

@ -7,8 +7,8 @@ module ApplicationHelper
follow follow
).freeze ).freeze
def active_nav_class(path) def active_nav_class(*paths)
current_page?(path) ? 'active' : '' paths.any? { |path| current_page?(path) } ? 'active' : ''
end end
def active_link_to(label, path, **options) def active_link_to(label, path, **options)

View file

@ -1,6 +1,7 @@
import escapeTextContentForBrowser from 'escape-html'; import escapeTextContentForBrowser from 'escape-html';
import emojify from '../../features/emoji/emoji'; import emojify from '../../features/emoji/emoji';
import { unescapeHTML } from '../../utils/html'; import { unescapeHTML } from '../../utils/html';
import { expandSpoilers } from '../../initial_state';
const domParser = new DOMParser(); const domParser = new DOMParser();
@ -57,7 +58,7 @@ export function normalizeStatus(status, normalOldStatus) {
normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent; normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent;
normalStatus.contentHtml = emojify(normalStatus.content, emojiMap); normalStatus.contentHtml = emojify(normalStatus.content, emojiMap);
normalStatus.spoilerHtml = emojify(escapeTextContentForBrowser(spoilerText), emojiMap); normalStatus.spoilerHtml = emojify(escapeTextContentForBrowser(spoilerText), emojiMap);
normalStatus.hidden = spoilerText.length > 0 || normalStatus.sensitive; normalStatus.hidden = expandSpoilers ? false : spoilerText.length > 0 || normalStatus.sensitive;
} }
return normalStatus; return normalStatus;

View file

@ -0,0 +1,27 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`<AutosuggestEmoji /> renders emoji with custom url 1`] = `
<div
className="autosuggest-emoji"
>
<img
alt="foobar"
className="emojione"
src="http://example.com/emoji.png"
/>
:foobar:
</div>
`;
exports[`<AutosuggestEmoji /> renders native emoji 1`] = `
<div
className="autosuggest-emoji"
>
<img
alt="💙"
className="emojione"
src="/emoji/1f499.svg"
/>
:foobar:
</div>
`;

View file

@ -0,0 +1,29 @@
import React from 'react';
import renderer from 'react-test-renderer';
import AutosuggestEmoji from '../autosuggest_emoji';
describe('<AutosuggestEmoji />', () => {
it('renders native emoji', () => {
const emoji = {
native: '💙',
colons: ':foobar:',
};
const component = renderer.create(<AutosuggestEmoji emoji={emoji} />);
const tree = component.toJSON();
expect(tree).toMatchSnapshot();
});
it('renders emoji with custom url', () => {
const emoji = {
custom: true,
imageUrl: 'http://example.com/emoji.png',
native: 'foobar',
colons: ':foobar:',
};
const component = renderer.create(<AutosuggestEmoji emoji={emoji} />);
const tree = component.toJSON();
expect(tree).toMatchSnapshot();
});
});

View file

@ -6,7 +6,7 @@ import IconButton from './icon_button';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { isIOS } from '../is_mobile'; import { isIOS } from '../is_mobile';
import classNames from 'classnames'; import classNames from 'classnames';
import { autoPlayGif, displaySensitiveMedia } from '../initial_state'; import { autoPlayGif, displayMedia } from '../initial_state';
const messages = defineMessages({ const messages = defineMessages({
toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Toggle visibility' }, toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Toggle visibility' },
@ -197,7 +197,7 @@ class MediaGallery extends React.PureComponent {
}; };
state = { state = {
visible: !this.props.sensitive || displaySensitiveMedia, visible: displayMedia !== 'hide_all' && !this.props.sensitive || displayMedia === 'show_all',
}; };
componentWillReceiveProps (nextProps) { componentWillReceiveProps (nextProps) {

View file

@ -285,7 +285,7 @@ class Status extends ImmutablePureComponent {
</a> </a>
</div> </div>
<StatusContent status={status} onClick={this.handleClick} expanded={!status.get('hidden')} onExpandedToggle={this.handleExpandedToggle} /> <StatusContent status={status} onClick={this.handleClick} expanded={!status.get('hidden')} onExpandedToggle={this.handleExpandedToggle} collapsable />
{media} {media}

View file

@ -6,6 +6,8 @@ import { FormattedMessage } from 'react-intl';
import Permalink from './permalink'; import Permalink from './permalink';
import classnames from 'classnames'; import classnames from 'classnames';
const MAX_HEIGHT = 642; // 20px * 32 (+ 2px padding at the top)
export default class StatusContent extends React.PureComponent { export default class StatusContent extends React.PureComponent {
static contextTypes = { static contextTypes = {
@ -17,10 +19,12 @@ export default class StatusContent extends React.PureComponent {
expanded: PropTypes.bool, expanded: PropTypes.bool,
onExpandedToggle: PropTypes.func, onExpandedToggle: PropTypes.func,
onClick: PropTypes.func, onClick: PropTypes.func,
collapsable: PropTypes.bool,
}; };
state = { state = {
hidden: true, hidden: true,
collapsed: null, // `collapsed: null` indicates that an element doesn't need collapsing, while `true` or `false` indicates that it does (and is/isn't).
}; };
_updateStatusLinks () { _updateStatusLinks () {
@ -53,6 +57,16 @@ export default class StatusContent extends React.PureComponent {
link.setAttribute('target', '_blank'); link.setAttribute('target', '_blank');
link.setAttribute('rel', 'noopener'); link.setAttribute('rel', 'noopener');
} }
if (
this.props.collapsable
&& this.props.onClick
&& this.state.collapsed === null
&& node.clientHeight > MAX_HEIGHT
&& this.props.status.get('spoiler_text').length === 0
) {
this.setState({ collapsed: true });
}
} }
componentDidMount () { componentDidMount () {
@ -113,6 +127,11 @@ export default class StatusContent extends React.PureComponent {
} }
} }
handleCollapsedClick = (e) => {
e.preventDefault();
this.setState({ collapsed: !this.state.collapsed });
}
setRef = (c) => { setRef = (c) => {
this.node = c; this.node = c;
} }
@ -132,12 +151,19 @@ export default class StatusContent extends React.PureComponent {
const classNames = classnames('status__content', { const classNames = classnames('status__content', {
'status__content--with-action': this.props.onClick && this.context.router, 'status__content--with-action': this.props.onClick && this.context.router,
'status__content--with-spoiler': status.get('spoiler_text').length > 0, 'status__content--with-spoiler': status.get('spoiler_text').length > 0,
'status__content--collapsed': this.state.collapsed === true,
}); });
if (isRtl(status.get('search_index'))) { if (isRtl(status.get('search_index'))) {
directionStyle.direction = 'rtl'; directionStyle.direction = 'rtl';
} }
const readMoreButton = (
<button className='status__content__read-more-button' onClick={this.props.onClick}>
<FormattedMessage id='status.read_more' defaultMessage='Read more' /><i className='fa fa-fw fa-angle-right' />
</button>
);
if (status.get('spoiler_text').length > 0) { if (status.get('spoiler_text').length > 0) {
let mentionsPlaceholder = ''; let mentionsPlaceholder = '';
@ -167,17 +193,23 @@ export default class StatusContent extends React.PureComponent {
</div> </div>
); );
} else if (this.props.onClick) { } else if (this.props.onClick) {
return ( const output = [
<div <div
ref={this.setRef} ref={this.setRef}
tabIndex='0' tabIndex='0'
className={classNames} className={classNames}
style={directionStyle} style={directionStyle}
dangerouslySetInnerHTML={content}
onMouseDown={this.handleMouseDown} onMouseDown={this.handleMouseDown}
onMouseUp={this.handleMouseUp} onMouseUp={this.handleMouseUp}
dangerouslySetInnerHTML={content} />,
/> ];
);
if (this.state.collapsed) {
output.push(readMoreButton);
}
return output;
} else { } else {
return ( return (
<div <div

View file

@ -2,7 +2,7 @@ import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePureComponent from 'react-immutable-pure-component';
import Permalink from '../../../components/permalink'; import Permalink from '../../../components/permalink';
import { displaySensitiveMedia } from '../../../initial_state'; import { displayMedia } from '../../../initial_state';
export default class MediaItem extends ImmutablePureComponent { export default class MediaItem extends ImmutablePureComponent {
@ -11,7 +11,7 @@ export default class MediaItem extends ImmutablePureComponent {
}; };
state = { state = {
visible: !this.props.media.getIn(['status', 'sensitive']) || displaySensitiveMedia, visible: displayMedia !== 'hide_all' && !this.props.media.getIn(['status', 'sensitive']) || displayMedia === 'show_all',
}; };
handleClick = () => { handleClick = () => {

View file

@ -27,7 +27,6 @@ export default class ColumnSettings extends React.PureComponent {
const showPushSettings = pushSettings.get('browserSupport') && pushSettings.get('isSubscribed'); const showPushSettings = pushSettings.get('browserSupport') && pushSettings.get('isSubscribed');
const pushStr = showPushSettings && <FormattedMessage id='notifications.column_settings.push' defaultMessage='Push notifications' />; const pushStr = showPushSettings && <FormattedMessage id='notifications.column_settings.push' defaultMessage='Push notifications' />;
const pushMeta = showPushSettings && <FormattedMessage id='notifications.column_settings.push_meta' defaultMessage='This device' />;
return ( return (
<div> <div>
@ -40,7 +39,7 @@ export default class ColumnSettings extends React.PureComponent {
<div className='column-settings__row'> <div className='column-settings__row'>
<SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow']} onChange={onChange} label={alertStr} /> <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow']} onChange={onChange} label={alertStr} />
{showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow']} meta={pushMeta} onChange={this.onPushChange} label={pushStr} />} {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow']} onChange={this.onPushChange} label={pushStr} />}
<SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow']} onChange={onChange} label={showStr} /> <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow']} onChange={onChange} label={showStr} />
<SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow']} onChange={onChange} label={soundStr} /> <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow']} onChange={onChange} label={soundStr} />
</div> </div>
@ -51,7 +50,7 @@ export default class ColumnSettings extends React.PureComponent {
<div className='column-settings__row'> <div className='column-settings__row'>
<SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'favourite']} onChange={onChange} label={alertStr} /> <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'favourite']} onChange={onChange} label={alertStr} />
{showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'favourite']} meta={pushMeta} onChange={this.onPushChange} label={pushStr} />} {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'favourite']} onChange={this.onPushChange} label={pushStr} />}
<SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'favourite']} onChange={onChange} label={showStr} /> <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'favourite']} onChange={onChange} label={showStr} />
<SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'favourite']} onChange={onChange} label={soundStr} /> <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'favourite']} onChange={onChange} label={soundStr} />
</div> </div>
@ -62,7 +61,7 @@ export default class ColumnSettings extends React.PureComponent {
<div className='column-settings__row'> <div className='column-settings__row'>
<SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'mention']} onChange={onChange} label={alertStr} /> <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'mention']} onChange={onChange} label={alertStr} />
{showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'mention']} meta={pushMeta} onChange={this.onPushChange} label={pushStr} />} {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'mention']} onChange={this.onPushChange} label={pushStr} />}
<SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'mention']} onChange={onChange} label={showStr} /> <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'mention']} onChange={onChange} label={showStr} />
<SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'mention']} onChange={onChange} label={soundStr} /> <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'mention']} onChange={onChange} label={soundStr} />
</div> </div>
@ -73,7 +72,7 @@ export default class ColumnSettings extends React.PureComponent {
<div className='column-settings__row'> <div className='column-settings__row'>
<SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'reblog']} onChange={onChange} label={alertStr} /> <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'reblog']} onChange={onChange} label={alertStr} />
{showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'reblog']} meta={pushMeta} onChange={this.onPushChange} label={pushStr} />} {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'reblog']} onChange={this.onPushChange} label={pushStr} />}
<SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'reblog']} onChange={onChange} label={showStr} /> <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'reblog']} onChange={onChange} label={showStr} />
<SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} /> <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} />
</div> </div>

View file

@ -85,8 +85,9 @@ class Notification extends ImmutablePureComponent {
<div className='notification__favourite-icon-wrapper'> <div className='notification__favourite-icon-wrapper'>
<i className='fa fa-fw fa-user-plus' /> <i className='fa fa-fw fa-user-plus' />
</div> </div>
<span title={notification.get('created_at')}>
<FormattedMessage id='notification.follow' defaultMessage='{name} followed you' values={{ name: link }} /> <FormattedMessage id='notification.follow' defaultMessage='{name} followed you' values={{ name: link }} />
</span>
</div> </div>
<AccountContainer id={account.get('id')} withNote={false} hidden={this.props.hidden} /> <AccountContainer id={account.get('id')} withNote={false} hidden={this.props.hidden} />

View file

@ -10,7 +10,6 @@ export default class SettingToggle extends React.PureComponent {
settings: ImmutablePropTypes.map.isRequired, settings: ImmutablePropTypes.map.isRequired,
settingPath: PropTypes.array.isRequired, settingPath: PropTypes.array.isRequired,
label: PropTypes.node.isRequired, label: PropTypes.node.isRequired,
meta: PropTypes.node,
onChange: PropTypes.func.isRequired, onChange: PropTypes.func.isRequired,
} }
@ -19,14 +18,13 @@ export default class SettingToggle extends React.PureComponent {
} }
render () { render () {
const { prefix, settings, settingPath, label, meta } = this.props; const { prefix, settings, settingPath, label } = this.props;
const id = ['setting-toggle', prefix, ...settingPath].filter(Boolean).join('-'); const id = ['setting-toggle', prefix, ...settingPath].filter(Boolean).join('-');
return ( return (
<div className='setting-toggle'> <div className='setting-toggle'>
<Toggle id={id} checked={settings.getIn(settingPath)} onChange={this.onChange} onKeyDown={this.onKeyDown} /> <Toggle id={id} checked={settings.getIn(settingPath)} onChange={this.onChange} onKeyDown={this.onKeyDown} />
<label htmlFor={id} className='setting-toggle__label'>{label}</label> <label htmlFor={id} className='setting-toggle__label'>{label}</label>
{meta && <span className='setting-meta__label'>{meta}</span>}
</div> </div>
); );
} }

View file

@ -59,7 +59,8 @@ const messages = defineMessages({
const mapStateToProps = state => ({ const mapStateToProps = state => ({
isComposing: state.getIn(['compose', 'is_composing']), isComposing: state.getIn(['compose', 'is_composing']),
hasComposingText: state.getIn(['compose', 'text']) !== '', hasComposingText: state.getIn(['compose', 'text']).trim().length !== 0,
hasMediaAttachments: state.getIn(['compose', 'media_attachments']).size > 0,
dropdownMenuIsOpen: state.getIn(['dropdown_menu', 'openId']) !== null, dropdownMenuIsOpen: state.getIn(['dropdown_menu', 'openId']) !== null,
}); });
@ -201,6 +202,7 @@ class UI extends React.PureComponent {
children: PropTypes.node, children: PropTypes.node,
isComposing: PropTypes.bool, isComposing: PropTypes.bool,
hasComposingText: PropTypes.bool, hasComposingText: PropTypes.bool,
hasMediaAttachments: PropTypes.bool,
location: PropTypes.object, location: PropTypes.object,
intl: PropTypes.object.isRequired, intl: PropTypes.object.isRequired,
dropdownMenuIsOpen: PropTypes.bool, dropdownMenuIsOpen: PropTypes.bool,
@ -211,9 +213,9 @@ class UI extends React.PureComponent {
}; };
handleBeforeUnload = (e) => { handleBeforeUnload = (e) => {
const { intl, isComposing, hasComposingText } = this.props; const { intl, isComposing, hasComposingText, hasMediaAttachments } = this.props;
if (isComposing && hasComposingText) { if (isComposing && (hasComposingText || hasMediaAttachments)) {
// Setting returnValue to any string causes confirmation dialog. // Setting returnValue to any string causes confirmation dialog.
// Many browsers no longer display this text to users, // Many browsers no longer display this text to users,
// but we set user-friendly message for other browsers, e.g. Edge. // but we set user-friendly message for other browsers, e.g. Edge.

View file

@ -5,7 +5,7 @@ import { fromJS } from 'immutable';
import { throttle } from 'lodash'; import { throttle } from 'lodash';
import classNames from 'classnames'; import classNames from 'classnames';
import { isFullscreen, requestFullscreen, exitFullscreen } from '../ui/util/fullscreen'; import { isFullscreen, requestFullscreen, exitFullscreen } from '../ui/util/fullscreen';
import { displaySensitiveMedia } from '../../initial_state'; import { displayMedia } from '../../initial_state';
const messages = defineMessages({ const messages = defineMessages({
play: { id: 'video.play', defaultMessage: 'Play' }, play: { id: 'video.play', defaultMessage: 'Play' },
@ -111,7 +111,7 @@ class Video extends React.PureComponent {
fullscreen: false, fullscreen: false,
hovered: false, hovered: false,
muted: false, muted: false,
revealed: !this.props.sensitive || displaySensitiveMedia, revealed: displayMedia !== 'hide_all' && !this.props.sensitive || displayMedia === 'show_all',
}; };
setPlayerRef = c => { setPlayerRef = c => {
@ -272,7 +272,7 @@ class Video extends React.PureComponent {
} }
render () { render () {
const { preview, src, inline, startTime, onOpenVideo, onCloseVideo, intl, alt, detailed } = this.props; const { preview, src, inline, startTime, onOpenVideo, onCloseVideo, intl, alt, detailed, sensitive } = this.props;
const { containerWidth, currentTime, duration, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; const { containerWidth, currentTime, duration, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state;
const progress = (currentTime / duration) * 100; const progress = (currentTime / duration) * 100;
const playerStyle = {}; const playerStyle = {};
@ -296,6 +296,13 @@ class Video extends React.PureComponent {
preload = 'none'; preload = 'none';
} }
let warning;
if (sensitive) {
warning = <FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' />;
} else {
warning = <FormattedMessage id='status.media_hidden' defaultMessage='Media hidden' />;
}
return ( return (
<div <div
role='menuitem' role='menuitem'
@ -328,7 +335,7 @@ class Video extends React.PureComponent {
/> />
<button type='button' className={classNames('video-player__spoiler', { active: !revealed })} onClick={this.toggleReveal}> <button type='button' className={classNames('video-player__spoiler', { active: !revealed })} onClick={this.toggleReveal}>
<span className='video-player__spoiler__title'><FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' /></span> <span className='video-player__spoiler__title'>{warning}</span>
<span className='video-player__spoiler__subtitle'><FormattedMessage id='status.sensitive_toggle' defaultMessage='Click to view' /></span> <span className='video-player__spoiler__subtitle'><FormattedMessage id='status.sensitive_toggle' defaultMessage='Click to view' /></span>
</button> </button>

View file

@ -5,7 +5,8 @@ const getMeta = (prop) => initialState && initialState.meta && initialState.meta
export const reduceMotion = getMeta('reduce_motion'); export const reduceMotion = getMeta('reduce_motion');
export const autoPlayGif = getMeta('auto_play_gif'); export const autoPlayGif = getMeta('auto_play_gif');
export const displaySensitiveMedia = getMeta('display_sensitive_media'); export const displayMedia = getMeta('display_media');
export const expandSpoilers = getMeta('expand_spoilers');
export const unfollowModal = getMeta('unfollow_modal'); export const unfollowModal = getMeta('unfollow_modal');
export const boostModal = getMeta('boost_modal'); export const boostModal = getMeta('boost_modal');
export const deleteModal = getMeta('delete_modal'); export const deleteModal = getMeta('delete_modal');

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "متابعُون جُدُد :", "notifications.column_settings.follow": "متابعُون جُدُد :",
"notifications.column_settings.mention": "الإشارات :", "notifications.column_settings.mention": "الإشارات :",
"notifications.column_settings.push": "الإخطارات المدفوعة", "notifications.column_settings.push": "الإخطارات المدفوعة",
"notifications.column_settings.push_meta": "هذا الجهاز",
"notifications.column_settings.reblog": "الترقيّات:", "notifications.column_settings.reblog": "الترقيّات:",
"notifications.column_settings.show": "إعرِضها في عمود", "notifications.column_settings.show": "إعرِضها في عمود",
"notifications.column_settings.sound": "أصدر صوتا", "notifications.column_settings.sound": "أصدر صوتا",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Siguidores nuevos:", "notifications.column_settings.follow": "Siguidores nuevos:",
"notifications.column_settings.mention": "Menciones:", "notifications.column_settings.mention": "Menciones:",
"notifications.column_settings.push": "Push notifications", "notifications.column_settings.push": "Push notifications",
"notifications.column_settings.push_meta": "Esti preséu",
"notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "Amosar en columna", "notifications.column_settings.show": "Amosar en columna",
"notifications.column_settings.sound": "Reproducir soníu", "notifications.column_settings.sound": "Reproducir soníu",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Нови последователи:", "notifications.column_settings.follow": "Нови последователи:",
"notifications.column_settings.mention": "Споменавания:", "notifications.column_settings.mention": "Споменавания:",
"notifications.column_settings.push": "Push notifications", "notifications.column_settings.push": "Push notifications",
"notifications.column_settings.push_meta": "This device",
"notifications.column_settings.reblog": "Споделяния:", "notifications.column_settings.reblog": "Споделяния:",
"notifications.column_settings.show": "Покажи в колона", "notifications.column_settings.show": "Покажи в колона",
"notifications.column_settings.sound": "Play sound", "notifications.column_settings.sound": "Play sound",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Nous seguidors:", "notifications.column_settings.follow": "Nous seguidors:",
"notifications.column_settings.mention": "Mencions:", "notifications.column_settings.mention": "Mencions:",
"notifications.column_settings.push": "Push notificacions", "notifications.column_settings.push": "Push notificacions",
"notifications.column_settings.push_meta": "Aquest dispositiu",
"notifications.column_settings.reblog": "Impulsos:", "notifications.column_settings.reblog": "Impulsos:",
"notifications.column_settings.show": "Mostrar en la columna", "notifications.column_settings.show": "Mostrar en la columna",
"notifications.column_settings.sound": "Reproduïr so", "notifications.column_settings.sound": "Reproduïr so",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Abbunati novi:", "notifications.column_settings.follow": "Abbunati novi:",
"notifications.column_settings.mention": "Minzione:", "notifications.column_settings.mention": "Minzione:",
"notifications.column_settings.push": "Nutificazione Push", "notifications.column_settings.push": "Nutificazione Push",
"notifications.column_settings.push_meta": "Quess'apparechju",
"notifications.column_settings.reblog": "Spartere:", "notifications.column_settings.reblog": "Spartere:",
"notifications.column_settings.show": "Mustrà indè a colonna", "notifications.column_settings.show": "Mustrà indè a colonna",
"notifications.column_settings.sound": "Sunà", "notifications.column_settings.sound": "Sunà",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Noví sledovatelé:", "notifications.column_settings.follow": "Noví sledovatelé:",
"notifications.column_settings.mention": "Zmínky:", "notifications.column_settings.mention": "Zmínky:",
"notifications.column_settings.push": "Push oznámení", "notifications.column_settings.push": "Push oznámení",
"notifications.column_settings.push_meta": "Toto zařízení",
"notifications.column_settings.reblog": "Boosty:", "notifications.column_settings.reblog": "Boosty:",
"notifications.column_settings.show": "Zobrazit ve sloupci", "notifications.column_settings.show": "Zobrazit ve sloupci",
"notifications.column_settings.sound": "Přehrát zvuk", "notifications.column_settings.sound": "Přehrát zvuk",

View file

@ -5,43 +5,42 @@
"account.blocked": "Blociwyd", "account.blocked": "Blociwyd",
"account.direct": "Neges breifat @{name}", "account.direct": "Neges breifat @{name}",
"account.disclaimer_full": "Gall y wybodaeth isod adlewyrchu darlun anghyflawn o broffil defnyddiwr.", "account.disclaimer_full": "Gall y wybodaeth isod adlewyrchu darlun anghyflawn o broffil defnyddiwr.",
"account.domain_blocked": "Domain hidden", "account.domain_blocked": "Parth wedi ei guddio",
"account.edit_profile": "Golygu proffil", "account.edit_profile": "Golygu proffil",
"account.endorse": "Feature on profile", "account.endorse": "Arddangos ar fy mhroffil",
"account.follow": "Dilyn", "account.follow": "Dilyn",
"account.followers": "Dilynwyr", "account.followers": "Dilynwyr",
"account.followers.empty": "Nid oes neb yn dilyn y defnyddiwr hwn eto.", "account.followers.empty": "Nid oes neb yn dilyn y defnyddiwr hwn eto.",
"account.follows": "Yn dilyn", "account.follows": "Yn dilyn",
"account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.", "account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.",
"account.follows_you": "Yn eich dilyn chi", "account.follows_you": "Yn eich dilyn chi",
"account.hide_reblogs": "Hide boosts from @{name}", "account.hide_reblogs": "Cuddio bwstiau o @{name}",
"account.link_verified_on": "Ownership of this link was checked on {date}",
"account.media": "Cyfryngau", "account.media": "Cyfryngau",
"account.mention": "Crybwyll @{name}", "account.mention": "Crybwyll @{name}",
"account.moved_to": "Mae @{name} wedi symud i:", "account.moved_to": "Mae @{name} wedi symud i:",
"account.mute": "Mute @{name}", "account.mute": "Tawelu @{name}",
"account.mute_notifications": "Mute notifications from @{name}", "account.mute_notifications": "Cuddio hysbysiadau o @{name}",
"account.muted": "Distewyd", "account.muted": "Distewyd",
"account.posts": "Tŵtiau", "account.posts": "Tŵtiau",
"account.posts_with_replies": "Toots and replies", "account.posts_with_replies": "Tŵtiau ac atebion",
"account.report": "Adroddwch @{name}", "account.report": "Adroddwch @{name}",
"account.requested": "Awaiting approval. Click to cancel follow request", "account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn",
"account.share": "Rhannwch broffil @{name}", "account.share": "Rhannwch broffil @{name}",
"account.show_reblogs": "Show boosts from @{name}", "account.show_reblogs": "Dangoswch bwstiau o @{name}",
"account.unblock": "Dadflociwch @{name}", "account.unblock": "Dadflociwch @{name}",
"account.unblock_domain": "Dadguddiwch {domain}", "account.unblock_domain": "Dadguddiwch {domain}",
"account.unendorse": "Don't feature on profile", "account.unendorse": "Peidwch a'i arddangos ar fy mhroffil",
"account.unfollow": "Daddilynwch", "account.unfollow": "Daddilynwch",
"account.unmute": "Unmute @{name}", "account.unmute": "Dad-dawelu @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}", "account.unmute_notifications": "Dad-dawelu hysbysiadau o @{name}",
"account.view_full_profile": "View full profile", "account.view_full_profile": "Gweld proffil llawn",
"alert.unexpected.message": "Digwyddodd gwall annisgwyl.", "alert.unexpected.message": "Digwyddodd gwall annisgwyl.",
"alert.unexpected.title": "Wps!", "alert.unexpected.title": "Wps!",
"boost_modal.combo": "You can press {combo} to skip this next time", "boost_modal.combo": "Mae modd gwasgu {combo} er mwyn sgipio hyn tro nesa",
"bundle_column_error.body": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.", "bundle_column_error.body": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.",
"bundle_column_error.retry": "Ceisiwch eto", "bundle_column_error.retry": "Ceisiwch eto",
"bundle_column_error.title": "Gwall rhwydwaith", "bundle_column_error.title": "Gwall rhwydwaith",
"bundle_modal_error.close": "Close", "bundle_modal_error.close": "Cau",
"bundle_modal_error.message": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.", "bundle_modal_error.message": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.",
"bundle_modal_error.retry": "Ceiswich eto", "bundle_modal_error.retry": "Ceiswich eto",
"column.blocks": "Defnyddwyr a flociwyd", "column.blocks": "Defnyddwyr a flociwyd",
@ -54,10 +53,10 @@
"column.lists": "Rhestrau", "column.lists": "Rhestrau",
"column.mutes": "Defnyddwyr a ddistewyd", "column.mutes": "Defnyddwyr a ddistewyd",
"column.notifications": "Hysbysiadau", "column.notifications": "Hysbysiadau",
"column.pins": "Pinned toot", "column.pins": "Tŵtiau wedi eu pinio",
"column.public": "Federated timeline", "column.public": "",
"column_back_button.label": "Nôl", "column_back_button.label": "Nôl",
"column_header.hide_settings": "Hide settings", "column_header.hide_settings": "Cuddiwch dewisiadau",
"column_header.moveLeft_settings": "Symudwch y golofn i'r chwith", "column_header.moveLeft_settings": "Symudwch y golofn i'r chwith",
"column_header.moveRight_settings": "Symudwch y golofn i'r dde", "column_header.moveRight_settings": "Symudwch y golofn i'r dde",
"column_header.pin": "Piniwch", "column_header.pin": "Piniwch",
@ -73,30 +72,30 @@
"compose_form.placeholder": "Be syd ar eich meddwl?", "compose_form.placeholder": "Be syd ar eich meddwl?",
"compose_form.publish": "Tŵt", "compose_form.publish": "Tŵt",
"compose_form.publish_loud": "{publish}!", "compose_form.publish_loud": "{publish}!",
"compose_form.sensitive.marked": "Media is marked as sensitive", "compose_form.sensitive.marked": "",
"compose_form.sensitive.unmarked": "Media is not marked as sensitive", "compose_form.sensitive.unmarked": "",
"compose_form.spoiler.marked": "Testun wedi ei guddio gan rybudd", "compose_form.spoiler.marked": "Testun wedi ei guddio gan rybudd",
"compose_form.spoiler.unmarked": "Nid yw'r testun wedi ei guddio", "compose_form.spoiler.unmarked": "Nid yw'r testun wedi ei guddio",
"compose_form.spoiler_placeholder": "Ysgrifenwch eich rhybudd yma", "compose_form.spoiler_placeholder": "Ysgrifenwch eich rhybudd yma",
"confirmation_modal.cancel": "Cancel", "confirmation_modal.cancel": "Canslo",
"confirmations.block.confirm": "Blociwch", "confirmations.block.confirm": "Blociwch",
"confirmations.block.message": "Ydych chi'n sicr eich bod eisiau blocio {name}?", "confirmations.block.message": "Ydych chi'n sicr eich bod eisiau blocio {name}?",
"confirmations.delete.confirm": "Dileu", "confirmations.delete.confirm": "Dileu",
"confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y statws hwn?", "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y statws hwn?",
"confirmations.delete_list.confirm": "Dileu", "confirmations.delete_list.confirm": "Dileu",
"confirmations.delete_list.message": "Ydych chi'n sicr eich bod eisiau dileu y rhestr hwn am byth?", "confirmations.delete_list.message": "Ydych chi'n sicr eich bod eisiau dileu y rhestr hwn am byth?",
"confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.confirm": "",
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", "confirmations.domain_block.message": "",
"confirmations.mute.confirm": "Mute", "confirmations.mute.confirm": "Tawelu",
"confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?", "confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Dilëwch & ailddrafftio",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", "confirmations.redraft.message": "Ydych chi'n siwr eich bod eisiau dileu y statws hwn a'i ailddrafftio? Bydd ffefrynnau a bwstiau'n cael ei colli, a bydd ymatebion i'r statws gwreiddiol yn cael eu hamddifadu.",
"confirmations.unfollow.confirm": "Dad-ddilynwch", "confirmations.unfollow.confirm": "Dad-ddilynwch",
"confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?", "confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?",
"embed.instructions": "Embed this status on your website by copying the code below.", "embed.instructions": "Mewnblannwch y statws hwn ar eich gwefan drwy gopïo'r côd isod.",
"embed.preview": "Dyma sut olwg fydd arno:", "embed.preview": "Dyma sut olwg fydd arno:",
"emoji_button.activity": "Gweithgarwch", "emoji_button.activity": "Gweithgarwch",
"emoji_button.custom": "Custom", "emoji_button.custom": "",
"emoji_button.flags": "Baneri", "emoji_button.flags": "Baneri",
"emoji_button.food": "Bwyd a Diod", "emoji_button.food": "Bwyd a Diod",
"emoji_button.label": "Mewnosodwch emoji", "emoji_button.label": "Mewnosodwch emoji",
@ -110,20 +109,20 @@
"emoji_button.symbols": "Symbolau", "emoji_button.symbols": "Symbolau",
"emoji_button.travel": "Teithio & Llefydd", "emoji_button.travel": "Teithio & Llefydd",
"empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.", "empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.community": "",
"empty_column.direct": "Nid oes gennych unrhyw negeseuon preifat eto. Pan y byddwch yn anfon neu derbyn un, mi fydd yn ymddangos yma.", "empty_column.direct": "Nid oes gennych unrhyw negeseuon preifat eto. Pan y byddwch yn anfon neu derbyn un, mi fydd yn ymddangos yma.",
"empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.", "empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.",
"empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff dwtiau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.", "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff dwtiau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.",
"empty_column.favourites": "Nid oes neb wedi hoffi'r tŵt yma eto. Pan bydd rhywun yn ei hoffi, mi fyddent yn ymddangos yma.", "empty_column.favourites": "Nid oes neb wedi hoffi'r tŵt yma eto. Pan bydd rhywun yn ei hoffi, mi fyddent yn ymddangos yma.",
"empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", "empty_column.follow_requests": "Nid oes gennych unrhyw geisiadau dilyn eto. Pan dderbyniwch chi un, bydd yn ymddangos yma.",
"empty_column.hashtag": "Nid oes dim ar yr hashnod hwn eto.", "empty_column.hashtag": "Nid oes dim ar yr hashnod hwn eto.",
"empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", "empty_column.home": "",
"empty_column.home.public_timeline": "the public timeline", "empty_column.home.public_timeline": "y ffrwd cyhoeddus",
"empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", "empty_column.list": "Nid oes dim yn y rhestr yma eto. Pan y bydd aelodau'r rhestr yn cyhoeddi statws newydd, mi fydd yn ymddangos yma.",
"empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", "empty_column.lists": "Nid oes gennych unrhyw restrau eto. Pan grëwch chi un, mi fydd yn ymddangos yma.",
"empty_column.mutes": "You haven't muted any users yet.", "empty_column.mutes": "Nid ydych wedi tawelu unrhyw ddefnyddwyr eto.",
"empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", "empty_column.notifications": "Nid oes gennych unrhyw hysbysiadau eto. Rhyngweithiwch ac eraill i ddechrau'r sgwrs.",
"empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", "empty_column.public": "Does dim byd yma! Ysgrifennwch rhywbeth yn gyhoeddus, neu dilynwch ddefnyddwyr o INSTANCES eraill i'w lenwi",
"follow_request.authorize": "Caniatau", "follow_request.authorize": "Caniatau",
"follow_request.reject": "Gwrthod", "follow_request.reject": "Gwrthod",
"getting_started.developers": "Datblygwyr", "getting_started.developers": "Datblygwyr",
@ -131,125 +130,124 @@
"getting_started.find_friends": "Canfod ffrindiau o Twitter", "getting_started.find_friends": "Canfod ffrindiau o Twitter",
"getting_started.heading": "Dechrau", "getting_started.heading": "Dechrau",
"getting_started.invite": "Gwahoddwch bobl", "getting_started.invite": "Gwahoddwch bobl",
"getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", "getting_started.open_source_notice": "Mae Mastodon yn feddalwedd côd agored. Mae modd cyfrannu neu adrodd materion ar GitHUb ar {github}.",
"getting_started.security": "Diogelwch", "getting_started.security": "Diogelwch",
"getting_started.terms": "Terms of service", "getting_started.terms": "Telerau Gwasanaeth",
"home.column_settings.basic": "Syml", "home.column_settings.basic": "Syml",
"home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_reblogs": "",
"home.column_settings.show_replies": "Dangoswch ymatebion", "home.column_settings.show_replies": "Dangoswch ymatebion",
"keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.back": "",
"keyboard_shortcuts.blocked": "to open blocked users list", "keyboard_shortcuts.blocked": "i agor rhestr defnyddwyr a flociwyd",
"keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.boost": "",
"keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.column": "",
"keyboard_shortcuts.compose": "to focus the compose textarea", "keyboard_shortcuts.compose": "",
"keyboard_shortcuts.description": "Disgrifiad", "keyboard_shortcuts.description": "Disgrifiad",
"keyboard_shortcuts.direct": "i agor colofn negeseuon preifat", "keyboard_shortcuts.direct": "i agor colofn negeseuon preifat",
"keyboard_shortcuts.down": "i symud lawr yn y rhestr", "keyboard_shortcuts.down": "i symud lawr yn y rhestr",
"keyboard_shortcuts.enter": "i agor statws", "keyboard_shortcuts.enter": "i agor statws",
"keyboard_shortcuts.favourite": "i hoffi", "keyboard_shortcuts.favourite": "i hoffi",
"keyboard_shortcuts.favourites": "i agor rhestr hoffi", "keyboard_shortcuts.favourites": "i agor rhestr hoffi",
"keyboard_shortcuts.federated": "to open federated timeline", "keyboard_shortcuts.federated": "",
"keyboard_shortcuts.heading": "Keyboard Shortcuts", "keyboard_shortcuts.heading": "",
"keyboard_shortcuts.home": "to open home timeline", "keyboard_shortcuts.home": "i agor ffrwd cartref",
"keyboard_shortcuts.hotkey": "Hotkey", "keyboard_shortcuts.hotkey": "Hotkey",
"keyboard_shortcuts.legend": "to display this legend", "keyboard_shortcuts.legend": "",
"keyboard_shortcuts.local": "to open local timeline", "keyboard_shortcuts.local": "i agor ffrwd lleol",
"keyboard_shortcuts.mention": "i grybwyll yr awdur", "keyboard_shortcuts.mention": "i grybwyll yr awdur",
"keyboard_shortcuts.muted": "to open muted users list", "keyboard_shortcuts.muted": "i agor rhestr defnyddwyr a dawelwyd",
"keyboard_shortcuts.my_profile": "i agor eich proffil", "keyboard_shortcuts.my_profile": "i agor eich proffil",
"keyboard_shortcuts.notifications": "i agor colofn hysbysiadau", "keyboard_shortcuts.notifications": "i agor colofn hysbysiadau",
"keyboard_shortcuts.pinned": "to open pinned toots list", "keyboard_shortcuts.pinned": "",
"keyboard_shortcuts.profile": "i agor proffil yr awdur", "keyboard_shortcuts.profile": "i agor proffil yr awdur",
"keyboard_shortcuts.reply": "i ateb", "keyboard_shortcuts.reply": "i ateb",
"keyboard_shortcuts.requests": "to open follow requests list", "keyboard_shortcuts.requests": "i agor rhestr ceisiadau dilyn",
"keyboard_shortcuts.search": "to focus search", "keyboard_shortcuts.search": "",
"keyboard_shortcuts.start": "to open \"get started\" column", "keyboard_shortcuts.start": "",
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", "keyboard_shortcuts.toggle_hidden": "",
"keyboard_shortcuts.toot": "i ddechrau tŵt newydd sbon", "keyboard_shortcuts.toot": "i ddechrau tŵt newydd sbon",
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.unfocus": "",
"keyboard_shortcuts.up": "to move up in the list", "keyboard_shortcuts.up": "i symud yn uwch yn y rhestr",
"lightbox.close": "Cau", "lightbox.close": "Cau",
"lightbox.next": "Nesaf", "lightbox.next": "Nesaf",
"lightbox.previous": "Previous", "lightbox.previous": "",
"lists.account.add": "Ychwanegwch at restr", "lists.account.add": "Ychwanegwch at restr",
"lists.account.remove": "Remove from list", "lists.account.remove": "",
"lists.delete": "Dileu rhestr", "lists.delete": "Dileu rhestr",
"lists.edit": "Golygwch restr", "lists.edit": "Golygwch restr",
"lists.new.create": "Ychwanegwch restr", "lists.new.create": "Ychwanegwch restr",
"lists.new.title_placeholder": "New list title", "lists.new.title_placeholder": "Teitl rhestr newydd",
"lists.search": "Search among people you follow", "lists.search": "",
"lists.subheading": "Eich rhestrau", "lists.subheading": "Eich rhestrau",
"loading_indicator.label": "Llwytho...", "loading_indicator.label": "Llwytho...",
"media_gallery.toggle_visible": "Toggle visibility", "media_gallery.toggle_visible": "",
"missing_indicator.label": "Heb ei ganfod", "missing_indicator.label": "Heb ei ganfod",
"missing_indicator.sublabel": "Ni ellid canfod yr adnodd hwn", "missing_indicator.sublabel": "Ni ellid canfod yr adnodd hwn",
"mute_modal.hide_notifications": "Cuddiwch hysbysiadau rhag y defnyddiwr hwn?", "mute_modal.hide_notifications": "Cuddiwch hysbysiadau rhag y defnyddiwr hwn?",
"navigation_bar.apps": "Apiau symudol", "navigation_bar.apps": "Apiau symudol",
"navigation_bar.blocks": "Defnyddwyr wedi eu blocio", "navigation_bar.blocks": "Defnyddwyr wedi eu blocio",
"navigation_bar.community_timeline": "Local timeline", "navigation_bar.community_timeline": "",
"navigation_bar.compose": "Cyfansoddwch dŵt newydd", "navigation_bar.compose": "Cyfansoddwch dŵt newydd",
"navigation_bar.direct": "Negeseuon preifat", "navigation_bar.direct": "Negeseuon preifat",
"navigation_bar.discover": "Darganfyddwch", "navigation_bar.discover": "Darganfyddwch",
"navigation_bar.domain_blocks": "Parthau cuddiedig", "navigation_bar.domain_blocks": "Parthau cuddiedig",
"navigation_bar.edit_profile": "Golygu proffil", "navigation_bar.edit_profile": "Golygu proffil",
"navigation_bar.favourites": "Ffefrynnau", "navigation_bar.favourites": "Ffefrynnau",
"navigation_bar.filters": "Muted words", "navigation_bar.filters": "Geiriau a dawelwyd",
"navigation_bar.follow_requests": "Ceisiadau dilyn", "navigation_bar.follow_requests": "Ceisiadau dilyn",
"navigation_bar.info": "About this instance", "navigation_bar.info": "",
"navigation_bar.keyboard_shortcuts": "Hotkeys", "navigation_bar.keyboard_shortcuts": "",
"navigation_bar.lists": "Rhestrau", "navigation_bar.lists": "Rhestrau",
"navigation_bar.logout": "Allgofnodi", "navigation_bar.logout": "Allgofnodi",
"navigation_bar.mutes": "Muted users", "navigation_bar.mutes": "Defnyddwyr a dawelwyd",
"navigation_bar.personal": "Personol", "navigation_bar.personal": "Personol",
"navigation_bar.pins": "Tŵtiau wedi eu pinio", "navigation_bar.pins": "Tŵtiau wedi eu pinio",
"navigation_bar.preferences": "Dewisiadau", "navigation_bar.preferences": "Dewisiadau",
"navigation_bar.public_timeline": "Federated timeline", "navigation_bar.public_timeline": "",
"navigation_bar.security": "Diogelwch", "navigation_bar.security": "Diogelwch",
"notification.favourite": "hoffodd {name} eich statws", "notification.favourite": "hoffodd {name} eich statws",
"notification.follow": "dilynodd {name} chi", "notification.follow": "dilynodd {name} chi",
"notification.mention": "{name} mentioned you", "notification.mention": "Soniodd {name} amdanoch chi",
"notification.reblog": "{name} boosted your status", "notification.reblog": "",
"notifications.clear": "Clirio hysbysiadau", "notifications.clear": "Clirio hysbysiadau",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", "notifications.clear_confirmation": "",
"notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.alert": "",
"notifications.column_settings.favourite": "Ffefrynnau:", "notifications.column_settings.favourite": "Ffefrynnau:",
"notifications.column_settings.follow": "Dilynwyr newydd:", "notifications.column_settings.follow": "Dilynwyr newydd:",
"notifications.column_settings.mention": "Mentions:", "notifications.column_settings.mention": "",
"notifications.column_settings.push": "Push notifications", "notifications.column_settings.push": "Hysbysiadau push",
"notifications.column_settings.push_meta": "This device", "notifications.column_settings.reblog": "",
"notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.show": "",
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Chwarae sain", "notifications.column_settings.sound": "Chwarae sain",
"notifications.group": "{count} o hysbysiadau", "notifications.group": "{count} o hysbysiadau",
"onboarding.done": "Done", "onboarding.done": "Wedi'i wneud",
"onboarding.next": "Nesaf", "onboarding.next": "Nesaf",
"onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.", "onboarding.page_five.public_timelines": "",
"onboarding.page_four.home": "The home timeline shows posts from people you follow.", "onboarding.page_four.home": "Mae'r ffrwd gartref yn dangos twtiau o bobl yr ydych yn dilyn.",
"onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "onboarding.page_four.notifications": "",
"onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", "onboarding.page_one.federation": "",
"onboarding.page_one.full_handle": "Your full handle", "onboarding.page_one.full_handle": "",
"onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.handle_hint": "",
"onboarding.page_one.welcome": "Croeso i Mastodon!", "onboarding.page_one.welcome": "Croeso i Mastodon!",
"onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.admin": "",
"onboarding.page_six.almost_done": "Almost done...", "onboarding.page_six.almost_done": "Bron a gorffen...",
"onboarding.page_six.appetoot": "Bon Apetŵt!", "onboarding.page_six.appetoot": "Bon Apetŵt!",
"onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.", "onboarding.page_six.apps_available": "Mae yna {apps} ar gael i iOS, Android a platfformau eraill.",
"onboarding.page_six.github": "Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.", "onboarding.page_six.github": "Mae Mastodon yn feddalwedd côd agored rhad ac am ddim. Mae modd adrodd bygiau, gwneud ceisiadau am nodweddion penodol, neu gyfrannu i'r côd ar {github}.",
"onboarding.page_six.guidelines": "canllawiau cymunedol", "onboarding.page_six.guidelines": "canllawiau cymunedol",
"onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", "onboarding.page_six.read_guidelines": "Darllenwch {guidelines} y {domain} os gwelwch yn dda!",
"onboarding.page_six.various_app": "apiau symudol", "onboarding.page_six.various_app": "apiau symudol",
"onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.", "onboarding.page_three.profile": "",
"onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.", "onboarding.page_three.search": "",
"onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", "onboarding.page_two.compose": "",
"onboarding.skip": "Skip", "onboarding.skip": "Sgipiwch",
"privacy.change": "Adjust status privacy", "privacy.change": "",
"privacy.direct.long": "Post to mentioned users only", "privacy.direct.long": "",
"privacy.direct.short": "Direct", "privacy.direct.short": "Uniongyrchol",
"privacy.private.long": "Post to followers only", "privacy.private.long": "Cyhoeddi i ddilynwyr yn unig",
"privacy.private.short": "Dilynwyr-yn-unig", "privacy.private.short": "Dilynwyr-yn-unig",
"privacy.public.long": "Post to public timelines", "privacy.public.long": "Cyhoeddi i ffrydiau cyhoeddus",
"privacy.public.short": "Cyhoeddus", "privacy.public.short": "Cyhoeddus",
"privacy.unlisted.long": "Do not show in public timelines", "privacy.unlisted.long": "Peidio a cyhoeddi i ffrydiau cyhoeddus",
"privacy.unlisted.short": "Heb ei restru", "privacy.unlisted.short": "Heb ei restru",
"regeneration_indicator.label": "Llwytho…", "regeneration_indicator.label": "Llwytho…",
"regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!", "regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!",
@ -259,79 +257,79 @@
"relative_time.minutes": "{number}m", "relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s", "relative_time.seconds": "{number}s",
"reply_indicator.cancel": "Canslo", "reply_indicator.cancel": "Canslo",
"report.forward": "Forward to {target}", "report.forward": "",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", "report.forward_hint": "",
"report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:", "report.hint": "",
"report.placeholder": "Sylwadau ychwanegol", "report.placeholder": "Sylwadau ychwanegol",
"report.submit": "Submit", "report.submit": "Cyflwyno",
"report.target": "Report {target}", "report.target": "",
"search.placeholder": "Chwilio", "search.placeholder": "Chwilio",
"search_popout.search_format": "Advanced search format", "search_popout.search_format": "Fformat chwilio uwch",
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.full_text": "",
"search_popout.tips.hashtag": "hashnod", "search_popout.tips.hashtag": "hashnod",
"search_popout.tips.status": "statws", "search_popout.tips.status": "statws",
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", "search_popout.tips.text": "",
"search_popout.tips.user": "defnyddiwr", "search_popout.tips.user": "defnyddiwr",
"search_results.accounts": "Pobl", "search_results.accounts": "Pobl",
"search_results.hashtags": "Hanshnodau", "search_results.hashtags": "Hanshnodau",
"search_results.statuses": "Twtiau", "search_results.statuses": "Twtiau",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}", "search_results.total": "",
"standalone.public_title": "A look inside...", "standalone.public_title": "Golwg tu fewn...",
"status.block": "Block @{name}", "status.block": "Blociwch @{name}",
"status.cancel_reblog_private": "Unboost", "status.cancel_reblog_private": "",
"status.cannot_reblog": "This post cannot be boosted", "status.cannot_reblog": "",
"status.delete": "Dileu", "status.delete": "Dileu",
"status.detailed_status": "Detailed conversation view", "status.detailed_status": "",
"status.direct": "Neges breifat @{name}", "status.direct": "Neges breifat @{name}",
"status.embed": "Plannu", "status.embed": "Plannu",
"status.favourite": "Favourite", "status.favourite": "",
"status.filtered": "Filtered", "status.filtered": "",
"status.load_more": "Llwythwch mwy", "status.load_more": "Llwythwch mwy",
"status.media_hidden": "Media hidden", "status.media_hidden": "",
"status.mention": "Mention @{name}", "status.mention": "",
"status.more": "Mwy", "status.more": "Mwy",
"status.mute": "Mute @{name}", "status.mute": "Tawelu @{name}",
"status.mute_conversation": "Mute conversation", "status.mute_conversation": "",
"status.open": "Expand this status", "status.open": "",
"status.pin": "Pin on profile", "status.pin": "",
"status.pinned": "Pinned toot", "status.pinned": "",
"status.reblog": "Boost", "status.reblog": "",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "",
"status.reblogged_by": "{name} boosted", "status.reblogged_by": "",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", "status.reblogs.empty": "",
"status.redraft": "Delete & re-draft", "status.redraft": "Dilëwh & ailddrafftio",
"status.reply": "Ateb", "status.reply": "Ateb",
"status.replyAll": "Ateb i edefyn", "status.replyAll": "Ateb i edefyn",
"status.report": "Report @{name}", "status.report": "",
"status.sensitive_toggle": "Click to view", "status.sensitive_toggle": "",
"status.sensitive_warning": "Cynnwys sensitif", "status.sensitive_warning": "Cynnwys sensitif",
"status.share": "Rhannwch", "status.share": "Rhannwch",
"status.show_less": "Dangoswch lai", "status.show_less": "Dangoswch lai",
"status.show_less_all": "Dangoswch lai i bawb", "status.show_less_all": "Dangoswch lai i bawb",
"status.show_more": "Dangoswch fwy", "status.show_more": "Dangoswch fwy",
"status.show_more_all": "Show more for all", "status.show_more_all": "",
"status.unmute_conversation": "Unmute conversation", "status.unmute_conversation": "Dad-dawelu sgwrs",
"status.unpin": "Unpin from profile", "status.unpin": "",
"tabs_bar.federated_timeline": "Federated", "tabs_bar.federated_timeline": "",
"tabs_bar.home": "Hafan", "tabs_bar.home": "Hafan",
"tabs_bar.local_timeline": "Lleol", "tabs_bar.local_timeline": "Lleol",
"tabs_bar.notifications": "Hysbysiadau", "tabs_bar.notifications": "Hysbysiadau",
"tabs_bar.search": "Chwilio", "tabs_bar.search": "Chwilio",
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} yn siarad",
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.",
"upload_area.title": "Drag & drop to upload", "upload_area.title": "Llusgwch & gollwing i uwchlwytho",
"upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)",
"upload_form.description": "Describe for the visually impaired", "upload_form.description": "",
"upload_form.focus": "Crop", "upload_form.focus": "",
"upload_form.undo": "Delete", "upload_form.undo": "Dileu",
"upload_progress.label": "Uwchlwytho...", "upload_progress.label": "Uwchlwytho...",
"video.close": "Close video", "video.close": "Cau fideo",
"video.exit_fullscreen": "Exit full screen", "video.exit_fullscreen": "Gadael sgrîn llawn",
"video.expand": "Expand video", "video.expand": "Ymestyn fideo",
"video.fullscreen": "Full screen", "video.fullscreen": "Sgrîn llawn",
"video.hide": "Hide video", "video.hide": "Cuddio fideo",
"video.mute": "Mute sound", "video.mute": "Tawelu sain",
"video.pause": "Pause", "video.pause": "Oedi",
"video.play": "Chwarae", "video.play": "Chwarae",
"video.unmute": "Unmute sound" "video.unmute": "Dad-dawelu sain"
} }

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Nye følgere:", "notifications.column_settings.follow": "Nye følgere:",
"notifications.column_settings.mention": "Omtale:", "notifications.column_settings.mention": "Omtale:",
"notifications.column_settings.push": "Push notifikationer", "notifications.column_settings.push": "Push notifikationer",
"notifications.column_settings.push_meta": "Denne enhed",
"notifications.column_settings.reblog": "Fremhævelser:", "notifications.column_settings.reblog": "Fremhævelser:",
"notifications.column_settings.show": "Vis i kolonne", "notifications.column_settings.show": "Vis i kolonne",
"notifications.column_settings.sound": "Afspil lyd", "notifications.column_settings.sound": "Afspil lyd",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Neue Folgende:", "notifications.column_settings.follow": "Neue Folgende:",
"notifications.column_settings.mention": "Erwähnungen:", "notifications.column_settings.mention": "Erwähnungen:",
"notifications.column_settings.push": "Push-Benachrichtigungen", "notifications.column_settings.push": "Push-Benachrichtigungen",
"notifications.column_settings.push_meta": "Auf diesem Gerät",
"notifications.column_settings.reblog": "Geteilte Beiträge:", "notifications.column_settings.reblog": "Geteilte Beiträge:",
"notifications.column_settings.show": "In der Spalte anzeigen", "notifications.column_settings.show": "In der Spalte anzeigen",
"notifications.column_settings.sound": "Ton abspielen", "notifications.column_settings.sound": "Ton abspielen",

View file

@ -1541,10 +1541,6 @@
"defaultMessage": "Push notifications", "defaultMessage": "Push notifications",
"id": "notifications.column_settings.push" "id": "notifications.column_settings.push"
}, },
{
"defaultMessage": "This device",
"id": "notifications.column_settings.push_meta"
},
{ {
"defaultMessage": "New followers:", "defaultMessage": "New followers:",
"id": "notifications.column_settings.follow" "id": "notifications.column_settings.follow"

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Νέοι ακόλουθοι:", "notifications.column_settings.follow": "Νέοι ακόλουθοι:",
"notifications.column_settings.mention": "Αναφορές:", "notifications.column_settings.mention": "Αναφορές:",
"notifications.column_settings.push": "Άμεσες ειδοποιήσεις", "notifications.column_settings.push": "Άμεσες ειδοποιήσεις",
"notifications.column_settings.push_meta": "Αυτή η συσκευή",
"notifications.column_settings.reblog": "Προωθήσεις:", "notifications.column_settings.reblog": "Προωθήσεις:",
"notifications.column_settings.show": "Εμφάνισε σε στήλη", "notifications.column_settings.show": "Εμφάνισε σε στήλη",
"notifications.column_settings.sound": "Ηχητική ειδοποίηση", "notifications.column_settings.sound": "Ηχητική ειδοποίηση",

View file

@ -221,7 +221,6 @@
"notifications.column_settings.follow": "New followers:", "notifications.column_settings.follow": "New followers:",
"notifications.column_settings.mention": "Mentions:", "notifications.column_settings.mention": "Mentions:",
"notifications.column_settings.push": "Push notifications", "notifications.column_settings.push": "Push notifications",
"notifications.column_settings.push_meta": "This device",
"notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "Show in column", "notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound", "notifications.column_settings.sound": "Play sound",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Novaj sekvantoj:", "notifications.column_settings.follow": "Novaj sekvantoj:",
"notifications.column_settings.mention": "Mencioj:", "notifications.column_settings.mention": "Mencioj:",
"notifications.column_settings.push": "Puŝsciigoj", "notifications.column_settings.push": "Puŝsciigoj",
"notifications.column_settings.push_meta": "Ĉi tiu aparato",
"notifications.column_settings.reblog": "Diskonigoj:", "notifications.column_settings.reblog": "Diskonigoj:",
"notifications.column_settings.show": "Montri en kolumno", "notifications.column_settings.show": "Montri en kolumno",
"notifications.column_settings.sound": "Eligi sonon", "notifications.column_settings.sound": "Eligi sonon",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Nuevos seguidores:", "notifications.column_settings.follow": "Nuevos seguidores:",
"notifications.column_settings.mention": "Menciones:", "notifications.column_settings.mention": "Menciones:",
"notifications.column_settings.push": "Notificaciones push", "notifications.column_settings.push": "Notificaciones push",
"notifications.column_settings.push_meta": "Este dispositivo",
"notifications.column_settings.reblog": "Retoots:", "notifications.column_settings.reblog": "Retoots:",
"notifications.column_settings.show": "Mostrar en columna", "notifications.column_settings.show": "Mostrar en columna",
"notifications.column_settings.sound": "Reproducir sonido", "notifications.column_settings.sound": "Reproducir sonido",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Jarraitzaile berriak:", "notifications.column_settings.follow": "Jarraitzaile berriak:",
"notifications.column_settings.mention": "Aipamenak:", "notifications.column_settings.mention": "Aipamenak:",
"notifications.column_settings.push": "Push jakinarazpenak", "notifications.column_settings.push": "Push jakinarazpenak",
"notifications.column_settings.push_meta": "Gailu hau",
"notifications.column_settings.reblog": "Bultzadak:", "notifications.column_settings.reblog": "Bultzadak:",
"notifications.column_settings.show": "Erakutsi zutabean", "notifications.column_settings.show": "Erakutsi zutabean",
"notifications.column_settings.sound": "Jo soinua", "notifications.column_settings.sound": "Jo soinua",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "پیگیران تازه:", "notifications.column_settings.follow": "پیگیران تازه:",
"notifications.column_settings.mention": "نام‌بردن‌ها:", "notifications.column_settings.mention": "نام‌بردن‌ها:",
"notifications.column_settings.push": "اعلان‌ها از سمت سرور", "notifications.column_settings.push": "اعلان‌ها از سمت سرور",
"notifications.column_settings.push_meta": "این دستگاه",
"notifications.column_settings.reblog": "بازبوق‌ها:", "notifications.column_settings.reblog": "بازبوق‌ها:",
"notifications.column_settings.show": "نمایش در ستون", "notifications.column_settings.show": "نمایش در ستون",
"notifications.column_settings.sound": "پخش صدا", "notifications.column_settings.sound": "پخش صدا",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Uudet seuraajat:", "notifications.column_settings.follow": "Uudet seuraajat:",
"notifications.column_settings.mention": "Maininnat:", "notifications.column_settings.mention": "Maininnat:",
"notifications.column_settings.push": "Push-ilmoitukset", "notifications.column_settings.push": "Push-ilmoitukset",
"notifications.column_settings.push_meta": "Tämä laite",
"notifications.column_settings.reblog": "Buustit:", "notifications.column_settings.reblog": "Buustit:",
"notifications.column_settings.show": "Näytä sarakkeessa", "notifications.column_settings.show": "Näytä sarakkeessa",
"notifications.column_settings.sound": "Äänimerkki", "notifications.column_settings.sound": "Äänimerkki",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Nouveaux⋅elles abonné⋅e·s:", "notifications.column_settings.follow": "Nouveaux⋅elles abonné⋅e·s:",
"notifications.column_settings.mention": "Mentions:", "notifications.column_settings.mention": "Mentions:",
"notifications.column_settings.push": "Notifications", "notifications.column_settings.push": "Notifications",
"notifications.column_settings.push_meta": "Cet appareil",
"notifications.column_settings.reblog": "Partages:", "notifications.column_settings.reblog": "Partages:",
"notifications.column_settings.show": "Afficher dans la colonne", "notifications.column_settings.show": "Afficher dans la colonne",
"notifications.column_settings.sound": "Émettre un son", "notifications.column_settings.sound": "Émettre un son",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Novos seguidores:", "notifications.column_settings.follow": "Novos seguidores:",
"notifications.column_settings.mention": "Mencións:", "notifications.column_settings.mention": "Mencións:",
"notifications.column_settings.push": "Enviar notificacións", "notifications.column_settings.push": "Enviar notificacións",
"notifications.column_settings.push_meta": "Este aparello",
"notifications.column_settings.reblog": "Promocións:", "notifications.column_settings.reblog": "Promocións:",
"notifications.column_settings.show": "Mostrar en columna", "notifications.column_settings.show": "Mostrar en columna",
"notifications.column_settings.sound": "Reproducir son", "notifications.column_settings.sound": "Reproducir son",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "עוקבים חדשים:", "notifications.column_settings.follow": "עוקבים חדשים:",
"notifications.column_settings.mention": "פניות:", "notifications.column_settings.mention": "פניות:",
"notifications.column_settings.push": "הודעות בדחיפה", "notifications.column_settings.push": "הודעות בדחיפה",
"notifications.column_settings.push_meta": "מכשיר זה",
"notifications.column_settings.reblog": "הדהודים:", "notifications.column_settings.reblog": "הדהודים:",
"notifications.column_settings.show": "הצגה בטור", "notifications.column_settings.show": "הצגה בטור",
"notifications.column_settings.sound": "שמע מופעל", "notifications.column_settings.sound": "שמע מופעל",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Novi sljedbenici:", "notifications.column_settings.follow": "Novi sljedbenici:",
"notifications.column_settings.mention": "Spominjanja:", "notifications.column_settings.mention": "Spominjanja:",
"notifications.column_settings.push": "Push notifications", "notifications.column_settings.push": "Push notifications",
"notifications.column_settings.push_meta": "This device",
"notifications.column_settings.reblog": "Boostovi:", "notifications.column_settings.reblog": "Boostovi:",
"notifications.column_settings.show": "Prikaži u stupcu", "notifications.column_settings.show": "Prikaži u stupcu",
"notifications.column_settings.sound": "Sviraj zvuk", "notifications.column_settings.sound": "Sviraj zvuk",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Új követők:", "notifications.column_settings.follow": "Új követők:",
"notifications.column_settings.mention": "Megemítéseim:", "notifications.column_settings.mention": "Megemítéseim:",
"notifications.column_settings.push": "Push értesítések", "notifications.column_settings.push": "Push értesítések",
"notifications.column_settings.push_meta": "Ezen eszköz",
"notifications.column_settings.reblog": "Rebloggolások:", "notifications.column_settings.reblog": "Rebloggolások:",
"notifications.column_settings.show": "Oszlopban mutatás", "notifications.column_settings.show": "Oszlopban mutatás",
"notifications.column_settings.sound": "Hang lejátszása", "notifications.column_settings.sound": "Hang lejátszása",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Նոր հետեւողներ՝", "notifications.column_settings.follow": "Նոր հետեւողներ՝",
"notifications.column_settings.mention": "Նշումներ՝", "notifications.column_settings.mention": "Նշումներ՝",
"notifications.column_settings.push": "Հրելու ծանուցումներ", "notifications.column_settings.push": "Հրելու ծանուցումներ",
"notifications.column_settings.push_meta": "Այս սարքը",
"notifications.column_settings.reblog": "Տարածածներից՝", "notifications.column_settings.reblog": "Տարածածներից՝",
"notifications.column_settings.show": "Ցուցադրել սյունում", "notifications.column_settings.show": "Ցուցադրել սյունում",
"notifications.column_settings.sound": "Ձայն հանել", "notifications.column_settings.sound": "Ձայն հանել",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Pengikut baru:", "notifications.column_settings.follow": "Pengikut baru:",
"notifications.column_settings.mention": "Balasan:", "notifications.column_settings.mention": "Balasan:",
"notifications.column_settings.push": "Push notifications", "notifications.column_settings.push": "Push notifications",
"notifications.column_settings.push_meta": "This device",
"notifications.column_settings.reblog": "Boost:", "notifications.column_settings.reblog": "Boost:",
"notifications.column_settings.show": "Tampilkan dalam kolom", "notifications.column_settings.show": "Tampilkan dalam kolom",
"notifications.column_settings.sound": "Mainkan suara", "notifications.column_settings.sound": "Mainkan suara",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Nova sequanti:", "notifications.column_settings.follow": "Nova sequanti:",
"notifications.column_settings.mention": "Mencioni:", "notifications.column_settings.mention": "Mencioni:",
"notifications.column_settings.push": "Push notifications", "notifications.column_settings.push": "Push notifications",
"notifications.column_settings.push_meta": "This device",
"notifications.column_settings.reblog": "Repeti:", "notifications.column_settings.reblog": "Repeti:",
"notifications.column_settings.show": "Montrar en kolumno", "notifications.column_settings.show": "Montrar en kolumno",
"notifications.column_settings.sound": "Plear sono", "notifications.column_settings.sound": "Plear sono",

View file

@ -3,7 +3,7 @@
"account.block": "Blocca @{name}", "account.block": "Blocca @{name}",
"account.block_domain": "Nascondi tutto da {domain}", "account.block_domain": "Nascondi tutto da {domain}",
"account.blocked": "Bloccato", "account.blocked": "Bloccato",
"account.direct": "Direct Message @{name}", "account.direct": "Invia messaggio diretto a @{name}",
"account.disclaimer_full": "Il profilo dell'utente mostrato qui sotto potrebbe essere incompleto.", "account.disclaimer_full": "Il profilo dell'utente mostrato qui sotto potrebbe essere incompleto.",
"account.domain_blocked": "Dominio nascosto", "account.domain_blocked": "Dominio nascosto",
"account.edit_profile": "Modifica profilo", "account.edit_profile": "Modifica profilo",
@ -54,7 +54,7 @@
"column.lists": "Liste", "column.lists": "Liste",
"column.mutes": "Utenti silenziati", "column.mutes": "Utenti silenziati",
"column.notifications": "Notifiche", "column.notifications": "Notifiche",
"column.pins": "Pinned toot", "column.pins": "Toot fissati in cima",
"column.public": "Timeline federata", "column.public": "Timeline federata",
"column_back_button.label": "Indietro", "column_back_button.label": "Indietro",
"column_header.hide_settings": "Nascondi impostazioni", "column_header.hide_settings": "Nascondi impostazioni",
@ -79,11 +79,11 @@
"compose_form.spoiler.unmarked": "Il testo non è nascosto", "compose_form.spoiler.unmarked": "Il testo non è nascosto",
"compose_form.spoiler_placeholder": "Content warning", "compose_form.spoiler_placeholder": "Content warning",
"confirmation_modal.cancel": "Annulla", "confirmation_modal.cancel": "Annulla",
"confirmations.block.confirm": "Block", "confirmations.block.confirm": "Blocca",
"confirmations.block.message": "Sei sicuro di voler bloccare {name}?", "confirmations.block.message": "Sei sicuro di voler bloccare {name}?",
"confirmations.delete.confirm": "Delete", "confirmations.delete.confirm": "Cancella",
"confirmations.delete.message": "Sei sicuro di voler cancellare questo status?", "confirmations.delete.message": "Sei sicuro di voler cancellare questo status?",
"confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.confirm": "Cancella",
"confirmations.delete_list.message": "Sei sicuro di voler cancellare definitivamente questa lista?", "confirmations.delete_list.message": "Sei sicuro di voler cancellare definitivamente questa lista?",
"confirmations.domain_block.confirm": "Nascondi intero dominio", "confirmations.domain_block.confirm": "Nascondi intero dominio",
"confirmations.domain_block.message": "Sei davvero sicuro che vuoi bloccare l'intero {domain}? Nella maggior parte dei casi, pochi blocchi o silenziamenti mirati sono sufficienti e preferibili. Non vedrai nessun contenuto di quel dominio né nelle timeline pubbliche né nelle notifiche. I tuoi seguaci di quel dominio saranno eliminati.", "confirmations.domain_block.message": "Sei davvero sicuro che vuoi bloccare l'intero {domain}? Nella maggior parte dei casi, pochi blocchi o silenziamenti mirati sono sufficienti e preferibili. Non vedrai nessun contenuto di quel dominio né nelle timeline pubbliche né nelle notifiche. I tuoi seguaci di quel dominio saranno eliminati.",
@ -119,7 +119,7 @@
"empty_column.hashtag": "Non c'è ancora nessun post con questo hashtag.", "empty_column.hashtag": "Non c'è ancora nessun post con questo hashtag.",
"empty_column.home": "Non stai ancora seguendo nessuno. Visita {public} o usa la ricerca per incontrare nuove persone.", "empty_column.home": "Non stai ancora seguendo nessuno. Visita {public} o usa la ricerca per incontrare nuove persone.",
"empty_column.home.public_timeline": "la timeline pubblica", "empty_column.home.public_timeline": "la timeline pubblica",
"empty_column.list": "Non c'è niente in questo elenco ancora. Quando i membri di questo elenco postano nuovi stati, questi appariranno qui.", "empty_column.list": "Non c'è ancora niente in questa lista. Quando i membri di questa lista pubblicheranno nuovi stati, appariranno qui.",
"empty_column.lists": "Non hai ancora nessuna lista. Quando ne creerai qualcuna, comparirà qui.", "empty_column.lists": "Non hai ancora nessuna lista. Quando ne creerai qualcuna, comparirà qui.",
"empty_column.mutes": "Non hai ancora silenziato nessun utente.", "empty_column.mutes": "Non hai ancora silenziato nessun utente.",
"empty_column.notifications": "Non hai ancora nessuna notifica. Interagisci con altri per iniziare conversazioni.", "empty_column.notifications": "Non hai ancora nessuna notifica. Interagisci con altri per iniziare conversazioni.",
@ -179,7 +179,7 @@
"lists.new.title_placeholder": "Titolo della nuova lista", "lists.new.title_placeholder": "Titolo della nuova lista",
"lists.search": "Cerca tra le persone che segui", "lists.search": "Cerca tra le persone che segui",
"lists.subheading": "Le tue liste", "lists.subheading": "Le tue liste",
"loading_indicator.label": "Carico...", "loading_indicator.label": "Caricamento...",
"media_gallery.toggle_visible": "Imposta visibilità", "media_gallery.toggle_visible": "Imposta visibilità",
"missing_indicator.label": "Non trovato", "missing_indicator.label": "Non trovato",
"missing_indicator.sublabel": "Risorsa non trovata", "missing_indicator.sublabel": "Risorsa non trovata",
@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Nuovi seguaci:", "notifications.column_settings.follow": "Nuovi seguaci:",
"notifications.column_settings.mention": "Menzioni:", "notifications.column_settings.mention": "Menzioni:",
"notifications.column_settings.push": "Notifiche push", "notifications.column_settings.push": "Notifiche push",
"notifications.column_settings.push_meta": "Questo dispositivo",
"notifications.column_settings.reblog": "Post condivisi:", "notifications.column_settings.reblog": "Post condivisi:",
"notifications.column_settings.show": "Mostra in colonna", "notifications.column_settings.show": "Mostra in colonna",
"notifications.column_settings.sound": "Riproduci suono", "notifications.column_settings.sound": "Riproduci suono",
@ -242,7 +241,7 @@
"onboarding.page_three.search": "Usa la barra di ricerca per trovare persone e hashtag, come {illustration} e {introductions}. Per trovare una persona che non è su questa istanza, usa il suo nome utente completo.", "onboarding.page_three.search": "Usa la barra di ricerca per trovare persone e hashtag, come {illustration} e {introductions}. Per trovare una persona che non è su questa istanza, usa il suo nome utente completo.",
"onboarding.page_two.compose": "Puoi scrivere dei post dalla colonna di composizione. Puoi caricare immagini, modificare le impostazioni di privacy, e aggiungere avvisi sul contenuto con le icone qui sotto.", "onboarding.page_two.compose": "Puoi scrivere dei post dalla colonna di composizione. Puoi caricare immagini, modificare le impostazioni di privacy, e aggiungere avvisi sul contenuto con le icone qui sotto.",
"onboarding.skip": "Salta", "onboarding.skip": "Salta",
"privacy.change": "Modifica privacy post", "privacy.change": "Modifica privacy del post",
"privacy.direct.long": "Invia solo a utenti menzionati", "privacy.direct.long": "Invia solo a utenti menzionati",
"privacy.direct.short": "Diretto", "privacy.direct.short": "Diretto",
"privacy.private.long": "Invia solo ai seguaci", "privacy.private.long": "Invia solo ai seguaci",
@ -261,7 +260,7 @@
"reply_indicator.cancel": "Annulla", "reply_indicator.cancel": "Annulla",
"report.forward": "Inoltra a {target}", "report.forward": "Inoltra a {target}",
"report.forward_hint": "Questo account appartiene a un altro server. Mandare anche là una copia anonima del rapporto?", "report.forward_hint": "Questo account appartiene a un altro server. Mandare anche là una copia anonima del rapporto?",
"report.hint": "La segnalazione sara' invata ai tuoi moderatori di istanza. Di seguito, puoi fornire il motivo per il quale stai segnalando questo account:", "report.hint": "La segnalazione sarà inviata ai moderatori della tua istanza. Di seguito, puoi fornire il motivo per il quale stai segnalando questo account:",
"report.placeholder": "Commenti aggiuntivi", "report.placeholder": "Commenti aggiuntivi",
"report.submit": "Invia", "report.submit": "Invia",
"report.target": "Invio la segnalazione {target}", "report.target": "Invio la segnalazione {target}",
@ -328,10 +327,10 @@
"video.close": "Chiudi video", "video.close": "Chiudi video",
"video.exit_fullscreen": "Esci da modalità a schermo intero", "video.exit_fullscreen": "Esci da modalità a schermo intero",
"video.expand": "Espandi video", "video.expand": "Espandi video",
"video.fullscreen": "Full screen", "video.fullscreen": "Schermo intero",
"video.hide": "Nascondi video", "video.hide": "Nascondi video",
"video.mute": "Silenzia suono", "video.mute": "Silenzia suono",
"video.pause": "Pause", "video.pause": "Pausa",
"video.play": "Avvia", "video.play": "Avvia",
"video.unmute": "Riattiva suono" "video.unmute": "Riattiva suono"
} }

View file

@ -221,7 +221,6 @@
"notifications.column_settings.follow": "新しいフォロワー:", "notifications.column_settings.follow": "新しいフォロワー:",
"notifications.column_settings.mention": "返信:", "notifications.column_settings.mention": "返信:",
"notifications.column_settings.push": "プッシュ通知", "notifications.column_settings.push": "プッシュ通知",
"notifications.column_settings.push_meta": "このデバイス",
"notifications.column_settings.reblog": "ブースト:", "notifications.column_settings.reblog": "ブースト:",
"notifications.column_settings.show": "カラムに表示", "notifications.column_settings.show": "カラムに表示",
"notifications.column_settings.sound": "通知音を再生", "notifications.column_settings.sound": "通知音を再生",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "ახალი მიმდევრები:", "notifications.column_settings.follow": "ახალი მიმდევრები:",
"notifications.column_settings.mention": "ხსენებები:", "notifications.column_settings.mention": "ხსენებები:",
"notifications.column_settings.push": "ფუშ შეტყობინებები", "notifications.column_settings.push": "ფუშ შეტყობინებები",
"notifications.column_settings.push_meta": "ეს მოწყობილობა",
"notifications.column_settings.reblog": "ბუსტები:", "notifications.column_settings.reblog": "ბუსტები:",
"notifications.column_settings.show": "გამოჩნდეს სვეტში", "notifications.column_settings.show": "გამოჩნდეს სვეტში",
"notifications.column_settings.sound": "ხმის დაკვრა", "notifications.column_settings.sound": "ხმის დაკვრა",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "새 팔로워:", "notifications.column_settings.follow": "새 팔로워:",
"notifications.column_settings.mention": "답글:", "notifications.column_settings.mention": "답글:",
"notifications.column_settings.push": "푸시 알림", "notifications.column_settings.push": "푸시 알림",
"notifications.column_settings.push_meta": "이 장치",
"notifications.column_settings.reblog": "부스트:", "notifications.column_settings.reblog": "부스트:",
"notifications.column_settings.show": "컬럼에 표시", "notifications.column_settings.show": "컬럼에 표시",
"notifications.column_settings.sound": "효과음 재생", "notifications.column_settings.sound": "효과음 재생",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Nieuwe volgers:", "notifications.column_settings.follow": "Nieuwe volgers:",
"notifications.column_settings.mention": "Vermeldingen:", "notifications.column_settings.mention": "Vermeldingen:",
"notifications.column_settings.push": "Pushmeldingen", "notifications.column_settings.push": "Pushmeldingen",
"notifications.column_settings.push_meta": "Dit apparaat",
"notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "In kolom tonen", "notifications.column_settings.show": "In kolom tonen",
"notifications.column_settings.sound": "Geluid afspelen", "notifications.column_settings.sound": "Geluid afspelen",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Nye følgere:", "notifications.column_settings.follow": "Nye følgere:",
"notifications.column_settings.mention": "Nevnt:", "notifications.column_settings.mention": "Nevnt:",
"notifications.column_settings.push": "Push varsler", "notifications.column_settings.push": "Push varsler",
"notifications.column_settings.push_meta": "Denne enheten",
"notifications.column_settings.reblog": "Fremhevet:", "notifications.column_settings.reblog": "Fremhevet:",
"notifications.column_settings.show": "Vis i kolonne", "notifications.column_settings.show": "Vis i kolonne",
"notifications.column_settings.sound": "Spill lyd", "notifications.column_settings.sound": "Spill lyd",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Nòus seguidors:", "notifications.column_settings.follow": "Nòus seguidors:",
"notifications.column_settings.mention": "Mencions:", "notifications.column_settings.mention": "Mencions:",
"notifications.column_settings.push": "Notificacions", "notifications.column_settings.push": "Notificacions",
"notifications.column_settings.push_meta": "Aqueste periferic",
"notifications.column_settings.reblog": "Partatges:", "notifications.column_settings.reblog": "Partatges:",
"notifications.column_settings.show": "Mostrar dins la colomna", "notifications.column_settings.show": "Mostrar dins la colomna",
"notifications.column_settings.sound": "Emetre un son", "notifications.column_settings.sound": "Emetre un son",

View file

@ -221,7 +221,6 @@
"notifications.column_settings.follow": "Nowi śledzący:", "notifications.column_settings.follow": "Nowi śledzący:",
"notifications.column_settings.mention": "Wspomnienia:", "notifications.column_settings.mention": "Wspomnienia:",
"notifications.column_settings.push": "Powiadomienia push", "notifications.column_settings.push": "Powiadomienia push",
"notifications.column_settings.push_meta": "To urządzenie",
"notifications.column_settings.reblog": "Podbicia:", "notifications.column_settings.reblog": "Podbicia:",
"notifications.column_settings.show": "Pokaż w kolumnie", "notifications.column_settings.show": "Pokaż w kolumnie",
"notifications.column_settings.sound": "Odtwarzaj dźwięk", "notifications.column_settings.sound": "Odtwarzaj dźwięk",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Novos seguidores:", "notifications.column_settings.follow": "Novos seguidores:",
"notifications.column_settings.mention": "Menções:", "notifications.column_settings.mention": "Menções:",
"notifications.column_settings.push": "Enviar notificações", "notifications.column_settings.push": "Enviar notificações",
"notifications.column_settings.push_meta": "Este aparelho",
"notifications.column_settings.reblog": "Compartilhamento:", "notifications.column_settings.reblog": "Compartilhamento:",
"notifications.column_settings.show": "Mostrar nas colunas", "notifications.column_settings.show": "Mostrar nas colunas",
"notifications.column_settings.sound": "Reproduzir som", "notifications.column_settings.sound": "Reproduzir som",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Novos seguidores:", "notifications.column_settings.follow": "Novos seguidores:",
"notifications.column_settings.mention": "Menções:", "notifications.column_settings.mention": "Menções:",
"notifications.column_settings.push": "Notificações Push", "notifications.column_settings.push": "Notificações Push",
"notifications.column_settings.push_meta": "Este dispositivo",
"notifications.column_settings.reblog": "Partilhas:", "notifications.column_settings.reblog": "Partilhas:",
"notifications.column_settings.show": "Mostrar nas colunas", "notifications.column_settings.show": "Mostrar nas colunas",
"notifications.column_settings.sound": "Reproduzir som", "notifications.column_settings.sound": "Reproduzir som",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Noi urmăritori:", "notifications.column_settings.follow": "Noi urmăritori:",
"notifications.column_settings.mention": "Mențiuni:", "notifications.column_settings.mention": "Mențiuni:",
"notifications.column_settings.push": "Notificări push", "notifications.column_settings.push": "Notificări push",
"notifications.column_settings.push_meta": "Acest dispozitiv",
"notifications.column_settings.reblog": "Redistribuite:", "notifications.column_settings.reblog": "Redistribuite:",
"notifications.column_settings.show": "Arată în coloană", "notifications.column_settings.show": "Arată în coloană",
"notifications.column_settings.sound": "Redă sunet", "notifications.column_settings.sound": "Redă sunet",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Новые подписчики:", "notifications.column_settings.follow": "Новые подписчики:",
"notifications.column_settings.mention": "Упоминания:", "notifications.column_settings.mention": "Упоминания:",
"notifications.column_settings.push": "Push-уведомления", "notifications.column_settings.push": "Push-уведомления",
"notifications.column_settings.push_meta": "Это устройство",
"notifications.column_settings.reblog": "Продвижения:", "notifications.column_settings.reblog": "Продвижения:",
"notifications.column_settings.show": "Показывать в колонке", "notifications.column_settings.show": "Показывать в колонке",
"notifications.column_settings.sound": "Проигрывать звук", "notifications.column_settings.sound": "Проигрывать звук",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Noví následujúci:", "notifications.column_settings.follow": "Noví následujúci:",
"notifications.column_settings.mention": "Zmienenia:", "notifications.column_settings.mention": "Zmienenia:",
"notifications.column_settings.push": "Push notifikácie", "notifications.column_settings.push": "Push notifikácie",
"notifications.column_settings.push_meta": "Toto zariadenie",
"notifications.column_settings.reblog": "Boosty:", "notifications.column_settings.reblog": "Boosty:",
"notifications.column_settings.show": "Zobraziť v stĺpci", "notifications.column_settings.show": "Zobraziť v stĺpci",
"notifications.column_settings.sound": "Prehrať zvuk", "notifications.column_settings.sound": "Prehrať zvuk",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "New followers:", "notifications.column_settings.follow": "New followers:",
"notifications.column_settings.mention": "Mentions:", "notifications.column_settings.mention": "Mentions:",
"notifications.column_settings.push": "Push notifications", "notifications.column_settings.push": "Push notifications",
"notifications.column_settings.push_meta": "This device",
"notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "Show in column", "notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound", "notifications.column_settings.sound": "Play sound",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Novi pratioci:", "notifications.column_settings.follow": "Novi pratioci:",
"notifications.column_settings.mention": "Pominjanja:", "notifications.column_settings.mention": "Pominjanja:",
"notifications.column_settings.push": "Guraj obaveštenja", "notifications.column_settings.push": "Guraj obaveštenja",
"notifications.column_settings.push_meta": "Ovaj uređaj",
"notifications.column_settings.reblog": "Podrški:", "notifications.column_settings.reblog": "Podrški:",
"notifications.column_settings.show": "Prikaži u koloni", "notifications.column_settings.show": "Prikaži u koloni",
"notifications.column_settings.sound": "Puštaj zvuk", "notifications.column_settings.sound": "Puštaj zvuk",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Нови пратиоци:", "notifications.column_settings.follow": "Нови пратиоци:",
"notifications.column_settings.mention": "Помињања:", "notifications.column_settings.mention": "Помињања:",
"notifications.column_settings.push": "Гурај обавештења", "notifications.column_settings.push": "Гурај обавештења",
"notifications.column_settings.push_meta": "Овај уређај",
"notifications.column_settings.reblog": "Подршки:", "notifications.column_settings.reblog": "Подршки:",
"notifications.column_settings.show": "Прикажи у колони", "notifications.column_settings.show": "Прикажи у колони",
"notifications.column_settings.sound": "Пуштај звук", "notifications.column_settings.sound": "Пуштај звук",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Nya följare:", "notifications.column_settings.follow": "Nya följare:",
"notifications.column_settings.mention": "Omnämningar:", "notifications.column_settings.mention": "Omnämningar:",
"notifications.column_settings.push": "Push meddelanden", "notifications.column_settings.push": "Push meddelanden",
"notifications.column_settings.push_meta": "Denna anordning",
"notifications.column_settings.reblog": "Knuffar:", "notifications.column_settings.reblog": "Knuffar:",
"notifications.column_settings.show": "Visa i kolumnen", "notifications.column_settings.show": "Visa i kolumnen",
"notifications.column_settings.sound": "Spela upp ljud", "notifications.column_settings.sound": "Spela upp ljud",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "New followers:", "notifications.column_settings.follow": "New followers:",
"notifications.column_settings.mention": "Mentions:", "notifications.column_settings.mention": "Mentions:",
"notifications.column_settings.push": "Push notifications", "notifications.column_settings.push": "Push notifications",
"notifications.column_settings.push_meta": "This device",
"notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "Show in column", "notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound", "notifications.column_settings.sound": "Play sound",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "క్రొత్త అనుచరులు:", "notifications.column_settings.follow": "క్రొత్త అనుచరులు:",
"notifications.column_settings.mention": "ప్రస్తావనలు:", "notifications.column_settings.mention": "ప్రస్తావనలు:",
"notifications.column_settings.push": "పుష్ ప్రకటనలు", "notifications.column_settings.push": "పుష్ ప్రకటనలు",
"notifications.column_settings.push_meta": "ఈ పరికరం",
"notifications.column_settings.reblog": "బూస్ట్ లు:", "notifications.column_settings.reblog": "బూస్ట్ లు:",
"notifications.column_settings.show": "నిలువు వరుసలో చూపు", "notifications.column_settings.show": "నిలువు వరుసలో చూపు",
"notifications.column_settings.sound": "ధ్వనిని ప్లే చేయి", "notifications.column_settings.sound": "ధ్వనిని ప్లే చేయి",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "New followers:", "notifications.column_settings.follow": "New followers:",
"notifications.column_settings.mention": "Mentions:", "notifications.column_settings.mention": "Mentions:",
"notifications.column_settings.push": "Push notifications", "notifications.column_settings.push": "Push notifications",
"notifications.column_settings.push_meta": "This device",
"notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "Show in column", "notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound", "notifications.column_settings.sound": "Play sound",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Yeni takipçiler:", "notifications.column_settings.follow": "Yeni takipçiler:",
"notifications.column_settings.mention": "Bahsedilenler:", "notifications.column_settings.mention": "Bahsedilenler:",
"notifications.column_settings.push": "Push notifications", "notifications.column_settings.push": "Push notifications",
"notifications.column_settings.push_meta": "This device",
"notifications.column_settings.reblog": "Boostlar:", "notifications.column_settings.reblog": "Boostlar:",
"notifications.column_settings.show": "Bildirimlerde göster", "notifications.column_settings.show": "Bildirimlerde göster",
"notifications.column_settings.sound": "Ses çal", "notifications.column_settings.sound": "Ses çal",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "Нові підписники:", "notifications.column_settings.follow": "Нові підписники:",
"notifications.column_settings.mention": "Згадки:", "notifications.column_settings.mention": "Згадки:",
"notifications.column_settings.push": "Push-сповіщення", "notifications.column_settings.push": "Push-сповіщення",
"notifications.column_settings.push_meta": "Цей пристрій",
"notifications.column_settings.reblog": "Передмухи:", "notifications.column_settings.reblog": "Передмухи:",
"notifications.column_settings.show": "Показати в колонці", "notifications.column_settings.show": "Показати в колонці",
"notifications.column_settings.sound": "Відтворювати звуки", "notifications.column_settings.sound": "Відтворювати звуки",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "当有人关注你时:", "notifications.column_settings.follow": "当有人关注你时:",
"notifications.column_settings.mention": "当有人在嘟文中提及你时:", "notifications.column_settings.mention": "当有人在嘟文中提及你时:",
"notifications.column_settings.push": "推送通知", "notifications.column_settings.push": "推送通知",
"notifications.column_settings.push_meta": "此设备",
"notifications.column_settings.reblog": "当有人转嘟了你的嘟文时:", "notifications.column_settings.reblog": "当有人转嘟了你的嘟文时:",
"notifications.column_settings.show": "在通知栏显示", "notifications.column_settings.show": "在通知栏显示",
"notifications.column_settings.sound": "播放音效", "notifications.column_settings.sound": "播放音效",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "關注你:", "notifications.column_settings.follow": "關注你:",
"notifications.column_settings.mention": "提及你:", "notifications.column_settings.mention": "提及你:",
"notifications.column_settings.push": "推送通知", "notifications.column_settings.push": "推送通知",
"notifications.column_settings.push_meta": "這臺設備",
"notifications.column_settings.reblog": "轉推你的文章:", "notifications.column_settings.reblog": "轉推你的文章:",
"notifications.column_settings.show": "在通知欄顯示", "notifications.column_settings.show": "在通知欄顯示",
"notifications.column_settings.sound": "播放音效", "notifications.column_settings.sound": "播放音效",

View file

@ -216,7 +216,6 @@
"notifications.column_settings.follow": "新的關注者:", "notifications.column_settings.follow": "新的關注者:",
"notifications.column_settings.mention": "提到:", "notifications.column_settings.mention": "提到:",
"notifications.column_settings.push": "推送通知", "notifications.column_settings.push": "推送通知",
"notifications.column_settings.push_meta": "這臺設備",
"notifications.column_settings.reblog": "轉嘟:", "notifications.column_settings.reblog": "轉嘟:",
"notifications.column_settings.show": "顯示在欄位中", "notifications.column_settings.show": "顯示在欄位中",
"notifications.column_settings.sound": "播放音效", "notifications.column_settings.sound": "播放音效",

View file

@ -168,7 +168,7 @@ const openUrl = url =>
if (webClients.length !== 0) { if (webClients.length !== 0) {
const client = findBestClient(webClients); const client = findBestClient(webClients);
const { pathname } = new URL(url); const { pathname } = new URL(url, self.location);
if (pathname.startsWith('/web/')) { if (pathname.startsWith('/web/')) {
return client.focus().then(client => client.postMessage({ return client.focus().then(client => client.postMessage({

View file

@ -169,7 +169,7 @@ p {
font-family: Helvetica, Arial, sans-serif; font-family: Helvetica, Arial, sans-serif;
@media only screen { @media only screen {
font-family: 'mastodon-font-sans-serif', sans-serif !important; font-family: $font-sans-serif, sans-serif !important;
} }
} }

View file

@ -16,7 +16,7 @@ $small-breakpoint: 960px;
} }
.rich-formatting { .rich-formatting {
font-family: 'mastodon-font-sans-serif', sans-serif; font-family: $font-sans-serif, sans-serif;
font-size: 16px; font-size: 16px;
font-weight: 400; font-weight: 400;
font-size: 16px; font-size: 16px;
@ -31,7 +31,7 @@ $small-breakpoint: 960px;
p, p,
li { li {
font-family: 'mastodon-font-sans-serif', sans-serif; font-family: $font-sans-serif, sans-serif;
font-size: 16px; font-size: 16px;
font-weight: 400; font-weight: 400;
font-size: 16px; font-size: 16px;
@ -62,7 +62,7 @@ $small-breakpoint: 960px;
} }
h1 { h1 {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 26px; font-size: 26px;
line-height: 30px; line-height: 30px;
font-weight: 500; font-weight: 500;
@ -70,7 +70,7 @@ $small-breakpoint: 960px;
color: $secondary-text-color; color: $secondary-text-color;
small { small {
font-family: 'mastodon-font-sans-serif', sans-serif; font-family: $font-sans-serif, sans-serif;
display: block; display: block;
font-size: 18px; font-size: 18px;
font-weight: 400; font-weight: 400;
@ -79,7 +79,7 @@ $small-breakpoint: 960px;
} }
h2 { h2 {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 22px; font-size: 22px;
line-height: 26px; line-height: 26px;
font-weight: 500; font-weight: 500;
@ -88,7 +88,7 @@ $small-breakpoint: 960px;
} }
h3 { h3 {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 18px; font-size: 18px;
line-height: 24px; line-height: 24px;
font-weight: 500; font-weight: 500;
@ -97,7 +97,7 @@ $small-breakpoint: 960px;
} }
h4 { h4 {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 16px; font-size: 16px;
line-height: 24px; line-height: 24px;
font-weight: 500; font-weight: 500;
@ -106,7 +106,7 @@ $small-breakpoint: 960px;
} }
h5 { h5 {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 14px; font-size: 14px;
line-height: 24px; line-height: 24px;
font-weight: 500; font-weight: 500;
@ -115,7 +115,7 @@ $small-breakpoint: 960px;
} }
h6 { h6 {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 12px; font-size: 12px;
line-height: 24px; line-height: 24px;
font-weight: 500; font-weight: 500;
@ -180,7 +180,7 @@ $small-breakpoint: 960px;
&__section { &__section {
flex: 1 0 0; flex: 1 0 0;
font-family: 'mastodon-font-sans-serif', sans-serif; font-family: $font-sans-serif, sans-serif;
font-size: 16px; font-size: 16px;
line-height: 28px; line-height: 28px;
color: $primary-text-color; color: $primary-text-color;
@ -221,7 +221,7 @@ $small-breakpoint: 960px;
bottom: -40px; bottom: -40px;
.panel-header { .panel-header {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 14px; font-size: 14px;
line-height: 24px; line-height: 24px;
font-weight: 500; font-weight: 500;
@ -450,7 +450,7 @@ $small-breakpoint: 960px;
p, p,
li { li {
font-family: 'mastodon-font-sans-serif', sans-serif; font-family: $font-sans-serif, sans-serif;
font-size: 16px; font-size: 16px;
font-weight: 400; font-weight: 400;
font-size: 16px; font-size: 16px;
@ -499,7 +499,7 @@ $small-breakpoint: 960px;
} }
h1 { h1 {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 26px; font-size: 26px;
line-height: 30px; line-height: 30px;
font-weight: 500; font-weight: 500;
@ -507,7 +507,7 @@ $small-breakpoint: 960px;
color: $secondary-text-color; color: $secondary-text-color;
small { small {
font-family: 'mastodon-font-sans-serif', sans-serif; font-family: $font-sans-serif, sans-serif;
display: block; display: block;
font-size: 18px; font-size: 18px;
font-weight: 400; font-weight: 400;
@ -516,7 +516,7 @@ $small-breakpoint: 960px;
} }
h2 { h2 {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 22px; font-size: 22px;
line-height: 26px; line-height: 26px;
font-weight: 500; font-weight: 500;
@ -525,7 +525,7 @@ $small-breakpoint: 960px;
} }
h3 { h3 {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 18px; font-size: 18px;
line-height: 24px; line-height: 24px;
font-weight: 500; font-weight: 500;
@ -534,7 +534,7 @@ $small-breakpoint: 960px;
} }
h4 { h4 {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 16px; font-size: 16px;
line-height: 24px; line-height: 24px;
font-weight: 500; font-weight: 500;
@ -543,7 +543,7 @@ $small-breakpoint: 960px;
} }
h5 { h5 {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 14px; font-size: 14px;
line-height: 24px; line-height: 24px;
font-weight: 500; font-weight: 500;
@ -552,7 +552,7 @@ $small-breakpoint: 960px;
} }
h6 { h6 {
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-size: 12px; font-size: 12px;
line-height: 24px; line-height: 24px;
font-weight: 500; font-weight: 500;
@ -619,7 +619,7 @@ $small-breakpoint: 960px;
.hero .heading { .hero .heading {
padding-bottom: 20px; padding-bottom: 20px;
font-family: 'mastodon-font-sans-serif', sans-serif; font-family: $font-sans-serif, sans-serif;
font-size: 16px; font-size: 16px;
font-weight: 400; font-weight: 400;
font-size: 16px; font-size: 16px;
@ -670,7 +670,7 @@ $small-breakpoint: 960px;
text-decoration: none; text-decoration: none;
padding: 12px 16px; padding: 12px 16px;
line-height: 32px; line-height: 32px;
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-weight: 500; font-weight: 500;
font-size: 14px; font-size: 14px;
@ -743,7 +743,7 @@ $small-breakpoint: 960px;
.about-short { .about-short {
background: darken($ui-base-color, 4%); background: darken($ui-base-color, 4%);
padding: 50px 0 30px; padding: 50px 0 30px;
font-family: 'mastodon-font-sans-serif', sans-serif; font-family: $font-sans-serif, sans-serif;
font-size: 16px; font-size: 16px;
font-weight: 400; font-weight: 400;
font-size: 16px; font-size: 16px;
@ -1012,7 +1012,7 @@ $small-breakpoint: 960px;
display: flex; display: flex;
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
-ms-overflow-style: -ms-autohiding-scrollbar; -ms-overflow-style: -ms-autohiding-scrollbar;
font-family: 'mastodon-font-sans-serif', sans-serif; font-family: $font-sans-serif, sans-serif;
font-size: 13px; font-size: 13px;
line-height: 18px; line-height: 18px;
font-weight: 400; font-weight: 400;

View file

@ -432,7 +432,7 @@ $no-columns-breakpoint: 600px;
border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px;
padding: 10px; padding: 10px;
color: $darker-text-color; color: $darker-text-color;
font-family: 'mastodon-font-monospace', monospace; font-family: $font-monospace, monospace;
font-size: 12px; font-size: 12px;
word-wrap: break-word; word-wrap: break-word;
min-height: 20px; min-height: 20px;

View file

@ -6,7 +6,7 @@
} }
body { body {
font-family: 'mastodon-font-sans-serif', sans-serif; font-family: $font-sans-serif, sans-serif;
background: darken($ui-base-color, 8%); background: darken($ui-base-color, 8%);
font-size: 13px; font-size: 13px;
line-height: 18px; line-height: 18px;
@ -29,8 +29,8 @@ body {
// Fira Sans => Firefox OS // Fira Sans => Firefox OS
// Droid Sans => Older Androids (<4.0) // Droid Sans => Older Androids (<4.0)
// Helvetica Neue => Older macOS <10.11 // Helvetica Neue => Older macOS <10.11
// mastodon-font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0) // $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", mastodon-font-sans-serif, sans-serif; font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", $font-sans-serif, sans-serif;
} }
&.app-body { &.app-body {

View file

@ -552,7 +552,7 @@
.character-counter { .character-counter {
cursor: default; cursor: default;
font-family: 'mastodon-font-sans-serif', sans-serif; font-family: $font-sans-serif, sans-serif;
font-size: 14px; font-size: 14px;
font-weight: 600; font-weight: 600;
color: $lighter-text-color; color: $lighter-text-color;
@ -631,11 +631,13 @@
.status__content, .status__content,
.reply-indicator__content { .reply-indicator__content {
position: relative;
font-size: 15px; font-size: 15px;
line-height: 20px; line-height: 20px;
word-wrap: break-word; word-wrap: break-word;
font-weight: 400; font-weight: 400;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis;
white-space: pre-wrap; white-space: pre-wrap;
padding-top: 2px; padding-top: 2px;
color: $primary-text-color; color: $primary-text-color;
@ -721,6 +723,26 @@
} }
} }
.status__content.status__content--collapsed {
max-height: 20px * 15; // 15 lines is roughly above 500 characters
}
.status__content__read-more-button {
display: block;
font-size: 15px;
line-height: 20px;
color: lighten($ui-highlight-color, 8%);
border: 0;
background: transparent;
padding: 0;
padding-top: 8px;
&:hover,
&:active {
text-decoration: underline;
}
}
.status__content__spoiler-link { .status__content__spoiler-link {
display: inline-block; display: inline-block;
border-radius: 2px; border-radius: 2px;
@ -3009,8 +3031,7 @@ a.status-card {
line-height: 24px; line-height: 24px;
} }
.setting-toggle__label, .setting-toggle__label {
.setting-meta__label {
color: $darker-text-color; color: $darker-text-color;
display: inline-block; display: inline-block;
margin-bottom: 14px; margin-bottom: 14px;
@ -3018,10 +3039,6 @@ a.status-card {
vertical-align: middle; vertical-align: middle;
} }
.setting-meta__label {
float: right;
}
.empty-column-indicator, .empty-column-indicator,
.error-column { .error-column {
color: $dark-text-color; color: $dark-text-color;
@ -5122,7 +5139,7 @@ noscript {
width: 100%; width: 100%;
border: none; border: none;
padding: 10px; padding: 10px;
font-family: 'mastodon-font-monospace', monospace; font-family: $font-monospace, monospace;
background: $ui-base-color; background: $ui-base-color;
color: $primary-text-color; color: $primary-text-color;
font-size: 14px; font-size: 14px;

View file

@ -37,7 +37,7 @@
outline: 0; outline: 0;
padding: 12px 16px; padding: 12px 16px;
line-height: 32px; line-height: 32px;
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
font-weight: 500; font-weight: 500;
font-size: 14px; font-size: 14px;
} }
@ -627,7 +627,7 @@
font-size: 18px; font-size: 18px;
margin-bottom: 5px; margin-bottom: 5px;
color: $primary-text-color; color: $primary-text-color;
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
} }
} }

View file

@ -35,7 +35,7 @@
font-weight: 500; font-weight: 500;
font-size: 24px; font-size: 24px;
color: $primary-text-color; color: $primary-text-color;
font-family: 'mastodon-font-display', sans-serif; font-family: $font-display, sans-serif;
margin-bottom: 20px; margin-bottom: 20px;
} }

View file

@ -1,7 +1,7 @@
$no-columns-breakpoint: 600px; $no-columns-breakpoint: 600px;
code { code {
font-family: 'mastodon-font-monospace', monospace; font-family: $font-monospace, monospace;
font-weight: 400; font-weight: 400;
} }
@ -474,7 +474,7 @@ code {
width: 100%; width: 100%;
border: none; border: none;
padding: 10px; padding: 10px;
font-family: 'mastodon-font-monospace', monospace; font-family: $font-monospace, monospace;
background: $ui-base-color; background: $ui-base-color;
color: $primary-text-color; color: $primary-text-color;
font-size: 14px; font-size: 14px;
@ -718,7 +718,7 @@ code {
.form_admin_settings_custom_css, .form_admin_settings_custom_css,
.form_admin_settings_closed_registrations_message { .form_admin_settings_closed_registrations_message {
textarea { textarea {
font-family: 'mastodon-font-monospace', monospace; font-family: $font-monospace, monospace;
} }
} }
@ -742,7 +742,7 @@ code {
border: 0; border: 0;
padding: 10px; padding: 10px;
font-size: 14px; font-size: 14px;
font-family: 'mastodon-font-monospace', monospace; font-family: $font-monospace, monospace;
} }
button { button {

View file

@ -46,8 +46,8 @@ body.rtl {
.column-header__buttons { .column-header__buttons {
left: 0; left: 0;
right: auto; right: auto;
margin-left: -15px; margin-left: 0;
margin-right: 0; margin-right: -15px;
} }
.column-inline-form .icon-button { .column-inline-form .icon-button {
@ -78,10 +78,6 @@ body.rtl {
margin-right: 8px; margin-right: 8px;
} }
.setting-meta__label {
float: left;
}
.status__avatar { .status__avatar {
left: auto; left: auto;
right: 10px; right: 10px;
@ -145,6 +141,19 @@ body.rtl {
margin-right: 6px; margin-right: 6px;
} }
.status__action-bar {
&__counter {
margin-right: 0;
margin-left: 11px;
.status__action-bar-button {
margin-right: 0;
margin-left: 4px;
}
}
}
.status__action-bar-button { .status__action-bar-button {
float: right; float: right;
margin-right: 0; margin-right: 0;
@ -285,4 +294,13 @@ body.rtl {
} }
} }
} }
.public-layout {
.header {
.nav-button {
margin-left: 8px;
margin-right: 0;
}
}
}
} }

View file

@ -90,7 +90,7 @@
} }
samp { samp {
font-family: 'mastodon-font-monospace', monospace; font-family: $font-monospace, monospace;
} }
button.table-action-link { button.table-action-link {

View file

@ -48,3 +48,7 @@ $media-modal-media-max-width: 100%;
$media-modal-media-max-height: 80%; $media-modal-media-max-height: 80%;
$no-gap-breakpoint: 415px; $no-gap-breakpoint: 415px;
$font-sans-serif: 'mastodon-font-sans-serif' !default;
$font-display: 'mastodon-font-display' !default;
$font-monospace: 'mastodon-font-monospace' !default;

View file

@ -92,7 +92,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
return if tag['href'].blank? return if tag['href'].blank?
account = account_from_uri(tag['href']) account = account_from_uri(tag['href'])
account = FetchRemoteAccountService.new.call(tag['href'], id: false) if account.nil? account = ::FetchRemoteAccountService.new.call(tag['href'], id: false) if account.nil?
return if account.nil? return if account.nil?
account.mentions.create(status: status) account.mentions.create(status: status)
end end

View file

@ -40,6 +40,7 @@ class FeedManager
end end
def push_to_list(list, status) def push_to_list(list, status)
return false if status.reply? && status.in_reply_to_account_id != status.account_id
return false unless add_to_feed(:list, list.id, status) return false unless add_to_feed(:list, list.id, status)
trim(:list, list.id) trim(:list, list.id)
PushUpdateWorker.perform_async(list.account_id, status.id, "timeline:list:#{list.id}") if push_update_required?("timeline:list:#{list.id}") PushUpdateWorker.perform_async(list.account_id, status.id, "timeline:list:#{list.id}") if push_update_required?("timeline:list:#{list.id}")

View file

@ -25,7 +25,8 @@ class UserSettingsDecorator
user.settings['favourite_modal'] = favourite_modal_preference if change?('setting_favourite_modal') user.settings['favourite_modal'] = favourite_modal_preference if change?('setting_favourite_modal')
user.settings['delete_modal'] = delete_modal_preference if change?('setting_delete_modal') user.settings['delete_modal'] = delete_modal_preference if change?('setting_delete_modal')
user.settings['auto_play_gif'] = auto_play_gif_preference if change?('setting_auto_play_gif') user.settings['auto_play_gif'] = auto_play_gif_preference if change?('setting_auto_play_gif')
user.settings['display_sensitive_media'] = display_sensitive_media_preference if change?('setting_display_sensitive_media') user.settings['display_media'] = display_media_preference if change?('setting_display_media')
user.settings['expand_spoilers'] = expand_spoilers_preference if change?('setting_expand_spoilers')
user.settings['reduce_motion'] = reduce_motion_preference if change?('setting_reduce_motion') user.settings['reduce_motion'] = reduce_motion_preference if change?('setting_reduce_motion')
user.settings['system_font_ui'] = system_font_ui_preference if change?('setting_system_font_ui') user.settings['system_font_ui'] = system_font_ui_preference if change?('setting_system_font_ui')
user.settings['noindex'] = noindex_preference if change?('setting_noindex') user.settings['noindex'] = noindex_preference if change?('setting_noindex')
@ -74,8 +75,12 @@ class UserSettingsDecorator
boolean_cast_setting 'setting_auto_play_gif' boolean_cast_setting 'setting_auto_play_gif'
end end
def display_sensitive_media_preference def display_media_preference
boolean_cast_setting 'setting_display_sensitive_media' settings['setting_display_media']
end
def expand_spoilers_preference
boolean_cast_setting 'setting_expand_spoilers'
end end
def reduce_motion_preference def reduce_motion_preference

View file

@ -19,5 +19,13 @@ module Paginable
query = query.where(arel_table[:id].gt(min_id)) if min_id.present? query = query.where(arel_table[:id].gt(min_id)) if min_id.present?
query query
} }
scope :paginate_by_id, ->(limit, options = {}) {
if options[:min_id].present?
paginate_by_min_id(limit, options[:min_id]).reverse
else
paginate_by_max_id(limit, options[:max_id], options[:since_id])
end
}
end end
end end

View file

@ -6,16 +6,20 @@ class Feed
@id = id @id = id
end end
def get(limit, max_id = nil, since_id = nil) def get(limit, max_id = nil, since_id = nil, min_id = nil)
from_redis(limit, max_id, since_id) from_redis(limit, max_id, since_id, min_id)
end end
protected protected
def from_redis(limit, max_id, since_id) def from_redis(limit, max_id, since_id, min_id)
if min_id.blank?
max_id = '+inf' if max_id.blank? max_id = '+inf' if max_id.blank?
since_id = '-inf' if since_id.blank? since_id = '-inf' if since_id.blank?
unhydrated = redis.zrevrangebyscore(key, "(#{max_id}", "(#{since_id}", limit: [0, limit], with_scores: true).map(&:first).map(&:to_i) unhydrated = redis.zrevrangebyscore(key, "(#{max_id}", "(#{since_id}", limit: [0, limit], with_scores: true).map(&:first).map(&:to_i)
else
unhydrated = redis.zrangebyscore(key, "(#{min_id}", '+inf', limit: [0, limit], with_scores: true).map(&:first).map(&:to_i)
end
Status.where(id: unhydrated).cache_ids Status.where(id: unhydrated).cache_ids
end end

View file

@ -7,9 +7,9 @@ class HomeFeed < Feed
@account = account @account = account
end end
def get(limit, max_id = nil, since_id = nil) def get(limit, max_id = nil, since_id = nil, min_id = nil)
if redis.exists("account:#{@account.id}:regeneration") if redis.exists("account:#{@account.id}:regeneration")
from_database(limit, max_id, since_id) from_database(limit, max_id, since_id, min_id)
else else
super super
end end
@ -17,9 +17,9 @@ class HomeFeed < Feed
private private
def from_database(limit, max_id, since_id) def from_database(limit, max_id, since_id, min_id)
Status.as_home_timeline(@account) Status.as_home_timeline(@account)
.paginate_by_max_id(limit, max_id, since_id) .paginate_by_id(limit, max_id: max_id, since_id: since_id, min_id: min_id)
.reject { |status| FeedManager.instance.filter?(:home, status, @account.id) } .reject { |status| FeedManager.instance.filter?(:home, status, @account.id) }
end end
end end

View file

@ -95,8 +95,8 @@ class User < ApplicationRecord
has_many :session_activations, dependent: :destroy has_many :session_activations, dependent: :destroy
delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :favourite_modal, :delete_modal, delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :favourite_modal, :delete_modal,
:reduce_motion, :system_font_ui, :noindex, :flavour, :skin, :display_sensitive_media, :hide_network, :reduce_motion, :system_font_ui, :noindex, :flavour, :skin, :display_media, :hide_network,
:default_language, to: :settings, prefix: :setting, allow_nil: false :expand_spoilers, :default_language, to: :settings, prefix: :setting, allow_nil: false
attr_reader :invite_code attr_reader :invite_code
@ -316,6 +316,14 @@ class User < ApplicationRecord
super super
end end
def show_all_media?
setting_display_media == 'show_all'
end
def hide_all_media?
setting_display_media == 'hide_all'
end
protected protected
def send_devise_notification(notification, *args) def send_devise_notification(notification, *args)

View file

@ -30,7 +30,8 @@ class InitialStateSerializer < ActiveModel::Serializer
store[:favourite_modal] = object.current_account.user.setting_favourite_modal store[:favourite_modal] = object.current_account.user.setting_favourite_modal
store[:delete_modal] = object.current_account.user.setting_delete_modal store[:delete_modal] = object.current_account.user.setting_delete_modal
store[:auto_play_gif] = object.current_account.user.setting_auto_play_gif store[:auto_play_gif] = object.current_account.user.setting_auto_play_gif
store[:display_sensitive_media] = object.current_account.user.setting_display_sensitive_media store[:display_media] = object.current_account.user.setting_display_media
store[:expand_spoilers] = object.current_account.user.setting_expand_spoilers
store[:reduce_motion] = object.current_account.user.setting_reduce_motion store[:reduce_motion] = object.current_account.user.setting_reduce_motion
store[:is_staff] = object.current_account.user.staff? store[:is_staff] = object.current_account.user.staff?
end end

View file

@ -16,7 +16,7 @@
= fa_icon('lock') if account.locked? = fa_icon('lock') if account.locked?
.public-account-header__tabs__tabs .public-account-header__tabs__tabs
.details-counters .details-counters
.counter{ class: active_nav_class(short_account_url(account)) + active_nav_class(short_account_with_replies_url(account)) + active_nav_class(short_account_media_url(account)) } .counter{ class: active_nav_class(short_account_url(account), short_account_with_replies_url(account), short_account_media_url(account)) }
= link_to short_account_url(account), class: 'u-url u-uid', title: number_with_delimiter(account.statuses_count) do = link_to short_account_url(account), class: 'u-url u-uid', title: number_with_delimiter(account.statuses_count) do
%span.counter-number= number_to_human account.statuses_count, strip_insignificant_zeros: true %span.counter-number= number_to_human account.statuses_count, strip_insignificant_zeros: true
%span.counter-label= t('accounts.posts', count: account.statuses_count) %span.counter-label= t('accounts.posts', count: account.statuses_count)

View file

@ -6,7 +6,7 @@
= t('accounts.moved_html', name: content_tag(:bdi, content_tag(:strong, display_name(account, custom_emojify: true), class: :emojify)), new_profile_link: link_to(content_tag(:strong, safe_join(['@', content_tag(:span, moved_to_account.acct)])), TagManager.instance.url_for(moved_to_account), class: 'mention')) = t('accounts.moved_html', name: content_tag(:bdi, content_tag(:strong, display_name(account, custom_emojify: true), class: :emojify)), new_profile_link: link_to(content_tag(:strong, safe_join(['@', content_tag(:span, moved_to_account.acct)])), TagManager.instance.url_for(moved_to_account), class: 'mention'))
.moved-account-widget__card .moved-account-widget__card
= link_to TagManager.instance.url_for(moved_to_account), class: 'detailed-status__display-name p-author h-card', target: '_blank', rel: 'noopener' do = link_to TagManager.instance.url_for(moved_to_account), class: 'detailed-status__display-name p-author h-card', target: '_blank', rel: 'me noopener' do
.detailed-status__display-avatar .detailed-status__display-avatar
.account__avatar-overlay .account__avatar-overlay
.account__avatar-overlay-base{ style: "background-image: url('#{moved_to_account.avatar.url(:original)}')" } .account__avatar-overlay-base{ style: "background-image: url('#{moved_to_account.avatar.url(:original)}')" }

View file

@ -14,9 +14,9 @@
- unless status.proper.media_attachments.empty? - unless status.proper.media_attachments.empty?
- if status.proper.media_attachments.first.video? - if status.proper.media_attachments.first.video?
- video = status.proper.media_attachments.first - video = status.proper.media_attachments.first
= react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: status.proper.sensitive? && !current_account&.user&.setting_display_sensitive_media, width: 610, height: 343, inline: true, alt: video.description = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.proper.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description
- else - else
= react_component :media_gallery, height: 343, sensitive: status.proper.sensitive? && !current_account&.user&.setting_display_sensitive_media, 'autoPlayGif': current_account&.user&.setting_auto_play_gif, media: status.proper.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } = react_component :media_gallery, height: 343, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif, media: status.proper.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }
.detailed-status__meta .detailed-status__meta
= link_to TagManager.instance.url_for(status), class: 'detailed-status__datetime', target: stream_link_target, rel: 'noopener' do = link_to TagManager.instance.url_for(status), class: 'detailed-status__datetime', target: stream_link_target, rel: 'noopener' do

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