From fc9553ee95149e4f6419c1389fbe2bb6022b2b8b Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Tue, 18 Apr 2017 23:27:03 -0500 Subject: [PATCH 001/274] Awoo the toots, work on a raspberry pi too --- Gemfile | 2 ++ Gemfile.lock | 36 +++++++++++-------- .../javascripts/components/locales/en.jsx | 28 +++++++-------- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/Gemfile b/Gemfile index 2971a7a29..d0dba82e6 100644 --- a/Gemfile +++ b/Gemfile @@ -58,6 +58,8 @@ gem 'twitter-text' gem 'tzinfo-data' gem 'whatlanguage' +gem 'unf_ext', git: 'https://github.com/nomoon/ruby-unf_ext.git', branch: 'fix_table_type' + gem 'react-rails' gem 'browserify-rails' gem 'autoprefixer-rails' diff --git a/Gemfile.lock b/Gemfile.lock index b0ef1c768..2a6f5208a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,10 @@ +GIT + remote: https://github.com/nomoon/ruby-unf_ext.git + revision: b352f23c9f0e55523d35a37fc78672d46be74b75 + branch: fix_table_type + specs: + unf_ext (0.0.7.3) + GEM remote: https://rubygems.org/ specs: @@ -47,17 +54,17 @@ GEM ast (2.3.0) attr_encrypted (3.0.3) encryptor (~> 3.0.0) - autoprefixer-rails (6.7.7.1) + autoprefixer-rails (6.7.7.2) execjs av (0.9.0) cocaine (~> 0.5.3) - aws-sdk (2.9.6) - aws-sdk-resources (= 2.9.6) - aws-sdk-core (2.9.6) + aws-sdk (2.9.7) + aws-sdk-resources (= 2.9.7) + aws-sdk-core (2.9.7) aws-sigv4 (~> 1.0) jmespath (~> 1.0) - aws-sdk-resources (2.9.6) - aws-sdk-core (= 2.9.6) + aws-sdk-resources (2.9.7) + aws-sdk-core (= 2.9.7) aws-sigv4 (1.0.0) babel-source (5.8.35) babel-transpiler (0.7.0) @@ -94,7 +101,7 @@ GEM capistrano-rails (1.2.3) capistrano (~> 3.1) capistrano-bundler (~> 1.1) - capistrano-rbenv (2.1.0) + capistrano-rbenv (2.1.1) capistrano (~> 3.1) sshkit (~> 1.3) capistrano-yarn (2.0.2) @@ -202,7 +209,7 @@ GEM rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json (2.0.3) + json (2.0.4) kaminari (1.0.1) activesupport (>= 4.1.0) kaminari-actionview (= 1.0.1) @@ -257,7 +264,7 @@ GEM http (~> 2.0) nokogiri (~> 1.6) openssl (~> 2.0) - ox (2.4.11) + ox (2.4.12) paperclip (5.1.0) activemodel (>= 4.2.0) activesupport (>= 4.2.0) @@ -332,7 +339,7 @@ GEM thor (>= 0.18.1, < 2.0) rainbow (2.2.1) rake (12.0.0) - react-rails (1.11.0) + react-rails (2.0.2) babel-transpiler (>= 0.7.0) connection_pool execjs @@ -346,8 +353,8 @@ GEM redis-activesupport (5.0.2) activesupport (>= 3, < 6) redis-store (~> 1.3.0) - redis-rack (2.0.1) - rack (>= 2.0, < 3) + redis-rack (2.0.2) + rack (>= 1.5, < 3) redis-store (>= 1.2, < 1.4) redis-rails (5.0.2) redis-actionpack (>= 5.0, < 6) @@ -376,7 +383,7 @@ GEM rspec-expectations (~> 3.5.0) rspec-mocks (~> 3.5.0) rspec-support (~> 3.5.0) - rspec-sidekiq (3.0.0) + rspec-sidekiq (3.0.1) rspec-core (~> 3.0, >= 3.0.0) sidekiq (>= 2.4.0) rspec-support (3.5.0) @@ -448,7 +455,7 @@ GEM uniform_notifier (1.10.0) warden (1.2.7) rack (>= 1.0) - webmock (2.3.2) + webmock (3.0.1) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff @@ -541,6 +548,7 @@ DEPENDENCIES twitter-text tzinfo-data uglifier (>= 1.3.0) + unf_ext! webmock whatlanguage diff --git a/app/assets/javascripts/components/locales/en.jsx b/app/assets/javascripts/components/locales/en.jsx index 5c1238524..4a1ee5531 100644 --- a/app/assets/javascripts/components/locales/en.jsx +++ b/app/assets/javascripts/components/locales/en.jsx @@ -28,14 +28,14 @@ const en = { "column_back_button.label": "Back", "column.blocks": "Blocked users", "column.community": "Local timeline", - "column.favourites": "Favourites", + "column.favourites": "Florps", "column.follow_requests": "Follow requests", "column.home": "Home", "column.mutes": "Muted users", "column.notifications": "Notifications", "column.public": "Federated timeline", "compose_form.placeholder": "What is on your mind?", - "compose_form.privacy_disclaimer": "Your private status will be delivered to mentioned users on {domains}. Do you trust {domainsCount, plural, one {that server} other {those servers}}? Post privacy only works on Mastodon instances. If {domains} {domainsCount, plural, one {is not a Mastodon instance} other {are not Mastodon instances}}, there will be no indication that your post is private, and it may be boosted or otherwise made visible to unintended recipients.", + "compose_form.privacy_disclaimer": "Your private toot will be delivered to mentioned users on {domains}. Do you trust {domainsCount, plural, one {that server} other {those servers}}? Post privacy only works on Mastodon instances. If {domains} {domainsCount, plural, one {is not a Mastodon instance} other {are not Mastodon instances}}, there will be no indication that your post is private, and it may be awooed or otherwise made visible to unintended recipients.", "compose_form.publish": "Toot", "compose_form.sensitive": "Mark media as sensitive", "compose_form.spoiler_placeholder": "Content warning", @@ -55,7 +55,7 @@ const en = { "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", "home.column_settings.filter_regex": "Filter out by regular expressions", - "home.column_settings.show_reblogs": "Show boosts", + "home.column_settings.show_reblogs": "Show awoos", "home.column_settings.show_replies": "Show replies", "home.settings": "Column settings", "lightbox.close": "Close", @@ -65,28 +65,28 @@ const en = { "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.edit_profile": "Edit profile", - "navigation_bar.favourites": "Favourites", + "navigation_bar.favourites": "Florps", "navigation_bar.follow_requests": "Follow requests", "navigation_bar.info": "Extended information", "navigation_bar.logout": "Logout", "navigation_bar.mutes": "Muted users", "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", - "notification.favourite": "{name} favourited your status", + "notification.favourite": "{name} florped your toot", "notification.follow": "{name} followed you", "notification.mention": "{name} mentioned you", - "notification.reblog": "{name} boosted your status", + "notification.reblog": "{name} awooed your toot", "notifications.clear_confirmation": "Are you sure you want to clear all your notifications?", "notifications.clear": "Clear notifications", "notifications.column_settings.alert": "Desktop notifications", - "notifications.column_settings.favourite": "Favourites:", + "notifications.column_settings.favourite": "Florps:", "notifications.column_settings.follow": "New followers:", "notifications.column_settings.mention": "Mentions:", - "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.reblog": "Awoos:", "notifications.column_settings.show": "Show in column", "notifications.column_settings.sound": "Play sound", "notifications.settings": "Column settings", - "privacy.change": "Adjust status privacy", + "privacy.change": "Adjust toot privacy", "privacy.direct.long": "Post to mentioned users only", "privacy.direct.short": "Direct", "privacy.private.long": "Post to followers only", @@ -102,15 +102,15 @@ const en = { "report.target": "Reporting", "search_results.total": "{count} {count, plural, one {result} other {results}}", "search.placeholder": "Search", - "search.status_by": "Status by {name}", + "search.status_by": "Toot by {name}", "status.delete": "Delete", - "status.favourite": "Favourite", + "status.favourite": "Florp", "status.load_more": "Load more", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", - "status.open": "Expand this status", - "status.reblog": "Boost", - "status.reblogged_by": "{name} boosted", + "status.open": "Expand this toot", + "status.reblog": "Awoo", + "status.reblogged_by": "{name} awooed", "status.reply": "Reply", "status.report": "Report @{name}", "status.sensitive_toggle": "Click to view", From ca6f5ff873610967444e46abe6e5ba6451c94b47 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Thu, 27 Apr 2017 18:25:58 -0500 Subject: [PATCH 002/274] Update gemfile --- Gemfile | 2 +- Gemfile.lock | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/Gemfile b/Gemfile index d8b7d3965..2aa63ce00 100644 --- a/Gemfile +++ b/Gemfile @@ -60,7 +60,7 @@ gem 'twitter-text' gem 'tzinfo-data' gem 'whatlanguage' -gem 'unf_ext', git: 'https://github.com/nomoon/ruby-unf_ext.git', branch: 'fix_table_type' +# gem 'unf_ext', git: 'https://github.com/nomoon/ruby-unf_ext.git', branch: 'fix_table_type' gem 'react-rails' gem 'browserify-rails' diff --git a/Gemfile.lock b/Gemfile.lock index 8c57072e1..ec8a7d902 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,10 +1,3 @@ -GIT - remote: https://github.com/nomoon/ruby-unf_ext.git - revision: b352f23c9f0e55523d35a37fc78672d46be74b75 - branch: fix_table_type - specs: - unf_ext (0.0.7.3) - GEM remote: https://rubygems.org/ specs: @@ -566,7 +559,6 @@ DEPENDENCIES twitter-text tzinfo-data uglifier (>= 1.3.0) - unf_ext! webmock whatlanguage From 456478c4e16a005b1253f495a9afe28613ca2907 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 5 May 2017 02:23:01 +0200 Subject: [PATCH 003/274] More robust PuSH subscription refreshes (#2799) * Fix #2473 - Use sidekiq scheduler to refresh PuSH subscriptions instead of cron Fix an issue where / in domain would raise exception in TagManager#normalize_domain PuSH subscriptions refresh done in a round-robin way to avoid hammering a single server's hub in sequence. Correct handling of failures/retries through Sidekiq (see also #2613). Optimize Account#with_followers scope. Also, since subscriptions are now delegated to Sidekiq jobs, an uncaught exception will not stop the entire refreshing operation halfway through Fix #2702 - Correct user agent header on outgoing http requests * Add test for SubscribeService * Extract #expiring_accounts into method * Make mastodon:push:refresh no-op * Queues are now defined in sidekiq.yml * Queues are now in sidekiq.yml --- Gemfile | 3 +- Gemfile.lock | 14 ++++++- Procfile | 2 +- app/helpers/http_helper.rb | 10 +++-- app/lib/tag_manager.rb | 4 +- app/models/account.rb | 5 ++- app/services/follow_service.rb | 2 +- app/services/process_interaction_service.rb | 2 +- app/services/subscribe_service.rb | 28 +++++++++++--- app/services/update_remote_profile_service.rb | 2 +- app/workers/pubsubhubbub/delivery_worker.rb | 12 +++++- app/workers/pubsubhubbub/subscribe_worker.rb | 13 +++++++ .../scheduler/subscriptions_scheduler.rb | 20 ++++++++++ config/environments/development.rb | 3 -- config/sidekiq.yml | 9 +++++ lib/tasks/mastodon.rake | 6 +-- spec/services/follow_service_spec.rb | 7 +++- spec/services/subscribe_service_spec.rb | 38 +++++++++++++++++++ 18 files changed, 151 insertions(+), 29 deletions(-) create mode 100644 app/workers/pubsubhubbub/subscribe_worker.rb create mode 100644 app/workers/scheduler/subscriptions_scheduler.rb create mode 100644 spec/services/subscribe_service_spec.rb diff --git a/Gemfile b/Gemfile index 7ea358e81..785ad6ff4 100644 --- a/Gemfile +++ b/Gemfile @@ -38,7 +38,7 @@ gem 'link_header' gem 'local_time' gem 'nokogiri' gem 'oj' -gem 'ostatus2', '~> 1.1' +gem 'ostatus2', '~> 2.0' gem 'ox' gem 'rabl' gem 'rack-attack' @@ -51,6 +51,7 @@ gem 'rqrcode' gem 'ruby-oembed', require: 'oembed' gem 'sanitize' gem 'sidekiq' +gem 'sidekiq-scheduler' gem 'sidekiq-unique-jobs' gem 'simple-navigation' gem 'simple_form' diff --git a/Gemfile.lock b/Gemfile.lock index b519f2d62..938780fef 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -153,6 +153,8 @@ GEM thread_safe encryptor (3.0.0) erubis (2.7.0) + et-orbi (1.0.3) + tzinfo execjs (2.7.0) fabrication (2.16.1) faker (1.7.3) @@ -265,7 +267,7 @@ GEM oj (3.0.2) openssl (2.0.3) orm_adapter (0.5.0) - ostatus2 (1.1.0) + ostatus2 (2.0.0) addressable (~> 2.4) http (~> 2.0) nokogiri (~> 1.6) @@ -402,6 +404,8 @@ GEM unicode-display_width (~> 1.0, >= 1.0.1) ruby-oembed (0.12.0) ruby-progressbar (1.8.1) + rufus-scheduler (3.4.0) + et-orbi (~> 1.0) safe_yaml (1.0.4) sanitize (4.4.0) crass (~> 1.0.2) @@ -419,6 +423,11 @@ GEM connection_pool (~> 2.2, >= 2.2.0) rack-protection (>= 1.5.0) redis (~> 3.2, >= 3.2.1) + sidekiq-scheduler (2.1.4) + redis (~> 3) + rufus-scheduler (~> 3.2) + sidekiq (>= 3) + tilt (>= 1.4.0) sidekiq-unique-jobs (5.0.0) sidekiq (>= 4.0) thor @@ -523,7 +532,7 @@ DEPENDENCIES microformats2 nokogiri oj - ostatus2 (~> 1.1) + ostatus2 (~> 2.0) ox paperclip (~> 5.1) paperclip-av-transcoder @@ -552,6 +561,7 @@ DEPENDENCIES sanitize sass-rails (~> 5.0) sidekiq + sidekiq-scheduler sidekiq-unique-jobs simple-navigation simple_form diff --git a/Procfile b/Procfile index 646e26059..b18e4b6be 100644 --- a/Procfile +++ b/Procfile @@ -1,2 +1,2 @@ web: bundle exec puma -C config/puma.rb -worker: bundle exec sidekiq -q default -q push -q pull -q mailers +worker: bundle exec sidekiq diff --git a/app/helpers/http_helper.rb b/app/helpers/http_helper.rb index 1697de746..e39a52da0 100644 --- a/app/helpers/http_helper.rb +++ b/app/helpers/http_helper.rb @@ -1,13 +1,17 @@ # frozen_string_literal: true module HttpHelper - USER_AGENT = "#{HTTP::Request::USER_AGENT} (Mastodon/#{Mastodon::Version}; +http://#{Rails.configuration.x.local_domain}/)" - def http_client(options = {}) timeout = { write: 10, connect: 10, read: 10 }.merge(options) - HTTP.headers(user_agent: USER_AGENT) + HTTP.headers(user_agent: user_agent) .timeout(:per_operation, timeout) .follow end + + private + + def user_agent + @user_agent ||= "#{HTTP::Request::USER_AGENT} (Mastodon/#{Mastodon::Version}; +http://#{Rails.configuration.x.local_domain}/)" + end end diff --git a/app/lib/tag_manager.rb b/app/lib/tag_manager.rb index 3bddfba7c..6170a90de 100644 --- a/app/lib/tag_manager.rb +++ b/app/lib/tag_manager.rb @@ -65,8 +65,10 @@ class TagManager end def normalize_domain(domain) + return if domain.nil? + uri = Addressable::URI.new - uri.host = domain + uri.host = domain.gsub(/[\/]/, '') uri.normalize.host end diff --git a/app/models/account.rb b/app/models/account.rb index 19f8ca365..db996b507 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -65,9 +65,10 @@ class Account < ApplicationRecord scope :remote, -> { where.not(domain: nil) } scope :local, -> { where(domain: nil) } - scope :without_followers, -> { where('(select count(f.id) from follows as f where f.target_account_id = accounts.id) = 0') } - scope :with_followers, -> { where('(select count(f.id) from follows as f where f.target_account_id = accounts.id) > 0') } + scope :without_followers, -> { where(followers_count: 0) } + scope :with_followers, -> { where('followers_count > 0') } scope :expiring, ->(time) { where(subscription_expires_at: nil).or(where('subscription_expires_at < ?', time)).remote.with_followers } + scope :partitioned, -> { order('row_number() over (partition by domain)') } scope :silenced, -> { where(silenced: true) } scope :suspended, -> { where(suspended: true) } scope :recent, -> { reorder(id: :desc) } diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb index 844f5282d..23e721fac 100644 --- a/app/services/follow_service.rb +++ b/app/services/follow_service.rb @@ -40,7 +40,7 @@ class FollowService < BaseService if target_account.local? NotifyService.new.call(target_account, follow) else - SubscribeService.new.call(target_account) unless target_account.subscribed? + Pubsubhubbub::SubscribeWorker.perform_async(target_account.id) unless target_account.subscribed? NotificationWorker.perform_async(build_follow_xml(follow), source_account.id, target_account.id) AfterRemoteFollowWorker.perform_async(follow.id) end diff --git a/app/services/process_interaction_service.rb b/app/services/process_interaction_service.rb index 410e805d3..f4fb6110e 100644 --- a/app/services/process_interaction_service.rb +++ b/app/services/process_interaction_service.rb @@ -88,7 +88,7 @@ class ProcessInteractionService < BaseService def authorize_follow_request!(account, target_account) follow_request = FollowRequest.find_by(account: target_account, target_account: account) follow_request&.authorize! - SubscribeService.new.call(account) unless account.subscribed? + Pubsubhubbub::SubscribeWorker.perform_async(account.id) unless account.subscribed? end def reject_follow_request!(account, target_account) diff --git a/app/services/subscribe_service.rb b/app/services/subscribe_service.rb index 820b208e9..138718f14 100644 --- a/app/services/subscribe_service.rb +++ b/app/services/subscribe_service.rb @@ -5,15 +5,31 @@ class SubscribeService < BaseService account.secret = SecureRandom.hex subscription = account.subscription(api_subscription_url(account.id)) - response = subscription.subscribe + response = subscription.subscribe - unless response.successful? + if response_failed_permanently?(response) + # An error in the 4xx range (except for 429, which is rate limiting) + # means we're not allowed to subscribe. Fail and move on account.secret = '' - Rails.logger.debug "PuSH subscription request for #{account.acct} failed: #{response.message}" + account.save! + elsif response_successful?(response) + # Anything in the 2xx range means the subscription will be confirmed + # asynchronously, we've done what we needed to do + account.save! + else + # What's left is the 5xx range and 429, which means we need to retry + # at a later time. Fail loudly! + raise "Subscription attempt failed for #{account.acct} (#{account.hub_url}): HTTP #{response.code}" end + end - account.save! - rescue HTTP::Error, OpenSSL::SSL::SSLError - Rails.logger.debug "PuSH subscription request for #{account.acct} could not be made due to HTTP or SSL error" + private + + def response_failed_permanently?(response) + response.code > 299 && response.code < 500 && response.code != 429 + end + + def response_successful?(response) + response.code > 199 && response.code < 300 end end diff --git a/app/services/update_remote_profile_service.rb b/app/services/update_remote_profile_service.rb index 31f4af2c1..f0c39ecc0 100644 --- a/app/services/update_remote_profile_service.rb +++ b/app/services/update_remote_profile_service.rb @@ -28,7 +28,7 @@ class UpdateRemoteProfileService < BaseService account.save_with_optional_avatar! - SubscribeService.new.call(account) if resubscribe && (account.hub_url != old_hub_url) + Pubsubhubbub::SubscribeWorker.perform_async(account.id) if resubscribe && (account.hub_url != old_hub_url) end private diff --git a/app/workers/pubsubhubbub/delivery_worker.rb b/app/workers/pubsubhubbub/delivery_worker.rb index f645b1e24..511ae14b3 100644 --- a/app/workers/pubsubhubbub/delivery_worker.rb +++ b/app/workers/pubsubhubbub/delivery_worker.rb @@ -25,8 +25,8 @@ class Pubsubhubbub::DeliveryWorker .headers(headers) .post(subscription.callback_url, body: payload) - return subscription.destroy! if response.code > 299 && response.code < 500 && response.code != 429 # HTTP 4xx means error is not temporary, except for 429 (throttling) - raise "Delivery failed for #{subscription.callback_url}: HTTP #{response.code}" unless response.code > 199 && response.code < 300 + return subscription.destroy! if response_failed_permanently?(response) # HTTP 4xx means error is not temporary, except for 429 (throttling) + raise "Delivery failed for #{subscription.callback_url}: HTTP #{response.code}" unless response_successful?(response) subscription.touch(:last_successful_delivery_at) end @@ -37,4 +37,12 @@ class Pubsubhubbub::DeliveryWorker hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), secret, payload) "sha1=#{hmac}" end + + def response_failed_permanently?(response) + response.code > 299 && response.code < 500 && response.code != 429 + end + + def response_successful?(response) + response.code > 199 && response.code < 300 + end end diff --git a/app/workers/pubsubhubbub/subscribe_worker.rb b/app/workers/pubsubhubbub/subscribe_worker.rb new file mode 100644 index 000000000..0c4111a8c --- /dev/null +++ b/app/workers/pubsubhubbub/subscribe_worker.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class Pubsubhubbub::SubscribeWorker + include Sidekiq::Worker + + sidekiq_options queue: 'push' + + def perform(account_id) + account = Account.find(account_id) + Rails.logger.debug "PuSH re-subscribing to #{account.acct}" + ::SubscribeService.new.call(account) + end +end diff --git a/app/workers/scheduler/subscriptions_scheduler.rb b/app/workers/scheduler/subscriptions_scheduler.rb new file mode 100644 index 000000000..03622e95b --- /dev/null +++ b/app/workers/scheduler/subscriptions_scheduler.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +require 'sidekiq-scheduler' + +class Scheduler::SubscriptionsScheduler + include Sidekiq::Worker + + def perform + Rails.logger.debug 'Queueing PuSH re-subscriptions' + + expiring_accounts.pluck(:id) do |id| + Pubsubhubbub::SubscribeWorker.perform_async(id) + end + end + + private + + def expiring_accounts + Account.expiring(1.day.from_now).partitioned + end +end diff --git a/config/environments/development.rb b/config/environments/development.rb index 6157f20d3..6122f61c6 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -79,7 +79,4 @@ Rails.application.configure do config.react.variant = :development end -require 'sidekiq/testing' -Sidekiq::Testing.inline! - ActiveRecordQueryTrace.enabled = ENV.fetch('QUERY_TRACE_ENABLED') { false } diff --git a/config/sidekiq.yml b/config/sidekiq.yml index ee32b6317..5c700cb27 100644 --- a/config/sidekiq.yml +++ b/config/sidekiq.yml @@ -1,2 +1,11 @@ --- :concurrency: 5 +:queues: + - default + - push + - pull + - mailers +:schedule: + subscriptions_scheduler: + cron: '0 5 * * *' + class: Scheduler::SubscriptionsScheduler diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake index 985747936..1889b451d 100644 --- a/lib/tasks/mastodon.rake +++ b/lib/tasks/mastodon.rake @@ -78,10 +78,8 @@ namespace :mastodon do desc 'Re-subscribes to soon expiring PuSH subscriptions' task refresh: :environment do - Account.expiring(1.day.from_now).find_each do |a| - Rails.logger.debug "PuSH re-subscribing to #{a.acct}" - SubscribeService.new.call(a) - end + # No-op + # This task is now executed via sidekiq-scheduler end end diff --git a/spec/services/follow_service_spec.rb b/spec/services/follow_service_spec.rb index 2ce0fa464..bda5daee1 100644 --- a/spec/services/follow_service_spec.rb +++ b/spec/services/follow_service_spec.rb @@ -53,10 +53,11 @@ RSpec.describe FollowService do end describe 'unlocked account' do - let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com')).account } + let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://salmon.example.com', hub_url: 'http://hub.example.com')).account } before do stub_request(:post, "http://salmon.example.com/").to_return(:status => 200, :body => "", :headers => {}) + stub_request(:post, "http://hub.example.com/").to_return(status: 202) subject.call(sender, bob.acct) end @@ -70,6 +71,10 @@ RSpec.describe FollowService do xml.match(TagManager::VERBS[:follow]) }).to have_been_made.once end + + it 'subscribes to PuSH' do + expect(a_request(:post, "http://hub.example.com/")).to have_been_made.once + end end end end diff --git a/spec/services/subscribe_service_spec.rb b/spec/services/subscribe_service_spec.rb new file mode 100644 index 000000000..8cf0100c6 --- /dev/null +++ b/spec/services/subscribe_service_spec.rb @@ -0,0 +1,38 @@ +require 'rails_helper' + +RSpec.describe SubscribeService do + let(:account) { Fabricate(:account, username: 'bob', domain: 'example.com', hub_url: 'http://hub.example.com') } + subject { SubscribeService.new } + + it 'sends subscription request to PuSH hub' do + stub_request(:post, 'http://hub.example.com/').to_return(status: 202) + subject.call(account) + expect(a_request(:post, 'http://hub.example.com/')).to have_been_made.once + end + + it 'generates and keeps PuSH secret on successful call' do + stub_request(:post, 'http://hub.example.com/').to_return(status: 202) + subject.call(account) + expect(account.secret).to_not be_blank + end + + it 'fails silently if PuSH hub forbids subscription' do + stub_request(:post, 'http://hub.example.com/').to_return(status: 403) + subject.call(account) + end + + it 'fails silently if PuSH hub is not found' do + stub_request(:post, 'http://hub.example.com/').to_return(status: 404) + subject.call(account) + end + + it 'fails loudly if there is a network error' do + stub_request(:post, 'http://hub.example.com/').to_raise(HTTP::Error) + expect { subject.call(account) }.to raise_error HTTP::Error + end + + it 'fails loudly if PuSH hub is unavailable' do + stub_request(:post, 'http://hub.example.com/').to_return(status: 503) + expect { subject.call(account) }.to raise_error + end +end From 7539254e96f0ca52f5f7b6969641937d2d2b7c8b Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 4 May 2017 04:34:57 +0200 Subject: [PATCH 004/274] Likely fix #2458, fix #2031 - handle out-of-order deletes for statuses (#2734) * Likely fix #2458, fix #2031 - handle out-of-order deletes for statuses If a delete arrives before the original status, cache that information for 6h, and if the original status arrives in that window, ignore it * Add test case --- app/services/process_feed_service.rb | 17 ++++++++- spec/services/process_feed_service_spec.rb | 44 ++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/app/services/process_feed_service.rb b/app/services/process_feed_service.rb index 799a9f6e3..4df1891d7 100644 --- a/app/services/process_feed_service.rb +++ b/app/services/process_feed_service.rb @@ -40,6 +40,11 @@ class ProcessFeedService < BaseService private def create_status + if redis.exists("delete_upon_arrival:#{id}") + Rails.logger.debug "Delete for status #{id} was queued, ignoring" + return + end + Rails.logger.debug "Creating remote status #{id}" status, just_created = status_from_xml(@xml) @@ -82,7 +87,13 @@ class ProcessFeedService < BaseService def delete_status Rails.logger.debug "Deleting remote status #{id}" status = Status.find_by(uri: id) - RemoveStatusService.new.call(status) unless status.nil? + + if status.nil? + redis.setex("delete_upon_arrival:#{id}", 6 * 3_600, id) + else + RemoveStatusService.new.call(status) + end + nil end @@ -283,5 +294,9 @@ class ProcessFeedService < BaseService "#{username}@#{domain}" end + + def redis + Redis.current + end end end diff --git a/spec/services/process_feed_service_spec.rb b/spec/services/process_feed_service_spec.rb index 19054ecd4..f16dda4d4 100644 --- a/spec/services/process_feed_service_spec.rb +++ b/spec/services/process_feed_service_spec.rb @@ -154,4 +154,48 @@ XML expect(created_statuses.first.reblog.account_id).to eq good_actor.id expect(created_statuses.first.reblog.text).to eq 'Overwatch rocks' end + + it 'ignores statuses with an out-of-order delete' do + sender = Fabricate(:account, username: 'tracer', domain: 'overwatch.com') + + delete_body = < + + tag:overwatch.com,2017-04-27:objectId=4487555:objectType=Status + 2017-04-27T13:49:25Z + 2017-04-27T13:49:25Z + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/delete + + https://overwatch.com/users/tracer + http://activitystrea.ms/schema/1.0/person + https://overwatch.com/users/tracer + tracer + + +XML + + status_body = < + + tag:overwatch.com,2017-04-27:objectId=4487555:objectType=Status + 2017-04-27T13:49:25Z + 2017-04-27T13:49:25Z + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + https://overwatch.com/users/tracer + http://activitystrea.ms/schema/1.0/person + https://overwatch.com/users/tracer + tracer + + Overwatch rocks + +XML + + subject.call(delete_body, sender) + created_statuses = subject.call(status_body, sender) + + expect(created_statuses).to be_empty + end end From f3f7a3840a9e09e36723de55f81b8ed0ddbaa58e Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 3 May 2017 17:02:18 +0200 Subject: [PATCH 005/274] Fix #2706 - Always respond with 200 to PuSH payloads (#2733) Fix #2196 - Respond with 201 when Salmon accepted, 400 when unverified Fix #2629 - Correctly handle confirm_domain? for local accounts Unify rules for extracting author acct from XML, prefer , fall back to + (see also #2017, #2172) --- app/controllers/api/salmon_controller.rb | 14 ++++++--- .../api/subscriptions_controller.rb | 5 ++- app/services/concerns/author_extractor.rb | 21 +++++++++++++ app/services/fetch_remote_account_service.rb | 17 +++------- app/services/fetch_remote_status_service.rb | 28 ++++------------- app/services/process_feed_service.rb | 16 ++-------- app/services/process_interaction_service.rb | 31 +++---------------- app/services/verify_salmon_service.rb | 26 ++++++++++++++++ .../api/subscriptions_controller_spec.rb | 4 +-- 9 files changed, 77 insertions(+), 85 deletions(-) create mode 100644 app/services/concerns/author_extractor.rb create mode 100644 app/services/verify_salmon_service.rb diff --git a/app/controllers/api/salmon_controller.rb b/app/controllers/api/salmon_controller.rb index a7872d542..7fc5e548d 100644 --- a/app/controllers/api/salmon_controller.rb +++ b/app/controllers/api/salmon_controller.rb @@ -5,13 +5,13 @@ class Api::SalmonController < ApiController respond_to :txt def update - body = request.body.read + payload = request.body.read - if body.nil? - head 200 - else - SalmonWorker.perform_async(@account.id, body.force_encoding('UTF-8')) + if !payload.nil? && verify?(payload) + SalmonWorker.perform_async(@account.id, payload.force_encoding('UTF-8')) head 201 + else + head 202 end end @@ -20,4 +20,8 @@ class Api::SalmonController < ApiController def set_account @account = Account.find(params[:id]) end + + def verify?(payload) + VerifySalmonService.new.call(payload) + end end diff --git a/app/controllers/api/subscriptions_controller.rb b/app/controllers/api/subscriptions_controller.rb index 51c476436..135a5632e 100644 --- a/app/controllers/api/subscriptions_controller.rb +++ b/app/controllers/api/subscriptions_controller.rb @@ -19,10 +19,9 @@ class Api::SubscriptionsController < ApiController if subscription.verify(body, request.headers['HTTP_X_HUB_SIGNATURE']) ProcessingWorker.perform_async(@account.id, body.force_encoding('UTF-8')) - head 201 - else - head 202 end + + head 200 end private diff --git a/app/services/concerns/author_extractor.rb b/app/services/concerns/author_extractor.rb new file mode 100644 index 000000000..d99780e7d --- /dev/null +++ b/app/services/concerns/author_extractor.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module AuthorExtractor + def author_from_xml(xml) + # Try for acct + acct = xml.at_xpath('./xmlns:author/xmlns:email', xmlns: TagManager::XMLNS)&.content + + # Try + + if acct.blank? + username = xml.at_xpath('./xmlns:author/xmlns:name', xmlns: TagManager::XMLNS)&.content + uri = xml.at_xpath('./xmlns:author/xmlns:uri', xmlns: TagManager::XMLNS)&.content + + return nil if username.blank? || uri.blank? + + domain = Addressable::URI.parse(uri).normalize.host + acct = "#{username}@#{domain}" + end + + FollowRemoteAccountService.new.call(acct) + end +end diff --git a/app/services/fetch_remote_account_service.rb b/app/services/fetch_remote_account_service.rb index 7c2fb0ef1..98fdf3dfe 100644 --- a/app/services/fetch_remote_account_service.rb +++ b/app/services/fetch_remote_account_service.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class FetchRemoteAccountService < BaseService + include AuthorExtractor + def call(url, prefetched_body = nil) if prefetched_body.nil? atom_url, body = FetchAtomService.new.call(url) @@ -19,21 +21,10 @@ class FetchRemoteAccountService < BaseService xml = Nokogiri::XML(body) xml.encoding = 'utf-8' - email = xml.at_xpath('//xmlns:author/xmlns:email').try(:content) - if email.nil? - url_parts = Addressable::URI.parse(url).normalize - username = xml.at_xpath('//xmlns:author/xmlns:name').try(:content) - domain = url_parts.host - else - username, domain = email.split('@') - end + account = author_from_xml(xml.at_xpath('/xmlns:feed', xmlns: TagManager::XMLNS)) - return nil if username.nil? || domain.nil? - - Rails.logger.debug "Going to webfinger #{username}@#{domain}" - - account = FollowRemoteAccountService.new.call("#{username}@#{domain}") UpdateRemoteProfileService.new.call(xml, account) unless account.nil? + account rescue TypeError Rails.logger.debug "Unparseable URL given: #{url}" diff --git a/app/services/fetch_remote_status_service.rb b/app/services/fetch_remote_status_service.rb index 5a454808e..f414813ad 100644 --- a/app/services/fetch_remote_status_service.rb +++ b/app/services/fetch_remote_status_service.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class FetchRemoteStatusService < BaseService + include AuthorExtractor + def call(url, prefetched_body = nil) if prefetched_body.nil? atom_url, body = FetchAtomService.new.call(url) @@ -21,37 +23,19 @@ class FetchRemoteStatusService < BaseService xml = Nokogiri::XML(body) xml.encoding = 'utf-8' - account = extract_author(url, xml) + account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS)) + domain = Addressable::URI.parse(url).normalize.host - return nil if account.nil? + return nil unless !account.nil? && confirmed_domain?(domain, account) statuses = ProcessFeedService.new.call(body, account) - statuses.first - end - - def extract_author(url, xml) - url_parts = Addressable::URI.parse(url).normalize - username = xml.at_xpath('//xmlns:author/xmlns:name').try(:content) - domain = url_parts.host - - return nil if username.nil? - - Rails.logger.debug "Going to webfinger #{username}@#{domain}" - - account = FollowRemoteAccountService.new.call("#{username}@#{domain}") - - # If the author's confirmed URLs do not match the domain of the URL - # we are reading this from, abort - return nil unless confirmed_domain?(domain, account) - - account rescue Nokogiri::XML::XPath::SyntaxError Rails.logger.debug 'Invalid XML or missing namespace' nil end def confirmed_domain?(domain, account) - domain.casecmp(account.domain).zero? || domain.casecmp(Addressable::URI.parse(account.remote_url).normalize.host).zero? + account.domain.nil? || domain.casecmp(account.domain).zero? || domain.casecmp(Addressable::URI.parse(account.remote_url).normalize.host).zero? end end diff --git a/app/services/process_feed_service.rb b/app/services/process_feed_service.rb index 4df1891d7..66bfaea66 100644 --- a/app/services/process_feed_service.rb +++ b/app/services/process_feed_service.rb @@ -20,6 +20,8 @@ class ProcessFeedService < BaseService end class ProcessEntry + include AuthorExtractor + def call(xml, account) @account = account @xml = xml @@ -119,7 +121,7 @@ class ProcessFeedService < BaseService # If that author cannot be found, don't record the status (do not misattribute) if account?(entry) begin - account = find_or_resolve_account(acct(entry)) + account = author_from_xml(entry) return [nil, false] if account.nil? rescue Goldfinger::Error return [nil, false] @@ -154,10 +156,6 @@ class ProcessFeedService < BaseService [status, true] end - def find_or_resolve_account(acct) - FollowRemoteAccountService.new.call(acct) - end - def find_or_resolve_status(parent, uri, url) status = find_status(uri) @@ -287,14 +285,6 @@ class ProcessFeedService < BaseService !xml.at_xpath('./xmlns:author', xmlns: TagManager::XMLNS).nil? end - def acct(xml = @xml) - username = xml.at_xpath('./xmlns:author/xmlns:name', xmlns: TagManager::XMLNS).content - url = xml.at_xpath('./xmlns:author/xmlns:uri', xmlns: TagManager::XMLNS).content - domain = Addressable::URI.parse(url).normalize.host - - "#{username}@#{domain}" - end - def redis Redis.current end diff --git a/app/services/process_interaction_service.rb b/app/services/process_interaction_service.rb index f4fb6110e..16eac2353 100644 --- a/app/services/process_interaction_service.rb +++ b/app/services/process_interaction_service.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class ProcessInteractionService < BaseService + include AuthorExtractor + # Record locally the remote interaction with our user # @param [String] envelope Salmon envelope # @param [Account] target_account Account the Salmon was addressed to @@ -10,18 +12,9 @@ class ProcessInteractionService < BaseService xml = Nokogiri::XML(body) xml.encoding = 'utf-8' - return unless contains_author?(xml) + account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS)) - username = xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:name', xmlns: TagManager::XMLNS).content - url = xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:uri', xmlns: TagManager::XMLNS).content - domain = Addressable::URI.parse(url).normalize.host - account = Account.find_by(username: username, domain: domain) - - if account.nil? - account = follow_remote_account_service.call("#{username}@#{domain}") - end - - return if account.suspended? + return if account.nil? || account.suspended? if salmon.verify(envelope, account.keypair) RemoteProfileUpdateWorker.perform_async(account.id, body.force_encoding('UTF-8'), true) @@ -59,10 +52,6 @@ class ProcessInteractionService < BaseService private - def contains_author?(xml) - !(xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:name', xmlns: TagManager::XMLNS).nil? || xml.at_xpath('/xmlns:entry/xmlns:author/xmlns:uri', xmlns: TagManager::XMLNS).nil?) - end - def mentions_account?(xml, account) xml.xpath('/xmlns:entry/xmlns:link[@rel="mentioned"]', xmlns: TagManager::XMLNS).each { |mention_link| return true if [TagManager.instance.uri_for(account), TagManager.instance.url_for(account)].include?(mention_link.attribute('href').value) } false @@ -144,16 +133,4 @@ class ProcessInteractionService < BaseService def salmon @salmon ||= OStatus2::Salmon.new end - - def follow_remote_account_service - @follow_remote_account_service ||= FollowRemoteAccountService.new - end - - def process_feed_service - @process_feed_service ||= ProcessFeedService.new - end - - def remove_status_service - @remove_status_service ||= RemoveStatusService.new - end end diff --git a/app/services/verify_salmon_service.rb b/app/services/verify_salmon_service.rb new file mode 100644 index 000000000..cd674837d --- /dev/null +++ b/app/services/verify_salmon_service.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +class VerifySalmonService < BaseService + include AuthorExtractor + + def call(payload) + body = salmon.unpack(payload) + + xml = Nokogiri::XML(body) + xml.encoding = 'utf-8' + + account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS)) + + if account.nil? + false + else + salmon.verify(payload, account.keypair) + end + end + + private + + def salmon + @salmon ||= OStatus2::Salmon.new + end +end diff --git a/spec/controllers/api/subscriptions_controller_spec.rb b/spec/controllers/api/subscriptions_controller_spec.rb index 44841176a..97e36420d 100644 --- a/spec/controllers/api/subscriptions_controller_spec.rb +++ b/spec/controllers/api/subscriptions_controller_spec.rb @@ -45,8 +45,8 @@ RSpec.describe Api::SubscriptionsController, type: :controller do post :update, params: { id: account.id } end - it 'returns http created' do - expect(response).to have_http_status(:created) + it 'returns http success' do + expect(response).to have_http_status(:success) end it 'creates statuses for feed' do From 46a1e16f214a8ff7c644afe552eb527b3dbe649e Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 6 May 2017 13:05:03 +0200 Subject: [PATCH 006/274] Fix Scheduler::SubscriptionsScheduler (#2834) * Fix Scheduler::SubscriptionsScheduler, add worker test for it * Change production log level of Sidekiq to "warn" instead of "info" --- app/workers/application_worker.rb | 7 ------- app/workers/distribution_worker.rb | 4 ++-- .../pubsubhubbub/confirmation_worker.rb | 2 +- app/workers/pubsubhubbub/subscribe_worker.rb | 2 +- .../scheduler/subscriptions_scheduler.rb | 4 ++-- config/environments/production.rb | 1 + .../scheduler/subscriptions_scheduler_spec.rb | 19 +++++++++++++++++++ 7 files changed, 26 insertions(+), 13 deletions(-) delete mode 100644 app/workers/application_worker.rb create mode 100644 spec/workers/scheduler/subscriptions_scheduler_spec.rb diff --git a/app/workers/application_worker.rb b/app/workers/application_worker.rb deleted file mode 100644 index 436f24763..000000000 --- a/app/workers/application_worker.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -class ApplicationWorker - def info(message) - Rails.logger.info("#{self.class.name} - #{message}") - end -end diff --git a/app/workers/distribution_worker.rb b/app/workers/distribution_worker.rb index f7953689b..f423d43ae 100644 --- a/app/workers/distribution_worker.rb +++ b/app/workers/distribution_worker.rb @@ -1,11 +1,11 @@ # frozen_string_literal: true -class DistributionWorker < ApplicationWorker +class DistributionWorker include Sidekiq::Worker def perform(status_id) FanOutOnWriteService.new.call(Status.find(status_id)) rescue ActiveRecord::RecordNotFound - info("Couldn't find the status") + true end end diff --git a/app/workers/pubsubhubbub/confirmation_worker.rb b/app/workers/pubsubhubbub/confirmation_worker.rb index 868fd9f97..b02dd3f55 100644 --- a/app/workers/pubsubhubbub/confirmation_worker.rb +++ b/app/workers/pubsubhubbub/confirmation_worker.rb @@ -25,7 +25,7 @@ class Pubsubhubbub::ConfirmationWorker body = response.body.to_s - Rails.logger.debug "Confirming PuSH subscription for #{subscription.callback_url} with challenge #{challenge}: #{body}" + logger.debug "Confirming PuSH subscription for #{subscription.callback_url} with challenge #{challenge}: #{body}" if mode == 'subscribe' && body == challenge subscription.save! diff --git a/app/workers/pubsubhubbub/subscribe_worker.rb b/app/workers/pubsubhubbub/subscribe_worker.rb index 0c4111a8c..5b0956b6b 100644 --- a/app/workers/pubsubhubbub/subscribe_worker.rb +++ b/app/workers/pubsubhubbub/subscribe_worker.rb @@ -7,7 +7,7 @@ class Pubsubhubbub::SubscribeWorker def perform(account_id) account = Account.find(account_id) - Rails.logger.debug "PuSH re-subscribing to #{account.acct}" + logger.debug "PuSH re-subscribing to #{account.acct}" ::SubscribeService.new.call(account) end end diff --git a/app/workers/scheduler/subscriptions_scheduler.rb b/app/workers/scheduler/subscriptions_scheduler.rb index 03622e95b..3ea3ad2b8 100644 --- a/app/workers/scheduler/subscriptions_scheduler.rb +++ b/app/workers/scheduler/subscriptions_scheduler.rb @@ -5,9 +5,9 @@ class Scheduler::SubscriptionsScheduler include Sidekiq::Worker def perform - Rails.logger.debug 'Queueing PuSH re-subscriptions' + logger.info 'Queueing PuSH re-subscriptions' - expiring_accounts.pluck(:id) do |id| + expiring_accounts.pluck(:id).each do |id| Pubsubhubbub::SubscribeWorker.perform_async(id) end end diff --git a/config/environments/production.rb b/config/environments/production.rb index fde69dc70..5a508a6dc 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -109,6 +109,7 @@ Rails.application.configure do config.to_prepare do StatsD.backend = StatsD::Instrument::Backends::NullBackend.new if ENV['STATSD_ADDR'].blank? + Sidekiq::Logging.logger.level = Logger::WARN end config.action_dispatch.default_headers = { diff --git a/spec/workers/scheduler/subscriptions_scheduler_spec.rb b/spec/workers/scheduler/subscriptions_scheduler_spec.rb new file mode 100644 index 000000000..a7d1046de --- /dev/null +++ b/spec/workers/scheduler/subscriptions_scheduler_spec.rb @@ -0,0 +1,19 @@ +require 'rails_helper' + +describe Scheduler::SubscriptionsScheduler do + subject { Scheduler::SubscriptionsScheduler.new } + + let!(:expiring_account1) { Fabricate(:account, subscription_expires_at: 20.minutes.from_now, domain: 'example.com', followers_count: 1, hub_url: 'http://hub.example.com') } + let!(:expiring_account2) { Fabricate(:account, subscription_expires_at: 4.hours.from_now, domain: 'example.org', followers_count: 1, hub_url: 'http://hub.example.org') } + + before do + stub_request(:post, 'http://hub.example.com/').to_return(status: 202) + stub_request(:post, 'http://hub.example.org/').to_return(status: 202) + end + + it 're-subscribes for all expiring accounts' do + subject.perform + expect(a_request(:post, 'http://hub.example.com/')).to have_been_made.once + expect(a_request(:post, 'http://hub.example.org/')).to have_been_made.once + end +end From a0f7453c6eeb2ad36a55779aa509c0a303c51f50 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 6 May 2017 13:53:43 +0200 Subject: [PATCH 007/274] Bump version to 1.3.3 --- lib/mastodon/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 46ba96b2a..4b7d90337 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 2 + 3 end def pre From d0fb7bac2f71c32816177e2dc5be8f64af3f6d8b Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Sat, 17 Jun 2017 00:07:50 -0500 Subject: [PATCH 008/274] Not sure why this is different --- app/workers/pubsubhubbub/delivery_worker.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/workers/pubsubhubbub/delivery_worker.rb b/app/workers/pubsubhubbub/delivery_worker.rb index 50aeee824..981838f33 100644 --- a/app/workers/pubsubhubbub/delivery_worker.rb +++ b/app/workers/pubsubhubbub/delivery_worker.rb @@ -81,12 +81,4 @@ class Pubsubhubbub::DeliveryWorker def response_successful? payload_delivery.code > 199 && payload_delivery.code < 300 end - - def response_failed_permanently?(response) - response.code > 299 && response.code < 500 && response.code != 429 - end - - def response_successful?(response) - response.code > 199 && response.code < 300 - end end From 2870fd0754f67b12f764128929fa4927709b3158 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Tue, 5 Sep 2017 13:58:47 -0500 Subject: [PATCH 009/274] Change colors! Yay! --- app/javascript/images/background-photo.jpg | Bin 264344 -> 296401 bytes app/javascript/styles/variables.scss | 20 ++++++++++---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/javascript/images/background-photo.jpg b/app/javascript/images/background-photo.jpg index 03341b8ec5b9f682e5248e4782135d626b267302..8cd4ae41284e6bde034a4697766009c3ca2c0bd4 100644 GIT binary patch literal 296401 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

``o?hXxBmL5x!2FQn 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%0DJRG#G4!1Ml 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 PPGpK*!mlf-{eAmCo-DMi diff --git a/app/javascript/styles/variables.scss b/app/javascript/styles/variables.scss index 8362096e1..bdc2418bf 100644 --- a/app/javascript/styles/variables.scss +++ b/app/javascript/styles/variables.scss @@ -1,16 +1,16 @@ // Commonly used web colors -$black: #000000; // Black -$white: #ffffff; // White -$success-green: #79bd9a; // Padua -$error-red: #df405a; // Cerise -$warning-red: #ff5050; // Sunset Orange -$gold-star: #ca8f04; // Dark Goldenrod +$black: #3b3633; // Black +$white: #ebe9e8; // White +$success-green: #3e935b; // Padua +$error-red: #a3360a; // Cerise +$warning-red: #f9dfb6; // Sunset Orange +$gold-star: #faa41a; // Dark Goldenrod // Values from the classic Mastodon UI -$classic-base-color: #282c37; // Midnight Express -$classic-primary-color: #9baec8; // Echo Blue -$classic-secondary-color: #d9e1e8; // Pattens Blue -$classic-highlight-color: #2b90d9; // Summer Sky +$classic-base-color: #49423e; // Midnight Express +$classic-primary-color: #c9c7c5; // Echo Blue +$classic-secondary-color: #ebe9e8; // Pattens Blue +$classic-highlight-color: #48b9c7; // Summer Sky // Variables for defaults in UI $base-shadow-color: $black !default; From 43c9e419f0ec509b11c17e481a8c8032c8987d09 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Tue, 5 Sep 2017 14:55:18 -0500 Subject: [PATCH 010/274] Don't duplicate colors, makes bad profile pages --- app/javascript/styles/variables.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/variables.scss b/app/javascript/styles/variables.scss index 48c904e03..2f5021dc9 100644 --- a/app/javascript/styles/variables.scss +++ b/app/javascript/styles/variables.scss @@ -1,6 +1,6 @@ // Commonly used web colors $black: #3b3633; // Black -$white: #ebe9e8; // White +$white: #fafafa; // White $success-green: #3e935b; // Padua $error-red: #a3360a; // Cerise $warning-red: #f9dfb6; // Sunset Orange From 6e4c95fa5e5af82d341ad1d767ac90d696e3a77c Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Sun, 10 Sep 2017 16:16:48 -0500 Subject: [PATCH 011/274] Change color of getting started icon --- .../images/mastodon-getting-started.png | Bin 34539 -> 32744 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/app/javascript/images/mastodon-getting-started.png b/app/javascript/images/mastodon-getting-started.png index e05dd493fe806f3aeda546b18080a9575b10aed7..d3d91f56471d7742ae9ed4074a5cee48bc0dccff 100644 GIT binary patch literal 32744 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 literal 34539 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%0Arc|r&DC@j0pAQE7yV9T$8x=q-T1FG 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

Qy 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 Date: Sun, 17 Sep 2017 16:52:25 -0500 Subject: [PATCH 012/274] Up file upload limit --- app/models/media_attachment.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index d913e7372..891a7d850 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -52,7 +52,7 @@ class MediaAttachment < ApplicationRecord include Remotable validates_attachment_content_type :file, content_type: IMAGE_MIME_TYPES + VIDEO_MIME_TYPES - validates_attachment_size :file, less_than: 8.megabytes + validates_attachment_size :file, less_than: 64.megabytes validates :account, presence: true From 58661dea93b2adafdeefb011514607ab91f9aeb5 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Sun, 17 Sep 2017 17:01:29 -0500 Subject: [PATCH 013/274] Up timeout duration --- config/initializers/timeout.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/timeout.rb b/config/initializers/timeout.rb index de87fd906..a45743e71 100644 --- a/config/initializers/timeout.rb +++ b/config/initializers/timeout.rb @@ -2,5 +2,5 @@ Rack::Timeout::Logger.disable Rack::Timeout.service_timeout = false if Rails.env.production? - Rack::Timeout.service_timeout = 90 + Rack::Timeout.service_timeout = 300 end From 0d34759a0bf47b60413d1257eb8b58f108da5ea0 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Thu, 21 Sep 2017 22:27:28 -0500 Subject: [PATCH 014/274] Inspired by awoo.space --- .../features/compose/components/emoji_picker_dropdown.js | 4 ++-- app/javascript/packs/custom.js | 1 + app/javascript/styles/custom.scss | 5 +++++ config/settings.yml | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 app/javascript/packs/custom.js create mode 100644 app/javascript/styles/custom.scss diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js index 9d05b7a34..bcfe74449 100644 --- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js +++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js @@ -127,8 +127,8 @@ export default class EmojiPickerDropdown extends React.PureComponent { 🙂 diff --git a/app/javascript/packs/custom.js b/app/javascript/packs/custom.js new file mode 100644 index 000000000..4db2964f6 --- /dev/null +++ b/app/javascript/packs/custom.js @@ -0,0 +1 @@ +require('../styles/custom.scss'); diff --git a/app/javascript/styles/custom.scss b/app/javascript/styles/custom.scss new file mode 100644 index 000000000..2c03e5272 --- /dev/null +++ b/app/javascript/styles/custom.scss @@ -0,0 +1,5 @@ +@import 'application'; + +.column { + flex-grow: 1 !important; +} diff --git a/config/settings.yml b/config/settings.yml index ba63afa92..c135d9675 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -7,7 +7,7 @@ # For more information, see docs/Running-Mastodon/Administration-guide.md # defaults: &defaults - site_title: Mastodon + site_title: asonix.dog site_description: '' site_extended_description: '' site_terms: '' From b6b2be18db8603ade80307bc35e817cc8bdb7cfc Mon Sep 17 00:00:00 2001 From: unarist Date: Tue, 19 Sep 2017 23:03:45 +0900 Subject: [PATCH 015/274] Hide sensitive image in default on the public pages (#5009) Additionally, this restores previous background / text color for media spoiler. --- app/javascript/styles/stream_entries.scss | 13 +++++++++++++ app/views/stream_entries/_detailed_status.html.haml | 2 +- app/views/stream_entries/_simple_status.html.haml | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/javascript/styles/stream_entries.scss b/app/javascript/styles/stream_entries.scss index ba6d89107..4f323a378 100644 --- a/app/javascript/styles/stream_entries.scss +++ b/app/javascript/styles/stream_entries.scss @@ -243,6 +243,19 @@ } } + .media-spoiler { + background: $ui-primary-color; + color: $white; + transition: all 100ms linear; + + &:hover, + &:active, + &:focus { + background: darken($ui-primary-color, 5%); + color: unset; + } + } + .pre-header { padding: 14px 0; padding-left: (48px + 14px * 2); diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml index dd9456260..c72be071f 100644 --- a/app/views/stream_entries/_detailed_status.html.haml +++ b/app/views/stream_entries/_detailed_status.html.haml @@ -24,7 +24,7 @@ - video = status.media_attachments.first %div{ data: { component: 'Video', props: Oj.dump(src: video.file.url(:original), preview: video.file.url(:small), sensitive: status.sensitive?, width: 670, height: 380) }} - else - %div{ data: { component: 'MediaGallery', props: Oj.dump(height: 380, 'autoPlayGif': current_account&.user&.setting_auto_play_gif, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }) }} + %div{ data: { component: 'MediaGallery', props: Oj.dump(height: 380, sensitive: status.sensitive?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }) }} - elsif status.preview_cards.first %div{ data: { component: 'Card', props: Oj.dump('maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_cards.first, serializer: REST::PreviewCardSerializer).as_json) }} diff --git a/app/views/stream_entries/_simple_status.html.haml b/app/views/stream_entries/_simple_status.html.haml index 55aa97f32..218cdecc1 100644 --- a/app/views/stream_entries/_simple_status.html.haml +++ b/app/views/stream_entries/_simple_status.html.haml @@ -25,4 +25,4 @@ - video = status.media_attachments.first %div{ data: { component: 'Video', props: Oj.dump(src: video.file.url(:original), preview: video.file.url(:small), sensitive: status.sensitive?, width: 610, height: 343) }} - else - %div{ data: { component: 'MediaGallery', props: Oj.dump(height: 343, 'autoPlayGif': current_account&.user&.setting_auto_play_gif, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }) }} + %div{ data: { component: 'MediaGallery', props: Oj.dump(height: 343, sensitive: status.sensitive?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }) }} From ca1721a7fa496d48745b5c41209c8cc5467c1ade Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Tue, 10 Oct 2017 17:05:46 -0500 Subject: [PATCH 016/274] Remove custom stuff, fix emojo --- .../features/compose/components/emoji_picker_dropdown.js | 2 +- app/javascript/packs/custom.js | 1 - app/javascript/styles/custom.scss | 5 ----- 3 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 app/javascript/packs/custom.js delete mode 100644 app/javascript/styles/custom.scss diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js index e4528f1a7..ce2d2ef95 100644 --- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js +++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js @@ -354,7 +354,7 @@ export default class EmojiPickerDropdown extends React.PureComponent {

🐺 diff --git a/app/javascript/packs/custom.js b/app/javascript/packs/custom.js deleted file mode 100644 index 4db2964f6..000000000 --- a/app/javascript/packs/custom.js +++ /dev/null @@ -1 +0,0 @@ -require('../styles/custom.scss'); diff --git a/app/javascript/styles/custom.scss b/app/javascript/styles/custom.scss deleted file mode 100644 index 2c03e5272..000000000 --- a/app/javascript/styles/custom.scss +++ /dev/null @@ -1,5 +0,0 @@ -@import 'application'; - -.column { - flex-grow: 1 !important; -} From fd25ded7358532ae565105ea1064818914883a8b Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Wed, 15 Nov 2017 13:50:35 -0600 Subject: [PATCH 017/274] Icons --- public/android-chrome-192x192.png | Bin 13546 -> 29428 bytes public/apple-touch-icon.png | Bin 6129 -> 29541 bytes public/favicon.ico | Bin 9086 -> 8522 bytes public/mstile-150x150.png | Bin 5621 -> 21709 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png index 166cabdaa73725867f56f682949109c79348bd65..9665a92f1e395793cbab7abd8dc98bfdc50e431a 100644 GIT binary patch literal 29428 zcma%CQ*9>Z;Rc@7nux zxPqKG95gmG5D*ZYq=bmlPv7@ngZ%Y#SK6?G`00KbNQ;XAegAjmb(bdoj6m5*XgC4^ z!Jz!tfPpfyFn-5d)2Lgq~hKfr{rKgwZo7&k)D&3g?}WZ% z5HZI&OcA=r%GG>^mtsH3;u|!JlI~sUgn$D2XBM-(9vKU&ZTA$dim;0e2G=#3PT9J2 z_*<-}uX#~HsEk!0=iymEJ^hcRKf!BxZz6Lu2;8?J4z;9!WvF-u%TJW34hdEkzRIZo zHoST%*s@9!)9;jlNKlAzbU$mXAzYIaLMS>%FF0QtjI+8D+aHNSp#laaMmQed8k?>? zQ-o>-H6#&>WVh@5ZRee7+rRKX`a!HF|Gd0YfweSw0`k8kAaApUbYFsg2ia@T2*_aL z4>FuBgxt1fRCHL-keN>oF~G^J4>VX?o!+b$AlCeI`sPoDh#Q0H)FDzp4L-Ob9ChUx zpFbuzwEljKOj@E(e}1P7(#v~fsr~-oCVk_AgkV9IOssHbZ#Wdr?PrSy?~JWbm{UR1 z{&#bN-<6T`Se0VUfAZ+|HL!o%6cS{*B`1_w3rbduhZP0)jUgIFUr|w!nIcM@O{!mH zUv#f!`8o=dmo>1JTN?*0D*DeEIncZ7_OEag9;ct~2vww;xvwMrVWjF*AuGBWK0@v1 z!M6EoYvLV9@ESIM2KC8B>d-F_#E6Ex=lKM-6vIR&I0-U^Afdi}vYp35^EC*#MK9Y4 zhA%FvOWU_#E~iz>zPRM7Q>=^6`t9@1c^BM}JrdG|^6$!k^4GedLd*@Og`e&BHjQyS zYd${Z^MTau6PFE-9q@~d`9f`p|Ha4;{|7Qy#VO3R=UsltbKR`s2I+yS<~dm{A9}!Kv87bGDSKqO1SSd0r z#r{Xj{-?X+dqhA&{oQRp-En=wy71_xKfnIGfnKi0T0X>J5ZF zMnqf(t07^XIHUJ4fvPVL%N92V{`$ewD>?8RL-X?36Z^gK~&$Q3L#FyPetU*U|aK$9%66rb2n;4XB=a!chz= zaIBD`1X+AjnXWJ03{NBf@xE~=G9&CdF)}1Otazv^e8#P1@G@#Q6@Of~oKl9H zkW<8R^ESdr+Mt~s6#jho(b{sVM*RbZlk*t(hZ{ZFkiffs za-#V$y_&)kcK93IFuRW!1)iT6PBxvsE(E4eJp&2U{DQR!Xjh5ZR5I(Id(N_e_udp zB6N$b$A1oW&LBZ~nw8xk-Ibe7JS=%@cKzP@lPjn=4b9`f^O{9?dcsiqabpSF%G%gP z9yLqSaO_yZ9<47KWS5^Jjsi=8t4iB@*3h;6Gdm>`2{LV)&3_X@d_4!y^jVf}QHBRW ze~}w!3@wh+DDlH9MLoFGz4zNP{&k0sB`*s*p|zo&LUK6P0*^>H0tgGr{h8-BK$7OtFpyLR3n5cfNxmbi{Js93BSCRnMjfxvzkR{= zIMUk6R(+|fhd_7*=l0o?v+HlAS9*pWQP2)WFe)eoVZPq`Xceb`T0~;*X~VzG z?_K*f_^YC-BEJv|dL7w6h+XM6&ajxUHVLD==B{d!q;Jvj}?{LBqr;rpN`?BiAll47GoGMhCB4=L!cL2?q!8d zb#2rpMVK6}5!+t(lVIN1(T6!%RYge&yFs$EapC&XEZU_-E#cJ!U$i}TL@|cFWWn3@ z)-Jp^&Rm(>MST=yRJVD*|2PAckeQz{)+w|fBJj(v?g7+IJWRk51B{r)9lyWOroP}) zR9o!^TPg@{)_cUsN7_gPa^U&%K&=5eYZ1zF4&e}YyvEv;mHBJ+x)nFg7P4u2|2C{BenhGi^MoT%P5I{Z zRl7GyPg=6Ca!%o>zs`vZ0xqWa4wlYS*W{M9weD&LLDnY>rYTA!3ghbClc%47-RG`1 z|12lHzO^7BMtt?QyOwFrK4i@xTY|w4k+$q6cJC`fh}V-I@02J9+hCi%H}p7N_dgKN zHyA&&axN*T_(4AI>)zBY=4sT8kKYv`F$HibNr%iE!P#td0-Kk#GwE_u_FL8gZNx7jprG9%!bH#Q~B1#JXaCkT$Y^<&A^|Lhu? zCllZ$8q)KOFh76E7j)x6=F`5&%7}$Z#=y>RJ4DqSv6p^lV#&-kxI)Bwy~avBXX^v1 zWB2OVbRSI}P5e|u6)+Vv77+<)4S1ewzY~S!`N9k}NJHK@p9WAq_G_^hBI?&);zk-=q z?A}3}P=_0*t0cdyd{+`QnB7NXhP!ReuAQQC_k7PjU)42ofRb@DI*SbGwhahOFZhpLo`rSv-B_p#)2Jm6i+@ z!|bIST6|_$!};7(LFKW){dg6sHw_KGLA$lZWhuu6{#e;!l`W!V@#*Ls%)5QbjzfQu zQ7?fFPxBovrkO$#TW$+llZX&mK|^(aw2WZrB*bFy&-nYG=x9`#}fW)3Rbz){3vzF zhj&JHf7*8Nq0ew)nA#}a`v=ZCjQ^_uJ!P-ZXEUX>=%y1|4>W0}7X*^0#i>pBi1;X!U zsuKhffCltwDo^O|r#3DGvK~LA^hzg2duUh0D!Cn&j3ES>$5K__z~*OBy81l!+4a`9 z%%~jh9u0>(IaJ!|%80yxb-@vujvFXI=c!{fOWz|cs;;1X)=sMa-4$RgT30q8y%2CE z{0?>fd6*P{EZ_O?;C7;{nYVuriEJJ!vSxA*@kN09uB7S9SUrrPOeJ+BEv1mO%HO?8 zBQTQj(1I%t06auFtAIVksxNv_h(dDxlKBA}iK6WBEdi4*!Q|8l1O8H7-|*wFOKGQE zo~QyHx5W%Z==m=jCjenQ>KkAooTL1N0q7mS{U={_#}5A^nt*1_YE_3Qt$@U){t(fU zV@gU=9zihmTmb8mdOFUN&nGS*LTq{}QTII#opVCK=zOFRPXl+S`%(enS0p;JXfvq> zim@gM(yOZ;1^_u%VR>;}O}&H$`!!Kn8*u%n$wm;#bclC2fu$|Q0RIe1r*8? zfz^N6@N|GIJnFQ>4=^d=`kq3`^}f;4;0)M&&SJ`V4Q{4BU4^U5jAKd5Jg&rElY}PIWl3I zeZ*>d#8K9)sMFOqPfkq`BIxve!qa)%;*ZD0;_TNV=*W3ZvcUlMN3O5s-&N}!@2I$Rd+I{ z`%W6j9sP<8VMozHbS$F%Srrqe@NCHdsNF3Ej@}+C(Kht*VhY~F!M`ek+U21m6%4$k zF}Ek%J~2PZuYvWq<0H`g7e0s%D{~207k;uMgsZX^x*blR`#C+Z3dZTsBK*8jjUx0r zniw*C%s$^kp8Pb}Fgo}@xT=oFD`}(8;UqipgT`-8qJbCR{m>*jKadqMF6L@Ne{qz1 zA-ItQc#2M?!VPO3QA+r7+RCThXV2B!&)S8CW3tvHefWV~%rkNF(9ts&(idm&+!_Vd zvTs$i%8(E0V8P_A_zi3V;0M@DNN}sutw5u-e0pFlz8mu?m9qlsiZrp8d;fGr%Uqf} z<7XKxs$Gs=?c%i-lJegR;pA2_mKSSc3Gm}hfk0guLMycnB^0uo z711IUXY?LB+@`y^pe<@geOI%tpd`sd*GQZo9{DuJ5^_#5mr!EM2~zaHy{W>z zUsQPF&(qZ8m}eZ)KV(}4-P7@^DXFcy?&FD06e$Rl8ZVH%f_P)E1!*x`ha#_jK=``O zAD`Ob{@UxTAf-$mTzLqL`M1LZY3%T95^vPEl3j051CXFyRd1>jamYT$3y;N;-c%?s z8i-QKflMqTZ+1oBf)srP2zSpj;McmGd?qKl(C$fOtTK|SLxQG~Q2sU?rY}w^5cDVY ze32~6DWW{5pB;C%RQE|mp5w|f=>8c2X=U7T8E6Ba=?+$`+*c1$K=*vxc==6crR5 zp`f#V%eG%vM(X{5 zNcQ(D+!>7!jLswp(-u{Z3&*mlLl^IKI)37kPvlVyX|*>w1@|JeP}l1pK5ao|FmJ`k zJCN+de|$nZ!B_n(;EyzIZ&&hDjC$F%WTmLOjNw=5nlFv2{L0jfJ;?6AAB`Hxm!d_o z%ycmz{Y%2Yz0kT=ZZ#-LEX&{v2B2yX;daj`-g4&(jv8d_sL8Qz5n7ez6WU*eA`(8!4c6PwSP&*QHjurAaK*DJ?6wW!?=VGqES?BxQHps6 z8J&H+pZ2Efx;{d)($o<%#)Rj6s1>pOB&4zRIW7WHkHb+v+HwpRn4&Vv(RiWoar4-n zEq1wQlytmTYgF}{PfW+uH<`BHlmjv-H zLVbHxYtZ;5yGUcGh#uIyH2T#oHIbEe!leK_OF#b@wuk;4xMO&pA$@AaIPy$y^Rg&X zCS3BWw~Ks-b};Di^NSrJ?|B>uJ!4(#?A^(X!MT)?7$S%Tz&C?hUa{yLy=;s?ivUK;j$*o(M3&f=Uo{hE-w&54uuj_h<}=4E$7( zNswHt>!-Zc9sIle`ed7$A94Ps$Y}3XR|YJAWY-X(OvYzjGAaZSA}dkeRF*{u0Kg&$ z*P&Q3^drde7SJu^NXFF+*Jet^>X3G^INua%vOrH zs#Ngijn|5Zh_b6g3GJ+Ey*`(y&dMff^`yzC~qci`=WZ?y*~pEd=M7FVuBQg;=>jj!qi_Qa#|Y5%YR zWlV*VVpZdkzxu|8SmLu!3%ol|d@C`7@;W@@Yr6bnOY$G9MFJe1<+*m2=Sc0Ux-+p; zv(WFc7(R@qW$$Av%{qmGj62bvv=RW;9yfZD*My0(GA_!d-Ck42l$IPv_h zxo+l|{S?FX7!hS{TZYX+C(^7-W{yS10q@wWOtkZ2OKKhM;sR0;cTxe;i`)l=g^+0h z7JqX|TJeJExaK5eo(?_H>ePKaa~07!Zi5A0SO8M?53Q>lBZ0yp(z{=Pd_-HmiNwfs z|1|Slg5mu-xUcGbPYjZxq0sP5mrUm7h+7>~CO$Ui4>%=K^nqosw=p{sa0ON;lqd9K z$IL-hKP!wg^T!KBv}+m7v&WvSrnDKiovj=GAu9}V`HIY?7ymY4_heFNttEeGnhw{> z2uf{E+U*890Il9akqSVje>OQNB81&hu`^H3k3MN{dPlnOlr>d;*_NDB+PO$u?qpc- zRVF*?Cur_3XU~z!bcI(>32*)bRX()?p|;v`_Wrr0I^0lw`H7pj?q7^GpPREsR$dfj z95v8J_?1)jUrH11G}(xbpH*3Ux1wL=NRH;DSf61p4}9H0`6 z6}kuQ2jV;TW5k*uV0am>C1DsVFy z*E-u@Bz%h)@88!mu}TwB^kdmC>;y%jX@i-Zd;$lf9~%Aq2qZj~ z;5WYl;#L`~Y2k*NP!EN`hL1hqQkGvD@XS$CE83!ogzYV7V#ZzmES;t=Yq_2Ft#;*V z%qt9p6a%WvDD#Q;h<1=(cp_ks4=yYU58TBPkR{Fi#e7Z5k^{I$yd;Z5-PZD5he+dH z>d0toZsgW<%Il{Fv$ZnKPB9A#>7|(PDVCO_+5g1-Tgjr+J{0vRa|h94gri|0f*zZ6 zo9+a88AKW&LnAbX$H#}Gra$6ZwwzNr%|`A_4Po^NkyQ#I-AUIjO--6xvvt@plGoX- zt))ERWv|X_>XR3Z7clNUuZx zcsYzlgk3GY^@OC3ok6y$j_{GaDbS|#CKEChGkd9HJ*oGVh}qK{x&5y_Vk&{Qwyc2& z3jqUl0B=+pg z9*=j_HtStM8A|lU;1$y86Ol9r1{v($_^$87_BjmNQe||H1#hXy)U`PdA_rRfhn@0{ zr;wS=ASXWj6{CSyFb7sq6l6i46_J7T1`K(W0arwc0e(_^)ZR`u@%r-9%`m`$_LuNXk>&x|3HDSYOIxLTST3%F}LVb5aaJe-yoSJt7`AI`K)B?Xx5NYk9P!0UC z4Z8Y4czS?(^wLBo#_2*44MAKPQ_ZC@JPwuB|G~{r%=BlWzC4wX?~n;G;^)a! z$_weI=Xkz*=7Zw{GxsAs6+%_DFr#eSdmz60R+m-9s)_&>Z4#wTKWlDIXhJ*t(_-~O zDDG>@!Fg>(8PhX82J=2gPr3Uq>q@gKSVhG$ZB>NU67|sr?KRh~S7}h`fc&(=s7Lkl;c+) zN^rgHnPm+8o1|_q1fefIlwc2}@n`1!^-z8EzANGjgGc2k|^%Sqr}F7Re{n4)tYJ8JBnM<4Jzl+ZnUZAE^MCIIDaW1%4k>U zuiCxH5D>V(YgR-)POeR>VVq;8a5LnwTPP}W+{>|=FCMAn258o!`3|yiEub|$VXfl- zqROW%TJ$Y>Er1{H*jT#Y9$@-r$xZF}r?%)~#1D74RaNqf#|AXm5s3;#7VU)>dcH{O zJs}g!p*o=AV7rgrn4?NVMNCkj{~9Uv(TPK}FF}f6I-ANO!nt+K_7{1%qsR@n?;Rd= z1oa*HhKfjw>tQz%dXw8%sEr%a1;q}s4M%XD zi9h%Oh5oE;okWQ#=_~L6~x{P=Y;|MXxzr!h&QKyQ9ZYi3z5*k zRsX$GLRm8N=}o$nX|+e&72%H7+vDN@7R$@D#>M%+g+oNpx(CgdVZicUheu7C&36JI z>h^Ww+Adp|5Ja%Sd6+=G58SHLtOb{{41rKL_S8f7D#QYUMXx@_qcpjYf9M$aBal)D zSwH@C^GXbfWF~wuIQAA)K#d9X7q4=?vXByMEO#eO`q_}#fB}OAqWtR0%*T=x=S)=# zqzNfmxo!&-AbW*|@D?2U^(NN~wE2O$04mZ?zVLo$@}V_HND=i}nzC%*vlkIsC=Az# zZ}WLy*RjDzUGB|l#?oQ0e&pt}ERH+fU~qnxYd;By6MF7=26|c$c*Mlc9Yj#d0$pE| zY2Es8&qi>rv#wrXuCne&8JjzH5h$Pp|WopHYO2&<4z|<7SY{$#&?ecpx!|4y_tNMO#uC#^i6QiF{3xYry zHr#p3g3kp|eUYra+Xcg}pOl5$ZbM|D_etbLch-beOT4vL`VO7cz$?+}2|gGGsaZPd z`e_XCnQCvg)|C%GTJz)$xR8dI1-7}tpm$R)*U(jIkEj5wGX5=H8B-KI?iKfP=%S6? zPM@NbG>O$lTLv7Cs=le%dQc>__7MX2|7ro+&QWv^;%$9G4xNKv3h|uSdnG^DrX|*$ zg10tPm=+01M$}X9hu;mjC`lVp1jMg%vz+4WL*ocXA%0;^BVv*10wFNyw2?~JdgDY? zED%g?;!|BHqq6|#v}9eN)(s!(B$%6Ojx{M*a@g3rtW0X>ez|TvzWa(#7c`r7U`(>q z)1geVAPEuSQkf3_vpp{K{W5G?fXh0Sq`yfM5u8Y%%-{z#2MY`w&v`6LJ4>GaL=9?Vf#bkr>;BFVj@XF zf#S=#O5E+n#F!M6q0qO+LS@>;KBk2t!$H`lmO1Y|S*1bHpvejofEZx~lgT5zd+&(eA!| z0WyuQrz<7s;6AQO*TV)5njK1{ypgvSI4{E_^!ex5`3iB#G#JX-+VRbGuN(2!=~bP( z_{7GnJRaM*4P9(msU_L`97){6vH*a~CD&Mkapasc`!f<%bxD&AD`>YT74%sW#w!wW z#JsEDQ==zGPJ?90C9Rb*nqXgP0t@M3C7WWm#lBE{(W1xGD=~V~J%(tjNQccdxr`Q5 z0gi98{SEGq)Agr7Qcodv~MlC96d`RhBz3ZQy5=1^E&2Tih zp&6YQO1L#fKxrpU_m)5UZ1rRG!xdMS)O&@y?z6Z0Rj|bIYou5N11tdY1ef9WS(`mk zo_Al-cGU=!F8G3&qDTsx3IIG-oFZPL!Sfks!*x556nUH~)>MmJy0#;omEAi^`SRAi zB^SB2MggEPRsn$f+2! zX4R2to!gswxW1ho4$5&&U-HVSw&7@OQ&J1A?=L1CP1~C}-&4>*j;`&E@}FVrE;5)~ zu1^nHRu%}uEV@=lx+zTlZ#XA1!5u$5^PwoBUfL!H$r1{3G|sFhfU7H797L}X15zC1&eVR|E5 zmcanR3|PP>R`VEgQ9)iAc16XHHx~ZrY%mfM2LIIPHd(#O7_Ahe*fb#|7d%FeMb0C` zoUFI#=^Ohr=*hXBXkuJVKt)!uHv)3(amvls)>?n*x_?y`rrYIL)|spgfuYma=-uu`Ox14;{jE{k-U;vhWIVrq^*&?Q z;SbFRVxqU1Ht`G&Kn2M!6X{&%?0hEUg1;u>WfG7+M)ZtnX|xt53Geq&-G2I-PuJ!g zGkoAV-Uj7h@S%;uJqAae7G7M^;{00JhaHk37NqMO+!s(uZ!kaf!ng6)Ev^z6tRqdK zW3=L=g5k*(d_KJ*72EMZ^!Vi|mnF+QPc>F08!5JbvE>~no4F+O${rA0Y~`~)>i)Rf zYie%Y4-Rp!Bs4~GV$R(kQQ2x5>^PfaGLwDo@a&euk*p>a08WOxiD6nuTxZQm2Kp;N ztEJjxv4lLw>jFxL+a=EV`VDf+ZU`+wBdoWejItuc8hZ%BQxf(m9`lTZb56LbG_WOc zlylW9q9&izw8Nmu3C=jy{^JjU(pnOohVW|wE5l6NR7=dm2dds5O%EqCB^R%#q#tn{ zKf{$raJEjAw9J?ViJF9qj`#F6eIZNVpE{ByqU$VRmKjqnZKzD_SBf7C#pYIdt+@;o zJTAw?NOWb1Q7G=Z!6)4H(X<)?c@CF&pXY9UVg;m!W-K8pc)Fw)R){|$$f$i;b#<0e zGn(jdeLBF_&wS0zo9o*B8!n4)b(p^A*0|++xwn5GLGJql6-`v}gsUUB(bIKq*#UN) zslOg+p`_R_ObwyczQhr7(&cX8xJm!^d|6KMCHs4N)Ay5(CDt@SEj_Zz+_Ao=us?vcbl-D9NfePe*U+WXAe{p^V>{*ek8rgYKa}DXO zV|8q;$X?Gc*CjA^>Cl%DnV)0rx>@pv%DJG(Vm7{IPFI6AIV0GA1dD6DK0O~wl#liG zxT^uJ+cT}ULnXTvez($6tJ&oF3^qIAZb`4y?mV|?OFtIl$CN1Dqa$jy9H^*e_$_DK zGjA`R2KmJY39GOW2j_HeDNqW~rVwsp_Jk|1h$Raws<>Qjh$}1ehV06mYD-h26A8g_ zG+64S%`XfP#`4}=r|r_ccvoWp zl;&H)C{J$l#fgcf7=t(E5%yv9-2BL@CiJtstr*TJ!is33yBqB@SfI?C7WnzqjaBwVdUU^VZbr5k*DUfe-my@`O@@jgbGFw$0PwENw zZ{1HezL7f;3t09_+XRYThjvfeDaB_WZZo}0OS^j(7L=%IXc%Dw6Dj16nome>QQx2N z_4dULUSOmh@=pgSf!fh^CpN&u#E^(tBh}s4-#K2!K1Bwx!PAAB6@EcSlU~9!*cD1< zj4&bi)HV~SzDyU>>S31P)D zA(J8A$UADoTefVBe;xZuxE~By-UGlVNU*ERRUuhSsvjShb$L(!paBZ^|LQFLj+v4K zRsjeut8BU5T~J;uY2EhWCis3C z)#z}d5)~Dtj2QS?V{m+rll-n+{!K=S^?q&IbsyJ|7`$A;G+S&IQ2#X2kNvMQuyrQ& zp36-q{H@8=CFQD`dsFcI`i;T)7St4PAGF{OYRLD0RxtZQ#Xtp6pxj<)95zsXv&Z^} z6CPIUf>Ptwt=4->TI?Mld6pmd{NG9W`RY1kW7Ggz#%d5kGBoFCFqlb6EXgj66~jvj zN}9Qob3T~~-B=O3Q9O1PSy)(Y#-|08N>2tGW#%V?a+q$M@C%|CEs z=M}P}9w#@8yQ4u)yX}U<8;Ur^Gv{3%wd|CeTips}Pzv%27(V36I1^%9w`T{ly<|4G!P(nQjhSc98uQfg z7x1I^eVw%0?#XUwV6s{#kC!;0)Y8=@*#3HIE$wOv(r2Dq3s6b23XG!phCu}DEUw*G z2ca4n1~bSyx9>$zW34-?iM<&a+%D}>n0-2ba}M6C%Q+>-F{B&0Zot2(2=cP|S6b8I zJz|)24&s=r6j#KtpTOSeU~D)-JkA50H$8~Z%R>Xbx}V;DyVYWSmTJ3ukwbuzUOGty zeaZpr@X+p?SARt#5@D&J!df}iVtn^8_&xD{y_(V8S~!s&_8t8=zE{}>DJ99ow}r- zkyw8|r;rsB)1!gMjtV_hMHwTk@n`_+`2`Jy2Q^F-tLaAT5C=?GM=c-!tTnzgE%ZRbZeOqkrzUduu5VOkcw#F)SAJ9z~>rt zwDi?=+~9t1((_PEU+;3MNjo`#vtf}TW@<{2`}I(|+G@K!_2prpdm{wi?}DxwZK<5{ z3JT8|qiNZ7<+6rwQBchE0uuG)C=V!*q2`y_c?|2+RaC&fXpSejQ_m_?u_A6BQ;UY<9Zdhs%2fn6Yrtgve4( zaI9uILfZKZ+bKhRy^tzVvkk{l?AK5&-JS<5`GB5E1n?#QXp?i5 zMj`ys%1x0fpQjuksMcAcO6KOL|E1l63LEgUn#z@yzzS+w4JBduSp_!oF>!oatrj!6 ztO8URWvSoA+)^fz0L00Zw3cAbmC-M}ZnKI!zJk0|a8uqt`hV{TETiwbDd3GtEsy8w z;~{mw-iEG_qGbYGzn_&;u{YAJRAR8?ip5Fa_mZg;E4o1^_Z zt8+5*GmQ^yz5a&lLspRub#kO>?+hLxGF+iD0Xo5J$O!nn?0wF^``eHKM5R4Os9(`0 z{;>qMho_~kKlsX|T5B_vshFKc*>RN7oM?CTcSM*_1y8+A9}wfT|JxS7I9pndI>o{4 zQuel5{3(H{s>}aM-uF#8g-$C4?Mu?X*Z4Nt)+_M8bm7<&6DMC~-&p;mP~Q|lGW%io1@zQGp}U^t$ZM8vslnnz{h=(%z&=hpV;=>8;Q;ANDR z2e+`+Hmy*6w!!gOzbJ|4ehNRws-q)hY`j`UgG$DN8<vX{@8)wACsn?GGK&C(gDK$JFX|h84bYv&Pfg{Ji|v08EBtD`tU(u zqYh-uGzM&e)99y7527p{0DJ$%)k` z295;;OsWEt#xaqVa)*?B$Vf}W(D!~Y1qTN|JU=_W-01(%xbgd0et!DnymDw+XJZ!r zduD7KFVm$k=(I(F5Ki_XnFYTOEw4g1FRQnqTz@A914TKWZ%7gdT|M{c?*c1M7N5#l z#VsiyVaZVSh5kC@tDK;LO;yQdu=x{nV*O+~E%v(ON8w`t0SfHf>kh zFGx}SXUl0+jL}1jUiO$ zF3M`T%nCC1I&z*wtHG>V-nGMW0=CGH{}nak8lQf>AIN+0dD}a$j+N2cU`$08bBP!e zq~7I##2RU-z)H7X##h|1!j{R-F54UFIl{f#5@^lM(IV{V2=V@Wz3VhdDCI^acS7y@ zJZ`V<*rac^-a==!)?_j>fWW{rC;vX~U1iQV<@RWYV?NkX zc3fXkpVYAMlXcVzDFbr(e(Y2x1r=)|G(D3F=Z_nb)EQ;Y&U6_Kt~CxX3?mu10um9tcq zx~q=LhLE2C=R88u8Oq0 z$z41Zv98qAn|1W^3A7*7g02wSuka}W0$*pDLy`bi(hxvk*n*KU@(IFRhO0Eo^1h^E0XUR!OKQ>+BT|ts zG==u}b^ld2#Z9R8yzv#fAtEI#N8Sa^l6@%EvYm8O1e{Pw|! z<-6nP{aCW8>Ar7FQvE&QWdhH9hL$|T9EvortZ>jvOWUIWsFGj}XSFS~ST(4q+LRzq z^|Wob!5Stbs?h{YqR`_VJ{ICV#F92}&jYzRC3Cm1+&)!H&pRdO^iaz8EKFI7uOAm( z#Mi~TZq{X;+x$r{PQepb!oAfWDs&?$W*9A*xepL<0C^{I@NsEYpoI1=-4dbK9a!`9 z$yG2XbKx4Ux&9_`C`%M2s8-*KLl@%0oUEnjc!G~o zz(Qi3o?eQP9LO#1l+7HLO;%Y(b=-`maepfh#N}U=To%YexdhF!AvgeCSG~PO(4HNU zm7Ze>cA79cU7*HyKO_7hLT*c?uA@i88*fj}f0t8@nQxS&A|i!hpPZ0utTR&b+6ckZ za^6ujFj*?#TFmQC6Td+>_l4KUKYtkh`MR&Tq(pwh0&`7-Qv}K)D{?(px3+iHTH9TN ziD*$0Dq8UCTxjj#&X@AXjqUdM8V>(Vf^#c!Oj2|*fi!3MbRAt{==D2K?|b|?RV{VF zr3y}U>6)Ynih4<~vF1ukw3AWIJf|&qyx~3sSy@NO=y^ZE4dY)Y6yC|Lkm7fw6u~gk z-a+XwEUStn%`DX?Q zIVZ=DjVZL|^;(+)URSG~47y431sJg zWBdF?`6?s_x$Zb*>kU-Zw8o#0YDlmU^i&7wlMS?)&FAQiUdDLGGq}dHhV=8yc@18l zY$>|k*#!*_Me7(bh(C#Ha)0|B#%4uR##k0A=2Brbrf!8*|_AJSSbdroE)GsngMMFnf?N*v-TN{n}`!16Icg} zO6nTH%MAT3A}UcV0}Tygwbj7l`nDmG|4+qcwI?MoRLlGncZi`hWrMEL!tFSkrhUJr z^8N^*0_bO3F!aQvErN(k4~IC@>FR|2LtyS9L z9@CM07}kx!rC`vP>#s(5?A@Z)_CE0-`2J{G^AVzs6L~r_`2EL=?e6PbKg*b7#3aiUKhluk z#>3@m;~OdsIvX&OtR$xqas}mf`|GY%!9`)f(E+7I1<@n}=$C6)w+f?QHqw>p;Rx<} zd-DF@#YAskqSa;`n?I6^2~up@-9Z?xxW$F0VIpfnAo#MzlW)KHUOih2DwLlC(?WvJ z#$}q~Ku*J6)quhiR)as=-qkGW?_;aYR z(CoCA=SDBZY}fA(HcJ#>QKC%`xvF3}=IYwDE(+q@RNEk+=7sfDfrX0H>1KYn-NdS0 zOiV!j`zN~bS|gjqxhO2|$-m&=-;e3-O@b;0lBO&`DvI>*EFS)6*>9i2=5$zSA+HcP zEn(AXdUJCeE7u3n&Str>>{Oqc+VrTon1t##y}{udnl0y;WBYHs$kGFHgBJz+8$-KR zw`9nA+A1W8H>y4nVZwSvbz-g?{XZ<=n6qWYi{z}V!+)1j2!nS1WshQFXZUz^m6XF4 zJ4G7#8xzq*_(c zPRrE(8RTf^T_1Kt#u5>pZ^TCt*Q7ME@4(C+Hi(MSeUhW+gk_#M69atJWx1FH&A@?q zoDY#>dPvdZcXn$8J0FlN)Mlt?1y!=2S4r*Sl8NmoVMYr#b=FoP4JeTAEdszbfsn&TVKAO8KeEd0g|r#-4Cs_&x;ocVKj^ zq%Hg-Q?pTJ;HM;ZQb*ul=mM)u>3+vkho5tiG_RR#+ zYR(HRo{?Kk_RxY!0??j%d=k1n<#!*?Q~;usw6JkurQyQ~FI`;tu_5;HG{mNwXs}0a zeuFG^8I3O#GMNhX?x}9krH5jgRFnBaxhXiOh-80ecWIM4C?_f{d2Uy9Y&wjcw?6vA zkKld2cHqx!-ys3ZoBq~XoaM3L)WMiIdH$XVJ#1NC^=DgW-z zm^)8679}M`p?>z)c@?s^rt)LYv=%wCs^>>IdjfMMjCwnKu z6_W-ZYz;EqMXGEW2kGriTUQ7|1V;VHWeg3{iF%jtg?{OuVH_5tVC})9w5nlb>UB=L zdA*~p?$WT~1QxpTtRVCp_cNf{E3WaQS+DSbHS&e@uhT54AWoiN#&Wr+hV0f}m$NTt zZSha&(1B+c0lI+Qhxo;&YzuKn^&Xp3V`EXe$)ly#+I_>^jgZkwW9H1l@v`K~^OwbM zA9j$JGk(6Qp6*hU;ZxltM{#3j3dqDMp-dgwTlb8b8UU^mvOId>mGeSnDaZxWkyY8_C{gv{!Goei*W2) z3W{sQ)??>6>2kl(MlNmCZ`h*(`j4NL71iw1>$wpj-6*CPakUG{7Os6}SvT&ts(IdS z&Uv23&KqsgbnRY3rpYr#d9B9zR)_k6fZUzZ&1g#!T_d$QIW$KNO8>~hZnr!)X8f-f zARwo`T66}&kMTw3*cIzz~T^93NTo83$#&o_96s`+i1%bKzP51v77&7P0 zvbmNu;w-iFXW1MH{7P;m&D3p|x=F zeC-+j;a^{*&9{opfAt*-o7NzOyYr|!t7!t}mvavSW*-EPPOcpXdtA&V+_!L(V@`4e zD4ZMjYdcgoR=E|AZ_#C0Hl<|+{N5kj%Gd9GoPvS?+upX8OHE{1sN630@)LOzaeN3M zjn2z*HQU9(|I^-?N6B$l_x|&%s@|r%XWvINnnlt`qkWgWAWO!(9ku{YOya|m0||+f zyhBJHNq8qOc|bw}VM&050LF$GL%_ipgEtv3*zzjNS}kiE?V8bO_TH*~zxPKiUDeYw znvrHej^}qyN!>lYRCnF`yZ3(Yz27_TYuY$PDGL}OkFTFlRV)@qE}-P>{GLE>?*Mmy z;~^?KS8{gF8p^L)OqCHrGeYQ*7}Cu7>I_^+ek@WcrsxA*KsmHu_+6S2;rYed1@yuy z1&L$=OIp04mx6|dO0K5@xUSK8Dc+4M#p_k zIl}=3=qEm{`AH!JmL=J<^DqxQ`Wo}!_ZL(wT8+$QP?qHs-c0;~W1llM4VXdtt?gE&utQCpdiQ z%q4MN^EgR010Ir>!(b<^7~>SsYbc@w`+P@c@<0B2 zO53}z(kYwk^E?r)@CCm9KJ+Q(!KUz3?}LJ&@*7>`RL&d?fw+=XE$wLf@w;A^5f?(xKDVRjT2XiogM_LA=#~( zClu#GVVBb&{6fIMz$oAU&!@Qi-WMs|^1F2Y&d1OrvGL|;PXNSB!?j|n8X$a-lhEwl z-6@XKHI2&lC5&Vw`;QKC+Nwg#S;=5pVM#@8X^43ZQJSklBxCv;rq<^|)}lpCbS-J7 z`(%pye)uerNa)wB0D@}zDfPKLX~GN<8wc~y7$sO=6UMyYOJ*24rX~5&51!`Vzxs0q z+qSUcPye2p)tiu}=~NStKMIf?oJs_j+Ase+;rsj46JZyW2M`YPmHnU7zv|py@RpnC zRaGpw@pi8J^DokSU>EU{Fdela>MBCSBlh^zNJs?SHZx~>eqpiWjTaP4-to>2)Kr9c zZdaD?-}B@pfeeL3&bOs0GK7i>bq<|Al7YwKq?u||@6Hr^=BeF$<}?4zDWjF8fBg;W zHe7>#keI4}P?rCtp&OmhIyD8&{D|XMg4AAy5nwr%xrlgqB2*BsJzI z4Po&T^GFd6B)_T{@(SlBv*YJ-CXYY5gB>sLC(^ZvWgq=JVvQ}xoC!)&*u_~$RVj*x zy8$QYVzhwY-7!PexH?Z`v5O||6ken z@-L}~=BO(V*@3aHv-`z8?0#`Kqa&$6#%VZmdM zzeXYvVa>WlM{rU5BX@ zmXZi;R)K^9w!d$x!90lQMnALAt z#hmsgOw+t%>VqyM=*wm;zVhV<*>|>q>hNi2;sWU}#|GpEv^!z>!AL*lF=_Z=i zZz0hNULzxOF#8(K<3l~5DbaNyTub!GZ;XI+~)UPJG*)G(N{^OCGA(;!h-AGi&6qpS>&X| zQi`0E6Dojb3Gl<3g$f|@#LE*1?~EwGf4#m}&8?^+YuO4Qm2%LZJPM?FCzyARq=SjN zhF3bwZW6ny6eGmh*Ir@&gWpA+*v*{!1R>unV3!D2H*{(mt7&Mir>VV(Xi4-9Wfe4C z3r2I7A)$RTGD(L!x%u_hz!hvaZqqdfGRN;8+cID}3Q`#23FrB)GH3#Hr|{mj2toO` zH|B#qr}^O071OH#ckkV;S}Lm?_r-pp?(X`IE2R5E5LXA3`$PC{%OVOOl|qCf3?6-* zec$^s)#k|w%c?EQA{-9WvACVKg{_n%N@k3Yemd94NSgon+RxbE*TA4v?N~*fkd~oD z^b=M?M2$2}wP70TOQ@_YrL;UwJRT#NEFqDI5{ZULB%)q#f~ho~qKlVg2VtC=8I>Ok zq6x)ZPP0NBqDl<2pC%592D+(5A<)eXGMxfxqH-DJ*;B~AQ*fr6%F{d8bD)o&ev_Qk zXsLq#^|9YzU|^Ixzx6nsANb!?&R>DB%z$4Wq`OpvG!4T?rr-*!DHWD-X3(kN3_9Tm zyr&F8paoza%RLI>h0kJiris?gq2>Bp*?Z?_nIG1Oj58Qp*L5t*;Z%F-dbDIvqoRF+r!BIL}MkwfQ@gJ+SZg(x8N9ZE@h1|&U$ ziqnJc_0*YDp=fQbAs&zLZ(sQtwU^&WNn01WT-FopLQ*=vSKua2T?RLaLK89|_=Ota z)gF2ISK+e&MX(?>wPKA)D?rAy$VufOK0zTCj>*$RG1k!FbG@4Facj91$@V1(O=CD^ z5lNo^6fM)@`Nv=2*ump0UDrifRrw{$E##89-geuSeD8bDa4@xytc(PLRIgq~MaWuF z`mJg}kjZ4Qa-)Q_9J;WGM-B9IVRSO+96?hD35m2#Qe&mb<+6-svOF(!ln`Wc&hM@S zqd7Zq6pskfS;$&2nuX!C%3n*z?QmCVRI+yce0FR`F>-VVRmsVnVkjJ<_f#)ifBXbpYZkF^`GRp9S$^G1O3A#= zMz(C}BK6=dPN>D0${06+943Q< zef0PDVp>_7wQtN+MW1EWV7%y~GzJS6G;-HB9;W8nTd|Y?NxoUO0KW8?LzF^k&hYI* zFF^T4UX6uBU1ji_f+Drh!uJY|8DWMSJA6`e;{hRTA70oes{6P@{X#GO!B4TneXeOz zzU(qi?tc-bVpHbYd3D=P2F?z${IX?)oM9T5oF$NoOx9EPH8oAt*3KcF9;Uy)kI~UVGMQ99?=s2N z(vUz1!O`Obbat(?nHUOOA5oauRSGEtmLo5Icezj|)R-XLRz@{Jf=e;6t37=dz<;97 zmlD1&;lFg2#xePgUwHB}(I##CN;A+BDSb*H{X4rW%#OBu7=NL53K4L1+`kLIBDn7< zCE>D4EVK)TIfW364v+Hq{ZEqel~-Jf>+SDc&t>c8&=fv^CM+(r!o@H`l$X~~Q`1OK z&v82e(!(Z35@aW9bZQHy2mt43o3#8 z-mZ1fG%gm*5kip7WO?S{ZI=vX$$0C=Th?;TmIbs#_Y)SGi|)RPL}FA{)^Ymu(Fy&1 zAq25lg8B28QC3zpp($u+tR#D`7a{FR0QWuB1UvJ%F<+sZJi+UW?e=nl&zgP(@VPpw zm<8~ikma)quFHcjd1h#uy@NPSG@g&=;sDNT1Y*oY_X}P9J^k!_ZWl)A(w)MdPGz}j z%Tj*xT`OtOc2cVMU9=Ktnoe!)92*r<=O1;{(9lLxQ^(lnDn&MDqU##fWjf}mBg8@> z!mbsVB#^>5E{iI*`wKB90GvpfJU4m@yXFOq|8PGjs031hrED{2I>PU_3OLoHhEqIe zI9X)F+eL&|TqQktZ2Hg}p$QJ`I>4#!Q_&P(BCnNU8<_=hq1%FpXfnVpA zD%jmsk=Q^^}?P@zKG7UBsDcc`AU z7In2SxPLpN#}1%rn&%4nySb!K8Kh_7-JFmJaQP_jxguZ=JfTVzUUp9+ya2~`ee9Dnox^gJz_ku)9DmW>J!~zu%cafqDAP^1In+PI z=tzo7eJQ0#CS%(-r$g~c`sH3eK1!;m1`k`|wf; zuTNN01=K;_Y-j0wd3z3(A*ELbo^u)|ER$`4a z{^HdfJkZUTzH}EuLxWUTR}&70IDPsImX*yD7z2wIE#RuFR(kLGzW3e4-~atrv8?f@ z+Q(uEM-fei5^rVIYMWuYws8)1%?sK4g^$tp2cJT#YCtKsy3`R$A9s~oG2s5M3LeAv zxWC9PP+_WyD~soe*rTbZUjbY{Uvu1?tdf}0O?s(-8PlBG!mpw3Fg+#7A@Z$}%6@O9 zd|yy#q)!}j`1q$+h)R+%BC)B>lhQQ7maCV+)wYT6KHS4Izue0`+nzuvSkyI#%dS{R zV`JrvPl(B8P3A9Xq;uihdFGe<`0ua&8Otxfo_BumXXD1j06g%(Gu(C8 z4+w|DNNJJFW!b!WL%{uOZEc{Yrkax{PfXwz+K-2fFu(Ek8-11`&b-B|*t90h_rLUU z=6?KN5wUndUH@1ZQ;Z|P#r|GY35vj{G7uxk=~sZPCCN&KQW6Vg2f5O&G08W*+hVVj z>*FaeI0CTqQ2DRyRRap;`+@>ZHyGXj3ek`;tp-3zN!^@!!jaGg@778w=C;+)F~6Qv zD$BtGr|gL(_ddhONSXx;o0vDRfws0fDytHhrks(|Y$+9&U$KaV3!8ZA$(?-WkKV?* zE$?92#&_DWjwPw8D&zLs-@~FsZS?gGaMxWAuwg@2;C;%dghSS-Qn)t3>8gc%-Akx0bQ1f0=!Fmp`Yy#+a}-c&cmTwHv5yteMgB=uk)pA=tm~1iN>2bMU|^hKAEDU*1aR!Z|dz zR8vwC!E*X5ru(x`o$TkSCw6l9@L4*Ry@h4#x6nMV3oVo+94-ziJo3m3)YMe4e0c|h zgQG;FVZvd9p`jG7zkZCBD{UU5?(WkxH`fMSrLTYCOH_&Hxal`G0D}9z|0D-O^Qe8# zAAy-I=-|rV&J!u*I}ANeH<9Q6Db{1|ZA1mXpXFGRgJ*j9_=;(6i3}Mw0%T||{|}5> zpe%{dz$yT$Jm}DCcu*e1rBH$921VWtQVO!CyHQe3oA4{CXzyyLrlESqdjs5w=B;hD zw6@h^nifMtX`X&+H}`z^2_lgYi$YrJ<&{L2mgf0@lF1k=R?PG6x3uIZ_&oiy@3HmAcTrap zWAl42LrU9vuU@~1SMPZNkxirNM&1)bjrH+WUOfE1yyjQ};d493+x>$HHRYj^)9wOA zb%U^@05<=RA}0h=6ChOqXBP<9e)$IJ`R$GyCm{0ZuTlaf6sh9}CG_pSGTin!+ef*_p;-aL;Uocf62(GMNRV(+83>$wy}+5MHMB9Qgp*07E9Pd zDC-2y>*SQmHz2re zkqXZx!uLh<+A0ttU+^Z~0mn`dJ#u(2RdJn*MHNlcWZhM3nA0)m*CPD*+`DYnL{@^+QEGy5hD~fP||^`9c5x1w?qiR z(e7RjA3n{Zzxp(WlAzfrl28g0XVX(-OQ2Pe{D3PRn$LR>MMXd8KH0|%z@VnI2V_fW z^Mcx}Uov0f>=d_2DKL@bR366iPTmJm=^_}hD?sQvea}Be%#c&Y|CLf$mZYh*fyHaO zh?mA~IPVhf0kC&y=vv&uqON9!22RHy}DwUfjz+;lu$T!0X6v7B`=85}= zCnA%Er<7ELqhTtl%UQf;5f!zS-mHN)%5pDWvNXnq%R0I2%7tuy@gUFqaxee%+56~R z*vO{M%c!hO5Q!KwnsL4mYhziGJOASmsA;8Q?KNOo2&clgpujUwtK$!Lg-fbH{=UCU zOiU02kFfw#_!3jF020eFXTfOR7G}%A_oWX3auX>Ch31a|y#8SS41{40VIR=T8uxv#uiJz@#RwXIoj&bsSLdOON1s!M#qOgL*Wp~ z@&p}=J7}Ia2PlYA< zg*}SIU&lFq3H?5+vu?oY`XY}_tb*i6ledAH|>Smh%&YQwr^)y-O;XH|3nVl=VpIQz=Q$wrvs<-5*n?9m?gYIm zUnlOqlOBz+=g!Yi7B|L4e}v}iIaP{8X@a$zS5tlo^MFpf%c1Q0B6DazGCe}1rjhw~ z{3F>D2kCp|Y3{z~r&NT~ELl09wd)se$xoQ zi+DB7slpsOhs$d3G@Pa51OJDT`OCd>c7G{@8{@gc?{@xK1ld89?|%;(6=F};BJ9b`0TDMX+zyU@+vn| zTR1u^NSCNQx7dSBMcyJP&CU+Hpb26ehKQL8f{Rg~Yd)=YsjM~M?jIDRkCXx z$*y%+!{<18|2NtBt;eXSD&v;7t)*pd&4izk%UL}3=nkIWwjWDE-CN(wsylwu6H3!G zy=$r$xW!IyAeuvn;(7Hx_V*dO8lIELlr{~#+`RaVG=$>F}L!SO|pj*Mb!nei?Yzf+sm>puiS* zP1*5Pv@R&#JSYrlCA%gwDV=Fze;chg+{US= zf6BHOw}Pg5Xbnb;Nc}=$>z2{cx(F>4L1>yiUuthtb7Ad5fe?ke<|KS`Il;#3 zzFu?s$VJ|x&QBNe(eGG_nNfhk|NY$U2<0I>L7f-Q-|%6-HtxUozONCBhAE9r?E8m8 zAuhXi{jBi&+@PCoS;Oc5@yDc(A0RfjGvGV={bCV7;P7gr+fc{2*s`y+CVi_`E@1+rqgdN)xk^@B2*>i5QzU zFXqHOpGQRF9t*cs05ytY*UijfrbjW;DOAQj$foTME@^qpJ;mrt{2Z}gWp;v&wb^usjmnTGA4%S48x#v<-#|;-#^A>kdl?FI*6vua^|OZqJ*ArHc=EQ zI~GBz!Qe%)g~27Z5TwDe)SuIX`S1K8wOejfO|BDj@-LI}3s{W(->km|DVgs6{Y zTCBKy*_3DIzFAf>8D-NotLS~~hh)#5DoQ;b5dLuvL~#1LH|92QBPg`49C(Ch&Ms_| zo#mTSGy%G1moR9WR)pegCe3pCUJbCkzGTWa&{VtGng>_nFu-C~^5`XNVp>=a@E21xZPzw0HZQ!}Ml4hviTnx-mj7ljeo5ev-y= zomfOWZ^o{)B8kw%tfWt{(y1&ry=^`E@m-v||LX`nLRjtsy_l%~GleNv#-z`+Lrc&j<2eC&ZY^@Dv2L zvIx2_gj*)#6%3E5D;h6I9&bWSCYwb;cG?vHMej&1=Y!jV^%pMmpvF;%R3;0k-s!ghs8>^_Nj7I8 zr7QG#3*aI^9xfaTGjjX@d%yTGLL-ACrk2sbAfPL?k0vR!mTd~0%1SDzsPrP3772+Z(Nd_C(5HUzV{aS znlTS(3MiaU3B)+oK#k=F%9$3aYz_sl&VU6_4@nb-(phg@jm`Zp@|Zs$(J*sadLH>6 zhraNqRAo=mRu?0rPkkFtjigCm;xm3PwIu}n#@p93ug2iWr+<&Wb3K&k1~*oh5!1B5 zJg>l*p>bOYgPyvV%=7}|;EXU$qhJ0Q+7sWRtEGfQOedAQFm9XP zlf6V@k=Z2J1t`J0Z@q#=^Q(FKQ-8qL?ay-164XaRD1W=D7(1e9-1jWFBSa8OEu_Q@ z3bZIlC-|@>pP-8ZAs1sN!;7&ln=k1%G@PCmw95x@1 z$>1wb@%ks_2GdeRL)r!T@d|~QMS(78>AJ?--?f2_s~S1*)lYEl z>7SqjE0ZO3ltjGXcf9F~6DdW2`&FpGG*eMTSps!Jf-wV-{H37z`)W)+AkbYd^6cVD zz~JyGIm<%9>-TKluzk`%%M^dtZvvn08%|LY31I+3JAcXWz8A4Z21%~FmZ7~b(|`6D z^%WuJRE5u5<39=4YgU>I5FcIFCTA5DTz|tV8tN-};Jcq=&b}R7ecK((iN!gZ$&hi% zCYA3Ri3tD+iYSFB5-fX^R|Vx3!uKI=VWd*|2L$$Wyt&aH^N8!B`Du3ZZ*NJ-xuIc~ zfb*ME`8}t!y-K)K!HB6W`i4f3nnry271X@@kE#9Lza(>HFGl|{x|(BDC5(%fUx6Ss znx6hSVQK^$7zX0^X`wD++_C2 zxJiC@COe7aimHDef>i&1K@~)J7-J*{(AX>lfdT$njFYv z8AxaBu}7H{C%*hK;(Z60*BF~VaTPG!KQx;S_U-=d9rZl&(Dw6MfNDJpruBjgAsFZz z^lE`@qS!aLOO(r5EL+~n&mVlb=(HDrbUMp7zWxaP{UhkkL`>y0lH73fT7K_CSF`X`vMpQ4^xhnruu@%zxt)@RUf&d8^O&YQ6Ap+$=it!ous2NK4TZXvZjJW zX@XqVWO!hhSUmQoR)Xr9UTp013N<}nT+wk{V%Y6`yre9+|WrRq8K5a z^71&V*Uh8<}wo5dX|ylH1R}~)obRlVr3i0wmr?E$9_(7*+xVpHc2ZWJQv4bC>JQ8^Cizz zzB4MHX%+&p6%`4}%1Wm7V(Yq2dsiFjku;XHShr>ECC&Z+t60a5 zo+X>fv2WjTvRRY&{`QrmC*brKLXgdxJpJSzwm!Clcug&JANU)>r4=JFcVC3?U$6`0U)v9z{qb9u)klCeKv*dlO=TGxN~4q_Wa!gU(yWxC_hc_4gTsuD zq^NJHCmadCsTH8Ktb|7&*};;fb2)QnfM=fC%lrk6L?WSa;b(iaYXdEFYk7V5A$p$p z39+_C#OBP)XJ<9dM)!&!Kz`WLPlKZs!~n{JG{-aCAs*dvYU|a@>h}Qafh3^Wb91u{42+UWWifMBptCEV zDxZS6av(d)vgkYAM{DQYH@zFQsH>S5UwECSrYc(7>-gaho}sELNmX@nTqTfFQBj#- z>GD=io$TY-<3GblRuXBRhf=c0{O6zo_+21Ph@zxvYK%1qKCS`^C7dQIi*(jxFrDV? z&!*VIk;NsE^$BmQ`Pwj^A(E9O+Noz5Pd@df$qNfsX@!3b?S4NT+k8 z)6+AgPAX~Bq_kEedk&M$T5oCvh=z4eo;XSW*pW-*TI zRAR92*bw(Vu$$NRoglexGd1t{5TU9j$YdP!y>I5W)sUozGf-zLdrY8cG>ci)BPLHc#8E??_03~*bJ-%76NmCa^Qk6Q_lii z*~zNK4YL*?tn=-k>>(BjQCkz|p{=j8Vrc`{Y-l;J1u!ke_a1tUXP-Slc)=>F-|@j; zn+0$tL!DK~V^XnKqMiq~esS&M?aZ#(HM?fl?3!J(Yj(}9*)_Xn*X){Ivuk$EuGuxa jX4mYRU9)R;UBLSPoFc~rU1s5B00000NkvXXu0mjfZO^Sw literal 13546 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 C`}M;B diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index 70ec8dbf9b785d944cc4cbcc9af0b5d60ebdeb20..b22f0b2c249b4ba70ad977b3bbceba6b1137e1b9 100644 GIT binary patch literal 29541 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 U;@idsbN~PV07*qoM6N<$f(4Hw-T(jq literal 6129 zcmY+IcT`i~vd8%;LICN#1rb8%i1aFkPH57li1ZEup%akan>6WS1VkiC?V*|TP?bN<+S&+Perk_`1VDaqN$iHL|OwYAiY2y^4#0U#k* zr7@EGgo(r+s;Nfw=kN2Xt16oiA$z9v*q?}qs_*akCs&Ayoe(62Y3r$z{vfBI1hdLh zz@~_Zm?N~+9-0I%;7Z&wtkEH_%KTdvI^MO1t}R*j_gnJ2BRF&pdF!0yG>VC%DZviG z&NRf?J)>e;HzIFu^b$#sIrH`0p<9*BP6gLFX~vgWB#9I-F=sKzWHB(;6u-w>Sac4;v4e2jd2*7Aw;0I@`RlUJWyBb2nrB94Lh`isqteI?t~iF9kZ#NhU6qtKqKUQIQJY=p!E|vd6q*`9t zbg_eV%8@=bP>L5n=Lr(eyinUY11)f3vHd+monR)GRDito}5GLaOH$0gFAAwldm zFmXDi!mEYmd39 z9mTyEIdv-XfJ&nqq+5=tpicRgpI-=-TYdGVw@VvyOMzqW?iQqebWrS@Nz}gk-of=o zZH7O-?0QA|2%lM=mCE7?r1X7i%wQXh`z36y=)JLH{p7vxo_=o1vD8KiRkKj;WYw~>LircXbhOkyy+qIcm@+u#* z)^O**zEt{y^HQvQ?(T4 zMCKO=wZjzj39AOuig5hpwLy4z`*Xw7*U#vdyv*~lRI!J>TfV0cc_N$%u?XVOs{SfaC) zC#teK@q684M!kbwSg|Hw?=A=RAsU=Nl&1uODO}9LwYv{SSrouuhFe9ml3A`gHU}P; zH3s9h=<=DpKqr<{x5Cec9(Citv#j|VKStp$KaeT6$!H6{KHk*Kll4Wsj`hBn1+N?% zIN?h+2eo4ZoXk}K+`$o6H;kFDwtw`O=C!-j;D`?v4P5Y;48el1xT==Ei;M)mV0%?H zvMx*IV~b=lWd#l4H;#KCD$nG@{W5l!K?^Oi-yb;^fSVK(saff4!>@opnVSbMS|%K| zG-05V2?wiz)t1uXdnIH7{-Lr}*E8J=WpKZoCq+s)fpXROmE7M5#RgF2`)yyC-ofy- zB-dhrA>@ywavgZ6ic7EBGF915()nok`jK>nF6bnq9^`dcFlf{#ECtvFmoCw*8FOi$ zj#9lTrTvv1mQ6Sc?{05PNOI$6mUs<3Qw7WS>w^SGp<&tY?2!iZnf1XTK6J*$5Cj<> zzsFnjt;<*rT;aL*B@eIEj9WP0w=LSu@}P$tq$toU(N^3n+rlU_t@f8BsgOh)NuT`? zVX*Pu#C{)E5N6;cm)c)Ky~*TeA;YE)Qlio?F_}nlCYd=U){O!Y@zSF724%Nq)7`=~|7-oY zAY{IrxYfphP6=epr&}cAh+Q8|%)_0g=azD_$bq9cy}`#O_8GH35jU~euGYb?c}CH3 zbiDDFuI}dKS+F_JFl6e-BJ)vaNcHEqHnwrqc>0Niv8p31Uw~JHGqp*HgOX?##`DCc2T_gqjCuAbcsW)!|pOcb!2s!)X0YSy|4_wJ;6*Rx@#E zzS#ppS)%ezBNc2^J{|dVUZHX%x^hwL`y}LkOm)z8{H4)R*NFP{$-!M)xY%I$l+CxA zM>-aQ9UNr>{!UYT_T-hCsv_#x{@1;>99FB5Tu*+^j0u{$cNLsedIuv+0cxrJ(@dN`p3~Ot z>0h;S&~}qG)l{vIn#sL0)G;fv)xtGwug&@}80VT-lOp};H!Plz4hl;{uIG-3fWE1M zqi17&j`kYn8vRm(n-f%GN1q}-P6ifmId*RyJy?FS(!`TOjVZ)lm5@gsp%j<94Y#&b zc5oh`>%sHQkW2USH3^=i%mL#fM3hJ)G2aOf{f~5N5-f6}Mw96x#Q|#L_SPtX_XBY3 zXf}J~K~VcXN~gp;L-_D)*2sMC{GyF5GB7xc2d!`!0s#OQX+TWV@tUsxD7Gt4Pr+1m zhL%gl5A*j$*M4CxmjnaK#JDDo2+Lt$5XDjUp|faxj5^t-Ykzaoy)#g9WW9f!YN6Q~ z^4_4Zmj|Zhqqe0_#gaaeckv0FS3UC^85tQwPW9)HN%}?fF+Eq~zV+zwsYIJf#LA%a zaQNxZ`+=loM^0J z^&17LO$P%PipyOyZQ%=(#0mqd#93OTcTY^d?9O>J%omqlR#B4^ClOy?Uy-}`V3rMc zphN7N=CUCYb9$AGgPUo`Lc-?q5?V}B3Y8a##^g_DXl5=rx^au!i5!E3&BG;}qLU2};t z;Ww$tO?H6GvK?P)JHOGRP0x9KY($KzgDQE9VgY0<|8Hq`5twY+ z0eTW{#Nqu~xwNJ6&CPdLEAB~a4eNRRPmsZ#K@DH%*QAb1(O1fQST>#Qs5)%_r;A+J>I?`Z$G29J<+rfHpb++C3Ee zB17$>RTsIC%HhJ^M_g3t^i8m9{N=GoZTu6P`XN(mR8yN&9Zj@}BY-51+Zd}APyz;_ z>jR-5mK`nDa>3KopyQZ6Re9TB>E4mc7arZ$Zz~Qjs_s*Z9LG?jeUwW#j76UG`t>{2 zsY;3Zda%Swt7*mtDh}b8Txg!mWv#?<)}H2Tsoz%qoyCCg&_zVJnMdcJ@mUQ!^;Ql* z!(KRAw#MsVT#zd;$1D&VU5r@clwxf)#snJyrMQ(R8tg5f?$j6|bmo)l_e_527xmH% zzQ2U$oFt<5BcU?Gv1ZF^Q`sL4cScQKOWmdrD%={iYm-7(d47m^nv=v@qc0V~V9cy2 z!HF>CYH=0@T77EvNPKAtT~5eJn=dEq40rrPSNUn`u|wWKiiD`t!8EBV3JBm#SDnSn zS1xkG#BogG1_aQY7H6rmsncu#MwvDdp~^cx8SxWMU1xN4G(|SOL4;ZjTMRmotdSuq zNW-o8X7XB4!K0tuAG$8$BGgwu11L)bzWDtfh&reNId6N(J?FP~OYJxN^wiNcx>_2? zkrCIJM_4ntdxId4m^=PF%sC=m(t2G=a$QTSomdPgZ~;bHd%LwFR{tl5A4_Z{`WIQt zc4(~YD5!<59DTpz5OLm|-(G!jO#@K+iovEbm8NSTUiNfyJt3+czR{W+Q{8Bx+Q>DN z@csCzhuM-?n!yytF7tfC#9crh+$eJ!LUGDKNpVV)Y8C@gCyg@`NU(qYEWA3_>^4=i z1Th49>JKF6O(Xx>lQBsbetHZHFR$^y=>SD^--AM`VJ@oV0CN#HqTv00Y8h6^^NP{yF`|DK{l=}{ed^T(ksa# z)($1Pmb-od{n?E+K4UT@ zyHtaGk3lCZYe64vpG=V9E_xUugxUof9o;Nq1C{1;{aYA&>^l5{?>1sbREEhJF$kmc zA=AzuGz%1O$)Qt9N2VDNFRj=>_>K9YS6e_rtL_K4xZ5ZupwMl34K#d{^L-qBlO24^ zaD_UqFnKa&)DsDuTYY>djNISJAUBhWzgeiQwCU#M6;cciy<_grrq{e^olP$-2^rXV z9SKfF-a7coFE1YWlt*|kHz;IAZ-J@m4Pw}eu% zzId}Ws`BU3JUJYDrL%&jOPtJQnpihG;WKCUxEdQ0o==u3hA1ct=jBYseAek-7ut80 zQ?}Yp!jh@E+I}es_ZPLCYGLpIegHmRJ(Unr^4E(3h(s-3gx)FQXT+5|hFx7`sbBA? zHCLIz(_Sg#^?P~(;kq{FfhVlTw-V6lqDO!9*F(K~{hvZ6m^sbf0S`0j+HEt9{Ophe z`59t|IEuK^&VkRdPpX3nO{8?Cu#*ng3UnxFY2sK0oG%COSZF}AzMM2gZ)zaNjf)(H z^MDz{K}S@!4~o`&mPhKWw{fR2pJUI$Tk~pvT+rDVS23U6ZN?t|9#QX(;2TsxkHCG$ zG%~ra?V8hZztlu>HP7iv#X|O-<7CD^9AKcgk^}$b2oMXN?ADL@&6`5b0Z6di1M~GV zQAYeAG)`qi<!G{5$f1(8P5IReXiiMVkBGWNcs68pk00 zo_TQSy;W>4k}aLUF(x=PI8oUO9W9LsUi`z)A`#vF{CxA>9Fo^Q&~^(lw)VSC5UZ)H z;Xv{Ts`~l!sYiE5N|n)hfskx*hw=K)wEI;)rfqdbTyMQUMp3|>hBoxO$D8Y(p&wj^ zqBfw*?Q!K~D6n30M%-K;SzU-^pV}8*&Z#6z!rlDKop0bAiixP`8Zpk2MFTOGGk zeMFzVWMy_L3onGt&bW7yxNytc7wmo>_%C^CC_$qMl|kGGn~UEV(fi|`*B(ed(DBoA&D@8xTeD@#T3y3NwOLfM^YPc_Ew(ewGL}^BYyg=7%Nym4rVqGrM;NRLspTP1zYgbF~Uz zDU=p04kl_az~tQzwl$64Al{{#l3|>~ z$(GwJo=T%JKsT;Mxi2nd9HtULovkzfy}(?bVw>%qq=t4reC#*m67(kjlR*`V;2Q&p~ex02A zB(B5foGH>FTn!BO0K$aIi$;afb+>z>^u!xQH~wko`z!DcDIXcpmV`Gw+D1VG9u_`# zRNKr-x>w;`Q9{?QnVcQLWUJIPN&qr0Kxn|}27r4`9O!&$k(hs8A?w%Gmo!h#yip^} zfI;TDk+U&|S10}jIhVnS7rkqF$BBw-Ic9v2CvNQsJ}T1$eynzDiE=F&6J?>)|bly}r5JNL~tYT#fqGc05t zsr`Bcl`dVS>dD$P_p+WPg}qOh)5gQvYV6P)zLQHQ|5SMt6+!?Ow8m@OB0U_*Jh68? z$txu&+mxFn9%8ahu*z|TLHp)YXZ)z};efKjHDiCcd-|KbU#(+w#%UTD*w@L#mu!cI z4hgz~@3ND(-rObOu`99A;<0y4EUV+ukPMpR|E1;n+*qdOsw{{}JRl7$O=1=1YmV%Q zyR0sI^qsdtZP+=W(Q|Yq(b)o32tk5!r`6WNHPp+Vz%;&0_L#vP_^Ce3amA9Vk)hml*!NGw$(njuST@^C8-N-BW*KsGl-cGQUmJ3b4cdQp7U<+U;XwM@(-DSYH|c>qdX_mi{OP@K+OU5J zT1&A>Zs41h{cdUMJthef$es>nZ8bbCNLknyZyuv%Y8RU z;1(M?CI14B5^eHOP|Lif?o>8JrgQLy0#%K~RG@vZCa(C(dV5e3H)AO$G@!oI|F z2=TOIPSnP$`P+Qh;_vxaxL*HQ=3ZnU6piiW&uCIoKJdOSz_>1C4 diff --git a/public/favicon.ico b/public/favicon.ico index 79000c9cc43c2044b5ab5129202e993aa2cf70af..d4855f7a12da8debddf21a7ac252bcc002d32227 100644 GIT binary patch literal 8522 zcmeI1cW_i!md1N#?H%uWYN}?dW^03Y)|0AcgJ(TniXE2?GD^k-k1;l3!C-6{8)Fbc z2qBauiy#`5g@h!ObCys-}~L~ ze&^it9x~bY`1geuWc>Ge*`lAxWPdA@$$rh?DcOHB#QDel85>ELZ9bAJd)+^8Bcp+F zmjQdc8&QMMt0qJ%KYyY))@j6n@@t40{Sx5=x3M*%0A~tgVAQ0-Y7mi*2~!@UfRPQW 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 literal 9086 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 Date: Thu, 16 Nov 2017 15:59:26 -0600 Subject: [PATCH 018/274] Play with locales, source code properly, add default theme --- app/javascript/mastodon/locales/dog.json | 221 +++++++ app/javascript/mastodon/locales/en.json | 48 +- app/javascript/styles/dog.scss | 15 + app/javascript/styles/mastodon/variables.scss | 20 +- config/i18n-tasks.yml | 2 +- config/initializers/source.rb | 9 + config/locales/activerecord.dog.yml | 13 + config/locales/devise.dog.yml | 62 ++ config/locales/dog.yml | 615 ++++++++++++++++++ config/locales/doorkeeper.dog.yml | 119 ++++ config/locales/en.yml | 3 +- config/locales/simple_form.dog.yml | 68 ++ config/themes.yml | 3 +- 13 files changed, 1161 insertions(+), 37 deletions(-) create mode 100644 app/javascript/mastodon/locales/dog.json create mode 100644 app/javascript/styles/dog.scss create mode 100644 config/initializers/source.rb create mode 100644 config/locales/activerecord.dog.yml create mode 100644 config/locales/devise.dog.yml create mode 100644 config/locales/dog.yml create mode 100644 config/locales/doorkeeper.dog.yml create mode 100644 config/locales/simple_form.dog.yml diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json new file mode 100644 index 000000000..b95a48083 --- /dev/null +++ b/app/javascript/mastodon/locales/dog.json @@ -0,0 +1,221 @@ +{ + "account.block": "Block @{name}", + "account.block_domain": "Hide everything from {domain}", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.edit_profile": "Edit profile", + "account.follow": "Join Pack", + "account.followers": "Pack Members", + "account.follows": "Follows", + "account.follows_you": "Follows you", + "account.media": "Media", + "account.mention": "Bark at @{name}", + "account.mute": "Mute @{name}", + "account.posts": "Toots", + "account.report": "Report @{name}", + "account.requested": "Awaiting approval. Click to cancel follow request", + "account.share": "Share @{name}'s profile", + "account.unblock": "Unblock @{name}", + "account.unblock_domain": "Unhide {domain}", + "account.unfollow": "Leave Pack", + "account.unmute": "Unmute @{name}", + "account.view_full_profile": "View full profile", + "boost_modal.combo": "You can press {combo} to skip this next time", + "bundle_column_error.body": "Something went wrong while loading this component.", + "bundle_column_error.retry": "Try again", + "bundle_column_error.title": "Network error", + "bundle_modal_error.close": "Close", + "bundle_modal_error.message": "Something went wrong while loading this component.", + "bundle_modal_error.retry": "Try again", + "column.blocks": "Blocked users", + "column.community": "Local timeline", + "column.favourites": "Boops", + "column.follow_requests": "Pack requests", + "column.home": "Home", + "column.mutes": "Muted users", + "column.notifications": "Notifications", + "column.pins": "Pinned toots", + "column.public": "Federated timeline", + "column_back_button.label": "Back", + "column_header.hide_settings": "Hide settings", + "column_header.moveLeft_settings": "Move column to the left", + "column_header.moveRight_settings": "Move column to the right", + "column_header.pin": "Pin", + "column_header.show_settings": "Show settings", + "column_header.unpin": "Unpin", + "column_subheading.navigation": "Navigation", + "column_subheading.settings": "Settings", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your pack-only toots.", + "compose_form.lock_disclaimer.lock": "locked", + "compose_form.placeholder": "Bark???", + "compose_form.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive": "Mark media as sensitive", + "compose_form.spoiler": "Hide text behind warning", + "compose_form.spoiler_placeholder": "Write your warning here", + "confirmation_modal.cancel": "Cancel", + "confirmations.block.confirm": "Block", + "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.delete.confirm": "Delete", + "confirmations.delete.message": "Are you sure you want to delete this toot?", + "confirmations.domain_block.confirm": "Hide entire domain", + "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.", + "confirmations.mute.confirm": "Mute", + "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.unfollow.confirm": "Leave Pack", + "confirmations.unfollow.message": "Are you sure you want to leave {name}'s pack?", + "embed.instructions": "Embed this toot on your website by copying the code below.", + "embed.preview": "Here is what it will look like:", + "emoji_button.activity": "Activity", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flags", + "emoji_button.food": "Food & Drink", + "emoji_button.label": "Insert emoji", + "emoji_button.nature": "Nature", + "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Objects", + "emoji_button.people": "People", + "emoji_button.recent": "Frequently used", + "emoji_button.search": "Search...", + "emoji_button.search_results": "Search results", + "emoji_button.symbols": "Symbols", + "emoji_button.travel": "Travel & Places", + "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home.public_timeline": "the public timeline", + "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", + "follow_request.authorize": "Authorize", + "follow_request.reject": "Reject", + "getting_started.appsshort": "Apps", + "getting_started.faq": "FAQ", + "getting_started.heading": "Getting started", + "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.userguide": "User Guide", + "home.column_settings.advanced": "Advanced", + "home.column_settings.basic": "Basic", + "home.column_settings.filter_regex": "Filter out by regular expressions", + "home.column_settings.show_reblogs": "Show awoos", + "home.column_settings.show_replies": "Show barks", + "home.settings": "Column settings", + "lightbox.close": "Close", + "lightbox.next": "Next", + "lightbox.previous": "Previous", + "loading_indicator.label": "Loading...", + "media_gallery.toggle_visible": "Toggle visibility", + "missing_indicator.label": "Not found", + "navigation_bar.blocks": "Blocked users", + "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.edit_profile": "Edit profile", + "navigation_bar.favourites": "Boops", + "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.info": "About this instance", + "navigation_bar.logout": "Logout", + "navigation_bar.mutes": "Muted users", + "navigation_bar.pins": "Pinned toots", + "navigation_bar.preferences": "Preferences", + "navigation_bar.public_timeline": "Federated timeline", + "notification.favourite": "{name} booped your toot", + "notification.follow": "{name} joined your pack", + "notification.mention": "{name} barked at you", + "notification.reblog": "{name} awooed your toot", + "notifications.clear": "Clear notifications", + "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.favourite": "Boops:", + "notifications.column_settings.follow": "New pack members:", + "notifications.column_settings.mention": "Barks:", + "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.push_meta": "This device", + "notifications.column_settings.reblog": "Awoos:", + "notifications.column_settings.show": "Show in column", + "notifications.column_settings.sound": "Play sound", + "onboarding.done": "Done", + "onboarding.next": "Next", + "onboarding.page_five.public_timelines": "The local timeline shows public toots from everyone on {domain}. The federated timeline shows public toots from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.", + "onboarding.page_four.home": "The home timeline shows toots from people you follow.", + "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", + "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.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.welcome": "Welcome to Mastodon!", + "onboarding.page_six.admin": "Your instance's admin is {admin}.", + "onboarding.page_six.almost_done": "Almost done...", + "onboarding.page_six.appetoot": "Bon Appetoot!", + "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.", + "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.guidelines": "community guidelines", + "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", + "onboarding.page_six.various_app": "mobile apps", + "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.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_two.compose": "Write toots from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", + "onboarding.skip": "Skip", + "privacy.change": "Adjust toot privacy", + "privacy.direct.long": "Toot to mentioned users only", + "privacy.direct.short": "Direct", + "privacy.private.long": "Toot to followers only", + "privacy.private.short": "Followers-only", + "privacy.public.long": "Toot to public timelines", + "privacy.public.short": "Public", + "privacy.unlisted.long": "Do not toot to public timelines", + "privacy.unlisted.short": "Unlisted", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}h", + "relative_time.just_now": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Cancel", + "report.placeholder": "Additional comments", + "report.submit": "Submit", + "report.target": "Reporting {target}", + "search.placeholder": "Search", + "search_popout.search_format": "Advanced search format", + "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.status": "status", + "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.user": "user", + "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "standalone.public_title": "A look inside...", + "status.cannot_reblog": "This toot cannot be awooed", + "status.delete": "Delete", + "status.embed": "Embed", + "status.favourite": "Boop", + "status.load_more": "Load more", + "status.media_hidden": "Media hidden", + "status.mention": "Bark at @{name}", + "status.more": "More", + "status.mute_conversation": "Mute conversation", + "status.open": "Expand this toot", + "status.pin": "Pin on profile", + "status.reblog": "Awoo", + "status.reblogged_by": "{name} awooed", + "status.reply": "Reply", + "status.replyAll": "Reply to thread", + "status.report": "Report @{name}", + "status.sensitive_toggle": "Click to view", + "status.sensitive_warning": "Sensitive content", + "status.share": "Share", + "status.show_less": "Show less", + "status.show_more": "Show more", + "status.unmute_conversation": "Unmute conversation", + "status.unpin": "Unpin from profile", + "tabs_bar.compose": "Compose", + "tabs_bar.federated_timeline": "Federated", + "tabs_bar.home": "Home", + "tabs_bar.local_timeline": "Local", + "tabs_bar.notifications": "Notifications", + "upload_area.title": "Drag & drop to upload", + "upload_button.label": "Add media", + "upload_form.description": "Describe for the visually impaired", + "upload_form.undo": "Undo", + "upload_progress.label": "Uploading...", + "video.close": "Close video", + "video.exit_fullscreen": "Exit full screen", + "video.expand": "Expand video", + "video.fullscreen": "Full screen", + "video.hide": "Hide video", + "video.mute": "Mute sound", + "video.pause": "Pause", + "video.play": "Play", + "video.unmute": "Unmute sound" +} diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index e0c619c2f..1d0bbcee5 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -10,7 +10,7 @@ "account.media": "Media", "account.mention": "Mention @{name}", "account.mute": "Mute @{name}", - "account.posts": "Toots", + "account.posts": "Posts", "account.report": "Report @{name}", "account.requested": "Awaiting approval. Click to cancel follow request", "account.share": "Share @{name}'s profile", @@ -28,7 +28,7 @@ "bundle_modal_error.retry": "Try again", "column.blocks": "Blocked users", "column.community": "Local timeline", - "column.favourites": "Boops", + "column.favourites": "Favourites", "column.follow_requests": "Follow requests", "column.home": "Home", "column.mutes": "Muted users", @@ -44,7 +44,7 @@ "column_header.unpin": "Unpin", "column_subheading.navigation": "Navigation", "column_subheading.settings": "Settings", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only toots.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", "compose_form.lock_disclaimer.lock": "locked", "compose_form.placeholder": "What is on your mind?", "compose_form.publish": "Toot", @@ -56,14 +56,14 @@ "confirmations.block.confirm": "Block", "confirmations.block.message": "Are you sure you want to block {name}?", "confirmations.delete.confirm": "Delete", - "confirmations.delete.message": "Are you sure you want to delete this toot?", + "confirmations.delete.message": "Are you sure you want to delete this status?", "confirmations.domain_block.confirm": "Hide entire domain", "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.", "confirmations.mute.confirm": "Mute", "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", - "embed.instructions": "Embed this toot on your website by copying the code below.", + "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", "emoji_button.custom": "Custom", @@ -95,7 +95,7 @@ "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", "home.column_settings.filter_regex": "Filter out by regular expressions", - "home.column_settings.show_reblogs": "Show awoos", + "home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_replies": "Show replies", "home.settings": "Column settings", "lightbox.close": "Close", @@ -107,7 +107,7 @@ "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.edit_profile": "Edit profile", - "navigation_bar.favourites": "Boops", + "navigation_bar.favourites": "Favourites", "navigation_bar.follow_requests": "Follow requests", "navigation_bar.info": "About this instance", "navigation_bar.logout": "Logout", @@ -115,25 +115,25 @@ "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", - "notification.favourite": "{name} booped your toot", + "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", "notification.mention": "{name} mentioned you", - "notification.reblog": "{name} awooed your toot", + "notification.reblog": "{name} boosted your status", "notifications.clear": "Clear notifications", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", "notifications.column_settings.alert": "Desktop notifications", - "notifications.column_settings.favourite": "Boops:", + "notifications.column_settings.favourite": "Favourites:", "notifications.column_settings.follow": "New followers:", "notifications.column_settings.mention": "Mentions:", "notifications.column_settings.push": "Push notifications", "notifications.column_settings.push_meta": "This device", - "notifications.column_settings.reblog": "Awoos:", + "notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.show": "Show in column", "notifications.column_settings.sound": "Play sound", "onboarding.done": "Done", "onboarding.next": "Next", - "onboarding.page_five.public_timelines": "The local timeline shows public toots from everyone on {domain}. The federated timeline shows public toots from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.", - "onboarding.page_four.home": "The home timeline shows toots from people you follow.", + "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_four.home": "The home timeline shows posts from people you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "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.handle": "You are on {domain}, so your full handle is {handle}", @@ -148,16 +148,16 @@ "onboarding.page_six.various_app": "mobile apps", "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.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_two.compose": "Write toots from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", + "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.skip": "Skip", - "privacy.change": "Adjust toot privacy", - "privacy.direct.long": "Toot to mentioned users only", + "privacy.change": "Adjust status privacy", + "privacy.direct.long": "Post to mentioned users only", "privacy.direct.short": "Direct", - "privacy.private.long": "Toot to followers only", + "privacy.private.long": "Post to followers only", "privacy.private.short": "Followers-only", - "privacy.public.long": "Toot to public timelines", + "privacy.public.long": "Post to public timelines", "privacy.public.short": "Public", - "privacy.unlisted.long": "Do not toot to public timelines", + "privacy.unlisted.long": "Do not post to public timelines", "privacy.unlisted.short": "Unlisted", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", @@ -176,19 +176,19 @@ "search_popout.tips.user": "user", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", - "status.cannot_reblog": "This toot cannot be awooed", + "status.cannot_reblog": "This post cannot be boosted", "status.delete": "Delete", "status.embed": "Embed", - "status.favourite": "Boop", + "status.favourite": "Favourite", "status.load_more": "Load more", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", "status.more": "More", "status.mute_conversation": "Mute conversation", - "status.open": "Expand this toot", + "status.open": "Expand this status", "status.pin": "Pin on profile", - "status.reblog": "Awoo", - "status.reblogged_by": "{name} awooed", + "status.reblog": "Boost", + "status.reblogged_by": "{name} boosted", "status.reply": "Reply", "status.replyAll": "Reply to thread", "status.report": "Report @{name}", diff --git a/app/javascript/styles/dog.scss b/app/javascript/styles/dog.scss new file mode 100644 index 000000000..c0ddc7764 --- /dev/null +++ b/app/javascript/styles/dog.scss @@ -0,0 +1,15 @@ +// Commonly used web colors +$black: #3b3633; // Black +$white: #fafafa; // White +$success-green: #3e935b; // Padua +$error-red: #a3360a; // Cerise +$warning-red: #f9dfb6; // Sunset Orange +$gold-star: #faa41a; // Dark Goldenrod + +// Values from the classic Mastodon UI +$classic-base-color: #49423e; // Midnight Express +$classic-primary-color: #c9c7c5; // Echo Blue +$classic-secondary-color: #ebe9e8; // Pattens Blue +$classic-highlight-color: #48b9c7; // Summer Sky + +@import 'application'; diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss index 2f5021dc9..52c8cd1cf 100644 --- a/app/javascript/styles/mastodon/variables.scss +++ b/app/javascript/styles/mastodon/variables.scss @@ -1,16 +1,16 @@ // Commonly used web colors -$black: #3b3633; // Black -$white: #fafafa; // White -$success-green: #3e935b; // Padua -$error-red: #a3360a; // Cerise -$warning-red: #f9dfb6; // Sunset Orange -$gold-star: #faa41a; // Dark Goldenrod +$black: #000000; // Black +$white: #ffffff; // White +$success-green: #79bd9a; // Padua +$error-red: #df405a; // Cerise +$warning-red: #ff5050; // Sunset Orange +$gold-star: #ca8f04; // Dark Goldenrod // Values from the classic Mastodon UI -$classic-base-color: #49423e; // Midnight Express -$classic-primary-color: #c9c7c5; // Echo Blue -$classic-secondary-color: #ebe9e8; // Pattens Blue -$classic-highlight-color: #48b9c7; // Summer Sky +$classic-base-color: #282c37; // Midnight Express +$classic-primary-color: #9baec8; // Echo Blue +$classic-secondary-color: #d9e1e8; // Pattens Blue +$classic-highlight-color: #2b90d9; // Summer Sky // Variables for defaults in UI $base-shadow-color: $black !default; diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index b35e5c09a..0cecd00fd 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -1,7 +1,7 @@ # i18n-tasks finds and manages missing and unused translations: https://github.com/glebm/i18n-tasks # The "main" locale. -base_locale: en +base_locale: dog data: read: - config/locales/%{locale}.yml diff --git a/config/initializers/source.rb b/config/initializers/source.rb new file mode 100644 index 000000000..8547386ea --- /dev/null +++ b/config/initializers/source.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +module Mastodon + module Version + module_function + def source_base_url + 'https://github.com/asonix/mastodon' + end + end +end diff --git a/config/locales/activerecord.dog.yml b/config/locales/activerecord.dog.yml new file mode 100644 index 000000000..4a815ea4a --- /dev/null +++ b/config/locales/activerecord.dog.yml @@ -0,0 +1,13 @@ +--- +dog: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: only letters, numbers and underscores + status: + attributes: + reblog: + taken: of status already exists diff --git a/config/locales/devise.dog.yml b/config/locales/devise.dog.yml new file mode 100644 index 000000000..5161c6b86 --- /dev/null +++ b/config/locales/devise.dog.yml @@ -0,0 +1,62 @@ +--- +dog: + devise: + confirmations: + confirmed: Your email address has been successfully confirmed. + send_instructions: You will receive an email with instructions for how to confirm your email address in a few minutes. Please check your spam folder if you didn't receive this email. + send_paranoid_instructions: If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes. Please check your spam folder if you didn't receive this email. + failure: + already_authenticated: You are already signed in. + inactive: Your account is not activated yet. + invalid: Invalid %{authentication_keys} or password. + last_attempt: You have one more attempt before your account is locked. + locked: Your account is locked. + not_found_in_database: Invalid %{authentication_keys} or password. + timeout: Your session expired. Please sign in again to continue. + unauthenticated: You need to sign in or sign up before continuing. + unconfirmed: You have to confirm your email address before continuing. + mailer: + confirmation_instructions: + subject: 'Mastodon: Confirmation instructions for %{instance}' + password_change: + subject: 'Mastodon: Password changed' + reset_password_instructions: + subject: 'Mastodon: Reset password instructions' + unlock_instructions: + subject: 'Mastodon: Unlock instructions' + omniauth_callbacks: + failure: Could not authenticate you from %{kind} because "%{reason}". + success: Successfully authenticated from %{kind} account. + passwords: + no_token: You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided. + send_instructions: If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes. Please check your spam folder if you didn't receive this email. + send_paranoid_instructions: If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes. Please check your spam folder if you didn't receive this email. + updated: Your password has been changed successfully. You are now signed in. + updated_not_active: Your password has been changed successfully. + registrations: + destroyed: Bye! Your account has been successfully cancelled. We hope to see you again soon. + signed_up: Welcome! You have signed up successfully. + signed_up_but_inactive: You have signed up successfully. However, we could not sign you in because your account is not yet activated. + signed_up_but_locked: You have signed up successfully. However, we could not sign you in because your account is locked. + signed_up_but_unconfirmed: A message with a confirmation link has been sent to your email address. Please follow the link to activate your account. Please check your spam folder if you didn't receive this email. + update_needs_confirmation: You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address. Please check your spam folder if you didn't receive this email. + updated: Your account has been updated successfully. + sessions: + already_signed_out: Signed out successfully. + signed_in: Signed in successfully. + signed_out: Signed out successfully. + unlocks: + send_instructions: You will receive an email with instructions for how to unlock your account in a few minutes. Please check your spam folder if you didn't receive this email. + send_paranoid_instructions: If your account exists, you will receive an email with instructions for how to unlock it in a few minutes. Please check your spam folder if you didn't receive this email. + unlocked: Your account has been unlocked successfully. Please sign in to continue. + errors: + messages: + already_confirmed: was already confirmed, please try signing in + confirmation_period_expired: needs to be confirmed within %{period}, please request a new one + expired: has expired, please request a new one + not_found: not found + not_locked: was not locked + not_saved: + one: '1 error prohibited this %{resource} from being saved:' + other: "%{count} errors prohibited this %{resource} from being saved:" + diff --git a/config/locales/dog.yml b/config/locales/dog.yml new file mode 100644 index 000000000..30503c899 --- /dev/null +++ b/config/locales/dog.yml @@ -0,0 +1,615 @@ +--- +dog: + about: + about_hashtag_html: These are public toots tagged with #%{hashtag}. You can interact with them if you have an account anywhere in the fediverse. + about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail. + about_this: About + closed_registrations: Registrations are currently closed on this instance. However! You can find a different instance to make an account on and get access to the very same network from there. + contact: Contact + contact_missing: Not set + contact_unavailable: N/A + description_headline: What is %{domain}? + domain_count_after: other instances + domain_count_before: Connected to + extended_description_html: | +

A good place for rules

+

The extended description has not been set up yet.

+ features: + humane_approach_body: Learning from failures of other networks, Mastodon aims to make ethical design choices to combat the misuse of social media. + humane_approach_title: A more humane approach + not_a_product_body: Mastodon is not a commercial network. No advertising, no data mining, no walled gardens. There is no central authority. + not_a_product_title: You’re a person, not a product + real_conversation_body: With 500 characters at your disposal and support for granular content and media warnings, you can express yourself the way you want to. + real_conversation_title: Built for real conversation + within_reach_body: Multiple apps for iOS, Android, and other platforms thanks to a developer-friendly API ecosystem allow you to keep up with your friends anywhere. + within_reach_title: Always within reach + find_another_instance: Find another instance + generic_description: "%{domain} is one server in the network" + hosted_on: Mastodon hosted on %{domain} + learn_more: Learn more + other_instances: Instance list + source_code: Source code + status_count_after: statuses + status_count_before: Who authored + user_count_after: users + user_count_before: Home to + what_is_mastodon: What is Mastodon? + accounts: + follow: Follow + followers: Followers + following: Following + media: Media + nothing_here: There is nothing here! + people_followed_by: People whom %{name} follows + people_who_follow: People who follow %{name} + posts: Toots + posts_with_replies: Toots with replies + remote_follow: Remote follow + reserved_username: The username is reserved + roles: + admin: Admin + unfollow: Unfollow + admin: + account_moderation_notes: + account: Moderator + create: Create + created_at: Date + created_msg: Moderation note successfully created! + delete: Delete + destroyed_msg: Moderation note successfully destroyed! + accounts: + are_you_sure: Are you sure? + confirm: Confirm + confirmed: Confirmed + disable_two_factor_authentication: Disable 2FA + display_name: Display name + domain: Domain + edit: Edit + email: E-mail + feed_url: Feed URL + followers: Followers + followers_url: Followers URL + follows: Follows + inbox_url: Inbox URL + ip: IP + location: + all: All + local: Local + remote: Remote + title: Location + media_attachments: Media attachments + moderation: + all: All + silenced: Silenced + suspended: Suspended + title: Moderation + moderation_notes: Moderation notes + most_recent_activity: Most recent activity + most_recent_ip: Most recent IP + not_subscribed: Not subscribed + order: + alphabetic: Alphabetic + most_recent: Most recent + title: Order + outbox_url: Outbox URL + perform_full_suspension: Perform full suspension + profile_url: Profile URL + protocol: Protocol + public: Public + push_subscription_expires: PuSH subscription expires + redownload: Refresh avatar + reset: Reset + reset_password: Reset password + resubscribe: Resubscribe + salmon_url: Salmon URL + search: Search + shared_inbox_url: Shared Inbox URL + show: + created_reports: Reports created by this account + report: report + targeted_reports: Reports made about this account + silence: Silence + statuses: Statuses + subscribe: Subscribe + title: Accounts + undo_silenced: Undo silence + undo_suspension: Undo suspension + unsubscribe: Unsubscribe + username: Username + web: Web + custom_emojis: + copied_msg: Successfully created local copy of the emoji + copy: Copy + copy_failed_msg: Could not make a local copy of that emoji + created_msg: Emoji successfully created! + delete: Delete + destroyed_msg: Emojo successfully destroyed! + disable: Disable + disabled_msg: Successfully disabled that emoji + emoji: Emoji + enable: Enable + enabled_msg: Successfully enabled that emoji + image_hint: PNG up to 50KB + new: + title: Add new custom emoji + shortcode: Shortcode + shortcode_hint: At least 2 characters, only alphanumeric characters and underscores + title: Custom emojis + upload: Upload + domain_blocks: + add_new: Add new + created_msg: Domain block is now being processed + destroyed_msg: Domain block has been undone + domain: Domain + new: + create: Create block + hint: The domain block will not prevent creation of account entries in the database, but will retroactively and automatically apply specific moderation methods on those accounts. + severity: + desc_html: "Silence will make the account's posts invisible to anyone who isn't following them. Suspend will remove all of the account's content, media, and profile data. Use None if you just want to reject media files." + noop: None + silence: Silence + suspend: Suspend + title: New domain block + reject_media: Reject media files + reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions + severities: + noop: None + silence: Silence + suspend: Suspend + severity: Severity + show: + affected_accounts: + one: One account in the database affected + other: "%{count} accounts in the database affected" + retroactive: + silence: Unsilence all existing accounts from this domain + suspend: Unsuspend all existing accounts from this domain + title: Undo domain block for %{domain} + undo: Undo + title: Domain Blocks + undo: Undo + email_domain_blocks: + add_new: Add new + created_msg: Email domain block successfully created + delete: Delete + destroyed_msg: Email domain block successfully deleted + domain: Domain + new: + create: Create block + title: New email domain block + title: Email Domain Block + instances: + account_count: Known accounts + domain_name: Domain + reset: Reset + search: Search + title: Known Instances + reports: + action_taken_by: Action taken by + are_you_sure: Are you sure? + comment: + label: Comment + none: None + delete: Delete + id: ID + mark_as_resolved: Mark as resolved + nsfw: + 'false': Unhide media attachments + 'true': Hide media attachments + report: 'Report #%{id}' + report_contents: Contents + reported_account: Reported account + reported_by: Reported by + resolved: Resolved + silence_account: Silence account + status: Status + suspend_account: Suspend account + target: Target + title: Reports + unresolved: Unresolved + view: View + settings: + bootstrap_timeline_accounts: + desc_html: Separate multiple usernames by comma. Only local and unlocked accounts will work. Default when empty is all local admins. + title: Default follows for new users + contact_information: + email: Business e-mail + username: Contact username + registrations: + closed_message: + desc_html: Displayed on frontpage when registrations are closed. You can use HTML tags + title: Closed registration message + deletion: + desc_html: Allow anyone to delete their account + title: Open account deletion + open: + desc_html: Allow anyone to create an account + title: Open registration + site_description: + desc_html: Introductory paragraph on the frontpage and in meta tags. You can use HTML tags, in particular <a> and <em>. + title: Instance description + site_description_extended: + desc_html: A good place for your code of conduct, rules, guidelines and other things that set your instance apart. You can use HTML tags + title: Custom extended information + site_terms: + desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags + title: Custom terms of service + site_title: Instance name + thumbnail: + desc_html: Used for previews via OpenGraph and API. 1200x630px recommended + title: Instance thumbnail + timeline_preview: + desc_html: Display public timeline on landing page + title: Timeline preview + title: Site Settings + statuses: + back_to_account: Back to account page + batch: + delete: Delete + nsfw_off: NSFW OFF + nsfw_on: NSFW ON + execute: Execute + failed_to_execute: Failed to execute + media: + hide: Hide media + show: Show media + title: Media + no_media: No media + title: Account statuses + with_media: With media + subscriptions: + callback_url: Callback URL + confirmed: Confirmed + expires_in: Expires in + last_delivery: Last delivery + title: WebSub + topic: Topic + title: Administration + admin_mailer: + new_report: + body: "%{reporter} has reported %{target}" + subject: New report for %{instance} (#%{id}) + application_mailer: + salutation: "%{name}," + settings: 'Change e-mail preferences: %{link}' + signature: Mastodon notifications from %{instance} + view: 'View:' + applications: + created: Application successfully created + destroyed: Application successfully deleted + invalid_url: The provided URL is invalid + regenerate_token: Regenerate access token + token_regenerated: Access token successfully regenerated + warning: Be very careful with this data. Never share it with anyone! + your_token: Your access token + auth: + agreement_html: By signing up you agree to
our terms of service and privacy policy. + change_password: Security + delete_account: Delete account + delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. + didnt_get_confirmation: Didn't receive confirmation instructions? + forgot_password: Forgot your password? + invalid_reset_password_token: Password reset token is invalid or expired. Please request a new one. + login: Log in + logout: Logout + register: Sign up + resend_confirmation: Resend confirmation instructions + reset_password: Reset password + set_new_password: Set new password + authorize_follow: + error: Unfortunately, there was an error looking up the remote account + follow: Follow + follow_request: 'You have sent a follow request to:' + following: 'Success! You are now following:' + post_follow: + close: Or, you can just close this window. + return: Return to the user's profile + web: Go to web + title: Follow %{acct} + datetime: + distance_in_words: + about_x_hours: "%{count}h" + about_x_months: "%{count}mo" + about_x_years: "%{count}y" + almost_x_years: "%{count}y" + half_a_minute: Just now + less_than_x_minutes: "%{count}m" + less_than_x_seconds: Just now + over_x_years: "%{count}y" + x_days: "%{count}d" + x_minutes: "%{count}m" + x_months: "%{count}mo" + x_seconds: "%{count}s" + deletes: + bad_password_msg: Nice try, hackers! Incorrect password + confirm_password: Enter your current password to verify your identity + description_html: This will permanently, irreversibly remove content from your account and deactivate it. Your username will remain reserved to prevent future impersonations. + proceed: Delete account + success_msg: Your account was successfully deleted + warning_html: Only deletion of content from this particular instance is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases. + warning_title: Disseminated content availability + errors: + '403': You don't have permission to view this page. + '404': The page you were looking for doesn't exist. + '410': The page you were looking for doesn't exist anymore. + '422': + content: Security verification failed. Are you blocking cookies? + title: Security verification failed + '429': Throttled + '500': + content: We're sorry, but something went wrong on our end. + title: This page is not correct + noscript_html: To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform. + exports: + blocks: You block + csv: CSV + follows: You follow + mutes: You mute + storage: Media storage + followers: + domain: Domain + explanation_html: If you want to ensure the privacy of your statuses, you must be aware of who is following you. Your private statuses are delivered to all instances where you have followers. You may wish to review them, and remove followers if you do not trust your privacy to be respected by the staff or software of those instances. + followers_count: Number of followers + lock_link: Lock your account + purge: Remove from followers + success: + one: In the process of soft-blocking followers from one domain... + other: In the process of soft-blocking followers from %{count} domains... + true_privacy_html: Please mind that true privacy can only be achieved with end-to-end encryption. + unlocked_warning_html: Anyone can follow you to immediately view your private statuses. %{lock_link} to be able to review and reject followers. + unlocked_warning_title: Your account is not locked + generic: + changes_saved_msg: Changes successfully saved! + powered_by: powered by %{link} + save_changes: Save changes + validation_errors: + one: Something isn't quite right yet! Please review the error below + other: Something isn't quite right yet! Please review %{count} errors below + imports: + preface: You can import data that you have exported from another instance, such as a list of the people you are following or blocking. + success: Your data was successfully uploaded and will now be processed in due time + types: + blocking: Blocking list + following: Following list + muting: Muting list + upload: Upload + landing_strip_html: "%{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." + landing_strip_signup_html: If you don't, you can sign up here. + media_attachments: + validations: + images_and_video: Cannot attach a video to a status that already contains images + too_many: Cannot attach more than 4 files + notification_mailer: + digest: + body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:' + mention: "%{name} mentioned you in:" + new_followers_summary: + one: You have acquired one new follower! Yay! + other: You have gotten %{count} new followers! Amazing! + subject: + one: "1 new notification since your last visit \U0001F418" + other: "%{count} new notifications since your last visit \U0001F418" + favourite: + body: 'Your status was favourited by %{name}:' + subject: "%{name} favourited your status" + follow: + body: "%{name} is now following you!" + subject: "%{name} is now following you" + follow_request: + body: "%{name} has requested to follow you" + subject: 'Pending follower: %{name}' + mention: + body: 'You were mentioned by %{name} in:' + subject: You were mentioned by %{name} + reblog: + body: 'Your status was boosted by %{name}:' + subject: "%{name} boosted your status" + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: Q + thousand: K + trillion: T + unit: '' + pagination: + next: Next + prev: Prev + truncate: "…" + preferences: + languages: Languages + other: Other + publishing: Publishing + web: Web + push_notifications: + favourite: + title: "%{name} favourited your status" + follow: + title: "%{name} is now following you" + group: + title: "%{count} notifications" + mention: + action_boost: Boost + action_expand: Show more + action_favourite: Favourite + title: "%{name} mentioned you" + reblog: + title: "%{name} boosted your status" + remote_follow: + acct: Enter your username@domain you want to follow from + missing_resource: Could not find the required redirect URL for your account + proceed: Proceed to follow + prompt: 'You are going to follow:' + sessions: + activity: Last activity + browser: Browser + browsers: + alipay: Alipay + blackberry: Blackberry + chrome: Chrome + edge: Microsoft Edge + firefox: Firefox + generic: Unknown browser + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Nokia S40 Ovi Browser + opera: Opera + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UCBrowser + weibo: Weibo + current_session: Current session + description: "%{browser} on %{platform}" + explanation: These are the web browsers currently logged in to your Mastodon account. + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: Linux + mac: Mac + other: unknown platform + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone + revoke: Revoke + revoke_success: Session successfully revoked + title: Sessions + settings: + authorized_apps: Authorized apps + back: Back to Mastodon + delete: Account deletion + development: Development + edit_profile: Edit profile + export: Data export + followers: Authorized followers + import: Import + notifications: Notifications + preferences: Preferences + settings: Settings + two_factor_authentication: Two-factor Authentication + your_apps: Your applications + statuses: + open_in_web: Open in web + over_character_limit: character limit of %{max} exceeded + pin_errors: + limit: Too many toots pinned + ownership: Someone else's toot cannot be pinned + private: Non-public toot cannot be pinned + reblog: A boost cannot be pinned + show_more: Show more + visibilities: + private: Followers-only + private_long: Only show to followers + public: Public + public_long: Everyone can see + unlisted: Unlisted + unlisted_long: Everyone can see, but not listed on public timelines + stream_entries: + click_to_show: Click to show + pinned: Pinned toot + reblogged: boosted + sensitive_content: Sensitive content + terms: + body_html: | +

Privacy Policy

+ +

What information do we collect?

+ +

We collect information from you when you register on our site and gather data when you participate in the forum by reading, writing, and evaluating the content shared here.

+ +

When registering on our site, you may be asked to enter your name and e-mail address. You may, however, visit our site without registering. Your e-mail address will be verified by an email containing a unique link. If that link is visited, we know that you control the e-mail address.

+ +

When registered and posting, we record the IP address that the post originated from. We also may retain server logs which include the IP address of every request to our server.

+ +

What do we use your information for?

+ +

Any of the information we collect from you may be used in one of the following ways:

+ +
    +
  • To personalize your experience — your information helps us to better respond to your individual needs.
  • +
  • To improve our site — we continually strive to improve our site offerings based on the information and feedback we receive from you.
  • +
  • To improve customer service — your information helps us to more effectively respond to your customer service requests and support needs.
  • +
  • To send periodic emails — The email address you provide may be used to send you information, notifications that you request about changes to topics or in response to your user name, respond to inquiries, and/or other requests or questions.
  • +
+ +

How do we protect your information?

+ +

We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information.

+ +

What is your data retention policy?

+ +

We will make a good faith effort to:

+ +
    +
  • Retain server logs containing the IP address of all requests to this server no more than 90 days.
  • +
  • Retain the IP addresses associated with registered users and their posts no more than 5 years.
  • +
+ +

Do we use cookies?

+ +

Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.

+ +

We use cookies to understand and save your preferences for future visits and compile aggregate data about site traffic and site interaction so that we can offer better site experiences and tools in the future. We may contract with third-party service providers to assist us in better understanding our site visitors. These service providers are not permitted to use the information collected on our behalf except to help us conduct and improve our business.

+ +

Do we disclose any information to outside parties?

+ +

We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety. However, non-personally identifiable visitor information may be provided to other parties for marketing, advertising, or other uses.

+ +

Third party links

+ +

Occasionally, at our discretion, we may include or offer third party products or services on our site. These third party sites have separate and independent privacy policies. We therefore have no responsibility or liability for the content and activities of these linked sites. Nonetheless, we seek to protect the integrity of our site and welcome any feedback about these sites.

+ +

Children's Online Privacy Protection Act Compliance

+ +

Our site, products and services are all directed to people who are at least 13 years old. If this server is in the USA, and you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

+ +

Online Privacy Policy Only

+ +

This online privacy policy applies only to information collected through our site and not to information collected offline.

+ + + +

By using our site, you consent to our web site privacy policy.

+ +

Changes to our Privacy Policy

+ +

If we decide to change our privacy policy, we will post those changes on this page.

+ +

This document is CC-BY-SA. It was last updated May 31, 2013.

+ +

Originally adapted from the Discourse privacy policy.

+ title: "%{instance} Terms of Service and Privacy Policy" + themes: + default: "Dog" + mastodon: "The default mastodon theme" + time: + formats: + default: "%b %d, %Y, %H:%M" + two_factor_authentication: + code_hint: Enter the code generated by your authenticator app to confirm + description_html: If you enable two-factor authentication, logging in will require you to be in possession of your phone, which will generate tokens for you to enter. + disable: Disable + enable: Enable + enabled: Two-factor authentication is enabled + enabled_success: Two-factor authentication successfully enabled + generate_recovery_codes: Generate recovery codes + instructions_html: "Scan this QR code into Google Authenticator or a similiar TOTP app on your phone. From now on, that app will generate tokens that you will have to enter when logging in." + lost_recovery_codes: Recovery codes allow you to regain access to your account if you lose your phone. If you've lost your recovery codes, you can regenerate them here. Your old recovery codes will be invalidated. + manual_instructions: 'If you can''t scan the QR code and need to enter it manually, here is the plain-text secret:' + recovery_codes: Backup recovery codes + recovery_codes_regenerated: Recovery codes successfully regenerated + recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. Keep the recovery codes safe. For example, you may print them and store them with other important documents. + setup: Set up + wrong_code: The entered code was invalid! Are server time and device time correct? + users: + invalid_email: The e-mail address is invalid + invalid_otp_token: Invalid two-factor code + signed_in_as: 'Signed in as:' diff --git a/config/locales/doorkeeper.dog.yml b/config/locales/doorkeeper.dog.yml new file mode 100644 index 000000000..d1f99f0b0 --- /dev/null +++ b/config/locales/doorkeeper.dog.yml @@ -0,0 +1,119 @@ +--- +dog: + activerecord: + attributes: + doorkeeper/application: + name: Application name + redirect_uri: Redirect URI + scopes: Scopes + website: Application website + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: cannot contain a fragment. + invalid_uri: must be a valid URI. + relative_uri: must be an absolute URI. + secured_uri: must be an HTTPS/SSL URI. + doorkeeper: + applications: + buttons: + authorize: Authorize + cancel: Cancel + destroy: Destroy + edit: Edit + submit: Submit + confirmations: + destroy: Are you sure? + edit: + title: Edit application + form: + error: Whoops! Check your form for possible errors + help: + native_redirect_uri: Use %{native_redirect_uri} for local tests + redirect_uri: Use one line per URI + scopes: Separate scopes with spaces. Leave blank to use the default scopes. + index: + application: Application + callback_url: Callback URL + delete: Delete + name: Name + new: New application + scopes: Scopes + show: Show + title: Your applications + new: + title: New application + show: + actions: Actions + application_id: Client key + callback_urls: Callback URLs + scopes: Scopes + secret: Client secret + title: 'Application: %{name}' + authorizations: + buttons: + authorize: Authorize + deny: Deny + error: + title: An error has occurred + new: + able_to: It will be able to + prompt: Application %{client_name} requests access to your account + title: Authorization required + show: + title: Copy this authorization code and paste it to the application. + authorized_applications: + buttons: + revoke: Revoke + confirmations: + revoke: Are you sure? + index: + application: Application + created_at: Authorized + date_format: "%Y-%m-%d %H:%M:%S" + scopes: Scopes + title: Your authorized applications + errors: + messages: + access_denied: The resource owner or authorization server denied the request. + credential_flow_not_configured: Resource Owner Password Credentials flow failed due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured. + invalid_client: Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method. + invalid_grant: The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client. + invalid_redirect_uri: The redirect uri included is not valid. + invalid_request: The request is missing a required parameter, includes an unsupported parameter value, or is otherwise malformed. + invalid_resource_owner: The provided resource owner credentials are not valid, or resource owner cannot be found + invalid_scope: The requested scope is invalid, unknown, or malformed. + invalid_token: + expired: The access token expired + revoked: The access token was revoked + unknown: The access token is invalid + resource_owner_authenticator_not_configured: Resource Owner find failed due to Doorkeeper.configure.resource_owner_authenticator being unconfiged. + server_error: The authorization server encountered an unexpected condition which prevented it from fulfilling the request. + temporarily_unavailable: The authorization server is currently unable to handle the request due to a temporary overloading or maintenance of the server. + unauthorized_client: The client is not authorized to perform this request using this method. + unsupported_grant_type: The authorization grant type is not supported by the authorization server. + unsupported_response_type: The authorization server does not support this response type. + flash: + applications: + create: + notice: Application created. + destroy: + notice: Application deleted. + update: + notice: Application updated. + authorized_applications: + destroy: + notice: Application revoked. + layouts: + admin: + nav: + applications: Applications + oauth2_provider: OAuth2 Provider + application: + title: OAuth authorization required + scopes: + follow: follow, block, unblock and unfollow accounts + read: read your account's data + write: post on your behalf diff --git a/config/locales/en.yml b/config/locales/en.yml index 45929e97d..d27def4b8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -588,7 +588,8 @@ en:

Originally adapted from the Discourse privacy policy.

title: "%{instance} Terms of Service and Privacy Policy" themes: - default: Mastodon + default: "Dog" + mastodon: "The default Mastodon theme" time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/locales/simple_form.dog.yml b/config/locales/simple_form.dog.yml new file mode 100644 index 000000000..d520df5ca --- /dev/null +++ b/config/locales/simple_form.dog.yml @@ -0,0 +1,68 @@ +--- +dog: + simple_form: + hints: + defaults: + avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 120x120px + digest: Sent after a long period of inactivity with a summary of mentions you've received in your absence + display_name: + one: 1 character left + other: %{count} characters left + header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px + locked: Requires you to manually approve followers + note: + one: 1 character left + other: %{count} characters left + setting_noindex: Affects your public profile and status pages + setting_theme: Affects how Mastodon looks when you're logged in from any device. + imports: + data: CSV file exported from another Mastodon instance + sessions: + otp: Enter the Two-factor code from your phone or use one of your recovery codes. + user: + filtered_languages: Checked languages will be filtered from public timelines for you + labels: + defaults: + avatar: Avatar + confirm_new_password: Confirm new password + confirm_password: Confirm password + current_password: Current password + data: Data + display_name: Display name + email: E-mail address + filtered_languages: Filtered languages + header: Header + locale: Language + locked: Lock account + new_password: New password + note: Bio + otp_attempt: Two-factor code + password: Password + setting_auto_play_gif: Auto-play animated GIFs + setting_boost_modal: Show confirmation dialog before boosting + setting_default_privacy: Post privacy + setting_default_sensitive: Always mark media as sensitive + setting_delete_modal: Show confirmation dialog before deleting a toot + setting_noindex: Opt-out of search engine indexing + setting_reduce_motion: Reduce motion in animations + setting_system_font_ui: Use system's default font + setting_theme: Site theme + setting_unfollow_modal: Show confirmation dialog before unfollowing someone + severity: Severity + type: Import type + username: Username + interactions: + must_be_follower: Block notifications from non-followers + must_be_following: Block notifications from people you don't follow + notification_emails: + digest: Send digest e-mails + favourite: Send e-mail when someone favourites your status + follow: Send e-mail when someone follows you + follow_request: Send e-mail when someone requests to follow you + mention: Send e-mail when someone mentions you + reblog: Send e-mail when someone boosts your status + 'no': 'No' + required: + mark: "*" + text: required + 'yes': 'Yes' diff --git a/config/themes.yml b/config/themes.yml index a1049fae7..8a455ce66 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1 +1,2 @@ -default: styles/application.scss +default: styles/dog.scss +mastodon: styles/application.scss From b7be2699802c9b954a9a6cba98c36b6bd73f5506 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Thu, 16 Nov 2017 16:18:07 -0600 Subject: [PATCH 019/274] Fix dog theme --- app/javascript/styles/dog.scss | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/javascript/styles/dog.scss b/app/javascript/styles/dog.scss index c0ddc7764..86e6c5294 100644 --- a/app/javascript/styles/dog.scss +++ b/app/javascript/styles/dog.scss @@ -6,10 +6,23 @@ $error-red: #a3360a; // Cerise $warning-red: #f9dfb6; // Sunset Orange $gold-star: #faa41a; // Dark Goldenrod +$base-shadow-color: #3b3633; +$base-overlay-background: #3b3633; +$base-border-color: #fafafa; +$simple-background-color: #fafafa; +$primary-text-color: #fafafa; +$valid-value-color: #3e935b; +$error-value-color: #a3360a; + // Values from the classic Mastodon UI $classic-base-color: #49423e; // Midnight Express $classic-primary-color: #c9c7c5; // Echo Blue $classic-secondary-color: #ebe9e8; // Pattens Blue $classic-highlight-color: #48b9c7; // Summer Sky +$ui-base-color: #49423e; // Midnight Express +$ui-primary-color: #c9c7c5; // Echo Blue +$ui-secondary-color: #ebe9e8; // Pattens Blue +$ui-highlight-color: #48b9c7; // Summer Sky + @import 'application'; From 7e1bf776e563f687ca184be35c074e9202e43db7 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Thu, 16 Nov 2017 16:32:36 -0600 Subject: [PATCH 020/274] More locale things --- .../mastodon/locales/locale-data/oc.js | 311 ++++++++++++------ .../mastodon/locales/whitelist_dog.json | 2 + config/application.rb | 3 +- 3 files changed, 215 insertions(+), 101 deletions(-) create mode 100644 app/javascript/mastodon/locales/whitelist_dog.json diff --git a/app/javascript/mastodon/locales/locale-data/oc.js b/app/javascript/mastodon/locales/locale-data/oc.js index c4b56350b..15f264632 100644 --- a/app/javascript/mastodon/locales/locale-data/oc.js +++ b/app/javascript/mastodon/locales/locale-data/oc.js @@ -2,107 +2,218 @@ /*eslint no-nested-ternary: "off"*/ /*eslint quotes: "off"*/ -export default [{ - locale: "oc", - pluralRuleFunction: function (e, a) { - return a ? 1 == e ? "one" : "other" : e >= 0 && e < 2 ? "one" : "other"; - }, - fields: { - year: { - displayName: "an", - relative: { - 0: "ongan", - 1: "l'an que ven", - "-1": "l'an passat", - }, - relativeTime: { - future: { - one: "dins {0} an", - other: "dins {0} ans", +export default [ + { + locale: "dog", + pluralRuleFunction: function(e, a) { + var n = String(e).split("."), + l = !n[1], + o = Number(n[0]) == e, + t = o && n[0].slice(-1), + r = o && n[0].slice(-2); + return a ? 1 == t && 11 != r ? "one" : 2 == t && 12 != r ? "two" : 3 == t && 13 != r ? "few" : "other" : 1 == e && l ? "one" : "other" }, - past: { - one: "fa {0} an", - other: "fa {0} ans", - }, - }, + fields: { + year: { + displayName: "year", + relative: { + 0: "this year", + 1: "next year", + "-1": "last year" + }, + relativeTime: { + future: { + one: "in {0} year", + other: "in {0} years" + }, + past: { + one: "{0} year ago", + other: "{0} years ago" + } + } + }, + month: { + displayName: "month", + relative: { + 0: "this month", + 1: "next month", + "-1": "last month" + }, + relativeTime: { + future: { + one: "in {0} month", + other: "in {0} months" + }, + past: { + one: "{0} month ago", + other: "{0} months ago" + } + } + }, + day: { + displayName: "day", + relative: { + 0: "today", + 1: "tomorrow", + "-1": "yesterday" + }, + relativeTime: { + future: { + one: "in {0} day", + other: "in {0} days" + }, + past: { + one: "{0} day ago", + other: "{0} days ago" + } + } + }, + hour: { + displayName: "hour", + relativeTime: { + future: { + one: "in {0} hour", + other: "in {0} hours" + }, + past: { + one: "{0} hour ago", + other: "{0} hours ago" + } + } + }, + minute: { + displayName: "minute", + relativeTime: { + future: { + one: "in {0} minute", + other: "in {0} minutes" + }, + past: { + one: "{0} minute ago", + other: "{0} minutes ago" + } + } + }, + second: { + displayName: "second", + relative: { + 0: "now" + }, + relativeTime: { + future: { + one: "in {0} second", + other: "in {0} seconds" + }, + past: { + one: "{0} second ago", + other: "{0} seconds ago" + } + } + } + } }, - month: { - displayName: "mes", - relative: { - 0: "aqueste mes", - 1: "lo mes que ven", - "-1": "lo mes passat", - }, - relativeTime: { - future: { - one: "dins {0} mes", - other: "dins {0} meses", + { + locale: "oc", + pluralRuleFunction: function (e, a) { + return a ? 1 == e ? "one" : "other" : e >= 0 && e < 2 ? "one" : "other"; }, - past: { - one: "fa {0} mes", - other: "fa {0} meses", + fields: { + year: { + displayName: "an", + relative: { + 0: "ongan", + 1: "l'an que ven", + "-1": "l'an passat", + }, + relativeTime: { + future: { + one: "dins {0} an", + other: "dins {0} ans", + }, + past: { + one: "fa {0} an", + other: "fa {0} ans", + }, + }, + }, + month: { + displayName: "mes", + relative: { + 0: "aqueste mes", + 1: "lo mes que ven", + "-1": "lo mes passat", + }, + relativeTime: { + future: { + one: "dins {0} mes", + other: "dins {0} meses", + }, + past: { + one: "fa {0} mes", + other: "fa {0} meses", + }, + }, + }, + day: { + displayName: "jorn", + relative: { + 0: "uèi", + 1: "deman", + "-1": "ièr", + }, + relativeTime: { + future: { + one: "dins {0} jorn", + other: "dins {0} jorns", + }, + past: { + one: "fa {0} jorn", + other: "fa {0} jorns", + }, + }, + }, + hour: { + displayName: "ora", + relativeTime: { + future: { + one: "dins {0} ora", + other: "dins {0} oras", + }, + past: { + one: "fa {0} ora", + other: "fa {0} oras", + }, + }, + }, + minute: { + displayName: "minuta", + relativeTime: { + future: { + one: "dins {0} minuta", + other: "dins {0} minutas", + }, + past: { + one: "fa {0} minuta", + other: "fa {0} minutas", + }, + }, + }, + second: { + displayName: "segonda", + relative: { + 0: "ara", + }, + relativeTime: { + future: { + one: "dins {0} segonda", + other: "dins {0} segondas", + }, + past: { + one: "fa {0} segonda", + other: "fa {0} segondas", + }, + }, + }, }, - }, - }, - day: { - displayName: "jorn", - relative: { - 0: "uèi", - 1: "deman", - "-1": "ièr", - }, - relativeTime: { - future: { - one: "dins {0} jorn", - other: "dins {0} jorns", - }, - past: { - one: "fa {0} jorn", - other: "fa {0} jorns", - }, - }, - }, - hour: { - displayName: "ora", - relativeTime: { - future: { - one: "dins {0} ora", - other: "dins {0} oras", - }, - past: { - one: "fa {0} ora", - other: "fa {0} oras", - }, - }, - }, - minute: { - displayName: "minuta", - relativeTime: { - future: { - one: "dins {0} minuta", - other: "dins {0} minutas", - }, - past: { - one: "fa {0} minuta", - other: "fa {0} minutas", - }, - }, - }, - second: { - displayName: "segonda", - relative: { - 0: "ara", - }, - relativeTime: { - future: { - one: "dins {0} segonda", - other: "dins {0} segondas", - }, - past: { - one: "fa {0} segonda", - other: "fa {0} segondas", - }, - }, - }, - }, -}]; + } +]; diff --git a/app/javascript/mastodon/locales/whitelist_dog.json b/app/javascript/mastodon/locales/whitelist_dog.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_dog.json @@ -0,0 +1,2 @@ +[ +] diff --git a/config/application.rb b/config/application.rb index 0879d3c6a..afcbf60b6 100644 --- a/config/application.rb +++ b/config/application.rb @@ -29,6 +29,7 @@ module Mastodon # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] config.i18n.available_locales = [ + :dog, :en, :ar, :bg, @@ -63,7 +64,7 @@ module Mastodon :'zh-TW', ] - config.i18n.default_locale = :en + config.i18n.default_locale = :dog # config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb') # config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')] From cfa97405892d862ccd24e71c83d60805c1cde88f Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Thu, 16 Nov 2017 16:51:28 -0600 Subject: [PATCH 021/274] Finish fixing locales, themes --- app/helpers/settings_helper.rb | 1 + .../mastodon/locales/locale-data/dog.js | 115 +++++++ .../mastodon/locales/locale-data/oc.js | 311 ++++++------------ app/javascript/styles/custom.scss | 5 + app/javascript/styles/dog.scss | 2 +- config/themes.yml | 2 +- 6 files changed, 223 insertions(+), 213 deletions(-) create mode 100644 app/javascript/mastodon/locales/locale-data/dog.js create mode 100644 app/javascript/styles/custom.scss diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index abce85812..7895fe764 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -2,6 +2,7 @@ module SettingsHelper HUMAN_LOCALES = { + dog: 'Dog', en: 'English', ar: 'العربية', bg: 'Български', diff --git a/app/javascript/mastodon/locales/locale-data/dog.js b/app/javascript/mastodon/locales/locale-data/dog.js new file mode 100644 index 000000000..614d3efad --- /dev/null +++ b/app/javascript/mastodon/locales/locale-data/dog.js @@ -0,0 +1,115 @@ +/*eslint eqeqeq: "off"*/ +/*eslint no-nested-ternary: "off"*/ +/*eslint quotes: "off"*/ + +export default [ + { + locale: "dog", + pluralRuleFunction: function(e, a) { + var n = String(e).split("."), + l = !n[1], + o = Number(n[0]) == e, + t = o && n[0].slice(-1), + r = o && n[0].slice(-2); + return a ? 1 == t && 11 != r ? "one" : 2 == t && 12 != r ? "two" : 3 == t && 13 != r ? "few" : "other" : 1 == e && l ? "one" : "other" + }, + fields: { + year: { + displayName: "year", + relative: { + 0: "this year", + 1: "next year", + "-1": "last year" + }, + relativeTime: { + future: { + one: "in {0} year", + other: "in {0} years" + }, + past: { + one: "{0} year ago", + other: "{0} years ago" + } + } + }, + month: { + displayName: "month", + relative: { + 0: "this month", + 1: "next month", + "-1": "last month" + }, + relativeTime: { + future: { + one: "in {0} month", + other: "in {0} months" + }, + past: { + one: "{0} month ago", + other: "{0} months ago" + } + } + }, + day: { + displayName: "day", + relative: { + 0: "today", + 1: "tomorrow", + "-1": "yesterday" + }, + relativeTime: { + future: { + one: "in {0} day", + other: "in {0} days" + }, + past: { + one: "{0} day ago", + other: "{0} days ago" + } + } + }, + hour: { + displayName: "hour", + relativeTime: { + future: { + one: "in {0} hour", + other: "in {0} hours" + }, + past: { + one: "{0} hour ago", + other: "{0} hours ago" + } + } + }, + minute: { + displayName: "minute", + relativeTime: { + future: { + one: "in {0} minute", + other: "in {0} minutes" + }, + past: { + one: "{0} minute ago", + other: "{0} minutes ago" + } + } + }, + second: { + displayName: "second", + relative: { + 0: "now" + }, + relativeTime: { + future: { + one: "in {0} second", + other: "in {0} seconds" + }, + past: { + one: "{0} second ago", + other: "{0} seconds ago" + } + } + } + } + } +]; diff --git a/app/javascript/mastodon/locales/locale-data/oc.js b/app/javascript/mastodon/locales/locale-data/oc.js index 15f264632..c4b56350b 100644 --- a/app/javascript/mastodon/locales/locale-data/oc.js +++ b/app/javascript/mastodon/locales/locale-data/oc.js @@ -2,218 +2,107 @@ /*eslint no-nested-ternary: "off"*/ /*eslint quotes: "off"*/ -export default [ - { - locale: "dog", - pluralRuleFunction: function(e, a) { - var n = String(e).split("."), - l = !n[1], - o = Number(n[0]) == e, - t = o && n[0].slice(-1), - r = o && n[0].slice(-2); - return a ? 1 == t && 11 != r ? "one" : 2 == t && 12 != r ? "two" : 3 == t && 13 != r ? "few" : "other" : 1 == e && l ? "one" : "other" +export default [{ + locale: "oc", + pluralRuleFunction: function (e, a) { + return a ? 1 == e ? "one" : "other" : e >= 0 && e < 2 ? "one" : "other"; + }, + fields: { + year: { + displayName: "an", + relative: { + 0: "ongan", + 1: "l'an que ven", + "-1": "l'an passat", + }, + relativeTime: { + future: { + one: "dins {0} an", + other: "dins {0} ans", }, - fields: { - year: { - displayName: "year", - relative: { - 0: "this year", - 1: "next year", - "-1": "last year" - }, - relativeTime: { - future: { - one: "in {0} year", - other: "in {0} years" - }, - past: { - one: "{0} year ago", - other: "{0} years ago" - } - } - }, - month: { - displayName: "month", - relative: { - 0: "this month", - 1: "next month", - "-1": "last month" - }, - relativeTime: { - future: { - one: "in {0} month", - other: "in {0} months" - }, - past: { - one: "{0} month ago", - other: "{0} months ago" - } - } - }, - day: { - displayName: "day", - relative: { - 0: "today", - 1: "tomorrow", - "-1": "yesterday" - }, - relativeTime: { - future: { - one: "in {0} day", - other: "in {0} days" - }, - past: { - one: "{0} day ago", - other: "{0} days ago" - } - } - }, - hour: { - displayName: "hour", - relativeTime: { - future: { - one: "in {0} hour", - other: "in {0} hours" - }, - past: { - one: "{0} hour ago", - other: "{0} hours ago" - } - } - }, - minute: { - displayName: "minute", - relativeTime: { - future: { - one: "in {0} minute", - other: "in {0} minutes" - }, - past: { - one: "{0} minute ago", - other: "{0} minutes ago" - } - } - }, - second: { - displayName: "second", - relative: { - 0: "now" - }, - relativeTime: { - future: { - one: "in {0} second", - other: "in {0} seconds" - }, - past: { - one: "{0} second ago", - other: "{0} seconds ago" - } - } - } - } + past: { + one: "fa {0} an", + other: "fa {0} ans", + }, + }, }, - { - locale: "oc", - pluralRuleFunction: function (e, a) { - return a ? 1 == e ? "one" : "other" : e >= 0 && e < 2 ? "one" : "other"; + month: { + displayName: "mes", + relative: { + 0: "aqueste mes", + 1: "lo mes que ven", + "-1": "lo mes passat", + }, + relativeTime: { + future: { + one: "dins {0} mes", + other: "dins {0} meses", }, - fields: { - year: { - displayName: "an", - relative: { - 0: "ongan", - 1: "l'an que ven", - "-1": "l'an passat", - }, - relativeTime: { - future: { - one: "dins {0} an", - other: "dins {0} ans", - }, - past: { - one: "fa {0} an", - other: "fa {0} ans", - }, - }, - }, - month: { - displayName: "mes", - relative: { - 0: "aqueste mes", - 1: "lo mes que ven", - "-1": "lo mes passat", - }, - relativeTime: { - future: { - one: "dins {0} mes", - other: "dins {0} meses", - }, - past: { - one: "fa {0} mes", - other: "fa {0} meses", - }, - }, - }, - day: { - displayName: "jorn", - relative: { - 0: "uèi", - 1: "deman", - "-1": "ièr", - }, - relativeTime: { - future: { - one: "dins {0} jorn", - other: "dins {0} jorns", - }, - past: { - one: "fa {0} jorn", - other: "fa {0} jorns", - }, - }, - }, - hour: { - displayName: "ora", - relativeTime: { - future: { - one: "dins {0} ora", - other: "dins {0} oras", - }, - past: { - one: "fa {0} ora", - other: "fa {0} oras", - }, - }, - }, - minute: { - displayName: "minuta", - relativeTime: { - future: { - one: "dins {0} minuta", - other: "dins {0} minutas", - }, - past: { - one: "fa {0} minuta", - other: "fa {0} minutas", - }, - }, - }, - second: { - displayName: "segonda", - relative: { - 0: "ara", - }, - relativeTime: { - future: { - one: "dins {0} segonda", - other: "dins {0} segondas", - }, - past: { - one: "fa {0} segonda", - other: "fa {0} segondas", - }, - }, - }, + past: { + one: "fa {0} mes", + other: "fa {0} meses", }, - } -]; + }, + }, + day: { + displayName: "jorn", + relative: { + 0: "uèi", + 1: "deman", + "-1": "ièr", + }, + relativeTime: { + future: { + one: "dins {0} jorn", + other: "dins {0} jorns", + }, + past: { + one: "fa {0} jorn", + other: "fa {0} jorns", + }, + }, + }, + hour: { + displayName: "ora", + relativeTime: { + future: { + one: "dins {0} ora", + other: "dins {0} oras", + }, + past: { + one: "fa {0} ora", + other: "fa {0} oras", + }, + }, + }, + minute: { + displayName: "minuta", + relativeTime: { + future: { + one: "dins {0} minuta", + other: "dins {0} minutas", + }, + past: { + one: "fa {0} minuta", + other: "fa {0} minutas", + }, + }, + }, + second: { + displayName: "segonda", + relative: { + 0: "ara", + }, + relativeTime: { + future: { + one: "dins {0} segonda", + other: "dins {0} segondas", + }, + past: { + one: "fa {0} segonda", + other: "fa {0} segondas", + }, + }, + }, + }, +}]; diff --git a/app/javascript/styles/custom.scss b/app/javascript/styles/custom.scss new file mode 100644 index 000000000..7b9e92dce --- /dev/null +++ b/app/javascript/styles/custom.scss @@ -0,0 +1,5 @@ +@import 'application'; + +.column { + flex-grow: 1 !important; +} diff --git a/app/javascript/styles/dog.scss b/app/javascript/styles/dog.scss index 86e6c5294..c07d33051 100644 --- a/app/javascript/styles/dog.scss +++ b/app/javascript/styles/dog.scss @@ -25,4 +25,4 @@ $ui-primary-color: #c9c7c5; // Echo Blue $ui-secondary-color: #ebe9e8; // Pattens Blue $ui-highlight-color: #48b9c7; // Summer Sky -@import 'application'; +@import 'custom'; diff --git a/config/themes.yml b/config/themes.yml index 8a455ce66..f464fab14 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,2 +1,2 @@ default: styles/dog.scss -mastodon: styles/application.scss +mastodon: styles/custom.scss From e0fa5294bb0fdac3e4828f0f711a25864e92c1a7 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Tue, 21 Nov 2017 19:57:20 -0600 Subject: [PATCH 022/274] Add lion language --- app/helpers/settings_helper.rb | 1 + app/javascript/mastodon/locales/dog.json | 12 +- app/javascript/mastodon/locales/lion.json | 221 +++++++ .../mastodon/locales/locale-data/lion.js | 115 ++++ .../mastodon/locales/whitelist_lion.json | 2 + config/application.rb | 1 + config/locales/activerecord.lion.yml | 13 + config/locales/devise.lion.yml | 62 ++ config/locales/doorkeeper.lion.yml | 119 ++++ config/locales/lion.yml | 615 ++++++++++++++++++ config/locales/simple_form.lion.yml | 68 ++ 11 files changed, 1223 insertions(+), 6 deletions(-) create mode 100644 app/javascript/mastodon/locales/lion.json create mode 100644 app/javascript/mastodon/locales/locale-data/lion.js create mode 100644 app/javascript/mastodon/locales/whitelist_lion.json create mode 100644 config/locales/activerecord.lion.yml create mode 100644 config/locales/devise.lion.yml create mode 100644 config/locales/doorkeeper.lion.yml create mode 100644 config/locales/lion.yml create mode 100644 config/locales/simple_form.lion.yml diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 7895fe764..21c276e36 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -3,6 +3,7 @@ module SettingsHelper HUMAN_LOCALES = { dog: 'Dog', + lion: 'Lion', en: 'English', ar: 'العربية', bg: 'Български', diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index b95a48083..0431c6cae 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -5,8 +5,8 @@ "account.edit_profile": "Edit profile", "account.follow": "Join Pack", "account.followers": "Pack Members", - "account.follows": "Follows", - "account.follows_you": "Follows you", + "account.follows": "Joined Packs", + "account.follows_you": "Is in your pack", "account.media": "Media", "account.mention": "Bark at @{name}", "account.mute": "Mute @{name}", @@ -108,7 +108,7 @@ "navigation_bar.community_timeline": "Local timeline", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Boops", - "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.follow_requests": "Pack requests", "navigation_bar.info": "About this instance", "navigation_bar.logout": "Logout", "navigation_bar.mutes": "Muted users", @@ -154,7 +154,7 @@ "privacy.direct.long": "Toot to mentioned users only", "privacy.direct.short": "Direct", "privacy.private.long": "Toot to followers only", - "privacy.private.short": "Followers-only", + "privacy.private.short": "Pack Members-only", "privacy.public.long": "Toot to public timelines", "privacy.public.short": "Public", "privacy.unlisted.long": "Do not toot to public timelines", @@ -189,8 +189,8 @@ "status.pin": "Pin on profile", "status.reblog": "Awoo", "status.reblogged_by": "{name} awooed", - "status.reply": "Reply", - "status.replyAll": "Reply to thread", + "status.reply": "Bark", + "status.replyAll": "Bark at thread", "status.report": "Report @{name}", "status.sensitive_toggle": "Click to view", "status.sensitive_warning": "Sensitive content", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json new file mode 100644 index 000000000..660802bba --- /dev/null +++ b/app/javascript/mastodon/locales/lion.json @@ -0,0 +1,221 @@ +{ + "account.block": "Block @{name}", + "account.block_domain": "Hide everything from {domain}", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.edit_profile": "Edit profile", + "account.follow": "Join pride", + "account.followers": "Pride Members", + "account.follows": "Joined Prides", + "account.follows_you": "Is in your pride", + "account.media": "Media", + "account.mention": "Meow at @{name}", + "account.mute": "Mute @{name}", + "account.posts": "Toots", + "account.report": "Report @{name}", + "account.requested": "Awaiting approval. Click to cancel follow request", + "account.share": "Share @{name}'s profile", + "account.unblock": "Unblock @{name}", + "account.unblock_domain": "Unhide {domain}", + "account.unfollow": "Leave Pride", + "account.unmute": "Unmute @{name}", + "account.view_full_profile": "View full profile", + "boost_modal.combo": "You can press {combo} to skip this next time", + "bundle_column_error.body": "Something went wrong while loading this component.", + "bundle_column_error.retry": "Try again", + "bundle_column_error.title": "Network error", + "bundle_modal_error.close": "Close", + "bundle_modal_error.message": "Something went wrong while loading this component.", + "bundle_modal_error.retry": "Try again", + "column.blocks": "Blocked users", + "column.community": "Local timeline", + "column.favourites": "Boops", + "column.follow_requests": "Pride requests", + "column.home": "Home", + "column.mutes": "Muted users", + "column.notifications": "Notifications", + "column.pins": "Pinned toots", + "column.public": "Federated timeline", + "column_back_button.label": "Back", + "column_header.hide_settings": "Hide settings", + "column_header.moveLeft_settings": "Move column to the left", + "column_header.moveRight_settings": "Move column to the right", + "column_header.pin": "Pin", + "column_header.show_settings": "Show settings", + "column_header.unpin": "Unpin", + "column_subheading.navigation": "Navigation", + "column_subheading.settings": "Settings", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your pack-only toots.", + "compose_form.lock_disclaimer.lock": "locked", + "compose_form.placeholder": "Meow???", + "compose_form.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive": "Mark media as sensitive", + "compose_form.spoiler": "Hide text behind warning", + "compose_form.spoiler_placeholder": "Write your warning here", + "confirmation_modal.cancel": "Cancel", + "confirmations.block.confirm": "Block", + "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.delete.confirm": "Delete", + "confirmations.delete.message": "Are you sure you want to delete this toot?", + "confirmations.domain_block.confirm": "Hide entire domain", + "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.", + "confirmations.mute.confirm": "Mute", + "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.unfollow.confirm": "Leave Pride", + "confirmations.unfollow.message": "Are you sure you want to leave {name}'s pride?", + "embed.instructions": "Embed this toot on your website by copying the code below.", + "embed.preview": "Here is what it will look like:", + "emoji_button.activity": "Activity", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flags", + "emoji_button.food": "Food & Drink", + "emoji_button.label": "Insert emoji", + "emoji_button.nature": "Nature", + "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Objects", + "emoji_button.people": "People", + "emoji_button.recent": "Frequently used", + "emoji_button.search": "Search...", + "emoji_button.search_results": "Search results", + "emoji_button.symbols": "Symbols", + "emoji_button.travel": "Travel & Places", + "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home.public_timeline": "the public timeline", + "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", + "follow_request.authorize": "Authorize", + "follow_request.reject": "Reject", + "getting_started.appsshort": "Apps", + "getting_started.faq": "FAQ", + "getting_started.heading": "Getting started", + "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.userguide": "User Guide", + "home.column_settings.advanced": "Advanced", + "home.column_settings.basic": "Basic", + "home.column_settings.filter_regex": "Filter out by regular expressions", + "home.column_settings.show_reblogs": "Show roars", + "home.column_settings.show_replies": "Show meows", + "home.settings": "Column settings", + "lightbox.close": "Close", + "lightbox.next": "Next", + "lightbox.previous": "Previous", + "loading_indicator.label": "Loading...", + "media_gallery.toggle_visible": "Toggle visibility", + "missing_indicator.label": "Not found", + "navigation_bar.blocks": "Blocked users", + "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.edit_profile": "Edit profile", + "navigation_bar.favourites": "Boops", + "navigation_bar.follow_requests": "Pride requests", + "navigation_bar.info": "About this instance", + "navigation_bar.logout": "Logout", + "navigation_bar.mutes": "Muted users", + "navigation_bar.pins": "Pinned toots", + "navigation_bar.preferences": "Preferences", + "navigation_bar.public_timeline": "Federated timeline", + "notification.favourite": "{name} booped your toot", + "notification.follow": "{name} joined your pride", + "notification.mention": "{name} meowed at you", + "notification.reblog": "{name} roared your toot", + "notifications.clear": "Clear notifications", + "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.favourite": "Boops:", + "notifications.column_settings.follow": "New pride members:", + "notifications.column_settings.mention": "Meows:", + "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.push_meta": "This device", + "notifications.column_settings.reblog": "Roars:", + "notifications.column_settings.show": "Show in column", + "notifications.column_settings.sound": "Play sound", + "onboarding.done": "Done", + "onboarding.next": "Next", + "onboarding.page_five.public_timelines": "The local timeline shows public toots from everyone on {domain}. The federated timeline shows public toots from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.", + "onboarding.page_four.home": "The home timeline shows toots from people you follow.", + "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", + "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.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.welcome": "Welcome to Mastodon!", + "onboarding.page_six.admin": "Your instance's admin is {admin}.", + "onboarding.page_six.almost_done": "Almost done...", + "onboarding.page_six.appetoot": "Bon Appetoot!", + "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.", + "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.guidelines": "community guidelines", + "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", + "onboarding.page_six.various_app": "mobile apps", + "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.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_two.compose": "Write toots from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", + "onboarding.skip": "Skip", + "privacy.change": "Adjust toot privacy", + "privacy.direct.long": "Toot to mentioned users only", + "privacy.direct.short": "Direct", + "privacy.private.long": "Toot to followers only", + "privacy.private.short": "Pride Members-only", + "privacy.public.long": "Toot to public timelines", + "privacy.public.short": "Public", + "privacy.unlisted.long": "Do not toot to public timelines", + "privacy.unlisted.short": "Unlisted", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}h", + "relative_time.just_now": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Cancel", + "report.placeholder": "Additional comments", + "report.submit": "Submit", + "report.target": "Reporting {target}", + "search.placeholder": "Search", + "search_popout.search_format": "Advanced search format", + "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.status": "status", + "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.user": "user", + "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "standalone.public_title": "A look inside...", + "status.cannot_reblog": "This toot cannot be roared", + "status.delete": "Delete", + "status.embed": "Embed", + "status.favourite": "Boop", + "status.load_more": "Load more", + "status.media_hidden": "Media hidden", + "status.mention": "Meow at @{name}", + "status.more": "More", + "status.mute_conversation": "Mute conversation", + "status.open": "Expand this toot", + "status.pin": "Pin on profile", + "status.reblog": "Roar", + "status.reblogged_by": "{name} roared", + "status.reply": "Meow", + "status.replyAll": "Meow at thread", + "status.report": "Report @{name}", + "status.sensitive_toggle": "Click to view", + "status.sensitive_warning": "Sensitive content", + "status.share": "Share", + "status.show_less": "Show less", + "status.show_more": "Show more", + "status.unmute_conversation": "Unmute conversation", + "status.unpin": "Unpin from profile", + "tabs_bar.compose": "Compose", + "tabs_bar.federated_timeline": "Federated", + "tabs_bar.home": "Home", + "tabs_bar.local_timeline": "Local", + "tabs_bar.notifications": "Notifications", + "upload_area.title": "Drag & drop to upload", + "upload_button.label": "Add media", + "upload_form.description": "Describe for the visually impaired", + "upload_form.undo": "Undo", + "upload_progress.label": "Uploading...", + "video.close": "Close video", + "video.exit_fullscreen": "Exit full screen", + "video.expand": "Expand video", + "video.fullscreen": "Full screen", + "video.hide": "Hide video", + "video.mute": "Mute sound", + "video.pause": "Pause", + "video.play": "Play", + "video.unmute": "Unmute sound" +} diff --git a/app/javascript/mastodon/locales/locale-data/lion.js b/app/javascript/mastodon/locales/locale-data/lion.js new file mode 100644 index 000000000..728b5f824 --- /dev/null +++ b/app/javascript/mastodon/locales/locale-data/lion.js @@ -0,0 +1,115 @@ +/*eslint eqeqeq: "off"*/ +/*eslint no-nested-ternary: "off"*/ +/*eslint quotes: "off"*/ + +export default [ + { + locale: "lion", + pluralRuleFunction: function(e, a) { + var n = String(e).split("."), + l = !n[1], + o = Number(n[0]) == e, + t = o && n[0].slice(-1), + r = o && n[0].slice(-2); + return a ? 1 == t && 11 != r ? "one" : 2 == t && 12 != r ? "two" : 3 == t && 13 != r ? "few" : "other" : 1 == e && l ? "one" : "other" + }, + fields: { + year: { + displayName: "year", + relative: { + 0: "this year", + 1: "next year", + "-1": "last year" + }, + relativeTime: { + future: { + one: "in {0} year", + other: "in {0} years" + }, + past: { + one: "{0} year ago", + other: "{0} years ago" + } + } + }, + month: { + displayName: "month", + relative: { + 0: "this month", + 1: "next month", + "-1": "last month" + }, + relativeTime: { + future: { + one: "in {0} month", + other: "in {0} months" + }, + past: { + one: "{0} month ago", + other: "{0} months ago" + } + } + }, + day: { + displayName: "day", + relative: { + 0: "today", + 1: "tomorrow", + "-1": "yesterday" + }, + relativeTime: { + future: { + one: "in {0} day", + other: "in {0} days" + }, + past: { + one: "{0} day ago", + other: "{0} days ago" + } + } + }, + hour: { + displayName: "hour", + relativeTime: { + future: { + one: "in {0} hour", + other: "in {0} hours" + }, + past: { + one: "{0} hour ago", + other: "{0} hours ago" + } + } + }, + minute: { + displayName: "minute", + relativeTime: { + future: { + one: "in {0} minute", + other: "in {0} minutes" + }, + past: { + one: "{0} minute ago", + other: "{0} minutes ago" + } + } + }, + second: { + displayName: "second", + relative: { + 0: "now" + }, + relativeTime: { + future: { + one: "in {0} second", + other: "in {0} seconds" + }, + past: { + one: "{0} second ago", + other: "{0} seconds ago" + } + } + } + } + } +]; diff --git a/app/javascript/mastodon/locales/whitelist_lion.json b/app/javascript/mastodon/locales/whitelist_lion.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_lion.json @@ -0,0 +1,2 @@ +[ +] diff --git a/config/application.rb b/config/application.rb index afcbf60b6..6167799a0 100644 --- a/config/application.rb +++ b/config/application.rb @@ -30,6 +30,7 @@ module Mastodon # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] config.i18n.available_locales = [ :dog, + :lion, :en, :ar, :bg, diff --git a/config/locales/activerecord.lion.yml b/config/locales/activerecord.lion.yml new file mode 100644 index 000000000..87d44eead --- /dev/null +++ b/config/locales/activerecord.lion.yml @@ -0,0 +1,13 @@ +--- +lion: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: only letters, numbers and underscores + status: + attributes: + reblog: + taken: of status already exists diff --git a/config/locales/devise.lion.yml b/config/locales/devise.lion.yml new file mode 100644 index 000000000..47e947589 --- /dev/null +++ b/config/locales/devise.lion.yml @@ -0,0 +1,62 @@ +--- +lion: + devise: + confirmations: + confirmed: Your email address has been successfully confirmed. + send_instructions: You will receive an email with instructions for how to confirm your email address in a few minutes. Please check your spam folder if you didn't receive this email. + send_paranoid_instructions: If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes. Please check your spam folder if you didn't receive this email. + failure: + already_authenticated: You are already signed in. + inactive: Your account is not activated yet. + invalid: Invalid %{authentication_keys} or password. + last_attempt: You have one more attempt before your account is locked. + locked: Your account is locked. + not_found_in_database: Invalid %{authentication_keys} or password. + timeout: Your session expired. Please sign in again to continue. + unauthenticated: You need to sign in or sign up before continuing. + unconfirmed: You have to confirm your email address before continuing. + mailer: + confirmation_instructions: + subject: 'Mastodon: Confirmation instructions for %{instance}' + password_change: + subject: 'Mastodon: Password changed' + reset_password_instructions: + subject: 'Mastodon: Reset password instructions' + unlock_instructions: + subject: 'Mastodon: Unlock instructions' + omniauth_callbacks: + failure: Could not authenticate you from %{kind} because "%{reason}". + success: Successfully authenticated from %{kind} account. + passwords: + no_token: You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided. + send_instructions: If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes. Please check your spam folder if you didn't receive this email. + send_paranoid_instructions: If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes. Please check your spam folder if you didn't receive this email. + updated: Your password has been changed successfully. You are now signed in. + updated_not_active: Your password has been changed successfully. + registrations: + destroyed: Bye! Your account has been successfully cancelled. We hope to see you again soon. + signed_up: Welcome! You have signed up successfully. + signed_up_but_inactive: You have signed up successfully. However, we could not sign you in because your account is not yet activated. + signed_up_but_locked: You have signed up successfully. However, we could not sign you in because your account is locked. + signed_up_but_unconfirmed: A message with a confirmation link has been sent to your email address. Please follow the link to activate your account. Please check your spam folder if you didn't receive this email. + update_needs_confirmation: You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address. Please check your spam folder if you didn't receive this email. + updated: Your account has been updated successfully. + sessions: + already_signed_out: Signed out successfully. + signed_in: Signed in successfully. + signed_out: Signed out successfully. + unlocks: + send_instructions: You will receive an email with instructions for how to unlock your account in a few minutes. Please check your spam folder if you didn't receive this email. + send_paranoid_instructions: If your account exists, you will receive an email with instructions for how to unlock it in a few minutes. Please check your spam folder if you didn't receive this email. + unlocked: Your account has been unlocked successfully. Please sign in to continue. + errors: + messages: + already_confirmed: was already confirmed, please try signing in + confirmation_period_expired: needs to be confirmed within %{period}, please request a new one + expired: has expired, please request a new one + not_found: not found + not_locked: was not locked + not_saved: + one: '1 error prohibited this %{resource} from being saved:' + other: "%{count} errors prohibited this %{resource} from being saved:" + diff --git a/config/locales/doorkeeper.lion.yml b/config/locales/doorkeeper.lion.yml new file mode 100644 index 000000000..aa45b0752 --- /dev/null +++ b/config/locales/doorkeeper.lion.yml @@ -0,0 +1,119 @@ +--- +lion: + activerecord: + attributes: + doorkeeper/application: + name: Application name + redirect_uri: Redirect URI + scopes: Scopes + website: Application website + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: cannot contain a fragment. + invalid_uri: must be a valid URI. + relative_uri: must be an absolute URI. + secured_uri: must be an HTTPS/SSL URI. + doorkeeper: + applications: + buttons: + authorize: Authorize + cancel: Cancel + destroy: Destroy + edit: Edit + submit: Submit + confirmations: + destroy: Are you sure? + edit: + title: Edit application + form: + error: Whoops! Check your form for possible errors + help: + native_redirect_uri: Use %{native_redirect_uri} for local tests + redirect_uri: Use one line per URI + scopes: Separate scopes with spaces. Leave blank to use the default scopes. + index: + application: Application + callback_url: Callback URL + delete: Delete + name: Name + new: New application + scopes: Scopes + show: Show + title: Your applications + new: + title: New application + show: + actions: Actions + application_id: Client key + callback_urls: Callback URLs + scopes: Scopes + secret: Client secret + title: 'Application: %{name}' + authorizations: + buttons: + authorize: Authorize + deny: Deny + error: + title: An error has occurred + new: + able_to: It will be able to + prompt: Application %{client_name} requests access to your account + title: Authorization required + show: + title: Copy this authorization code and paste it to the application. + authorized_applications: + buttons: + revoke: Revoke + confirmations: + revoke: Are you sure? + index: + application: Application + created_at: Authorized + date_format: "%Y-%m-%d %H:%M:%S" + scopes: Scopes + title: Your authorized applications + errors: + messages: + access_denied: The resource owner or authorization server denied the request. + credential_flow_not_configured: Resource Owner Password Credentials flow failed due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured. + invalid_client: Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method. + invalid_grant: The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client. + invalid_redirect_uri: The redirect uri included is not valid. + invalid_request: The request is missing a required parameter, includes an unsupported parameter value, or is otherwise malformed. + invalid_resource_owner: The provided resource owner credentials are not valid, or resource owner cannot be found + invalid_scope: The requested scope is invalid, unknown, or malformed. + invalid_token: + expired: The access token expired + revoked: The access token was revoked + unknown: The access token is invalid + resource_owner_authenticator_not_configured: Resource Owner find failed due to Doorkeeper.configure.resource_owner_authenticator being unconfiged. + server_error: The authorization server encountered an unexpected condition which prevented it from fulfilling the request. + temporarily_unavailable: The authorization server is currently unable to handle the request due to a temporary overloading or maintenance of the server. + unauthorized_client: The client is not authorized to perform this request using this method. + unsupported_grant_type: The authorization grant type is not supported by the authorization server. + unsupported_response_type: The authorization server does not support this response type. + flash: + applications: + create: + notice: Application created. + destroy: + notice: Application deleted. + update: + notice: Application updated. + authorized_applications: + destroy: + notice: Application revoked. + layouts: + admin: + nav: + applications: Applications + oauth2_provider: OAuth2 Provider + application: + title: OAuth authorization required + scopes: + follow: follow, block, unblock and unfollow accounts + read: read your account's data + write: post on your behalf diff --git a/config/locales/lion.yml b/config/locales/lion.yml new file mode 100644 index 000000000..40b3240ae --- /dev/null +++ b/config/locales/lion.yml @@ -0,0 +1,615 @@ +--- +lion: + about: + about_hashtag_html: These are public toots tagged with #%{hashtag}. You can interact with them if you have an account anywhere in the fediverse. + about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail. + about_this: About + closed_registrations: Registrations are currently closed on this instance. However! You can find a different instance to make an account on and get access to the very same network from there. + contact: Contact + contact_missing: Not set + contact_unavailable: N/A + description_headline: What is %{domain}? + domain_count_after: other instances + domain_count_before: Connected to + extended_description_html: | +

A good place for rules

+

The extended description has not been set up yet.

+ features: + humane_approach_body: Learning from failures of other networks, Mastodon aims to make ethical design choices to combat the misuse of social media. + humane_approach_title: A more humane approach + not_a_product_body: Mastodon is not a commercial network. No advertising, no data mining, no walled gardens. There is no central authority. + not_a_product_title: You’re a person, not a product + real_conversation_body: With 500 characters at your disposal and support for granular content and media warnings, you can express yourself the way you want to. + real_conversation_title: Built for real conversation + within_reach_body: Multiple apps for iOS, Android, and other platforms thanks to a developer-friendly API ecosystem allow you to keep up with your friends anywhere. + within_reach_title: Always within reach + find_another_instance: Find another instance + generic_description: "%{domain} is one server in the network" + hosted_on: Mastodon hosted on %{domain} + learn_more: Learn more + other_instances: Instance list + source_code: Source code + status_count_after: statuses + status_count_before: Who authored + user_count_after: users + user_count_before: Home to + what_is_mastodon: What is Mastodon? + accounts: + follow: Follow + followers: Followers + following: Following + media: Media + nothing_here: There is nothing here! + people_followed_by: People whom %{name} follows + people_who_follow: People who follow %{name} + posts: Toots + posts_with_replies: Toots with replies + remote_follow: Remote follow + reserved_username: The username is reserved + roles: + admin: Admin + unfollow: Unfollow + admin: + account_moderation_notes: + account: Moderator + create: Create + created_at: Date + created_msg: Moderation note successfully created! + delete: Delete + destroyed_msg: Moderation note successfully destroyed! + accounts: + are_you_sure: Are you sure? + confirm: Confirm + confirmed: Confirmed + disable_two_factor_authentication: Disable 2FA + display_name: Display name + domain: Domain + edit: Edit + email: E-mail + feed_url: Feed URL + followers: Followers + followers_url: Followers URL + follows: Follows + inbox_url: Inbox URL + ip: IP + location: + all: All + local: Local + remote: Remote + title: Location + media_attachments: Media attachments + moderation: + all: All + silenced: Silenced + suspended: Suspended + title: Moderation + moderation_notes: Moderation notes + most_recent_activity: Most recent activity + most_recent_ip: Most recent IP + not_subscribed: Not subscribed + order: + alphabetic: Alphabetic + most_recent: Most recent + title: Order + outbox_url: Outbox URL + perform_full_suspension: Perform full suspension + profile_url: Profile URL + protocol: Protocol + public: Public + push_subscription_expires: PuSH subscription expires + redownload: Refresh avatar + reset: Reset + reset_password: Reset password + resubscribe: Resubscribe + salmon_url: Salmon URL + search: Search + shared_inbox_url: Shared Inbox URL + show: + created_reports: Reports created by this account + report: report + targeted_reports: Reports made about this account + silence: Silence + statuses: Statuses + subscribe: Subscribe + title: Accounts + undo_silenced: Undo silence + undo_suspension: Undo suspension + unsubscribe: Unsubscribe + username: Username + web: Web + custom_emojis: + copied_msg: Successfully created local copy of the emoji + copy: Copy + copy_failed_msg: Could not make a local copy of that emoji + created_msg: Emoji successfully created! + delete: Delete + destroyed_msg: Emojo successfully destroyed! + disable: Disable + disabled_msg: Successfully disabled that emoji + emoji: Emoji + enable: Enable + enabled_msg: Successfully enabled that emoji + image_hint: PNG up to 50KB + new: + title: Add new custom emoji + shortcode: Shortcode + shortcode_hint: At least 2 characters, only alphanumeric characters and underscores + title: Custom emojis + upload: Upload + domain_blocks: + add_new: Add new + created_msg: Domain block is now being processed + destroyed_msg: Domain block has been undone + domain: Domain + new: + create: Create block + hint: The domain block will not prevent creation of account entries in the database, but will retroactively and automatically apply specific moderation methods on those accounts. + severity: + desc_html: "Silence will make the account's posts invisible to anyone who isn't following them. Suspend will remove all of the account's content, media, and profile data. Use None if you just want to reject media files." + noop: None + silence: Silence + suspend: Suspend + title: New domain block + reject_media: Reject media files + reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions + severities: + noop: None + silence: Silence + suspend: Suspend + severity: Severity + show: + affected_accounts: + one: One account in the database affected + other: "%{count} accounts in the database affected" + retroactive: + silence: Unsilence all existing accounts from this domain + suspend: Unsuspend all existing accounts from this domain + title: Undo domain block for %{domain} + undo: Undo + title: Domain Blocks + undo: Undo + email_domain_blocks: + add_new: Add new + created_msg: Email domain block successfully created + delete: Delete + destroyed_msg: Email domain block successfully deleted + domain: Domain + new: + create: Create block + title: New email domain block + title: Email Domain Block + instances: + account_count: Known accounts + domain_name: Domain + reset: Reset + search: Search + title: Known Instances + reports: + action_taken_by: Action taken by + are_you_sure: Are you sure? + comment: + label: Comment + none: None + delete: Delete + id: ID + mark_as_resolved: Mark as resolved + nsfw: + 'false': Unhide media attachments + 'true': Hide media attachments + report: 'Report #%{id}' + report_contents: Contents + reported_account: Reported account + reported_by: Reported by + resolved: Resolved + silence_account: Silence account + status: Status + suspend_account: Suspend account + target: Target + title: Reports + unresolved: Unresolved + view: View + settings: + bootstrap_timeline_accounts: + desc_html: Separate multiple usernames by comma. Only local and unlocked accounts will work. Default when empty is all local admins. + title: Default follows for new users + contact_information: + email: Business e-mail + username: Contact username + registrations: + closed_message: + desc_html: Displayed on frontpage when registrations are closed. You can use HTML tags + title: Closed registration message + deletion: + desc_html: Allow anyone to delete their account + title: Open account deletion + open: + desc_html: Allow anyone to create an account + title: Open registration + site_description: + desc_html: Introductory paragraph on the frontpage and in meta tags. You can use HTML tags, in particular <a> and <em>. + title: Instance description + site_description_extended: + desc_html: A good place for your code of conduct, rules, guidelines and other things that set your instance apart. You can use HTML tags + title: Custom extended information + site_terms: + desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags + title: Custom terms of service + site_title: Instance name + thumbnail: + desc_html: Used for previews via OpenGraph and API. 1200x630px recommended + title: Instance thumbnail + timeline_preview: + desc_html: Display public timeline on landing page + title: Timeline preview + title: Site Settings + statuses: + back_to_account: Back to account page + batch: + delete: Delete + nsfw_off: NSFW OFF + nsfw_on: NSFW ON + execute: Execute + failed_to_execute: Failed to execute + media: + hide: Hide media + show: Show media + title: Media + no_media: No media + title: Account statuses + with_media: With media + subscriptions: + callback_url: Callback URL + confirmed: Confirmed + expires_in: Expires in + last_delivery: Last delivery + title: WebSub + topic: Topic + title: Administration + admin_mailer: + new_report: + body: "%{reporter} has reported %{target}" + subject: New report for %{instance} (#%{id}) + application_mailer: + salutation: "%{name}," + settings: 'Change e-mail preferences: %{link}' + signature: Mastodon notifications from %{instance} + view: 'View:' + applications: + created: Application successfully created + destroyed: Application successfully deleted + invalid_url: The provided URL is invalid + regenerate_token: Regenerate access token + token_regenerated: Access token successfully regenerated + warning: Be very careful with this data. Never share it with anyone! + your_token: Your access token + auth: + agreement_html: By signing up you agree to our terms of service and privacy policy. + change_password: Security + delete_account: Delete account + delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. + didnt_get_confirmation: Didn't receive confirmation instructions? + forgot_password: Forgot your password? + invalid_reset_password_token: Password reset token is invalid or expired. Please request a new one. + login: Log in + logout: Logout + register: Sign up + resend_confirmation: Resend confirmation instructions + reset_password: Reset password + set_new_password: Set new password + authorize_follow: + error: Unfortunately, there was an error looking up the remote account + follow: Follow + follow_request: 'You have sent a follow request to:' + following: 'Success! You are now following:' + post_follow: + close: Or, you can just close this window. + return: Return to the user's profile + web: Go to web + title: Follow %{acct} + datetime: + distance_in_words: + about_x_hours: "%{count}h" + about_x_months: "%{count}mo" + about_x_years: "%{count}y" + almost_x_years: "%{count}y" + half_a_minute: Just now + less_than_x_minutes: "%{count}m" + less_than_x_seconds: Just now + over_x_years: "%{count}y" + x_days: "%{count}d" + x_minutes: "%{count}m" + x_months: "%{count}mo" + x_seconds: "%{count}s" + deletes: + bad_password_msg: Nice try, hackers! Incorrect password + confirm_password: Enter your current password to verify your identity + description_html: This will permanently, irreversibly remove content from your account and deactivate it. Your username will remain reserved to prevent future impersonations. + proceed: Delete account + success_msg: Your account was successfully deleted + warning_html: Only deletion of content from this particular instance is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases. + warning_title: Disseminated content availability + errors: + '403': You don't have permission to view this page. + '404': The page you were looking for doesn't exist. + '410': The page you were looking for doesn't exist anymore. + '422': + content: Security verification failed. Are you blocking cookies? + title: Security verification failed + '429': Throttled + '500': + content: We're sorry, but something went wrong on our end. + title: This page is not correct + noscript_html: To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform. + exports: + blocks: You block + csv: CSV + follows: You follow + mutes: You mute + storage: Media storage + followers: + domain: Domain + explanation_html: If you want to ensure the privacy of your statuses, you must be aware of who is following you. Your private statuses are delivered to all instances where you have followers. You may wish to review them, and remove followers if you do not trust your privacy to be respected by the staff or software of those instances. + followers_count: Number of followers + lock_link: Lock your account + purge: Remove from followers + success: + one: In the process of soft-blocking followers from one domain... + other: In the process of soft-blocking followers from %{count} domains... + true_privacy_html: Please mind that true privacy can only be achieved with end-to-end encryption. + unlocked_warning_html: Anyone can follow you to immediately view your private statuses. %{lock_link} to be able to review and reject followers. + unlocked_warning_title: Your account is not locked + generic: + changes_saved_msg: Changes successfully saved! + powered_by: powered by %{link} + save_changes: Save changes + validation_errors: + one: Something isn't quite right yet! Please review the error below + other: Something isn't quite right yet! Please review %{count} errors below + imports: + preface: You can import data that you have exported from another instance, such as a list of the people you are following or blocking. + success: Your data was successfully uploaded and will now be processed in due time + types: + blocking: Blocking list + following: Following list + muting: Muting list + upload: Upload + landing_strip_html: "%{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." + landing_strip_signup_html: If you don't, you can sign up here. + media_attachments: + validations: + images_and_video: Cannot attach a video to a status that already contains images + too_many: Cannot attach more than 4 files + notification_mailer: + digest: + body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:' + mention: "%{name} mentioned you in:" + new_followers_summary: + one: You have acquired one new follower! Yay! + other: You have gotten %{count} new followers! Amazing! + subject: + one: "1 new notification since your last visit \U0001F418" + other: "%{count} new notifications since your last visit \U0001F418" + favourite: + body: 'Your status was favourited by %{name}:' + subject: "%{name} favourited your status" + follow: + body: "%{name} is now following you!" + subject: "%{name} is now following you" + follow_request: + body: "%{name} has requested to follow you" + subject: 'Pending follower: %{name}' + mention: + body: 'You were mentioned by %{name} in:' + subject: You were mentioned by %{name} + reblog: + body: 'Your status was boosted by %{name}:' + subject: "%{name} boosted your status" + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: Q + thousand: K + trillion: T + unit: '' + pagination: + next: Next + prev: Prev + truncate: "…" + preferences: + languages: Languages + other: Other + publishing: Publishing + web: Web + push_notifications: + favourite: + title: "%{name} favourited your status" + follow: + title: "%{name} is now following you" + group: + title: "%{count} notifications" + mention: + action_boost: Boost + action_expand: Show more + action_favourite: Favourite + title: "%{name} mentioned you" + reblog: + title: "%{name} boosted your status" + remote_follow: + acct: Enter your username@domain you want to follow from + missing_resource: Could not find the required redirect URL for your account + proceed: Proceed to follow + prompt: 'You are going to follow:' + sessions: + activity: Last activity + browser: Browser + browsers: + alipay: Alipay + blackberry: Blackberry + chrome: Chrome + edge: Microsoft Edge + firefox: Firefox + generic: Unknown browser + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Nokia S40 Ovi Browser + opera: Opera + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UCBrowser + weibo: Weibo + current_session: Current session + description: "%{browser} on %{platform}" + explanation: These are the web browsers currently logged in to your Mastodon account. + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: Linux + mac: Mac + other: unknown platform + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone + revoke: Revoke + revoke_success: Session successfully revoked + title: Sessions + settings: + authorized_apps: Authorized apps + back: Back to Mastodon + delete: Account deletion + development: Development + edit_profile: Edit profile + export: Data export + followers: Authorized followers + import: Import + notifications: Notifications + preferences: Preferences + settings: Settings + two_factor_authentication: Two-factor Authentication + your_apps: Your applications + statuses: + open_in_web: Open in web + over_character_limit: character limit of %{max} exceeded + pin_errors: + limit: Too many toots pinned + ownership: Someone else's toot cannot be pinned + private: Non-public toot cannot be pinned + reblog: A boost cannot be pinned + show_more: Show more + visibilities: + private: Followers-only + private_long: Only show to followers + public: Public + public_long: Everyone can see + unlisted: Unlisted + unlisted_long: Everyone can see, but not listed on public timelines + stream_entries: + click_to_show: Click to show + pinned: Pinned toot + reblogged: boosted + sensitive_content: Sensitive content + terms: + body_html: | +

Privacy Policy

+ +

What information do we collect?

+ +

We collect information from you when you register on our site and gather data when you participate in the forum by reading, writing, and evaluating the content shared here.

+ +

When registering on our site, you may be asked to enter your name and e-mail address. You may, however, visit our site without registering. Your e-mail address will be verified by an email containing a unique link. If that link is visited, we know that you control the e-mail address.

+ +

When registered and posting, we record the IP address that the post originated from. We also may retain server logs which include the IP address of every request to our server.

+ +

What do we use your information for?

+ +

Any of the information we collect from you may be used in one of the following ways:

+ +
    +
  • To personalize your experience — your information helps us to better respond to your individual needs.
  • +
  • To improve our site — we continually strive to improve our site offerings based on the information and feedback we receive from you.
  • +
  • To improve customer service — your information helps us to more effectively respond to your customer service requests and support needs.
  • +
  • To send periodic emails — The email address you provide may be used to send you information, notifications that you request about changes to topics or in response to your user name, respond to inquiries, and/or other requests or questions.
  • +
+ +

How do we protect your information?

+ +

We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information.

+ +

What is your data retention policy?

+ +

We will make a good faith effort to:

+ +
    +
  • Retain server logs containing the IP address of all requests to this server no more than 90 days.
  • +
  • Retain the IP addresses associated with registered users and their posts no more than 5 years.
  • +
+ +

Do we use cookies?

+ +

Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.

+ +

We use cookies to understand and save your preferences for future visits and compile aggregate data about site traffic and site interaction so that we can offer better site experiences and tools in the future. We may contract with third-party service providers to assist us in better understanding our site visitors. These service providers are not permitted to use the information collected on our behalf except to help us conduct and improve our business.

+ +

Do we disclose any information to outside parties?

+ +

We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety. However, non-personally identifiable visitor information may be provided to other parties for marketing, advertising, or other uses.

+ +

Third party links

+ +

Occasionally, at our discretion, we may include or offer third party products or services on our site. These third party sites have separate and independent privacy policies. We therefore have no responsibility or liability for the content and activities of these linked sites. Nonetheless, we seek to protect the integrity of our site and welcome any feedback about these sites.

+ +

Children's Online Privacy Protection Act Compliance

+ +

Our site, products and services are all directed to people who are at least 13 years old. If this server is in the USA, and you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

+ +

Online Privacy Policy Only

+ +

This online privacy policy applies only to information collected through our site and not to information collected offline.

+ + + +

By using our site, you consent to our web site privacy policy.

+ +

Changes to our Privacy Policy

+ +

If we decide to change our privacy policy, we will post those changes on this page.

+ +

This document is CC-BY-SA. It was last updated May 31, 2013.

+ +

Originally adapted from the Discourse privacy policy.

+ title: "%{instance} Terms of Service and Privacy Policy" + themes: + default: "Dog" + mastodon: "The default mastodon theme" + time: + formats: + default: "%b %d, %Y, %H:%M" + two_factor_authentication: + code_hint: Enter the code generated by your authenticator app to confirm + description_html: If you enable two-factor authentication, logging in will require you to be in possession of your phone, which will generate tokens for you to enter. + disable: Disable + enable: Enable + enabled: Two-factor authentication is enabled + enabled_success: Two-factor authentication successfully enabled + generate_recovery_codes: Generate recovery codes + instructions_html: "Scan this QR code into Google Authenticator or a similiar TOTP app on your phone. From now on, that app will generate tokens that you will have to enter when logging in." + lost_recovery_codes: Recovery codes allow you to regain access to your account if you lose your phone. If you've lost your recovery codes, you can regenerate them here. Your old recovery codes will be invalidated. + manual_instructions: 'If you can''t scan the QR code and need to enter it manually, here is the plain-text secret:' + recovery_codes: Backup recovery codes + recovery_codes_regenerated: Recovery codes successfully regenerated + recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. Keep the recovery codes safe. For example, you may print them and store them with other important documents. + setup: Set up + wrong_code: The entered code was invalid! Are server time and device time correct? + users: + invalid_email: The e-mail address is invalid + invalid_otp_token: Invalid two-factor code + signed_in_as: 'Signed in as:' diff --git a/config/locales/simple_form.lion.yml b/config/locales/simple_form.lion.yml new file mode 100644 index 000000000..a44406c13 --- /dev/null +++ b/config/locales/simple_form.lion.yml @@ -0,0 +1,68 @@ +--- +lion: + simple_form: + hints: + defaults: + avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 120x120px + digest: Sent after a long period of inactivity with a summary of mentions you've received in your absence + display_name: + one: 1 character left + other: %{count} characters left + header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px + locked: Requires you to manually approve followers + note: + one: 1 character left + other: %{count} characters left + setting_noindex: Affects your public profile and status pages + setting_theme: Affects how Mastodon looks when you're logged in from any device. + imports: + data: CSV file exported from another Mastodon instance + sessions: + otp: Enter the Two-factor code from your phone or use one of your recovery codes. + user: + filtered_languages: Checked languages will be filtered from public timelines for you + labels: + defaults: + avatar: Avatar + confirm_new_password: Confirm new password + confirm_password: Confirm password + current_password: Current password + data: Data + display_name: Display name + email: E-mail address + filtered_languages: Filtered languages + header: Header + locale: Language + locked: Lock account + new_password: New password + note: Bio + otp_attempt: Two-factor code + password: Password + setting_auto_play_gif: Auto-play animated GIFs + setting_boost_modal: Show confirmation dialog before boosting + setting_default_privacy: Post privacy + setting_default_sensitive: Always mark media as sensitive + setting_delete_modal: Show confirmation dialog before deleting a toot + setting_noindex: Opt-out of search engine indexing + setting_reduce_motion: Reduce motion in animations + setting_system_font_ui: Use system's default font + setting_theme: Site theme + setting_unfollow_modal: Show confirmation dialog before unfollowing someone + severity: Severity + type: Import type + username: Username + interactions: + must_be_follower: Block notifications from non-followers + must_be_following: Block notifications from people you don't follow + notification_emails: + digest: Send digest e-mails + favourite: Send e-mail when someone favourites your status + follow: Send e-mail when someone follows you + follow_request: Send e-mail when someone requests to follow you + mention: Send e-mail when someone mentions you + reblog: Send e-mail when someone boosts your status + 'no': 'No' + required: + mark: "*" + text: required + 'yes': 'Yes' From 74f35bc9c2a9a9a11f36222caff8ba492ec3e974 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Thu, 14 Dec 2017 16:01:42 -0600 Subject: [PATCH 023/274] Spelling --- config/locales/dog.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 30503c899..1cddd7483 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -589,7 +589,7 @@ dog: title: "%{instance} Terms of Service and Privacy Policy" themes: default: "Dog" - mastodon: "The default mastodon theme" + mastodon: "The default Mastodon theme" time: formats: default: "%b %d, %Y, %H:%M" From acd67185b4043356af6f310424f289457a30852e Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Thu, 14 Dec 2017 16:16:33 -0600 Subject: [PATCH 024/274] Update locales --- app/javascript/mastodon/locales/dog.json | 38 +++++++ app/javascript/mastodon/locales/lion.json | 40 ++++++- config/locales/devise.dog.yml | 1 - config/locales/dog.yml | 121 ++++++++++++++++++--- config/locales/lion.yml | 123 +++++++++++++++++++--- config/locales/simple_form.dog.yml | 3 + config/locales/simple_form.lion.yml | 3 + 7 files changed, 302 insertions(+), 27 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index 0431c6cae..33d05523a 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -7,17 +7,22 @@ "account.followers": "Pack Members", "account.follows": "Joined Packs", "account.follows_you": "Is in your pack", + "account.hide_reblogs": "Hide awoos from @{name}", "account.media": "Media", "account.mention": "Bark at @{name}", + "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", + "account.mute_notifications": "Mute notifications from @{name}", "account.posts": "Toots", "account.report": "Report @{name}", "account.requested": "Awaiting approval. Click to cancel follow request", "account.share": "Share @{name}'s profile", + "account.show_reblogs": "Show awoos from @{name}", "account.unblock": "Unblock @{name}", "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Leave Pack", "account.unmute": "Unmute @{name}", + "account.unmute_notifications": "Unmute notifications from @{name}", "account.view_full_profile": "View full profile", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", @@ -31,6 +36,7 @@ "column.favourites": "Boops", "column.follow_requests": "Pack requests", "column.home": "Home", + "column.lists": "Lists", "column.mutes": "Muted users", "column.notifications": "Notifications", "column.pins": "Pinned toots", @@ -57,6 +63,8 @@ "confirmations.block.message": "Are you sure you want to block {name}?", "confirmations.delete.confirm": "Delete", "confirmations.delete.message": "Are you sure you want to delete this toot?", + "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.domain_block.confirm": "Hide entire domain", "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.", "confirmations.mute.confirm": "Mute", @@ -83,6 +91,7 @@ "empty_column.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", "empty_column.home.public_timeline": "the public timeline", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", "follow_request.authorize": "Authorize", @@ -98,18 +107,46 @@ "home.column_settings.show_reblogs": "Show awoos", "home.column_settings.show_replies": "Show barks", "home.settings": "Column settings", + "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.compose": "to focus the compose textarea", + "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.heading": "Keyboard shortcuts", + "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.up": "to move up in the list", "lightbox.close": "Close", "lightbox.next": "Next", "lightbox.previous": "Previous", + "lists.account.add": "Add to list", + "lists.account.remove": "Remove from list", + "lists.delete": "Delete list", + "lists.edit": "Edit list", + "lists.new.create": "Add list", + "lists.new.title_placeholder": "New list title", + "lists.search": "Search among people you follow", + "lists.subheading": "Your lists", "loading_indicator.label": "Loading...", "media_gallery.toggle_visible": "Toggle visibility", "missing_indicator.label": "Not found", + "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Boops", "navigation_bar.follow_requests": "Pack requests", "navigation_bar.info": "About this instance", + "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", + "navigation_bar.lists": "Lists", "navigation_bar.logout": "Logout", "navigation_bar.mutes": "Muted users", "navigation_bar.pins": "Pinned toots", @@ -204,6 +241,7 @@ "tabs_bar.home": "Home", "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notifications", + "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", "upload_form.description": "Describe for the visually impaired", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index 660802bba..b192621e0 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -7,17 +7,22 @@ "account.followers": "Pride Members", "account.follows": "Joined Prides", "account.follows_you": "Is in your pride", + "account.hide_reblogs": "Hide roars from @{name}", "account.media": "Media", "account.mention": "Meow at @{name}", + "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", + "account.mute_notifications": "Mute notifications from @{name}", "account.posts": "Toots", "account.report": "Report @{name}", "account.requested": "Awaiting approval. Click to cancel follow request", "account.share": "Share @{name}'s profile", + "account.show_reblogs": "Show roars from @{name}", "account.unblock": "Unblock @{name}", "account.unblock_domain": "Unhide {domain}", "account.unfollow": "Leave Pride", "account.unmute": "Unmute @{name}", + "account.unmute_notifications": "Unmute notifications from @{name}", "account.view_full_profile": "View full profile", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", @@ -31,6 +36,7 @@ "column.favourites": "Boops", "column.follow_requests": "Pride requests", "column.home": "Home", + "column.lists": "Lists", "column.mutes": "Muted users", "column.notifications": "Notifications", "column.pins": "Pinned toots", @@ -44,7 +50,7 @@ "column_header.unpin": "Unpin", "column_subheading.navigation": "Navigation", "column_subheading.settings": "Settings", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your pack-only toots.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your pride-only toots.", "compose_form.lock_disclaimer.lock": "locked", "compose_form.placeholder": "Meow???", "compose_form.publish": "Toot", @@ -57,6 +63,8 @@ "confirmations.block.message": "Are you sure you want to block {name}?", "confirmations.delete.confirm": "Delete", "confirmations.delete.message": "Are you sure you want to delete this toot?", + "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.domain_block.confirm": "Hide entire domain", "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.", "confirmations.mute.confirm": "Mute", @@ -83,6 +91,7 @@ "empty_column.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", "empty_column.home.public_timeline": "the public timeline", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", "follow_request.authorize": "Authorize", @@ -98,18 +107,46 @@ "home.column_settings.show_reblogs": "Show roars", "home.column_settings.show_replies": "Show meows", "home.settings": "Column settings", + "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.compose": "to focus the compose textarea", + "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.heading": "Keyboard shortcuts", + "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.up": "to move up in the list", "lightbox.close": "Close", "lightbox.next": "Next", "lightbox.previous": "Previous", + "lists.account.add": "Add to list", + "lists.account.remove": "Remove from list", + "lists.delete": "Delete list", + "lists.edit": "Edit list", + "lists.new.create": "Add list", + "lists.new.title_placeholder": "New list title", + "lists.search": "Search among people you follow", + "lists.subheading": "Your lists", "loading_indicator.label": "Loading...", "media_gallery.toggle_visible": "Toggle visibility", "missing_indicator.label": "Not found", + "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Boops", "navigation_bar.follow_requests": "Pride requests", "navigation_bar.info": "About this instance", + "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", + "navigation_bar.lists": "Lists", "navigation_bar.logout": "Logout", "navigation_bar.mutes": "Muted users", "navigation_bar.pins": "Pinned toots", @@ -204,6 +241,7 @@ "tabs_bar.home": "Home", "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notifications", + "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", "upload_form.description": "Describe for the visually impaired", diff --git a/config/locales/devise.dog.yml b/config/locales/devise.dog.yml index 5161c6b86..047a64ec3 100644 --- a/config/locales/devise.dog.yml +++ b/config/locales/devise.dog.yml @@ -59,4 +59,3 @@ dog: not_saved: one: '1 error prohibited this %{resource} from being saved:' other: "%{count} errors prohibited this %{resource} from being saved:" - diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 1cddd7483..0e00257cf 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -39,15 +39,17 @@ dog: followers: Followers following: Following media: Media + moved_html: "%{name} has moved to %{new_profile_link}:" nothing_here: There is nothing here! people_followed_by: People whom %{name} follows people_who_follow: People who follow %{name} posts: Toots - posts_with_replies: Toots with replies + posts_with_replies: Toots and replies remote_follow: Remote follow reserved_username: The username is reserved roles: admin: Admin + moderator: Mod unfollow: Unfollow admin: account_moderation_notes: @@ -59,13 +61,19 @@ dog: destroyed_msg: Moderation note successfully destroyed! accounts: are_you_sure: Are you sure? + by_domain: Domain confirm: Confirm confirmed: Confirmed + demote: Demote + disable: Disable disable_two_factor_authentication: Disable 2FA + disabled: Disabled display_name: Display name domain: Domain edit: Edit email: E-mail + enable: Enable + enabled: Enabled feed_url: Feed URL followers: Followers followers_url: Followers URL @@ -77,7 +85,9 @@ dog: local: Local remote: Remote title: Location + login_status: Login status media_attachments: Media attachments + memorialize: Turn into memoriam moderation: all: All silenced: Silenced @@ -94,6 +104,7 @@ dog: outbox_url: Outbox URL perform_full_suspension: Perform full suspension profile_url: Profile URL + promote: Promote protocol: Protocol public: Public push_subscription_expires: PuSH subscription expires @@ -101,6 +112,12 @@ dog: reset: Reset reset_password: Reset password resubscribe: Resubscribe + role: Permissions + roles: + admin: Administrator + moderator: Moderator + staff: Staff + user: User salmon_url: Salmon URL search: Search shared_inbox_url: Shared Inbox URL @@ -117,7 +134,34 @@ dog: unsubscribe: Unsubscribe username: Username web: Web + action_logs: + actions: + confirm_user: "%{name} confirmed e-mail address of user %{target}" + create_custom_emoji: "%{name} uploaded new emoji %{target}" + create_domain_block: "%{name} blocked domain %{target}" + create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" + demote_user: "%{name} demoted user %{target}" + destroy_domain_block: "%{name} unblocked domain %{target}" + destroy_email_domain_block: "%{name} whitelisted e-mail domain %{target}" + destroy_status: "%{name} removed status by %{target}" + disable_2fa_user: "%{name} disabled two factor requirement for user %{target}" + disable_custom_emoji: "%{name} disabled emoji %{target}" + disable_user: "%{name} disabled login for user %{target}" + enable_custom_emoji: "%{name} enabled emoji %{target}" + enable_user: "%{name} enabled login for user %{target}" + memorialize_account: "%{name} turned %{target}'s account into a memoriam page" + promote_user: "%{name} promoted user %{target}" + reset_password_user: "%{name} reset password of user %{target}" + resolve_report: "%{name} dismissed report %{target}" + silence_account: "%{name} silenced %{target}'s account" + suspend_account: "%{name} suspended %{target}'s account" + unsilence_account: "%{name} unsilenced %{target}'s account" + unsuspend_account: "%{name} unsuspended %{target}'s account" + update_custom_emoji: "%{name} updated emoji %{target}" + update_status: "%{name} updated status by %{target}" + title: Audit log custom_emojis: + by_domain: Domain copied_msg: Successfully created local copy of the emoji copy: Copy copy_failed_msg: Could not make a local copy of that emoji @@ -130,11 +174,16 @@ dog: enable: Enable enabled_msg: Successfully enabled that emoji image_hint: PNG up to 50KB + listed: Listed new: title: Add new custom emoji + overwrite: Overwrite shortcode: Shortcode shortcode_hint: At least 2 characters, only alphanumeric characters and underscores title: Custom emojis + unlisted: Unlisted + update_failed_msg: Could not update that emoji + updated_msg: Emoji successfully updated! upload: Upload domain_blocks: add_new: Add new @@ -166,24 +215,31 @@ dog: suspend: Unsuspend all existing accounts from this domain title: Undo domain block for %{domain} undo: Undo - title: Domain Blocks + title: Domain blocks undo: Undo email_domain_blocks: add_new: Add new - created_msg: Email domain block successfully created + created_msg: Successfully added e-mail domain to blacklist delete: Delete - destroyed_msg: Email domain block successfully deleted + destroyed_msg: Successfully deleted e-mail domain from blacklist domain: Domain new: - create: Create block - title: New email domain block - title: Email Domain Block + create: Add domain + title: New e-mail blacklist entry + title: E-mail blacklist instances: account_count: Known accounts domain_name: Domain reset: Reset search: Search - title: Known Instances + title: Known instances + invites: + filter: + all: All + available: Available + expired: Expired + title: Filter + title: Invites reports: action_taken_by: Action taken by are_you_sure: Are you sure? @@ -222,9 +278,15 @@ dog: deletion: desc_html: Allow anyone to delete their account title: Open account deletion + min_invite_role: + disabled: No one + title: Allow invitations by open: desc_html: Allow anyone to create an account title: Open registration + show_staff_badge: + desc_html: Show a staff badge on a user page + title: Show staff badge site_description: desc_html: Introductory paragraph on the frontpage and in meta tags. You can use HTML tags, in particular <a> and <em>. title: Instance description @@ -241,7 +303,7 @@ dog: timeline_preview: desc_html: Display public timeline on landing page title: Timeline preview - title: Site Settings + title: Site settings statuses: back_to_account: Back to account page batch: @@ -283,7 +345,7 @@ dog: warning: Be very careful with this data. Never share it with anyone! your_token: Your access token auth: - agreement_html: By signing up you agree to our terms of service and privacy policy. + agreement_html: By signing up you agree to follow the rules of the instance and our terms of service. change_password: Security delete_account: Delete account delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. @@ -292,6 +354,8 @@ dog: invalid_reset_password_token: Password reset token is invalid or expired. Please request a new one. login: Log in logout: Logout + migrate_account: Move to a different account + migrate_account_html: If you wish to redirect this account to a different one, you can configure it here. register: Sign up resend_confirmation: Resend confirmation instructions reset_password: Reset password @@ -373,12 +437,43 @@ dog: following: Following list muting: Muting list upload: Upload + in_memoriam_html: In Memoriam. + invites: + delete: Deactivate + expired: Expired + expires_in: + '1800': 30 minutes + '21600': 6 hours + '3600': 1 hour + '43200': 12 hours + '86400': 1 day + expires_in_prompt: Never + generate: Generate + max_uses: + one: 1 use + other: "%{count} uses" + max_uses_prompt: No limit + prompt: Generate and share links with others to grant access to this instance + table: + expires_at: Expires + uses: Uses + title: Invite people landing_strip_html: "%{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." landing_strip_signup_html: If you don't, you can sign up here. + lists: + errors: + limit: You have reached the maximum amount of lists media_attachments: validations: images_and_video: Cannot attach a video to a status that already contains images too_many: Cannot attach more than 4 files + migrations: + acct: username@domain of the new account + currently_redirecting: 'Your profile is set to redirect to:' + proceed: Save + updated_msg: Your account migration setting successfully updated! + moderation: + title: Moderation notification_mailer: digest: body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:' @@ -491,20 +586,22 @@ dog: export: Data export followers: Authorized followers import: Import + migrate: Account migration notifications: Notifications preferences: Preferences settings: Settings - two_factor_authentication: Two-factor Authentication + two_factor_authentication: Two-factor Auth your_apps: Your applications statuses: open_in_web: Open in web over_character_limit: character limit of %{max} exceeded pin_errors: - limit: Too many toots pinned + limit: You have already pinned the maximum number of toots ownership: Someone else's toot cannot be pinned private: Non-public toot cannot be pinned reblog: A boost cannot be pinned show_more: Show more + title: '%{name}: "%{quote}"' visibilities: private: Followers-only private_long: Only show to followers diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 40b3240ae..4243bee97 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -39,15 +39,17 @@ lion: followers: Followers following: Following media: Media + moved_html: "%{name} has moved to %{new_profile_link}:" nothing_here: There is nothing here! people_followed_by: People whom %{name} follows people_who_follow: People who follow %{name} posts: Toots - posts_with_replies: Toots with replies + posts_with_replies: Toots and replies remote_follow: Remote follow reserved_username: The username is reserved roles: admin: Admin + moderator: Mod unfollow: Unfollow admin: account_moderation_notes: @@ -59,13 +61,19 @@ lion: destroyed_msg: Moderation note successfully destroyed! accounts: are_you_sure: Are you sure? + by_domain: Domain confirm: Confirm confirmed: Confirmed + demote: Demote + disable: Disable disable_two_factor_authentication: Disable 2FA + disabled: Disabled display_name: Display name domain: Domain edit: Edit email: E-mail + enable: Enable + enabled: Enabled feed_url: Feed URL followers: Followers followers_url: Followers URL @@ -77,7 +85,9 @@ lion: local: Local remote: Remote title: Location + login_status: Login status media_attachments: Media attachments + memorialize: Turn into memoriam moderation: all: All silenced: Silenced @@ -94,6 +104,7 @@ lion: outbox_url: Outbox URL perform_full_suspension: Perform full suspension profile_url: Profile URL + promote: Promote protocol: Protocol public: Public push_subscription_expires: PuSH subscription expires @@ -101,6 +112,12 @@ lion: reset: Reset reset_password: Reset password resubscribe: Resubscribe + role: Permissions + roles: + admin: Administrator + moderator: Moderator + staff: Staff + user: User salmon_url: Salmon URL search: Search shared_inbox_url: Shared Inbox URL @@ -117,7 +134,34 @@ lion: unsubscribe: Unsubscribe username: Username web: Web + action_logs: + actions: + confirm_user: "%{name} confirmed e-mail address of user %{target}" + create_custom_emoji: "%{name} uploaded new emoji %{target}" + create_domain_block: "%{name} blocked domain %{target}" + create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" + demote_user: "%{name} demoted user %{target}" + destroy_domain_block: "%{name} unblocked domain %{target}" + destroy_email_domain_block: "%{name} whitelisted e-mail domain %{target}" + destroy_status: "%{name} removed status by %{target}" + disable_2fa_user: "%{name} disabled two factor requirement for user %{target}" + disable_custom_emoji: "%{name} disabled emoji %{target}" + disable_user: "%{name} disabled login for user %{target}" + enable_custom_emoji: "%{name} enabled emoji %{target}" + enable_user: "%{name} enabled login for user %{target}" + memorialize_account: "%{name} turned %{target}'s account into a memoriam page" + promote_user: "%{name} promoted user %{target}" + reset_password_user: "%{name} reset password of user %{target}" + resolve_report: "%{name} dismissed report %{target}" + silence_account: "%{name} silenced %{target}'s account" + suspend_account: "%{name} suspended %{target}'s account" + unsilence_account: "%{name} unsilenced %{target}'s account" + unsuspend_account: "%{name} unsuspended %{target}'s account" + update_custom_emoji: "%{name} updated emoji %{target}" + update_status: "%{name} updated status by %{target}" + title: Audit log custom_emojis: + by_domain: Domain copied_msg: Successfully created local copy of the emoji copy: Copy copy_failed_msg: Could not make a local copy of that emoji @@ -130,11 +174,16 @@ lion: enable: Enable enabled_msg: Successfully enabled that emoji image_hint: PNG up to 50KB + listed: Listed new: title: Add new custom emoji + overwrite: Overwrite shortcode: Shortcode shortcode_hint: At least 2 characters, only alphanumeric characters and underscores title: Custom emojis + unlisted: Unlisted + update_failed_msg: Could not update that emoji + updated_msg: Emoji successfully updated! upload: Upload domain_blocks: add_new: Add new @@ -166,24 +215,31 @@ lion: suspend: Unsuspend all existing accounts from this domain title: Undo domain block for %{domain} undo: Undo - title: Domain Blocks + title: Domain blocks undo: Undo email_domain_blocks: add_new: Add new - created_msg: Email domain block successfully created + created_msg: Successfully added e-mail domain to blacklist delete: Delete - destroyed_msg: Email domain block successfully deleted + destroyed_msg: Successfully deleted e-mail domain from blacklist domain: Domain new: - create: Create block - title: New email domain block - title: Email Domain Block + create: Add domain + title: New e-mail blacklist entry + title: E-mail blacklist instances: account_count: Known accounts domain_name: Domain reset: Reset search: Search - title: Known Instances + title: Known instances + invites: + filter: + all: All + available: Available + expired: Expired + title: Filter + title: Invites reports: action_taken_by: Action taken by are_you_sure: Are you sure? @@ -222,9 +278,15 @@ lion: deletion: desc_html: Allow anyone to delete their account title: Open account deletion + min_invite_role: + disabled: No one + title: Allow invitations by open: desc_html: Allow anyone to create an account title: Open registration + show_staff_badge: + desc_html: Show a staff badge on a user page + title: Show staff badge site_description: desc_html: Introductory paragraph on the frontpage and in meta tags. You can use HTML tags, in particular <a> and <em>. title: Instance description @@ -241,7 +303,7 @@ lion: timeline_preview: desc_html: Display public timeline on landing page title: Timeline preview - title: Site Settings + title: Site settings statuses: back_to_account: Back to account page batch: @@ -283,7 +345,7 @@ lion: warning: Be very careful with this data. Never share it with anyone! your_token: Your access token auth: - agreement_html: By signing up you agree to our terms of service and privacy policy. + agreement_html: By signing up you agree to follow the rules of the instance and our terms of service. change_password: Security delete_account: Delete account delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. @@ -292,6 +354,8 @@ lion: invalid_reset_password_token: Password reset token is invalid or expired. Please request a new one. login: Log in logout: Logout + migrate_account: Move to a different account + migrate_account_html: If you wish to redirect this account to a different one, you can configure it here. register: Sign up resend_confirmation: Resend confirmation instructions reset_password: Reset password @@ -373,12 +437,43 @@ lion: following: Following list muting: Muting list upload: Upload + in_memoriam_html: In Memoriam. + invites: + delete: Deactivate + expired: Expired + expires_in: + '1800': 30 minutes + '21600': 6 hours + '3600': 1 hour + '43200': 12 hours + '86400': 1 day + expires_in_prompt: Never + generate: Generate + max_uses: + one: 1 use + other: "%{count} uses" + max_uses_prompt: No limit + prompt: Generate and share links with others to grant access to this instance + table: + expires_at: Expires + uses: Uses + title: Invite people landing_strip_html: "%{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." landing_strip_signup_html: If you don't, you can sign up here. + lists: + errors: + limit: You have reached the maximum amount of lists media_attachments: validations: images_and_video: Cannot attach a video to a status that already contains images too_many: Cannot attach more than 4 files + migrations: + acct: username@domain of the new account + currently_redirecting: 'Your profile is set to redirect to:' + proceed: Save + updated_msg: Your account migration setting successfully updated! + moderation: + title: Moderation notification_mailer: digest: body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:' @@ -491,20 +586,22 @@ lion: export: Data export followers: Authorized followers import: Import + migrate: Account migration notifications: Notifications preferences: Preferences settings: Settings - two_factor_authentication: Two-factor Authentication + two_factor_authentication: Two-factor Auth your_apps: Your applications statuses: open_in_web: Open in web over_character_limit: character limit of %{max} exceeded pin_errors: - limit: Too many toots pinned + limit: You have already pinned the maximum number of toots ownership: Someone else's toot cannot be pinned private: Non-public toot cannot be pinned reblog: A boost cannot be pinned show_more: Show more + title: '%{name}: "%{quote}"' visibilities: private: Followers-only private_long: Only show to followers @@ -589,7 +686,7 @@ lion: title: "%{instance} Terms of Service and Privacy Policy" themes: default: "Dog" - mastodon: "The default mastodon theme" + mastodon: "The default Mastodon theme" time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/locales/simple_form.dog.yml b/config/locales/simple_form.dog.yml index d520df5ca..3590538ec 100644 --- a/config/locales/simple_form.dog.yml +++ b/config/locales/simple_form.dog.yml @@ -30,10 +30,12 @@ dog: data: Data display_name: Display name email: E-mail address + expires_in: Expire after filtered_languages: Filtered languages header: Header locale: Language locked: Lock account + max_uses: Max number of uses new_password: New password note: Bio otp_attempt: Two-factor code @@ -54,6 +56,7 @@ dog: interactions: must_be_follower: Block notifications from non-followers must_be_following: Block notifications from people you don't follow + must_be_following_dm: Block direct messages from people you don't follow notification_emails: digest: Send digest e-mails favourite: Send e-mail when someone favourites your status diff --git a/config/locales/simple_form.lion.yml b/config/locales/simple_form.lion.yml index a44406c13..5a4e9c835 100644 --- a/config/locales/simple_form.lion.yml +++ b/config/locales/simple_form.lion.yml @@ -30,10 +30,12 @@ lion: data: Data display_name: Display name email: E-mail address + expires_in: Expire after filtered_languages: Filtered languages header: Header locale: Language locked: Lock account + max_uses: Max number of uses new_password: New password note: Bio otp_attempt: Two-factor code @@ -54,6 +56,7 @@ lion: interactions: must_be_follower: Block notifications from non-followers must_be_following: Block notifications from people you don't follow + must_be_following_dm: Block direct messages from people you don't follow notification_emails: digest: Send digest e-mails favourite: Send e-mail when someone favourites your status From 75eced63c13049423f82afb821470b82d20d4881 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Sat, 20 Jan 2018 21:59:48 -0600 Subject: [PATCH 025/274] Make elephant friend work better with colorscheme --- app/javascript/images/elephant-friend.png | Bin 24466 -> 22383 bytes app/javascript/images/mastodon-not-found.png | Bin 19560 -> 19994 bytes app/javascript/images/mastodon-ui.png | Bin 32449 -> 30531 bytes .../images/wave-compose-standalone.png | Bin 5921 -> 3404 bytes app/javascript/images/wave-drawer.png | Bin 3269 -> 756 bytes app/javascript/images/wave-modal.png | Bin 5200 -> 2680 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/javascript/images/elephant-friend.png b/app/javascript/images/elephant-friend.png index 3c5145ba987ff14621d0632cec74e02eb3886d8b..63cf129559136f0ba0e59210660084031ae32e34 100644 GIT binary patch literal 22383 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 literal 19560 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 diff --git a/app/javascript/images/mastodon-ui.png b/app/javascript/images/mastodon-ui.png index a1fb642a003b2e2b652b1e6022a84f08dc76105f..676fcf165557d82a858db8f17eaee5345797e861 100644 GIT binary patch literal 30531 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 literal 32449 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%0Arc|r&DC@j0pAQE7yV9T$8x=q-T1FG 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 Cr$1f* diff --git a/app/javascript/images/wave-compose-standalone.png b/app/javascript/images/wave-compose-standalone.png index 287ee639b3426947ff629f9b8d183d38d0f767cf..e7359d20f582563cb193c137983dfc4529b5ab8c 100644 GIT binary patch delta 3363 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 z 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 z zdG)DK>c-TrG*RToI+(7O{$2WHhIK|&#{0~`%rjZSS=_9_EgD<)Y?;Y+%Km99dMkTt zZ;nFF&Ya0@w%cmAL)#;__wG>Ik-uX)*EzRwCvj)O&R_EM@=EjG?h4w~oiCf8n?LoP z^LH%;0tLK+iGSUeyKBBje;@b#&>q7*hxdFbR{Xd!g)Ko83UsV6Of!n}u^lj{GGHq&VmT4|&fm_mB=1zp27(VH6va40QwYH7c zR&)xSNUL^-VF%Q)rDLHpwv*o#(lv6bt~*`7 z+Hc!``G(bv3j-Dd=Wd$a?7U@it7Fi3u>BX~U)qOEhB|JW-tHPUAMPGmH*#szX7tJ( zhdbBry57Atwtj46JYf9ZMA!uX9_QZd{lxpP9)Dy!SbmuM2=l1$vC!l4Co)g!epUaq zjc>xgIO#As_|)&|!zuREi{Daz`!t>ZjPk5}Mt-Jg)?oI+oYUO!^9|3ZUnIX+o-g=a z`1k6UYA?_J!Te)zA$Vc>74Ox`>*6<(ZyMejz3pA}UVQQ{>D}^D;d{yVjUUWD^nVQc zIDfO8`3d)_;(Dd zTHjL5-|$*y`zjLvYI6YyVFD0@R1H#$)fm(RfH%VaOaP}Veye{fHQLZ%&5P8DM3eHB zl{Y~E;M4*5Jh8H}+_|#yxgOc<0|0v7t$*dfRmmZlGpO+#zS zV*mgGgGod|RCwC$+)HlUKn#T8w2+f{J5XdXm-p{^bB86)CdV ztN9tshCNPSPr(2!;Pixn@{(nyQ z5n6vTo^vnK%j?@av&?9QO5;hq4r%5-<%-e-zE*dFnJ3l6)&{PQAx-a9{kNFF_l)VY zp6)q+Mql?FcdwH)y=%_DSEmVV0$Y_e9E?}Tut#rIzPD)Js&yncMB;_2Zserf1c~`Q za+P&e97pJ#-Po5d+m$^!Dq={yJ%6xfo077nnqm7oLycXjb?>>he1DlG$+KUm3e8oG znpO{Ip7ZQD(v1D6bF4kiVgj4MopPF34;@zEci0tG>K&Djh@2JpnQFStMx7>unAm!&62j4Rdt-S(mwk59r|ubH-oDZn`ROz$4xYvs((I7x_3L< zZLo3WU&5|V-cd26ZLL!DRy5OI-5m^IPYg*t*h%YR0-L}UdMkfX-+J!!N9jC9w_WQv z`~R~h@Vr{L>h01z&uZ`5>}zsg8N=Edsm}LTddIV(k{cpT|5me1(A&*){-r%(HS|pG zlNKvohv--%%mg-pw`%TeI)5LvC;ph3V)kh@@=@*r=0AQ2= zz$gKLQ33!MB>*r=0AQ2=z$gKLQ33#?1b`X%3ws_C?=;#oj{pDw07*qoM6N<$f;mS{ A)&Kwi diff --git a/app/javascript/images/wave-modal.png b/app/javascript/images/wave-modal.png index 88818a6d78a30e2827d4e86db12f2b0d3d8f24fe..c944ff258a4296d4c312ef7a18e54859a820bcf4 100644 GIT binary patch delta 2595 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 FV1l~W-X8z} delta 5134 zcmV+p6!Gi$6woM;BYz3~X+uL$Nkc;*aB^>EX>4Tx07!|ImUmPXSsKM(Rp&%%Xfiah z$vGp?E zXLrxe*|WFK_v&}P^Ui(m)%&9^03-)ia&jUp1V9oujpyrZM}H3v38mwn021QrSrepG8=MoypO}C1jQr-wV#R#pwX=K`-ajfeEsC!H ze}0btt)#^CKi63O>f|VHfFJS}KuQMqgD8*+(vXo3kfqb2veH&3+HX$Y!i$TEO{3c) zHxxy8<+63O=mvWFMgXkd_nO_CdtV(P8vd_d_#gmAdVk2dmH+B-Qvo>Njhxx;ub$c= z0EB1&T))mv=Vh$*R<8?S01*fRQ6LHAfD%vx+Q0yq0879Gj=&9gAv+EMn*bZcf+WBL znIH%31O=c7>;nfuC8z<%KqEK_PJ>Qx0bBvs!7VTh#=t|s2h-pMSOD+9G6X?5hyqa| zNk|@2fqyh11IP@rh8!Ue$QKHMBA^(E3#CIj&@QM5DupVcTBr&789E1Dfd-%v=sq+F z%|WlBk1z@*!=kV(tP1PGX0R>n4*SC!;TSjt&W7{hy>JCw2cLjD;4APgcns#lFW^NK zK#@>1lmbc{Wrngxd7(m4(I_5jJE{;>j;ceoqJO$k{ir)AK58EI0gXjd(R8#n+7j)8 z4nVWfDd_F!Vss_C5#53AL*GG9q8HF#FcgdoMiXO!am55mNwh&4P#|hnp+k|Pt zGEtbwAX*XqiSfjp#0p|7@fz_F@ePSYQY4v^d`NMmTv7$;6zK+OlJtQrLe?PLlf%gA z$sLK8xZ!c<{>VK3n%;bP%t;Q`@U5uAvs zh@%KcBwys1$W@UkDvGK^wWqSFyQs&h*QnE?SW$+kt7yDvk?2X$A<+df5iujNK!33; zu`02PVtg8krb=_ACDKZ0r)lG~kK(f8w&GFZd&FDCN5z*Uq$QXVQ4)m`Z4zS=A0_FM zj*nxirdsz0W?7SRJjwu%}S0;B!ZhuamDsL?xCtoIiS^ha)jBZO$q*u`U=nD!m3N8xi z3bhJD3d@QN#Q?=T#WuyqN<<|yrD&xxrCy~4WqD;!pj#L(Rb6&)9==QZJ=SmHmEYVYe+G4GTdRZsT6#&nBiO zJd;+FIa6iR2-9lQ2{TbMZ-295vm53Zb35}L<`>LASeRI(S)8``!&2Ka!Lr$Mb{%6~ z)VkyArmPgLSXQ-Gd~3ROg!PZsd>aKDmQ9__Q>GG=!>nh{*s9yc+n%s}X{Tq$vun3o zvbV6`X5Zt0a&UGibQp3JaSU**bbR8Z=oI7B;v#|7i!?til1Wx`d~mF?Q( zy5MH&w#}{2o$T)CUg`eSL&JmT(d`L)x_KV(e6(I=J$HSl7w~fRI^gx#o8g_}eclJ_ z zdG)DK>c-TrG*RToI+(7O{$2WHhIK|&#{0~`%rjZSS=_9_EgD<)Y?;Y+%Km99dMkTt zZ;nFF&Ya0@w%cmAL)#;__wG>Ik-uX)*EzRwCvj)O&R_EM@=EjG?h4w~oiCf8n?LoP z^LH%;0tLK+iGSUeyKBBje;@b#&>q7*hxdFbR{Xd!g)Ko83UsV6Of!n}u^lj{GGHq&VmT4|&fm_mB=1zp27(VH6va40QwYH7c zR&)xSNUL^-VF%Q)rDLHpwv*o#(lv6bt~*`7 z+Hc!``G(bv3j-Dd=Wd$a?7U@it7Fi3u>BX~U)qOEhB|JW-tHPUAMPGmH*#szX7tJ( zhdbBry57Atwtj46JYf9ZMA!uX9_QZd{lxpP9)Dy!SbmuM2=l1$vC!l4Co)g!epUaq zjc>xgIO#As_|)&|!zuREi{Daz`!t>ZjPk5}Mt-Jg)?oI+oYUO!^9|3ZUnIX+o-g=a z`1k6UYA?_J!Te)zA$Vc>74Ox`>*6<(ZyMejz3pA}UVQQ{>D}^D;d{yVjUUWD^nVQc zIDfO8`3d)_;(Dd zTHjL5-|$*y`zjLvYI6YyVFD0@R1H#$)fm(RfH%VaOaP}Veye{fHQLZ%&5P8DM3eHB zl{Y~E;M4*5Jh8H}+_|#yxgOc<0|0v7t$*dfRmmZlGpO+#zS zV*mgO4oO5oRCwC$oPDrVbs5J$XYb{D;ertFc?G8ENBs~)`9**r1R>g1I<15?j859L zNrO%5XsOiXOKI;p5;m(%O}{UpE0ay-_1t6G$-y_$u%|pnntS2VMYf27VMLQVUPIf%}1ZKpSuj*a3VJ*d0d^ zCR6E2z@5MX;5e`@ERMH_gz|}(z|lmOmB>QJV&sdTJr7CIDhVh0B{9x zpEz>BdVy6ywiPm=h;OE3k_D1Qwg78@S7I8KPY3Q5+~uqf_&#uTE}MC+$#{nW8-ZmN zE_)I9DDY$)e4b3D&l7Hs9^}Wpz^Ys}v!Q7MOs3NFgs3A1`SCH}V&JE7uI+^w(}3>* zvr2qY1fBst4*WJwfh3tqPk#k+g1ega1Dk+L!|YvZ==-h%Zmhz&BCrcs4(w~D&y%V2 z63Kj{DqMC5Sf0yfo~rftBOu$~6&SK9ockav$Y*vIbx9tOty{4ZU=IZB&sA@3fF zT!6_`daMAP8Q^y;2Y*H>ZT_gVIaSq#8)c9MM|3|3VC;LlW;Ew z9xBt1_$9Umx|KE?3wgH~HD;yFWGR&=)WFNxzz(I&UmL|2nFTxsye;5=9V7gBu#k6; zL?%EHUly2O!^58=QFy1)=HG?9+t&mVcK~k%ZUt5YLj_*HkAHG}957F5v!#%C4>lP0 z3cTsz@H$)iflN43Y4giM-aQ^6<~IXB2ULx>7$#UZDs7HL9WdmKZxi0}NG)~>Fkfl2 zIfw{@_JHewg*6hu0nP<}47^+VuSSx1xH$J-;3Lwbiuj6t{ct95zmzEr$=1nK`f}+} zyDGcZ@hieM;C~9>D-q%zEo45;ALg<)8@Mg%eo(5Sb-;V7lZ-1hgA&B^{k}szYUJqP2U1>8_ zX|vT2-Zq~^SPxuMIb%9Oz>dH>4?3u{d0uJL8%3Qj6Sy(b@7*TiFYWhgIfilY*1qNm zDfUN^t(7+4z#HAS*B0=6Wx^#=-aQo}nXdyr6^zUkA4Nhck3CA8=fWJy2;R$pZFKY+RmifV+uzFXe%>}@B z`QIgyFan$d%u?F)74q&AH48AAO0NaJP+JuC<$vrUz+55ocBM^E7@1JYptnmY^nsFo zuLwn_I%$0+M+fgX;4G!h_Cns>S1)Fz%}TsU=gbgFeZSXsNGAMUA@9Ca2bs^7LDA5N z0!F8_F27RR{G%QbN?S4?Z=g6VBD@J;vC^hk$h*G|EWl(c{UJ%s9koAPUqopGri%#w zB!7KLJlc*8(H!99-1$9J+vIay)UM z2K=M&#`ohQ4j3l`26$K|>BSm@#av)><>8JK2Hu1O=&}`tQ^uiZ0*{t=Xi%pX{a&;~ znqjw=^)(^F0wMFHU?81(@$bgl`0%~aFMpHZPv9*~j}IZ3)%zKq1}@BHGk*)<^U=T~ zlpWtYVdE|0?YDk9=zgn|$+N=cwlDwg1J2E5GrzBz0cFc&BQPaeLX<7(4Dh7V=1`D^ zTaFo4;Jr37(LX>xS;g0_#>nLFIi<}@l`^4}n@gqtxQz1ad?EVU*FCy{$#S6F?|;+h znWRM4dbHXP?plYE2Tn#*) z%Vv)FaO^0&Ba$x?=*-B8;xoL0x6%KL(o85gJMoqnuEaZY>I@%a-JfCLHJh6&Ekg@e z?g8E(E%vf_kIK+zYc8AV@i7y)NPmKJR}-s@t-#9CrFiEAg4~I>{qIBrvKZvTm+?m0 zo6BwSm#me24EP-W_YI>cjY{nxa5>)IX1`!uhIbq?n~LXpkw;@cpW$`j##}aYYXw4Y zkO5Z%u$RTVNBsJHxnLnPfs|AmozdehR{P;y!0G|KZ341gqTU+n9({*GD1S#9?&ZKS zrOk_SR#=)*+GPN8EpScwX;xT+j6k2E6F5)){Vw1RDK)3y`z7e8#OLeY?Z5)1&0(d@ z&eCCrl%01-MsXU0z3lx)N>8^%X>)k6p^Vbz5+KtU@m0N-gZI`=r_yFyA@BCL3CL^k z-tuja9%P{Vbl|P`%miLg+JF2@Y15~)IT>%w>2@hSI~q%BUn1@RmPmviOQ5yCD8&~@ zgiC?(a@N^baz>eIocOBR6ujl>M@!%GkUo1Y-b>aUjrDca$>?05r;vBIJIPc!CAIvp z#)2#cy?C!gvaQneUm+RLX)d9QjTS~TdcwQ#4%jzP@hupqSy+pB3x5~406ikeuK~&C z28xQlJpx?pBva{En=losmAuCVc$fc-;>3Z(F%(`P{6*;tJDZQcEY@SdXYl^+%%xO( zbHs^@Z}+x0PkaOS4@BNJs*dcN;b^B$5jInNzVJKo5MM>CL-3~HLmJach2q-@vG_9! zP3Ui8B0|UdI$U25ZE7`tCz=m7>sI21<5z%Ai~zPWAzHP(tQJ6=7V~ku@h0Lo3<&B#C+1{sRbe_YD>-X<{_)4# w-dbcRwjh~H2L`ruvp%L3lMV_}7=zh=0I2TsfHx$47ytkO07*qoM6N<$f(pRa9RL6T From c4f455fe001daec43fe5c41a19e3c6f1dcac1770 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Sat, 3 Mar 2018 00:58:26 -0600 Subject: [PATCH 026/274] Finish converting locales --- app/javascript/mastodon/locales/dog.json | 9 ++++++++- app/javascript/mastodon/locales/lion.json | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index 33d05523a..e857e4079 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -50,7 +50,8 @@ "column_header.unpin": "Unpin", "column_subheading.navigation": "Navigation", "column_subheading.settings": "Settings", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your pack-only toots.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can join your pack to view your pack-only toots.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can join your pack to view your pack-only posts.", "compose_form.lock_disclaimer.lock": "locked", "compose_form.placeholder": "Bark???", "compose_form.publish": "Toot", @@ -138,6 +139,7 @@ "loading_indicator.label": "Loading...", "media_gallery.toggle_visible": "Toggle visibility", "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", @@ -174,6 +176,7 @@ "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "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.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.almost_done": "Almost done...", @@ -196,6 +199,8 @@ "privacy.public.short": "Public", "privacy.unlisted.long": "Do not toot to public timelines", "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", @@ -214,6 +219,7 @@ "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", "status.cannot_reblog": "This toot cannot be awooed", + "status.cannot_reblog": "This toot cannot be awooed", "status.delete": "Delete", "status.embed": "Embed", "status.favourite": "Boop", @@ -221,6 +227,7 @@ "status.media_hidden": "Media hidden", "status.mention": "Bark at @{name}", "status.more": "More", + "status.mute": "Mute @{name}", "status.mute_conversation": "Mute conversation", "status.open": "Expand this toot", "status.pin": "Pin on profile", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index b192621e0..b45e873be 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -50,7 +50,8 @@ "column_header.unpin": "Unpin", "column_subheading.navigation": "Navigation", "column_subheading.settings": "Settings", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your pride-only toots.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can join your pride to view your pride-only toots.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can join your pride to view your pride-only posts.", "compose_form.lock_disclaimer.lock": "locked", "compose_form.placeholder": "Meow???", "compose_form.publish": "Toot", @@ -138,6 +139,7 @@ "loading_indicator.label": "Loading...", "media_gallery.toggle_visible": "Toggle visibility", "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", @@ -174,6 +176,7 @@ "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "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.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.almost_done": "Almost done...", @@ -196,6 +199,8 @@ "privacy.public.short": "Public", "privacy.unlisted.long": "Do not toot to public timelines", "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", @@ -214,6 +219,7 @@ "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", "status.cannot_reblog": "This toot cannot be roared", + "status.cannot_reblog": "This toot cannot be roared", "status.delete": "Delete", "status.embed": "Embed", "status.favourite": "Boop", @@ -221,6 +227,7 @@ "status.media_hidden": "Media hidden", "status.mention": "Meow at @{name}", "status.more": "More", + "status.mute": "Mute @{name}", "status.mute_conversation": "Mute conversation", "status.open": "Expand this toot", "status.pin": "Pin on profile", From 70e03a70229a293324efa6b3cbce5ac1952ec14c Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Sat, 3 Mar 2018 15:06:29 -0600 Subject: [PATCH 027/274] Fix locales --- config/locales/dog.yml | 2 +- config/locales/lion.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 1c493a64a..362229eb6 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -510,7 +510,7 @@ dog: mention: action: Bark body: '%{name} barked at you in:' - subject: %{name} barked at you + subject: "%{name} barked at you" title: New mention reblog: body: 'Your toot was awooed by %{name}:' diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 8a43de79d..532b3e2b9 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -510,7 +510,7 @@ lion: mention: action: Meow body: '%{name} meowed at you in:' - subject: %{name} meowed at you + subject: "%{name} meowed at you" title: New mention reblog: body: 'Your toot was roared by %{name}:' From a0c93fa5da38db5559eeb6325411f5e9ee42d9bd Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Fri, 9 Mar 2018 15:05:56 -0600 Subject: [PATCH 028/274] Locale parity --- app/javascript/mastodon/locales/dog.json | 14 +++++++++- app/javascript/mastodon/locales/lion.json | 14 +++++++++- config/locales/dog.yml | 31 +++++++++++++++++++++-- config/locales/lion.yml | 31 +++++++++++++++++++++-- config/locales/simple_form.dog.yml | 2 ++ config/locales/simple_form.lion.yml | 2 ++ 6 files changed, 88 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index e857e4079..153f0a954 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -1,7 +1,9 @@ { "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", + "account.blocked": "Blocked", "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.domain_blocked": "Domain hidden", "account.edit_profile": "Edit profile", "account.follow": "Join Pack", "account.followers": "Pack Members", @@ -13,7 +15,9 @@ "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", + "account.muted": "Muted", "account.posts": "Toots", + "account.posts_with_replies": "Toots with barks", "account.report": "Report @{name}", "account.requested": "Awaiting approval. Click to cancel follow request", "account.share": "Share @{name}'s profile", @@ -207,15 +211,22 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "reply_indicator.cancel": "Cancel", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "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.placeholder": "Additional comments", "report.submit": "Submit", "report.target": "Reporting {target}", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", + "search_popout.tips.full_text": "Simple text returns statuses you have written, booped, awooed, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", "search_popout.tips.user": "user", + "search_results.accounts": "Dogs", + "search_results.hashtags": "Hashtags", + "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", "status.cannot_reblog": "This toot cannot be awooed", @@ -235,6 +246,7 @@ "status.reblogged_by": "{name} awooed", "status.reply": "Bark", "status.replyAll": "Bark at thread", + "status.replyAll": "Bark in thread", "status.report": "Report @{name}", "status.sensitive_toggle": "Click to view", "status.sensitive_warning": "Sensitive content", @@ -243,7 +255,6 @@ "status.show_more": "Show more", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", - "tabs_bar.compose": "Compose", "tabs_bar.federated_timeline": "Federated", "tabs_bar.home": "Home", "tabs_bar.local_timeline": "Local", @@ -252,6 +263,7 @@ "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", "upload_form.description": "Describe for the visually impaired", + "upload_form.focus": "Crop", "upload_form.undo": "Undo", "upload_progress.label": "Uploading...", "video.close": "Close video", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index b45e873be..281fe7eee 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -1,7 +1,9 @@ { "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", + "account.blocked": "Blocked", "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.domain_blocked": "Domain hidden", "account.edit_profile": "Edit profile", "account.follow": "Join pride", "account.followers": "Pride Members", @@ -13,7 +15,9 @@ "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", + "account.muted": "Muted", "account.posts": "Toots", + "account.posts_with_replies": "Toots with meows", "account.report": "Report @{name}", "account.requested": "Awaiting approval. Click to cancel follow request", "account.share": "Share @{name}'s profile", @@ -207,15 +211,22 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "reply_indicator.cancel": "Cancel", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "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.placeholder": "Additional comments", "report.submit": "Submit", "report.target": "Reporting {target}", "search.placeholder": "Search", "search_popout.search_format": "Advanced search format", + "search_popout.tips.full_text": "Simple text returns statuses you have written, booped, roard, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", "search_popout.tips.user": "user", + "search_results.accounts": "Lions", + "search_results.hashtags": "Hashtags", + "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", "status.cannot_reblog": "This toot cannot be roared", @@ -235,6 +246,7 @@ "status.reblogged_by": "{name} roared", "status.reply": "Meow", "status.replyAll": "Meow at thread", + "status.replyAll": "Reply to thread", "status.report": "Report @{name}", "status.sensitive_toggle": "Click to view", "status.sensitive_warning": "Sensitive content", @@ -243,7 +255,6 @@ "status.show_more": "Show more", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", - "tabs_bar.compose": "Compose", "tabs_bar.federated_timeline": "Federated", "tabs_bar.home": "Home", "tabs_bar.local_timeline": "Local", @@ -252,6 +263,7 @@ "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", "upload_form.description": "Describe for the visually impaired", + "upload_form.focus": "Crop", "upload_form.undo": "Undo", "upload_progress.label": "Uploading...", "video.close": "Close video", diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 1c493a64a..4c7fcefbb 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -23,7 +23,6 @@ dog: real_conversation_title: Built for real conversation within_reach_body: Multiple apps for iOS, Android, and other platforms thanks to a developer-friendly API ecosystem allow you to keep up with your friends anywhere. within_reach_title: Always within reach - find_another_instance: Find another instance generic_description: "%{domain} is one server in the network" hosted_on: Mastodon hosted on %{domain} learn_more: Learn more @@ -274,6 +273,9 @@ dog: contact_information: email: Business e-mail username: Contact username + hero: + desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to instance thumbnail + title: Hero image peers_api_enabled: desc_html: Domain names this instance has encountered in the fediverse title: Publish list of discovered instances @@ -290,6 +292,9 @@ dog: open: desc_html: Allow anyone to create an account title: Open registration + show_known_fediverse_at_about_page: + desc_html: When toggled, it will show toots from all the known fediverse on preview. Otherwise it will only show local toots. + title: Show known fediverse on timeline preview show_staff_badge: desc_html: Show a staff badge on a user page title: Show staff badge @@ -354,7 +359,8 @@ dog: your_token: Your access token auth: agreement_html: By signing up you agree to follow the rules of the instance and our terms of service. - change_password: Security + change_password: Password + confirm_email: Confirm email delete_account: Delete account delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. didnt_get_confirmation: Didn't receive confirmation instructions? @@ -364,9 +370,16 @@ dog: logout: Logout migrate_account: Move to a different account migrate_account_html: If you wish to redirect this account to a different one, you can configure it here. + or: or + or_log_in_with: Or log in with + providers: + cas: CAS + saml: SAML register: Sign up + register_elsewhere: Sign up on another server resend_confirmation: Resend confirmation instructions reset_password: Reset password + security: Security set_new_password: Set new password authorize_follow: error: Unfortunately, there was an error looking up the remote account @@ -413,6 +426,13 @@ dog: title: This page is not correct noscript_html: To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform. exports: + archive_takeout: + date: Date + download: Download your archive + hint_html: You can request an archive of your toots and uploaded media. The exported data will be in ActivityPub format, readable by any compliant software. + in_progress: Compiling your archive... + request: Request your archive + size: Size blocks: You block csv: CSV follows: You follow @@ -528,7 +548,9 @@ dog: trillion: T unit: '' pagination: + newer: Newer next: Next + older: Older prev: Prev truncate: "…" preferences: @@ -726,6 +748,10 @@ dog: setup: Set up wrong_code: The entered code was invalid! Are server time and device time correct? user_mailer: + backup_ready: + explanation: You requested a full backup of your Mastodon account. It's now ready for download! + subject: Your archive is ready for download + title: Archive takeout welcome: edit_profile_action: Setup profile edit_profile_step: You can customize your profile by uploading an avatar, header, changing your display name and more. If you’d like to review new followers before they’re allowed to follow you, you can lock your account. @@ -747,4 +773,5 @@ dog: users: invalid_email: The e-mail address is invalid invalid_otp_token: Invalid two-factor code + seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available. signed_in_as: 'Signed in as:' diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 8a43de79d..b535c7a91 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -23,7 +23,6 @@ lion: real_conversation_title: Built for real conversation within_reach_body: Multiple apps for iOS, Android, and other platforms thanks to a developer-friendly API ecosystem allow you to keep up with your friends anywhere. within_reach_title: Always within reach - find_another_instance: Find another instance generic_description: "%{domain} is one server in the network" hosted_on: Mastodon hosted on %{domain} learn_more: Learn more @@ -274,6 +273,9 @@ lion: contact_information: email: Business e-mail username: Contact username + hero: + desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to instance thumbnail + title: Hero image peers_api_enabled: desc_html: Domain names this instance has encountered in the fediverse title: Publish list of discovered instances @@ -290,6 +292,9 @@ lion: open: desc_html: Allow anyone to create an account title: Open registration + show_known_fediverse_at_about_page: + desc_html: When toggled, it will show toots from all the known fediverse on preview. Otherwise it will only show local toots. + title: Show known fediverse on timeline preview show_staff_badge: desc_html: Show a staff badge on a user page title: Show staff badge @@ -354,7 +359,8 @@ lion: your_token: Your access token auth: agreement_html: By signing up you agree to follow the rules of the instance and our terms of service. - change_password: Security + change_password: Password + confirm_email: Confirm email delete_account: Delete account delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. didnt_get_confirmation: Didn't receive confirmation instructions? @@ -364,9 +370,16 @@ lion: logout: Logout migrate_account: Move to a different account migrate_account_html: If you wish to redirect this account to a different one, you can configure it here. + or: or + or_log_in_with: Or log in with + providers: + cas: CAS + saml: SAML register: Sign up + register_elsewhere: Sign up on another server resend_confirmation: Resend confirmation instructions reset_password: Reset password + security: Security set_new_password: Set new password authorize_follow: error: Unfortunately, there was an error looking up the remote account @@ -413,6 +426,13 @@ lion: title: This page is not correct noscript_html: To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform. exports: + archive_takeout: + date: Date + download: Download your archive + hint_html: You can request an archive of your toots and uploaded media. The exported data will be in ActivityPub format, readable by any compliant software. + in_progress: Compiling your archive... + request: Request your archive + size: Size blocks: You block csv: CSV follows: You follow @@ -528,7 +548,9 @@ lion: trillion: T unit: '' pagination: + newer: Newer next: Next + older: Older prev: Prev truncate: "…" preferences: @@ -726,6 +748,10 @@ lion: setup: Set up wrong_code: The entered code was invalid! Are server time and device time correct? user_mailer: + backup_ready: + explanation: You requested a full backup of your Mastodon account. It's now ready for download! + subject: Your archive is ready for download + title: Archive takeout welcome: edit_profile_action: Setup profile edit_profile_step: You can customize your profile by uploading an avatar, header, changing your display name and more. If you’d like to review new followers before they’re allowed to follow you, you can lock your account. @@ -747,4 +773,5 @@ lion: users: invalid_email: The e-mail address is invalid invalid_otp_token: Invalid two-factor code + seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available. signed_in_as: 'Signed in as:' diff --git a/config/locales/simple_form.dog.yml b/config/locales/simple_form.dog.yml index 457b1a2d1..15e4adb8e 100644 --- a/config/locales/simple_form.dog.yml +++ b/config/locales/simple_form.dog.yml @@ -45,6 +45,7 @@ dog: setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot + setting_display_sensitive_media: Always show media marked as sensitive setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations setting_system_font_ui: Use system's default font @@ -53,6 +54,7 @@ dog: severity: Severity type: Import type username: Username + username_or_email: Username or Email interactions: must_be_follower: Block notifications from non-followers must_be_following: Block notifications from people you don't follow diff --git a/config/locales/simple_form.lion.yml b/config/locales/simple_form.lion.yml index f873d284e..be67f9595 100644 --- a/config/locales/simple_form.lion.yml +++ b/config/locales/simple_form.lion.yml @@ -45,6 +45,7 @@ lion: setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot + setting_display_sensitive_media: Always show media marked as sensitive setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations setting_system_font_ui: Use system's default font @@ -53,6 +54,7 @@ lion: severity: Severity type: Import type username: Username + username_or_email: Username or Email interactions: must_be_follower: Block notifications from non-followers must_be_following: Block notifications from people you don't follow From 68265482ace5ab3b128acf201f6ee4e44c82e5fd Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Tue, 13 Mar 2018 10:39:35 -0500 Subject: [PATCH 029/274] Fix and update locales --- app/javascript/mastodon/locales/dog.json | 16 ++++++++++------ app/javascript/mastodon/locales/lion.json | 18 +++++++++++------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index 153f0a954..a9999ee4f 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -54,14 +54,16 @@ "column_header.unpin": "Unpin", "column_subheading.navigation": "Navigation", "column_subheading.settings": "Settings", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can join your pack to view your pack-only toots.", + "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can join your pack to view your pack-only posts.", "compose_form.lock_disclaimer.lock": "locked", "compose_form.placeholder": "Bark???", "compose_form.publish": "Toot", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive": "Mark media as sensitive", - "compose_form.spoiler": "Hide text behind warning", + "compose_form.sensitive.marked": "Media is marked as sensitive", + "compose_form.sensitive.unmarked": "Media is not marked as sensitive", + "compose_form.spoiler.marked": "Text is hidden behind warning", + "compose_form.spoiler.unmarked": "Text is not hidden", "compose_form.spoiler_placeholder": "Write your warning here", "confirmation_modal.cancel": "Cancel", "confirmations.block.confirm": "Block", @@ -179,7 +181,7 @@ "onboarding.page_four.home": "The home timeline shows toots from people you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "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.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.full_handle": "Your full handle", "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", @@ -229,7 +231,7 @@ "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", - "status.cannot_reblog": "This toot cannot be awooed", + "status.block": "Block @{name}", "status.cannot_reblog": "This toot cannot be awooed", "status.delete": "Delete", "status.embed": "Embed", @@ -242,17 +244,19 @@ "status.mute_conversation": "Mute conversation", "status.open": "Expand this toot", "status.pin": "Pin on profile", + "status.pinned": "Pinned toot", "status.reblog": "Awoo", "status.reblogged_by": "{name} awooed", "status.reply": "Bark", - "status.replyAll": "Bark at thread", "status.replyAll": "Bark in thread", "status.report": "Report @{name}", "status.sensitive_toggle": "Click to view", "status.sensitive_warning": "Sensitive content", "status.share": "Share", "status.show_less": "Show less", + "status.show_less_all": "Show less for all", "status.show_more": "Show more", + "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "tabs_bar.federated_timeline": "Federated", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index 281fe7eee..bd70ccce7 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -54,14 +54,16 @@ "column_header.unpin": "Unpin", "column_subheading.navigation": "Navigation", "column_subheading.settings": "Settings", + "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can join your pride to view your pride-only toots.", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can join your pride to view your pride-only posts.", "compose_form.lock_disclaimer.lock": "locked", "compose_form.placeholder": "Meow???", "compose_form.publish": "Toot", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive": "Mark media as sensitive", - "compose_form.spoiler": "Hide text behind warning", + "compose_form.sensitive.marked": "Media is marked as sensitive", + "compose_form.sensitive.unmarked": "Media is not marked as sensitive", + "compose_form.spoiler.marked": "Text is hidden behind warning", + "compose_form.spoiler.unmarked": "Text is not hidden", "compose_form.spoiler_placeholder": "Write your warning here", "confirmation_modal.cancel": "Cancel", "confirmations.block.confirm": "Block", @@ -179,7 +181,7 @@ "onboarding.page_four.home": "The home timeline shows toots from people you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "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.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.full_handle": "Your full handle", "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", @@ -229,7 +231,7 @@ "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", - "status.cannot_reblog": "This toot cannot be roared", + "status.block": "Block @{name}", "status.cannot_reblog": "This toot cannot be roared", "status.delete": "Delete", "status.embed": "Embed", @@ -242,17 +244,19 @@ "status.mute_conversation": "Mute conversation", "status.open": "Expand this toot", "status.pin": "Pin on profile", + "status.pinned": "Pinned toot", "status.reblog": "Roar", "status.reblogged_by": "{name} roared", "status.reply": "Meow", - "status.replyAll": "Meow at thread", - "status.replyAll": "Reply to thread", + "status.replyAll": "Meow in thread", "status.report": "Report @{name}", "status.sensitive_toggle": "Click to view", "status.sensitive_warning": "Sensitive content", "status.share": "Share", "status.show_less": "Show less", + "status.show_less_all": "Show less for all", "status.show_more": "Show more", + "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "tabs_bar.federated_timeline": "Federated", From 9924ca88106fff34eb0ed105f394c20f9197a69c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 27 Mar 2018 00:44:10 +0200 Subject: [PATCH 030/274] Fix UniqueUsernameValidator comparison Comparison was downcasing only one side, therefore if previously existing account had a non-lowercase spelling, it would be ignored when checking for duplicates. New rake task `mastodon:maintenance:find_duplicate_usernames` will help find constraint violations that might have occured from the presence of this bug. Bump version to 2.3.3 --- app/models/concerns/account_finder_concern.rb | 2 +- app/validators/unique_username_validator.rb | 2 +- lib/mastodon/version.rb | 2 +- lib/tasks/mastodon.rake | 18 ++++++++++++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/models/concerns/account_finder_concern.rb b/app/models/concerns/account_finder_concern.rb index 2e8a7fb37..6b7237e89 100644 --- a/app/models/concerns/account_finder_concern.rb +++ b/app/models/concerns/account_finder_concern.rb @@ -30,7 +30,7 @@ module AccountFinderConcern end def account - scoped_accounts.take + scoped_accounts.order(id: :asc).take end private diff --git a/app/validators/unique_username_validator.rb b/app/validators/unique_username_validator.rb index c76407b16..fb67105dd 100644 --- a/app/validators/unique_username_validator.rb +++ b/app/validators/unique_username_validator.rb @@ -6,7 +6,7 @@ class UniqueUsernameValidator < ActiveModel::Validator normalized_username = account.username.downcase.delete('.') - scope = Account.where(domain: nil, username: normalized_username) + scope = Account.where(domain: nil).where('lower(username) = ?', normalized_username) scope = scope.where.not(id: account.id) if account.persisted? account.errors.add(:username, :taken) if scope.exists? diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 121c5c693..a6927eec3 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 2 + 3 end def pre diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake index cf32b1495..18bdc347f 100644 --- a/lib/tasks/mastodon.rake +++ b/lib/tasks/mastodon.rake @@ -740,6 +740,24 @@ namespace :mastodon do LinkCrawlWorker.push_bulk status_ids end + desc 'Find case-insensitive username duplicates of local users' + task find_duplicate_usernames: :environment do + include RoutingHelper + + disable_log_stdout! + + duplicate_masters = Account.find_by_sql('SELECT * FROM accounts WHERE id IN (SELECT min(id) FROM accounts WHERE domain IS NULL GROUP BY lower(username) HAVING count(*) > 1)') + pastel = Pastel.new + + duplicate_masters.each do |account| + puts pastel.yellow("First of their name: ") + pastel.bold(account.username) + " (#{admin_account_url(account.id)})" + + Account.where('lower(username) = ?', account.username.downcase).where.not(id: account.id).each do |duplicate| + puts " " + pastel.red("Duplicate: ") + admin_account_url(duplicate.id) + end + end + end + desc 'Remove all home feed regeneration markers' task remove_regeneration_markers: :environment do keys = Redis.current.keys('account:*:regeneration') From a4c7690453bf1a4c24879e0d067b9b700bbb2a13 Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 1 May 2018 01:18:39 -0500 Subject: [PATCH 031/274] womp --- .gitignore | 1 + .node-version | 1 + 2 files changed, 2 insertions(+) create mode 100644 .node-version diff --git a/.gitignore b/.gitignore index 38ebc934f..34b138ecc 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,4 @@ yarn-debug.log # Ignore Docker option files docker-compose.override.yml +public.tar.gz diff --git a/.node-version b/.node-version new file mode 100644 index 000000000..ee1b03fb4 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +9.11.1 From bf723f07d05c58240962b8dbb530e0eeb6a00482 Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 1 May 2018 01:31:57 -0500 Subject: [PATCH 032/274] bump version --- .ruby-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ruby-version b/.ruby-version index 437459cd9..73462a5a1 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.5.0 +2.5.1 From 860cce3d5deaed12f28be492c19b5d83aaeabfa5 Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 15 May 2018 09:05:39 -0500 Subject: [PATCH 033/274] Update locales for 2.4.0rc3 --- app/javascript/mastodon/locales/dog.json | 1 + app/javascript/mastodon/locales/lion.json | 1 + config/locales/dog.yml | 1 + config/locales/doorkeeper.dog.yml | 1 + config/locales/doorkeeper.lion.yml | 1 + config/locales/lion.yml | 1 + 6 files changed, 6 insertions(+) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index a95d3406c..302c53e3a 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index bf8b23572..5f90f1987 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", "account.blocked": "Blocked", diff --git a/config/locales/dog.yml b/config/locales/dog.yml index b28571d33..457abf2c5 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -682,6 +682,7 @@ dog: video: one: "%{count} video" other: "%{count} videos" + boosted_from_html: Awooed from %{acct_link} content_warning: 'Content warning: %{warning}' disallowed_hashtags: one: 'contained a disallowed hashtag: %{tags}' diff --git a/config/locales/doorkeeper.dog.yml b/config/locales/doorkeeper.dog.yml index d1f99f0b0..d52a0b74b 100644 --- a/config/locales/doorkeeper.dog.yml +++ b/config/locales/doorkeeper.dog.yml @@ -115,5 +115,6 @@ dog: title: OAuth authorization required scopes: follow: follow, block, unblock and unfollow accounts + push: receive push notifications for your account read: read your account's data write: post on your behalf diff --git a/config/locales/doorkeeper.lion.yml b/config/locales/doorkeeper.lion.yml index aa45b0752..b3e3c1c60 100644 --- a/config/locales/doorkeeper.lion.yml +++ b/config/locales/doorkeeper.lion.yml @@ -115,5 +115,6 @@ lion: title: OAuth authorization required scopes: follow: follow, block, unblock and unfollow accounts + push: receive push notifications for your account read: read your account's data write: post on your behalf diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 6d9cf078d..7f7d18b57 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -682,6 +682,7 @@ lion: video: one: "%{count} video" other: "%{count} videos" + boosted_from_html: Roared from %{acct_link} content_warning: 'Content warning: %{warning}' disallowed_hashtags: one: 'contained a disallowed hashtag: %{tags}' From ce87288e125478a8e882dfff2804e8db9fdbfa4b Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Tue, 15 May 2018 11:36:19 -0500 Subject: [PATCH 034/274] Fix dog/lion locales --- config/locales/dog.yml | 6 +++--- config/locales/lion.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 457abf2c5..3d0d7a2d0 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -542,7 +542,7 @@ dog: digest: action: View all notifications body: Here is a brief summary of the messages you missed since your last visit on %{since} - mention: "%{name} mentioned you in:" + mention: "%{name} barked at you in:" new_followers_summary: one: Also, you have acquired one new follower while being away! Yay! other: Also, you have acquired %{count} new followers while being away! Amazing! @@ -567,7 +567,7 @@ dog: action: Bark body: '%{name} barked at you in:' subject: "%{name} barked at you" - title: New mention + title: New bark reblog: body: 'Your toot was awooed by %{name}:' subject: "%{name} awooed your toot" @@ -605,7 +605,7 @@ dog: action_boost: Awoo action_expand: Show more action_favourite: Boop - title: "%{name} mentioned you" + title: "%{name} barked at you" reblog: title: "%{name} awooed your toot" remote_follow: diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 7f7d18b57..9b4228431 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -542,7 +542,7 @@ lion: digest: action: View all notifications body: Here is a brief summary of the messages you missed since your last visit on %{since} - mention: "%{name} mentioned you in:" + mention: "%{name} meowed at you in:" new_followers_summary: one: Also, you have acquired one new follower while being away! Yay! other: Also, you have acquired %{count} new followers while being away! Amazing! @@ -567,7 +567,7 @@ lion: action: Meow body: '%{name} meowed at you in:' subject: "%{name} meowed at you" - title: New mention + title: New meow reblog: body: 'Your toot was roared by %{name}:' subject: "%{name} roared your toot" @@ -605,7 +605,7 @@ lion: action_boost: Roar action_expand: Show more action_favourite: Boop - title: "%{name} mentioned you" + title: "%{name} meowed at you" reblog: title: "%{name} roared your toot" remote_follow: From 19c45d520ca487f5ad186a00814bf5f6a708177c Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Tue, 15 May 2018 16:49:37 -0500 Subject: [PATCH 035/274] Add off-network mentions --- app/lib/formatter.rb | 66 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index e1ab05cc0..b23df1b44 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -204,13 +204,77 @@ class Formatter def link_to_mention(entity, linkable_accounts) acct = entity[:screen_name] + username, domain = acct.split('@') - return link_to_account(acct) unless linkable_accounts + case domain + when 'twitter.com' + return link_to_twitter(username) + when 'tumblr.com' + return link_to_tumblr(username) + when 'weasyl.com' + return link_to_weasyl(username) + when 'furaffinity.net' + return link_to_furaffinity(username) + when 'furrynetwork.com', 'beta.furrynetwork.com' + return link_to_furrynetwork(username) + when 'sofurry.com' + return link_to_sofurry(username) + when 'inkbunny.net' + return link_to_inkbunny(username) + when 'deviantart.com' + return link_to_deviantart(username) + when 'artstation.com' + return link_to_artstation(username) + when 'github.com' + return link_to_github(username) + else + return link_to_account(acct) unless linkable_accounts + end account = linkable_accounts.find { |item| TagManager.instance.same_acct?(item.acct, acct) } account ? mention_html(account) : "@#{acct}" end + def link_to_twitter(username) + "@#{username}@twitter.com" + end + + def link_to_tumblr(username) + "@#{username}@tumblr.com" + end + + def link_to_weasyl(username) + "@#{username}@weasyl.com" + end + + def link_to_furaffinity(username) + "@#{username}@furaffinity.net" + end + + def link_to_furrynetwork(username) + "@#{username}@furrynetwork.com" + end + + def link_to_inkbunny(username) + "@#{username}@inkbunny.net" + end + + def link_to_sofurry(username) + "@#{username}@sofurry.com" + end + + def link_to_deviantart(username) + "@#{username}@deviantart.com" + end + + def link_to_artstation(username) + "@#{username}@artstation.com" + end + + def link_to_github(username) + "@#{username}@github.com" + end + def link_to_account(acct) username, domain = acct.split('@') From f7d0764417d19d354b64f7224e82ad62db9efffe Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 15 May 2018 23:08:05 -0500 Subject: [PATCH 036/274] Small text change --- app/javascript/mastodon/locales/dog.json | 2 +- app/javascript/mastodon/locales/lion.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index 302c53e3a..f47e4ef1c 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -10,7 +10,7 @@ "account.follow": "Join Pack", "account.followers": "Pack Members", "account.follows": "Joined Packs", - "account.follows_you": "Is in your pack", + "account.follows_you": "In your pack", "account.hide_reblogs": "Hide awoos from @{name}", "account.media": "Media", "account.mention": "Bark at @{name}", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index 5f90f1987..b49a67857 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -10,7 +10,7 @@ "account.follow": "Join pride", "account.followers": "Pride Members", "account.follows": "Joined Prides", - "account.follows_you": "Is in your pride", + "account.follows_you": "In your pride", "account.hide_reblogs": "Hide roars from @{name}", "account.media": "Media", "account.mention": "Meow at @{name}", From 6bb0ddb61602f18e3e4388a325712357570760db Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Wed, 16 May 2018 10:41:04 -0500 Subject: [PATCH 037/274] Add more off-network mentions --- app/lib/formatter.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index b23df1b44..b1623d5bf 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -221,12 +221,20 @@ class Formatter return link_to_sofurry(username) when 'inkbunny.net' return link_to_inkbunny(username) + when 'e621.net' + return link_to_e621(username) + when 'e926.net' + return link_to_e926(username) + when 'f-list.net' + return link_to_flist(username) when 'deviantart.com' return link_to_deviantart(username) when 'artstation.com' return link_to_artstation(username) when 'github.com' return link_to_github(username) + when 'gitlab.com' + return link_to_gitlab(username) else return link_to_account(acct) unless linkable_accounts end @@ -263,6 +271,18 @@ class Formatter "@#{username}@sofurry.com" end + def link_to_e621(username) + "@#{username}@e621.net" + end + + def link_to_e926(username) + "@#{username}@e926.net" + end + + def link_to_flist(username) + "@#{username}@f-list.net" + end + def link_to_deviantart(username) "@#{username}@deviantart.com" end @@ -275,6 +295,10 @@ class Formatter "@#{username}@github.com" end + def link_to_gitlab(username) + "@#{username}@gitlab.com" + end + def link_to_account(acct) username, domain = acct.split('@') From f6666f37ca2ab5e6a5d0193362c33c4f5d25ea43 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Thu, 31 May 2018 15:45:14 -0500 Subject: [PATCH 038/274] Update translations --- config/locales/dog.yml | 8 ++++++-- config/locales/lion.yml | 8 ++++++-- config/locales/simple_form.dog.yml | 2 +- config/locales/simple_form.lion.yml | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 36dc92e84..71c3c0522 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -760,9 +760,13 @@ dog:


-

Children's Online Privacy Protection Act Compliance

+

Site usage by children

-

Our site, products and services are all directed to people who are at least 13 years old. If this server is in the USA, and you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

+

If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site.

+ +

If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

+ +

Law requirements can be different if this server is in another jurisdiction.


diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 7209e1bf6..8b00009dd 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -760,9 +760,13 @@ lion:
-

Children's Online Privacy Protection Act Compliance

+

Site usage by children

-

Our site, products and services are all directed to people who are at least 13 years old. If this server is in the USA, and you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

+

If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site.

+ +

If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

+ +

Law requirements can be different if this server is in another jurisdiction.


diff --git a/config/locales/simple_form.dog.yml b/config/locales/simple_form.dog.yml index 693a28eb5..d765c0fd9 100644 --- a/config/locales/simple_form.dog.yml +++ b/config/locales/simple_form.dog.yml @@ -4,7 +4,7 @@ dog: hints: defaults: avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px - bot: Warns people that the account does not represent a person + bot: This account mainly performs automated actions and might not be monitored digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence display_name: one: 1 character left diff --git a/config/locales/simple_form.lion.yml b/config/locales/simple_form.lion.yml index f42eee847..417e2e483 100644 --- a/config/locales/simple_form.lion.yml +++ b/config/locales/simple_form.lion.yml @@ -4,7 +4,7 @@ lion: hints: defaults: avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px - bot: Warns people that the account does not represent a person + bot: This account mainly performs automated actions and might not be monitored digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence display_name: one: 1 character left From 0d7fa351a519a0b9a5b8eeb4a2dabd8fe2830f9f Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 31 May 2018 21:42:01 -0500 Subject: [PATCH 039/274] Update locales --- app/javascript/mastodon/locales/dog.json | 11 ++++++----- app/javascript/mastodon/locales/lion.json | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index dcf919e0b..566997cfb 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -96,7 +96,7 @@ "emoji_button.nature": "Nature", "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "Objects", - "emoji_button.people": "People", + "emoji_button.people": "Dogs", "emoji_button.recent": "Frequently used", "emoji_button.search": "Search...", "emoji_button.search_results": "Search results", @@ -150,7 +150,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among people you follow", + "lists.search": "Search among dogs you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Loading...", "media_gallery.toggle_visible": "Toggle visibility", @@ -190,8 +190,8 @@ "notifications.group": "{count} notifications", "onboarding.done": "Done", "onboarding.next": "Next", - "onboarding.page_five.public_timelines": "The local timeline shows public toots from everyone on {domain}. The federated timeline shows public toots from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.", - "onboarding.page_four.home": "The home timeline shows toots from people you follow.", + "onboarding.page_five.public_timelines": "The local timeline shows public toots from everyone on {domain}. The federated timeline shows public toots from everyone who dogs on {domain} follow. These are the Public Timelines, a great way to discover new dogs.", + "onboarding.page_four.home": "The home timeline shows toots from dogs you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "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.full_handle": "Your full handle", @@ -206,7 +206,7 @@ "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", "onboarding.page_six.various_app": "mobile apps", "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.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": "Use the search bar to find dogs and look at hashtags, such as {illustration} and {introductions}. To look for a dog who is not on this instance, use their full handle.", "onboarding.page_two.compose": "Write toots from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", "onboarding.skip": "Skip", "privacy.change": "Adjust toot privacy", @@ -280,6 +280,7 @@ "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notifications", "tabs_bar.search": "Search", + "trends.count_by_accounts": "{count} {rawCount, plural, one {dog} other {dogs}} talking", "timeline.media": "Media", "timeline.posts": "Toots", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index 4133b554e..4b7937551 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -96,7 +96,7 @@ "emoji_button.nature": "Nature", "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "Objects", - "emoji_button.people": "People", + "emoji_button.people": "Lions", "emoji_button.recent": "Frequently used", "emoji_button.search": "Search...", "emoji_button.search_results": "Search results", @@ -150,7 +150,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among people you follow", + "lists.search": "Search among lions you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Loading...", "media_gallery.toggle_visible": "Toggle visibility", @@ -190,8 +190,8 @@ "notifications.group": "{count} notifications", "onboarding.done": "Done", "onboarding.next": "Next", - "onboarding.page_five.public_timelines": "The local timeline shows public toots from everyone on {domain}. The federated timeline shows public toots from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.", - "onboarding.page_four.home": "The home timeline shows toots from people you follow.", + "onboarding.page_five.public_timelines": "The local timeline shows public toots from everyone on {domain}. The federated timeline shows public toots from everyone who lions on {domain} follow. These are the Public Timelines, a great way to discover new lions.", + "onboarding.page_four.home": "The home timeline shows toots from lions you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "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.full_handle": "Your full handle", @@ -206,7 +206,7 @@ "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", "onboarding.page_six.various_app": "mobile apps", "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.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": "Use the search bar to find lions and look at hashtags, such as {illustration} and {introductions}. To look for a lion who is not on this instance, use their full handle.", "onboarding.page_two.compose": "Write toots from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", "onboarding.skip": "Skip", "privacy.change": "Adjust toot privacy", @@ -280,6 +280,7 @@ "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notifications", "tabs_bar.search": "Search", + "trends.count_by_accounts": "{count} {rawCount, plural, one {lion} other {lions}} talking", "timeline.media": "Media", "timeline.posts": "Toots", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", From fa4e4f7f9a139c5487604cc0d2dfb44b4749062e Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 31 May 2018 21:44:07 -0500 Subject: [PATCH 040/274] Update locales --- app/javascript/mastodon/locales/dog.json | 2 +- app/javascript/mastodon/locales/lion.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index 566997cfb..8ee13cf10 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -280,7 +280,7 @@ "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notifications", "tabs_bar.search": "Search", - "trends.count_by_accounts": "{count} {rawCount, plural, one {dog} other {dogs}} talking", + "trends.count_by_accounts": "{count} {rawCount, plural, one {dog} other {dogs}} barking", "timeline.media": "Media", "timeline.posts": "Toots", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index 4b7937551..25ab0856e 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -280,7 +280,7 @@ "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notifications", "tabs_bar.search": "Search", - "trends.count_by_accounts": "{count} {rawCount, plural, one {lion} other {lions}} talking", + "trends.count_by_accounts": "{count} {rawCount, plural, one {lion} other {lions}} meowing", "timeline.media": "Media", "timeline.posts": "Toots", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", From 66bddf35fc6049d7f5aeb41dfb0d5a96ab0abdb2 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Fri, 8 Jun 2018 14:27:57 -0500 Subject: [PATCH 041/274] Update locales for 2.4.1rc3 --- app/javascript/mastodon/locales/dog.json | 13 +++++++++---- app/javascript/mastodon/locales/lion.json | 15 ++++++++++----- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index dcf919e0b..c8f45ba35 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -58,7 +58,6 @@ "column_header.pin": "Pin", "column_header.show_settings": "Show settings", "column_header.unpin": "Unpin", - "column_subheading.navigation": "Navigation", "column_subheading.settings": "Settings", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,6 +83,8 @@ "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.", "confirmations.mute.confirm": "Mute", "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.redraft.message": "Are you sure you want to delete this toot and re-draft it? You will lose all barks, awoos, and boops to it.", "confirmations.unfollow.confirm": "Leave Pack", "confirmations.unfollow.message": "Are you sure you want to leave {name}'s pack?", "embed.instructions": "Embed this toot on your website by copying the code below.", @@ -112,11 +113,10 @@ "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", - "getting_started.appsshort": "Apps", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Getting started", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", - "getting_started.userguide": "User Guide", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", "home.column_settings.filter_regex": "Filter out by regular expressions", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Boops", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "Logout", "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", "notification.favourite": "{name} booped your toot", "notification.follow": "{name} joined your pack", "notification.mention": "{name} barked at you", @@ -263,6 +266,7 @@ "status.reblog": "Awoo", "status.reblog_private": "Awoo to original audience", "status.reblogged_by": "{name} awooed", + "status.redraft": "Delete & re-draft", "status.reply": "Bark", "status.replyAll": "Bark in thread", "status.report": "Report @{name}", @@ -282,6 +286,7 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {dog} other {dogs}} barking", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index 4133b554e..33a981248 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -58,7 +58,6 @@ "column_header.pin": "Pin", "column_header.show_settings": "Show settings", "column_header.unpin": "Unpin", - "column_subheading.navigation": "Navigation", "column_subheading.settings": "Settings", "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", "compose_form.direct_message_warning_learn_more": "Learn more", @@ -84,6 +83,8 @@ "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.", "confirmations.mute.confirm": "Mute", "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.redraft.message": "Are you sure you want to delete this toot and re-draft it? You will lose all meows, roars, and boops to it.", "confirmations.unfollow.confirm": "Leave Pride", "confirmations.unfollow.message": "Are you sure you want to leave {name}'s pride?", "embed.instructions": "Embed this toot on your website by copying the code below.", @@ -112,11 +113,10 @@ "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", - "getting_started.appsshort": "Apps", - "getting_started.faq": "FAQ", + "getting_started.documentation": "Documentation", "getting_started.heading": "Getting started", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", - "getting_started.userguide": "User Guide", + "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", "home.column_settings.filter_regex": "Filter out by regular expressions", @@ -160,6 +160,7 @@ "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Boops", @@ -169,9 +170,11 @@ "navigation_bar.lists": "Lists", "navigation_bar.logout": "Logout", "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", "notification.favourite": "{name} booped your toot", "notification.follow": "{name} joined your pride", "notification.mention": "{name} meowed at you", @@ -263,6 +266,7 @@ "status.reblog": "Roar", "status.reblog_private": "Roar to original audience", "status.reblogged_by": "{name} roared", + "status.redraft": "Delete & re-draft", "status.reply": "Meow", "status.replyAll": "Meow in thread", "status.report": "Report @{name}", @@ -282,12 +286,13 @@ "tabs_bar.search": "Search", "timeline.media": "Media", "timeline.posts": "Toots", + "trends.count_by_accounts": "{count} {rawCount, plural, one {lion} other {lions}} meowing", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", - "upload_form.undo": "Undo", + "upload_form.undo": "Delete", "upload_progress.label": "Uploading...", "video.close": "Close video", "video.exit_fullscreen": "Exit full screen", From a3a18ff8449f1d042e40596edac76ffa5f6c56b1 Mon Sep 17 00:00:00 2001 From: Riley Trautman Date: Fri, 8 Jun 2018 14:29:41 -0500 Subject: [PATCH 042/274] Remove duplicate key --- app/javascript/mastodon/locales/dog.json | 1 - app/javascript/mastodon/locales/lion.json | 1 - 2 files changed, 2 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index c4a32ee58..5c32d170a 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -284,7 +284,6 @@ "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notifications", "tabs_bar.search": "Search", - "trends.count_by_accounts": "{count} {rawCount, plural, one {dog} other {dogs}} barking", "timeline.media": "Media", "timeline.posts": "Toots", "trends.count_by_accounts": "{count} {rawCount, plural, one {dog} other {dogs}} barking", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index 47d39096b..7a946cdfd 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -284,7 +284,6 @@ "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notifications", "tabs_bar.search": "Search", - "trends.count_by_accounts": "{count} {rawCount, plural, one {lion} other {lions}} meowing", "timeline.media": "Media", "timeline.posts": "Toots", "trends.count_by_accounts": "{count} {rawCount, plural, one {lion} other {lions}} meowing", From 47a36b105b5f5c453a68ac73e6522892e595c9e3 Mon Sep 17 00:00:00 2001 From: asonix Date: Sun, 17 Jun 2018 13:41:57 -0500 Subject: [PATCH 043/274] Update translations --- app/javascript/mastodon/locales/dog.json | 23 +++++++++++++---------- app/javascript/mastodon/locales/lion.json | 23 +++++++++++++---------- config/locales/dog.yml | 6 ++++-- config/locales/lion.yml | 2 ++ config/locales/simple_form.dog.yml | 11 ++++++++--- config/locales/simple_form.lion.yml | 11 ++++++++--- 6 files changed, 48 insertions(+), 28 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index 5c32d170a..13e21d2cc 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -39,7 +39,7 @@ "bundle_modal_error.close": "Close", "bundle_modal_error.message": "Something went wrong while loading this component.", "bundle_modal_error.retry": "Try again", - "column.blocks": "Blocked users", + "column.blocks": "Blocked dogs", "column.community": "Local timeline", "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", @@ -47,7 +47,7 @@ "column.follow_requests": "Pack requests", "column.home": "Home", "column.lists": "Lists", - "column.mutes": "Muted users", + "column.mutes": "Muted dogs", "column.notifications": "Notifications", "column.pins": "Pinned toots", "column.public": "Federated timeline", @@ -59,7 +59,8 @@ "column_header.show_settings": "Show settings", "column_header.unpin": "Unpin", "column_subheading.settings": "Settings", - "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", + "community.column_settings.media_only": "Media Only", + "compose_form.direct_message_warning": "This toot will only be sent to the mentioned dogs.", "compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can join your pack to view your pack-only posts.", @@ -106,16 +107,20 @@ "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "There is nothing in this hashtag yet.", - "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other dogs.", "empty_column.home.public_timeline": "the public timeline", "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", - "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow dogs from other instances to fill it up", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", + "getting_started.developers": "Developers", "getting_started.documentation": "Documentation", + "getting_started.find_friends": "Find friends from Twitter", "getting_started.heading": "Getting started", + "getting_started.invite": "Invite dogs", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.security": "Security", "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", @@ -157,7 +162,7 @@ "missing_indicator.label": "Not found", "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", - "navigation_bar.blocks": "Blocked users", + "navigation_bar.blocks": "Blocked dogs", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", @@ -169,7 +174,7 @@ "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", "navigation_bar.lists": "Lists", "navigation_bar.logout": "Logout", - "navigation_bar.mutes": "Muted users", + "navigation_bar.mutes": "Muted dogs", "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", @@ -213,7 +218,7 @@ "onboarding.page_two.compose": "Write toots from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", "onboarding.skip": "Skip", "privacy.change": "Adjust toot privacy", - "privacy.direct.long": "Toot to mentioned users only", + "privacy.direct.long": "Toot to mentioned dogs only", "privacy.direct.short": "Direct", "privacy.private.long": "Toot to followers only", "privacy.private.short": "Pack Members-only", @@ -284,8 +289,6 @@ "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notifications", "tabs_bar.search": "Search", - "timeline.media": "Media", - "timeline.posts": "Toots", "trends.count_by_accounts": "{count} {rawCount, plural, one {dog} other {dogs}} barking", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index 7a946cdfd..4c82b1b07 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -39,7 +39,7 @@ "bundle_modal_error.close": "Close", "bundle_modal_error.message": "Something went wrong while loading this component.", "bundle_modal_error.retry": "Try again", - "column.blocks": "Blocked users", + "column.blocks": "Blocked lions", "column.community": "Local timeline", "column.direct": "Direct messages", "column.domain_blocks": "Hidden domains", @@ -47,7 +47,7 @@ "column.follow_requests": "Pride requests", "column.home": "Home", "column.lists": "Lists", - "column.mutes": "Muted users", + "column.mutes": "Muted lions", "column.notifications": "Notifications", "column.pins": "Pinned toots", "column.public": "Federated timeline", @@ -59,7 +59,8 @@ "column_header.show_settings": "Show settings", "column_header.unpin": "Unpin", "column_subheading.settings": "Settings", - "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", + "community.column_settings.media_only": "Media Only", + "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned lions.", "compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can join your pride to view your pride-only toots.", @@ -106,16 +107,20 @@ "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "There is nothing in this hashtag yet.", - "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other lions.", "empty_column.home.public_timeline": "the public timeline", "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", - "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow lions from other instances to fill it up", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", + "getting_started.developers": "Developers", "getting_started.documentation": "Documentation", + "getting_started.find_friends": "Find friends from Twitter", "getting_started.heading": "Getting started", + "getting_started.invite": "Invite people", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.security": "Security", "getting_started.terms": "Terms of service", "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", @@ -157,7 +162,7 @@ "missing_indicator.label": "Not found", "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", - "navigation_bar.blocks": "Blocked users", + "navigation_bar.blocks": "Blocked lions", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", @@ -169,7 +174,7 @@ "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", "navigation_bar.lists": "Lists", "navigation_bar.logout": "Logout", - "navigation_bar.mutes": "Muted users", + "navigation_bar.mutes": "Muted lions", "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", @@ -213,7 +218,7 @@ "onboarding.page_two.compose": "Write toots from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", "onboarding.skip": "Skip", "privacy.change": "Adjust toot privacy", - "privacy.direct.long": "Toot to mentioned users only", + "privacy.direct.long": "Toot to mentioned lions only", "privacy.direct.short": "Direct", "privacy.private.long": "Toot to followers only", "privacy.private.short": "Pride Members-only", @@ -284,8 +289,6 @@ "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notifications", "tabs_bar.search": "Search", - "timeline.media": "Media", - "timeline.posts": "Toots", "trends.count_by_accounts": "{count} {rawCount, plural, one {lion} other {lions}} meowing", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 71c3c0522..46972188d 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -514,6 +514,7 @@ dog: '86400': 1 day expires_in_prompt: Never generate: Generate + invited_by: 'You were invited by:' max_uses: one: 1 use other: "%{count} uses" @@ -674,6 +675,7 @@ dog: disallowed_hashtags: one: 'contained a disallowed hashtag: %{tags}' other: 'contained the disallowed hashtags: %{tags}' + language_detection: Automatically detect language open_in_web: Open in web over_character_limit: character limit of %{max} exceeded pin_errors: @@ -711,7 +713,7 @@ dog:

What do we use your information for?

-

Any of the information we collect from you may be used in one of the following ways:

+

Any of the information we collect from you may be used in the following ways:

  • To provide the core functionality of Mastodon. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.
  • @@ -774,7 +776,7 @@ dog:

    If we decide to change our privacy policy, we will post those changes on this page.

    -

    This document is CC-BY-SA. It was last updated May 31, 2013.

    +

    This document is CC-BY-SA. It was last updated March 7, 2018.

    Originally adapted from the Discourse privacy policy.

    title: "%{instance} Terms of Service and Privacy Policy" diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 8b00009dd..cb1fe23cb 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -514,6 +514,7 @@ lion: '86400': 1 day expires_in_prompt: Never generate: Generate + invited_by: 'You were invited by:' max_uses: one: 1 use other: "%{count} uses" @@ -674,6 +675,7 @@ lion: disallowed_hashtags: one: 'contained a disallowed hashtag: %{tags}' other: 'contained the disallowed hashtags: %{tags}' + language_detection: Automatically detect language open_in_web: Open in web over_character_limit: character limit of %{max} exceeded pin_errors: diff --git a/config/locales/simple_form.dog.yml b/config/locales/simple_form.dog.yml index d765c0fd9..37fc7d93b 100644 --- a/config/locales/simple_form.dog.yml +++ b/config/locales/simple_form.dog.yml @@ -3,6 +3,7 @@ dog: simple_form: hints: defaults: + autofollow: People who sign up through the invite will automatically follow you avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px bot: This account mainly performs automated actions and might not be monitored digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence @@ -11,10 +12,12 @@ dog: other: %{count} characters left fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px + locale: The language of the user interface, e-mails and push notifications locked: Requires you to manually approve followers note: one: 1 character left other: %{count} characters left + setting_default_language: The language of your toots can be detected automatically, but it's not always accurate setting_hide_network: Who you follow and who follows you will not be shown on your profile setting_noindex: Affects your public profile and status pages setting_theme: Affects how Mastodon looks when you're logged in from any device. @@ -23,15 +26,17 @@ dog: sessions: otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:' user: - filtered_languages: Checked languages will be filtered from public timelines for you + chosen_languages: When checked, only toots in selected languages will be displayed in public timelines labels: account: fields: name: Label value: Content defaults: + autofollow: Invite to follow your account avatar: Avatar bot: This is a bot account + chosen_languages: Filter languages confirm_new_password: Confirm new password confirm_password: Confirm password current_password: Current password @@ -40,9 +45,8 @@ dog: email: E-mail address expires_in: Expire after fields: Profile metadata - filtered_languages: Filtered languages header: Header - locale: Language + locale: Interface language locked: Lock account max_uses: Max number of uses new_password: New password @@ -51,6 +55,7 @@ dog: password: Password setting_auto_play_gif: Auto-play animated GIFs setting_boost_modal: Show confirmation dialog before boosting + setting_default_language: Posting language setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot diff --git a/config/locales/simple_form.lion.yml b/config/locales/simple_form.lion.yml index 417e2e483..4d524ccd5 100644 --- a/config/locales/simple_form.lion.yml +++ b/config/locales/simple_form.lion.yml @@ -3,6 +3,7 @@ lion: simple_form: hints: defaults: + autofollow: People who sign up through the invite will automatically follow you avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px bot: This account mainly performs automated actions and might not be monitored digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence @@ -11,10 +12,12 @@ lion: other: %{count} characters left fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px + locale: The language of the user interface, e-mails and push notifications locked: Requires you to manually approve followers note: one: 1 character left other: %{count} characters left + setting_default_language: The language of your toots can be detected automatically, but it's not always accurate setting_hide_network: Who you follow and who follows you will not be shown on your profile setting_noindex: Affects your public profile and status pages setting_theme: Affects how Mastodon looks when you're logged in from any device. @@ -23,15 +26,17 @@ lion: sessions: otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:' user: - filtered_languages: Checked languages will be filtered from public timelines for you + chosen_languages: When checked, only toots in selected languages will be displayed in public timelines labels: account: fields: name: Label value: Content defaults: + autofollow: Invite to follow your account avatar: Avatar bot: This is a bot account + chosen_languages: Filter languages confirm_new_password: Confirm new password confirm_password: Confirm password current_password: Current password @@ -40,9 +45,8 @@ lion: email: E-mail address expires_in: Expire after fields: Profile metadata - filtered_languages: Filtered languages header: Header - locale: Language + locale: Interface language locked: Lock account max_uses: Max number of uses new_password: New password @@ -51,6 +55,7 @@ lion: password: Password setting_auto_play_gif: Auto-play animated GIFs setting_boost_modal: Show confirmation dialog before boosting + setting_default_language: Posting language setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot From 86f3fa2a26f183525a5321fa06a35f12f8da6744 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 21 Jun 2018 19:21:18 -0500 Subject: [PATCH 044/274] Update translations --- config/locales/dog.yml | 38 +++++++++++++++++++------------------- config/locales/lion.yml | 38 +++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 46972188d..f7b7fa54c 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -31,7 +31,7 @@ dog: source_code: Source code status_count_after: toots status_count_before: Who authored - user_count_after: users + user_count_after: dogs user_count_before: Home to what_is_mastodon: What is Mastodon? accounts: @@ -121,7 +121,7 @@ dog: redownload: Refresh avatar remove_avatar: Remove avatar resend_confirmation: - already_confirmed: This user is already confirmed + already_confirmed: This dog is already confirmed send: Resend confirmation email success: Confirmation email successfully sent! reset: Reset @@ -132,7 +132,7 @@ dog: admin: Administrator moderator: Moderator staff: Staff - user: User + user: Dog salmon_url: Salmon URL search: Search shared_inbox_url: Shared Inbox URL @@ -153,25 +153,25 @@ dog: action_logs: actions: assigned_to_self_report: "%{name} assigned report %{target} to themselves" - change_email_user: "%{name} changed the e-mail address of user %{target}" - confirm_user: "%{name} confirmed e-mail address of user %{target}" + change_email_user: "%{name} changed the e-mail address of dog %{target}" + confirm_user: "%{name} confirmed e-mail address of dog %{target}" create_custom_emoji: "%{name} uploaded new emoji %{target}" create_domain_block: "%{name} blocked domain %{target}" create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" - demote_user: "%{name} demoted user %{target}" + demote_user: "%{name} demoted dog %{target}" destroy_domain_block: "%{name} unblocked domain %{target}" destroy_email_domain_block: "%{name} whitelisted e-mail domain %{target}" destroy_status: "%{name} removed toot by %{target}" - disable_2fa_user: "%{name} disabled two factor requirement for user %{target}" + disable_2fa_user: "%{name} disabled two factor requirement for dog %{target}" disable_custom_emoji: "%{name} disabled emoji %{target}" - disable_user: "%{name} disabled login for user %{target}" + disable_user: "%{name} disabled login for dog %{target}" enable_custom_emoji: "%{name} enabled emoji %{target}" - enable_user: "%{name} enabled login for user %{target}" + enable_user: "%{name} enabled login for dog %{target}" memorialize_account: "%{name} turned %{target}'s account into a memoriam page" - promote_user: "%{name} promoted user %{target}" + promote_user: "%{name} promoted dog %{target}" remove_avatar_user: "%{name} removed %{target}'s avatar" reopen_report: "%{name} reopened report %{target}" - reset_password_user: "%{name} reset password of user %{target}" + reset_password_user: "%{name} reset password of dog %{target}" resolve_report: "%{name} resolved report %{target}" silence_account: "%{name} silenced %{target}'s account" suspend_account: "%{name} suspended %{target}'s account" @@ -302,11 +302,11 @@ dog: view: View settings: activity_api_enabled: - desc_html: Counts of locally posted toots, active users, and new registrations in weekly buckets - title: Publish aggregate statistics about user activity + desc_html: Counts of locally posted toots, active dogs, and new registrations in weekly buckets + title: Publish aggregate statistics about dog activity bootstrap_timeline_accounts: desc_html: Separate multiple usernames by comma. Only local and unlocked accounts will work. Default when empty is all local admins. - title: Default follows for new users + title: Default follows for new dogs contact_information: email: Business e-mail username: Contact username @@ -333,7 +333,7 @@ dog: desc_html: When toggled, it will show toots from all the known fediverse on preview. Otherwise it will only show local toots. title: Show known fediverse on timeline preview show_staff_badge: - desc_html: Show a staff badge on a user page + desc_html: Show a staff badge on a dog page title: Show staff badge site_description: desc_html: Introductory paragraph on the frontpage and in meta tags. You can use HTML tags, in particular <a> and <em>. @@ -424,7 +424,7 @@ dog: following: 'Success! You are now following:' post_follow: close: Or, you can just close this window. - return: Return to the user's profile + return: Show the dog's profile web: Go to web title: Follow %{acct} datetime: @@ -524,7 +524,7 @@ dog: expires_at: Expires uses: Uses title: Invite people - landing_strip_html: "%{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." + landing_strip_html: "%{name} is a dog on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." landing_strip_signup_html: If you don't, you can sign up here. lists: errors: @@ -705,7 +705,7 @@ dog:
    • Basic account information: If you register on this server, you may be asked to enter a username, an e-mail address and a password. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly.
    • Posts, following and other public information: The list of people you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.
    • -
    • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and users who are mentioned in them, and direct posts are delivered only to users mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
    • +
    • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and dogs who are mentioned in them, and direct posts are delivered only to dogs mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
    • IPs and other metadata: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.
    @@ -735,7 +735,7 @@ dog:
    • Retain server logs containing the IP address of all requests to this server, in so far as such logs are kept, no more than 90 days.
    • -
    • Retain the IP addresses associated with registered users no more than 12 months.
    • +
    • Retain the IP addresses associated with registered dogs no more than 12 months.

    You can request and download an archive of your content, including your posts, media attachments, profile picture, and header image.

    diff --git a/config/locales/lion.yml b/config/locales/lion.yml index cb1fe23cb..9719e9e58 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -31,7 +31,7 @@ lion: source_code: Source code status_count_after: toots status_count_before: Who authored - user_count_after: users + user_count_after: lions user_count_before: Home to what_is_mastodon: What is Mastodon? accounts: @@ -121,7 +121,7 @@ lion: redownload: Refresh avatar remove_avatar: Remove avatar resend_confirmation: - already_confirmed: This user is already confirmed + already_confirmed: This lion is already confirmed send: Resend confirmation email success: Confirmation email successfully sent! reset: Reset @@ -132,7 +132,7 @@ lion: admin: Administrator moderator: Moderator staff: Staff - user: User + user: Lion salmon_url: Salmon URL search: Search shared_inbox_url: Shared Inbox URL @@ -153,25 +153,25 @@ lion: action_logs: actions: assigned_to_self_report: "%{name} assigned report %{target} to themselves" - change_email_user: "%{name} changed the e-mail address of user %{target}" - confirm_user: "%{name} confirmed e-mail address of user %{target}" + change_email_user: "%{name} changed the e-mail address of lion %{target}" + confirm_user: "%{name} confirmed e-mail address of lion %{target}" create_custom_emoji: "%{name} uploaded new emoji %{target}" create_domain_block: "%{name} blocked domain %{target}" create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" - demote_user: "%{name} demoted user %{target}" + demote_user: "%{name} demoted lion %{target}" destroy_domain_block: "%{name} unblocked domain %{target}" destroy_email_domain_block: "%{name} whitelisted e-mail domain %{target}" destroy_status: "%{name} removed toot by %{target}" - disable_2fa_user: "%{name} disabled two factor requirement for user %{target}" + disable_2fa_user: "%{name} disabled two factor requirement for lion %{target}" disable_custom_emoji: "%{name} disabled emoji %{target}" - disable_user: "%{name} disabled login for user %{target}" + disable_user: "%{name} disabled login for lion %{target}" enable_custom_emoji: "%{name} enabled emoji %{target}" - enable_user: "%{name} enabled login for user %{target}" + enable_user: "%{name} enabled login for lion %{target}" memorialize_account: "%{name} turned %{target}'s account into a memoriam page" - promote_user: "%{name} promoted user %{target}" + promote_user: "%{name} promoted lion %{target}" remove_avatar_user: "%{name} removed %{target}'s avatar" reopen_report: "%{name} reopened report %{target}" - reset_password_user: "%{name} reset password of user %{target}" + reset_password_user: "%{name} reset password of lion %{target}" resolve_report: "%{name} resolved report %{target}" silence_account: "%{name} silenced %{target}'s account" suspend_account: "%{name} suspended %{target}'s account" @@ -302,11 +302,11 @@ lion: view: View settings: activity_api_enabled: - desc_html: Counts of locally posted toots, active users, and new registrations in weekly buckets - title: Publish aggregate statistics about user activity + desc_html: Counts of locally posted toots, active lions, and new registrations in weekly buckets + title: Publish aggregate statistics about lion activity bootstrap_timeline_accounts: desc_html: Separate multiple usernames by comma. Only local and unlocked accounts will work. Default when empty is all local admins. - title: Default follows for new users + title: Default follows for new lions contact_information: email: Business e-mail username: Contact username @@ -333,7 +333,7 @@ lion: desc_html: When toggled, it will show toots from all the known fediverse on preview. Otherwise it will only show local toots. title: Show known fediverse on timeline preview show_staff_badge: - desc_html: Show a staff badge on a user page + desc_html: Show a staff badge on a lion page title: Show staff badge site_description: desc_html: Introductory paragraph on the frontpage and in meta tags. You can use HTML tags, in particular <a> and <em>. @@ -424,7 +424,7 @@ lion: following: 'Success! You are now following:' post_follow: close: Or, you can just close this window. - return: Return to the user's profile + return: Show the lion's profile web: Go to web title: Follow %{acct} datetime: @@ -524,7 +524,7 @@ lion: expires_at: Expires uses: Uses title: Invite people - landing_strip_html: "%{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." + landing_strip_html: "%{name} is a lion on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." landing_strip_signup_html: If you don't, you can sign up here. lists: errors: @@ -705,7 +705,7 @@ lion:
    • Basic account information: If you register on this server, you may be asked to enter a username, an e-mail address and a password. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly.
    • Posts, following and other public information: The list of people you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.
    • -
    • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and users who are mentioned in them, and direct posts are delivered only to users mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
    • +
    • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and lions who are mentioned in them, and direct posts are delivered only to lions mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
    • IPs and other metadata: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.
    @@ -735,7 +735,7 @@ lion:
    • Retain server logs containing the IP address of all requests to this server, in so far as such logs are kept, no more than 90 days.
    • -
    • Retain the IP addresses associated with registered users no more than 12 months.
    • +
    • Retain the IP addresses associated with registered lions no more than 12 months.

    You can request and download an archive of your content, including your posts, media attachments, profile picture, and header image.

    From e32713f1aa55b2bdc0d77752dda7f33c4765a073 Mon Sep 17 00:00:00 2001 From: asonix Date: Sun, 15 Jul 2018 15:35:29 -0500 Subject: [PATCH 045/274] Update translations --- app/javascript/mastodon/locales/dog.json | 5 ++-- app/javascript/mastodon/locales/lion.json | 5 ++-- config/locales/dog.yml | 28 +++++++++++++++++++++ config/locales/doorkeeper.dog.yml | 30 ++++++++++++++++++++--- config/locales/doorkeeper.lion.yml | 30 ++++++++++++++++++++--- config/locales/lion.yml | 27 ++++++++++++++++++++ config/locales/simple_form.dog.yml | 11 +++++++++ 7 files changed, 122 insertions(+), 14 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index 13e21d2cc..2bec09291 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", - "home.column_settings.filter_regex": "Filter out by regular expressions", "home.column_settings.show_reblogs": "Show awoos", "home.column_settings.show_replies": "Show barks", - "home.settings": "Column settings", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", @@ -170,6 +167,7 @@ "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Boops", "navigation_bar.follow_requests": "Pack requests", + "navigation_bar.follow_requests": "Pack requests", "navigation_bar.info": "About this instance", "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", "navigation_bar.lists": "Lists", @@ -259,6 +257,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Boop", + "status.filtered": "Filtered", "status.load_more": "Load more", "status.media_hidden": "Media hidden", "status.mention": "Bark at @{name}", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index 4c82b1b07..970bbaa1b 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -122,12 +122,9 @@ "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", - "home.column_settings.advanced": "Advanced", "home.column_settings.basic": "Basic", - "home.column_settings.filter_regex": "Filter out by regular expressions", "home.column_settings.show_reblogs": "Show roars", "home.column_settings.show_replies": "Show meows", - "home.settings": "Column settings", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", @@ -170,6 +167,7 @@ "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Boops", "navigation_bar.follow_requests": "Pride requests", + "navigation_bar.follow_requests": "Pride requests", "navigation_bar.info": "About this instance", "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", "navigation_bar.lists": "Lists", @@ -259,6 +257,7 @@ "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Boop", + "status.filtered": "Filtered", "status.load_more": "Load more", "status.media_hidden": "Media hidden", "status.mention": "Meow at @{name}", diff --git a/config/locales/dog.yml b/config/locales/dog.yml index f7b7fa54c..785eeab40 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -261,6 +261,14 @@ dog: expired: Expired title: Filter title: Invites + relays: + add_new: Add new relay + description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. + enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. + inbox_url: Relay URL + setup: Setup a relay connection + status: Status + title: Relays report_notes: created_msg: Report note successfully created! destroyed_msg: Report note successfully deleted! @@ -316,6 +324,9 @@ dog: peers_api_enabled: desc_html: Domain names this instance has encountered in the fediverse title: Publish list of discovered instances + preview_sensitive_media: + desc_html: Link previews on other websites will display a thumbnail even if the media is marked as sensitive + title: Show sensitive media in OpenGraph previews registrations: closed_message: desc_html: Displayed on frontpage when registrations are closed. You can use HTML tags @@ -474,6 +485,22 @@ dog: follows: You follow mutes: You mute storage: Media storage + filters: + contexts: + home: Home timeline + notifications: Notifications + public: Public timelines + thread: Conversations + edit: + title: Edit filter + errors: + invalid_context: None or invalid context supplied + invalid_irreversible: Irreversible filtering only works with home or notifications context + index: + delete: Delete + title: Filters + new: + title: Add new filter followers: domain: Domain explanation_html: If you want to ensure the privacy of your toots, you must be aware of who is following you. Your private toots are delivered to all instances where you have followers. You may wish to review them, and remove followers if you do not trust your privacy to be respected by the staff or software of those instances. @@ -599,6 +626,7 @@ dog: remote_follow: acct: Enter your username@domain you want to follow from missing_resource: Could not find the required redirect URL for your account + no_account_html: Don't have an account? You can sign up here proceed: Proceed to follow prompt: 'You are going to follow:' remote_unfollow: diff --git a/config/locales/doorkeeper.dog.yml b/config/locales/doorkeeper.dog.yml index d52a0b74b..7e556c27f 100644 --- a/config/locales/doorkeeper.dog.yml +++ b/config/locales/doorkeeper.dog.yml @@ -114,7 +114,29 @@ dog: application: title: OAuth authorization required scopes: - follow: follow, block, unblock and unfollow accounts - push: receive push notifications for your account - read: read your account's data - write: post on your behalf + follow: modify account relationships + push: receive your push notifications + read: read all your account's data + read:accounts: see accounts information + read:blocks: see your blocks + read:favourites: see your favourites + read:filters: see your filters + read:follows: see your joined packs + read:lists: see your lists + read:mutes: see your mutes + read:notifications: see your notifications + read:reports: see your reports + read:search: search on your behalf + read:statuses: see all toots + write: modify all your account's data + write:accounts: modify your profile + write:blocks: block accounts and domains + write:favourites: favourite toots + write:filters: create filters + write:follows: join packs + write:lists: create lists + write:media: upload media files + write:mutes: mute dogs and conversations + write:notifications: clear your notifications + write:reports: report other dogs + write:statuses: publish toots diff --git a/config/locales/doorkeeper.lion.yml b/config/locales/doorkeeper.lion.yml index b3e3c1c60..593c9c185 100644 --- a/config/locales/doorkeeper.lion.yml +++ b/config/locales/doorkeeper.lion.yml @@ -114,7 +114,29 @@ lion: application: title: OAuth authorization required scopes: - follow: follow, block, unblock and unfollow accounts - push: receive push notifications for your account - read: read your account's data - write: post on your behalf + follow: modify account relationships + push: receive your push notifications + read: read all your account's data + read:accounts: see accounts information + read:blocks: see your blocks + read:favourites: see your favourites + read:filters: see your filters + read:follows: see your joined prides + read:lists: see your lists + read:mutes: see your mutes + read:notifications: see your notifications + read:reports: see your reports + read:search: search on your behalf + read:statuses: see all toots + write: modify all your account's data + write:accounts: modify your profile + write:blocks: block accounts and domains + write:favourites: favourite toots + write:filters: create filters + write:follows: join prides + write:lists: create lists + write:media: upload media files + write:mutes: mute lions and conversations + write:notifications: clear your notifications + write:reports: report other lions + write:statuses: publish toots diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 9719e9e58..7417fdf82 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -261,6 +261,14 @@ lion: expired: Expired title: Filter title: Invites + relays: + add_new: Add new relay + description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. + enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. + inbox_url: Relay URL + setup: Setup a relay connection + status: Status + title: Relays report_notes: created_msg: Report note successfully created! destroyed_msg: Report note successfully deleted! @@ -316,6 +324,9 @@ lion: peers_api_enabled: desc_html: Domain names this instance has encountered in the fediverse title: Publish list of discovered instances + preview_sensitive_media: + desc_html: Link previews on other websites will display a thumbnail even if the media is marked as sensitive + title: Show sensitive media in OpenGraph previews registrations: closed_message: desc_html: Displayed on frontpage when registrations are closed. You can use HTML tags @@ -474,6 +485,22 @@ lion: follows: You follow mutes: You mute storage: Media storage + filters: + contexts: + home: Home timeline + notifications: Notifications + public: Public timelines + thread: Conversations + edit: + title: Edit filter + errors: + invalid_context: None or invalid context supplied + invalid_irreversible: Irreversible filtering only works with home or notifications context + index: + delete: Delete + title: Filters + new: + title: Add new filter followers: domain: Domain explanation_html: If you want to ensure the privacy of your toots, you must be aware of who is following you. Your private toots are delivered to all instances where you have followers. You may wish to review them, and remove followers if you do not trust your privacy to be respected by the staff or software of those instances. diff --git a/config/locales/simple_form.dog.yml b/config/locales/simple_form.dog.yml index 37fc7d93b..a653af306 100644 --- a/config/locales/simple_form.dog.yml +++ b/config/locales/simple_form.dog.yml @@ -6,21 +6,27 @@ dog: autofollow: People who sign up through the invite will automatically follow you avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px bot: This account mainly performs automated actions and might not be monitored + context: One or multiple contexts where the filter should apply digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence display_name: one: 1 character left other: %{count} characters left fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px + inbox_url: Copy the URL from the frontpage of the relay you want to use + irreversible: Filtered toots will disappear irreversibly, even if filter is later removed locale: The language of the user interface, e-mails and push notifications locked: Requires you to manually approve followers note: one: 1 character left other: %{count} characters left + phrase: Will be matched regardless of casing in text or content warning of a toot + scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. setting_default_language: The language of your toots can be detected automatically, but it's not always accurate setting_hide_network: Who you follow and who follows you will not be shown on your profile setting_noindex: Affects your public profile and status pages setting_theme: Affects how Mastodon looks when you're logged in from any device. + whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word imports: data: CSV file exported from another Mastodon instance sessions: @@ -39,6 +45,7 @@ dog: chosen_languages: Filter languages confirm_new_password: Confirm new password confirm_password: Confirm password + context: Filter contexts current_password: Current password data: Data display_name: Display name @@ -46,6 +53,8 @@ dog: expires_in: Expire after fields: Profile metadata header: Header + inbox_url: URL of the relay inbox + irreversible: Drop instead of hide locale: Interface language locked: Lock account max_uses: Max number of uses @@ -53,6 +62,7 @@ dog: note: Bio otp_attempt: Two-factor code password: Password + phrase: Keyword or phrase setting_auto_play_gif: Auto-play animated GIFs setting_boost_modal: Show confirmation dialog before boosting setting_default_language: Posting language @@ -70,6 +80,7 @@ dog: type: Import type username: Username username_or_email: Username or Email + whole_word: Whole word interactions: must_be_follower: Block notifications from non-followers must_be_following: Block notifications from people you don't follow From 13a062a5d9f05d5ca476c2159d560261f7011b2b Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 14 Aug 2018 20:24:47 +0200 Subject: [PATCH 046/274] Upgrade Doorkeeper to 4.4.1 (#8197) --- Gemfile | 2 +- Gemfile.lock | 4 ++-- ..._change_account_id_nonnullable_in_lists.rb | 2 -- ..._confidential_to_doorkeeper_application.rb | 23 +++++++++++++++++++ db/schema.rb | 3 ++- 5 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 db/migrate/20180814171349_add_confidential_to_doorkeeper_application.rb diff --git a/Gemfile b/Gemfile index 7a6e1568d..c9e74455a 100644 --- a/Gemfile +++ b/Gemfile @@ -41,7 +41,7 @@ gem 'omniauth-cas', '~> 1.1' gem 'omniauth-saml', '~> 1.10' gem 'omniauth', '~> 1.2' -gem 'doorkeeper', '~> 4.2', '< 4.3' +gem 'doorkeeper', '~> 4.4' gem 'fast_blank', '~> 1.0' gem 'fastimage' gem 'goldfinger', '~> 2.1' diff --git a/Gemfile.lock b/Gemfile.lock index e1929a05c..213a4418e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -181,7 +181,7 @@ GEM docile (1.3.0) domain_name (0.5.20180417) unf (>= 0.0.5, < 1.0.0) - doorkeeper (4.2.6) + doorkeeper (4.4.1) railties (>= 4.2) dotenv (2.2.2) dotenv-rails (2.2.2) @@ -670,7 +670,7 @@ DEPENDENCIES devise (~> 4.4) devise-two-factor (~> 3.0) devise_pam_authenticatable2 (~> 9.1) - doorkeeper (~> 4.2, < 4.3) + doorkeeper (~> 4.4) dotenv-rails (~> 2.2, < 2.3) fabrication (~> 2.20) faker (~> 1.8) diff --git a/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb b/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb index 120f74402..3369e3b9e 100644 --- a/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb +++ b/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb @@ -1,5 +1,3 @@ -require Rails.root.join('lib', 'mastodon', 'migration_helpers') - class ChangeAccountIdNonnullableInLists < ActiveRecord::Migration[5.1] def change change_column_null :lists, :account_id, false diff --git a/db/migrate/20180814171349_add_confidential_to_doorkeeper_application.rb b/db/migrate/20180814171349_add_confidential_to_doorkeeper_application.rb new file mode 100644 index 000000000..7077a4e65 --- /dev/null +++ b/db/migrate/20180814171349_add_confidential_to_doorkeeper_application.rb @@ -0,0 +1,23 @@ +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class AddConfidentialToDoorkeeperApplication < ActiveRecord::Migration[5.2] + include Mastodon::MigrationHelpers + + disable_ddl_transaction! + + def up + safety_assured do + add_column_with_default( + :oauth_applications, + :confidential, + :boolean, + allow_null: false, + default: true # maintaining backwards compatibility: require secrets + ) + end + end + + def down + remove_column :oauth_applications, :confidential + end +end diff --git a/db/schema.rb b/db/schema.rb index 02032c548..a7d81d57e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2018_07_07_154237) do +ActiveRecord::Schema.define(version: 2018_08_14_171349) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -339,6 +339,7 @@ ActiveRecord::Schema.define(version: 2018_07_07_154237) do t.string "website" t.string "owner_type" t.bigint "owner_id" + t.boolean "confidential", default: true, null: false t.index ["owner_id", "owner_type"], name: "index_oauth_applications_on_owner_id_and_owner_type" t.index ["uid"], name: "index_oauth_applications_on_uid", unique: true end From 31a209cb015022733cdc6e6f5f2fac614a1e70b3 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 20 Aug 2018 22:42:02 +0200 Subject: [PATCH 047/274] Upgrade doorkeeper to 4.4.2 (#8321) --- Gemfile.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 213a4418e..2da3fe324 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -181,7 +181,7 @@ GEM docile (1.3.0) domain_name (0.5.20180417) unf (>= 0.0.5, < 1.0.0) - doorkeeper (4.4.1) + doorkeeper (4.4.2) railties (>= 4.2) dotenv (2.2.2) dotenv-rails (2.2.2) @@ -269,7 +269,7 @@ GEM httplog (1.0.2) colorize (~> 0.8) rack (>= 1.0) - i18n (1.0.1) + i18n (1.1.0) concurrent-ruby (~> 1.0) i18n-tasks (0.9.21) activesupport (>= 4.0.2) @@ -347,7 +347,7 @@ GEM net-ssh (>= 2.6.5) net-ssh (4.2.0) nio4r (2.3.0) - nokogiri (1.8.2) + nokogiri (1.8.4) mini_portile2 (~> 2.3.0) nokogumbo (1.5.0) nokogiri @@ -415,7 +415,7 @@ GEM puma (3.11.4) pundit (1.1.0) activesupport (>= 3.0.0) - rack (2.0.4) + rack (2.0.5) rack-attack (5.2.0) rack rack-cors (1.0.2) @@ -423,7 +423,7 @@ GEM rack rack-proxy (0.6.4) rack - rack-test (1.0.0) + rack-test (1.1.0) rack (>= 1.0, < 3) rails (5.2.0) actioncable (= 5.2.0) @@ -764,4 +764,4 @@ RUBY VERSION ruby 2.5.0p0 BUNDLED WITH - 1.16.2 + 1.16.3 From f100e843725cc6e2dfdbb6dc2b1bfc2fa939bb63 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 22 Aug 2018 20:55:14 +0200 Subject: [PATCH 048/274] Improve federated ID validation (#8372) * Fix URI not being sufficiently validated with prefetched JSON * Add additional id validation to OStatus documents, when possible --- app/helpers/jsonld_helper.rb | 6 ++- app/lib/ostatus/activity/creation.rb | 11 +++- .../fetch_remote_account_service.rb | 2 +- .../activitypub/fetch_remote_key_service.rb | 2 +- .../fetch_remote_status_service.rb | 2 +- app/services/fetch_remote_account_service.rb | 7 ++- .../fetch_remote_account_service_spec.rb | 7 ++- .../fetch_remote_status_service_spec.rb | 22 ++++++++ .../fetch_remote_account_service_spec.rb | 20 ++++++- .../fetch_remote_status_service_spec.rb | 52 +++++++++++++++++++ 10 files changed, 122 insertions(+), 9 deletions(-) diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb index 9d2b6cf00..532397272 100644 --- a/app/helpers/jsonld_helper.rb +++ b/app/helpers/jsonld_helper.rb @@ -73,8 +73,10 @@ module JsonLdHelper end end - def body_to_json(body) - body.is_a?(String) ? Oj.load(body, mode: :strict) : body + def body_to_json(body, compare_id: nil) + json = body.is_a?(String) ? Oj.load(body, mode: :strict) : body + return if compare_id.present? && json['id'] != compare_id + json rescue Oj::ParseError nil end diff --git a/app/lib/ostatus/activity/creation.rb b/app/lib/ostatus/activity/creation.rb index d3a303a0c..8f8c70052 100644 --- a/app/lib/ostatus/activity/creation.rb +++ b/app/lib/ostatus/activity/creation.rb @@ -7,7 +7,7 @@ class OStatus::Activity::Creation < OStatus::Activity::Base return [nil, false] end - return [nil, false] if @account.suspended? + return [nil, false] if @account.suspended? || invalid_origin? RedisLock.acquire(lock_options) do |lock| if lock.acquired? @@ -204,6 +204,15 @@ class OStatus::Activity::Creation < OStatus::Activity::Base end end + def invalid_origin? + return false unless id.start_with?('http') # Legacy IDs cannot be checked + + needle = Addressable::URI.parse(id).normalized_host + + !(needle.casecmp(@account.domain).zero? || + needle.casecmp(Addressable::URI.parse(@account.remote_url.presence || @account.uri).normalized_host).zero?) + end + def lock_options { redis: Redis.current, key: "create:#{id}" } end diff --git a/app/services/activitypub/fetch_remote_account_service.rb b/app/services/activitypub/fetch_remote_account_service.rb index 867e70876..6fa4e9a1b 100644 --- a/app/services/activitypub/fetch_remote_account_service.rb +++ b/app/services/activitypub/fetch_remote_account_service.rb @@ -11,7 +11,7 @@ class ActivityPub::FetchRemoteAccountService < BaseService @json = if prefetched_body.nil? fetch_resource(uri, id) else - body_to_json(prefetched_body) + body_to_json(prefetched_body, compare_id: id ? uri : nil) end return unless supported_context? && expected_type? diff --git a/app/services/activitypub/fetch_remote_key_service.rb b/app/services/activitypub/fetch_remote_key_service.rb index 505baccd4..df17d9079 100644 --- a/app/services/activitypub/fetch_remote_key_service.rb +++ b/app/services/activitypub/fetch_remote_key_service.rb @@ -17,7 +17,7 @@ class ActivityPub::FetchRemoteKeyService < BaseService @json = fetch_resource(uri, id) end else - @json = body_to_json(prefetched_body) + @json = body_to_json(prefetched_body, compare_id: id ? uri : nil) end return unless supported_context?(@json) && expected_type? diff --git a/app/services/activitypub/fetch_remote_status_service.rb b/app/services/activitypub/fetch_remote_status_service.rb index 2b447abb3..469821032 100644 --- a/app/services/activitypub/fetch_remote_status_service.rb +++ b/app/services/activitypub/fetch_remote_status_service.rb @@ -8,7 +8,7 @@ class ActivityPub::FetchRemoteStatusService < BaseService @json = if prefetched_body.nil? fetch_resource(uri, id, on_behalf_of) else - body_to_json(prefetched_body) + body_to_json(prefetched_body, compare_id: id ? uri : nil) end return unless supported_context? && expected_type? diff --git a/app/services/fetch_remote_account_service.rb b/app/services/fetch_remote_account_service.rb index a0f031a44..cfc560022 100644 --- a/app/services/fetch_remote_account_service.rb +++ b/app/services/fetch_remote_account_service.rb @@ -27,7 +27,7 @@ class FetchRemoteAccountService < BaseService account = author_from_xml(xml.at_xpath('/xmlns:feed', xmlns: OStatus::TagManager::XMLNS), false) - UpdateRemoteProfileService.new.call(xml, account) unless account.nil? + UpdateRemoteProfileService.new.call(xml, account) if account.present? && trusted_domain?(url, account) account rescue TypeError @@ -37,4 +37,9 @@ class FetchRemoteAccountService < BaseService Rails.logger.debug 'Invalid XML or missing namespace' nil end + + def trusted_domain?(url, account) + domain = Addressable::URI.parse(url).normalized_host + domain.casecmp(account.domain).zero? || domain.casecmp(Addressable::URI.parse(account.remote_url.presence || account.uri).normalized_host).zero? + end end diff --git a/spec/services/activitypub/fetch_remote_account_service_spec.rb b/spec/services/activitypub/fetch_remote_account_service_spec.rb index dba55c034..aa13f0a9b 100644 --- a/spec/services/activitypub/fetch_remote_account_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_account_service_spec.rb @@ -59,7 +59,6 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do it 'returns nil' do expect(account).to be_nil end - end context 'when URI and WebFinger share the same host' do @@ -119,5 +118,11 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do include_examples 'sets profile data' end + + context 'with wrong id' do + it 'does not create account' do + expect(subject.call('https://fake.address/@foo', prefetched_body: Oj.dump(actor))).to be_nil + end + end end end diff --git a/spec/services/activitypub/fetch_remote_status_service_spec.rb b/spec/services/activitypub/fetch_remote_status_service_spec.rb index 549eb80fa..9ae409996 100644 --- a/spec/services/activitypub/fetch_remote_status_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_status_service_spec.rb @@ -70,5 +70,27 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remix https://#{valid_domain}/watch?v=12345" end end + + context 'with wrong id' do + let(:note) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: "https://real.address/@foo/1234", + type: 'Note', + content: 'Lorem ipsum', + attributedTo: ActivityPub::TagManager.instance.uri_for(sender), + } + end + + let(:object) do + temp = note.dup + temp[:id] = 'https://fake.address/@foo/5678' + temp + end + + it 'does not create status' do + expect(sender.statuses.first).to be_nil + end + end end end diff --git a/spec/services/fetch_remote_account_service_spec.rb b/spec/services/fetch_remote_account_service_spec.rb index 1c3abe8f3..20dd505d0 100644 --- a/spec/services/fetch_remote_account_service_spec.rb +++ b/spec/services/fetch_remote_account_service_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe FetchRemoteAccountService, type: :service do - let(:url) { 'https://example.com' } + let(:url) { 'https://example.com/alice' } let(:prefetched_body) { nil } let(:protocol) { :ostatus } subject { FetchRemoteAccountService.new.call(url, prefetched_body, protocol) } @@ -46,6 +46,24 @@ RSpec.describe FetchRemoteAccountService, type: :service do end include_examples 'return Account' + + it 'does not update account information if XML comes from an unverified domain' do + feed_xml = <<-XML.squish + + + + http://activitystrea.ms/schema/1.0/person + http://kickass.zone/users/localhost + localhost + localhost + Villain!!! + + + XML + + returned_account = described_class.new.call('https://real-fake-domains.com/alice', feed_xml, :ostatus) + expect(returned_account.display_name).to_not eq 'Villain!!!' + end end context 'when prefetched_body is nil' do diff --git a/spec/services/fetch_remote_status_service_spec.rb b/spec/services/fetch_remote_status_service_spec.rb index 0df9c329a..f9db024b9 100644 --- a/spec/services/fetch_remote_status_service_spec.rb +++ b/spec/services/fetch_remote_status_service_spec.rb @@ -32,4 +32,56 @@ RSpec.describe FetchRemoteStatusService, type: :service do expect(status.text).to eq 'Lorem ipsum' end end + + context 'protocol is :ostatus' do + subject { described_class.new } + + before do + Fabricate(:account, username: 'tracer', domain: 'real.domain', remote_url: 'https://real.domain/users/tracer') + end + + it 'does not create status with author at different domain' do + status_body = <<-XML.squish + + + tag:real.domain,2017-04-27:objectId=4487555:objectType=Status + 2017-04-27T13:49:25Z + 2017-04-27T13:49:25Z + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + https://real.domain/users/tracer + http://activitystrea.ms/schema/1.0/person + https://real.domain/users/tracer + tracer + + Overwatch rocks + + XML + + expect(subject.call('https://fake.domain/foo', status_body, :ostatus)).to be_nil + end + + it 'does not create status with wrong id when id uses http format' do + status_body = <<-XML.squish + + + https://other-real.domain/statuses/123 + 2017-04-27T13:49:25Z + 2017-04-27T13:49:25Z + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + https://real.domain/users/tracer + http://activitystrea.ms/schema/1.0/person + https://real.domain/users/tracer + tracer + + Overwatch rocks + + XML + + expect(subject.call('https://real.domain/statuses/456', status_body, :ostatus)).to be_nil + end + end end From 612d02028c9b33cda250207778ed3cb7fb24e317 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 22 Aug 2018 20:56:43 +0200 Subject: [PATCH 049/274] Bump version to 2.4.4 --- lib/mastodon/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 04894d34d..87099675b 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 3 + 4 end def pre From 589af2a0ab43c87ab88da71e0a24ab4bcea6f1de Mon Sep 17 00:00:00 2001 From: Ceralor Date: Thu, 23 Aug 2018 22:42:40 -0500 Subject: [PATCH 050/274] Added squeak language, default to en --- .../mastodon/locales/locale-data/squeak.js | 115 +++ app/javascript/mastodon/locales/squeak.json | 308 +++++++ .../mastodon/locales/whitelist_squeak.json | 2 + config/application.rb | 3 +- config/locales/activerecord.squeak.yml | 13 + config/locales/devise.squeak.yml | 82 ++ config/locales/doorkeeper.squeak.yml | 142 +++ config/locales/simple_form.squeak.yml | 99 ++ config/locales/squeak.yml | 863 ++++++++++++++++++ 9 files changed, 1626 insertions(+), 1 deletion(-) create mode 100644 app/javascript/mastodon/locales/locale-data/squeak.js create mode 100644 app/javascript/mastodon/locales/squeak.json create mode 100644 app/javascript/mastodon/locales/whitelist_squeak.json create mode 100644 config/locales/activerecord.squeak.yml create mode 100644 config/locales/devise.squeak.yml create mode 100644 config/locales/doorkeeper.squeak.yml create mode 100644 config/locales/simple_form.squeak.yml create mode 100644 config/locales/squeak.yml diff --git a/app/javascript/mastodon/locales/locale-data/squeak.js b/app/javascript/mastodon/locales/locale-data/squeak.js new file mode 100644 index 000000000..6a390908f --- /dev/null +++ b/app/javascript/mastodon/locales/locale-data/squeak.js @@ -0,0 +1,115 @@ +/*eslint eqeqeq: "off"*/ +/*eslint no-nested-ternary: "off"*/ +/*eslint quotes: "off"*/ + +export default [ + { + locale: "squeak", + pluralRuleFunction: function(e, a) { + var n = String(e).split("."), + l = !n[1], + o = Number(n[0]) == e, + t = o && n[0].slice(-1), + r = o && n[0].slice(-2); + return a ? 1 == t && 11 != r ? "one" : 2 == t && 12 != r ? "two" : 3 == t && 13 != r ? "few" : "other" : 1 == e && l ? "one" : "other" + }, + fields: { + year: { + displayName: "year", + relative: { + 0: "this year", + 1: "next year", + "-1": "last year" + }, + relativeTime: { + future: { + one: "in {0} year", + other: "in {0} years" + }, + past: { + one: "{0} year ago", + other: "{0} years ago" + } + } + }, + month: { + displayName: "month", + relative: { + 0: "this month", + 1: "next month", + "-1": "last month" + }, + relativeTime: { + future: { + one: "in {0} month", + other: "in {0} months" + }, + past: { + one: "{0} month ago", + other: "{0} months ago" + } + } + }, + day: { + displayName: "day", + relative: { + 0: "today", + 1: "tomorrow", + "-1": "yesterday" + }, + relativeTime: { + future: { + one: "in {0} day", + other: "in {0} days" + }, + past: { + one: "{0} day ago", + other: "{0} days ago" + } + } + }, + hour: { + displayName: "hour", + relativeTime: { + future: { + one: "in {0} hour", + other: "in {0} hours" + }, + past: { + one: "{0} hour ago", + other: "{0} hours ago" + } + } + }, + minute: { + displayName: "minute", + relativeTime: { + future: { + one: "in {0} minute", + other: "in {0} minutes" + }, + past: { + one: "{0} minute ago", + other: "{0} minutes ago" + } + } + }, + second: { + displayName: "second", + relative: { + 0: "now" + }, + relativeTime: { + future: { + one: "in {0} second", + other: "in {0} seconds" + }, + past: { + one: "{0} second ago", + other: "{0} seconds ago" + } + } + } + } + } +]; diff --git a/app/javascript/mastodon/locales/squeak.json b/app/javascript/mastodon/locales/squeak.json new file mode 100644 index 000000000..e88cb2107 --- /dev/null +++ b/app/javascript/mastodon/locales/squeak.json @@ -0,0 +1,308 @@ +{ + "account.badges.bot": "Bot", + "account.block": "Block @{name}", + "account.block_domain": "Hide everything from {domain}", + "account.blocked": "Blocked", + "account.direct": "Direct message @{name}", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.domain_blocked": "Domain hidden", + "account.edit_profile": "Edit profile", + "account.follow": "Follow", + "account.followers": "Followers", + "account.follows": "Follows", + "account.follows_you": "Follows you", + "account.hide_reblogs": "Hide pumps from @{name}", + "account.media": "Media", + "account.mention": "Mention @{name}", + "account.moved_to": "{name} has moved to:", + "account.mute": "Mute @{name}", + "account.mute_notifications": "Mute notifications from @{name}", + "account.muted": "Muted", + "account.posts": "Toots", + "account.posts_with_replies": "Toots and replies", + "account.report": "Report @{name}", + "account.requested": "Awaiting approval. Click to cancel follow request", + "account.share": "Share @{name}'s profile", + "account.show_reblogs": "Show pumps from @{name}", + "account.unblock": "Unblock @{name}", + "account.unblock_domain": "Unhide {domain}", + "account.unfollow": "Unfollow", + "account.unmute": "Unmute @{name}", + "account.unmute_notifications": "Unmute notifications from @{name}", + "account.view_full_profile": "View full profile", + "alert.unexpected.message": "An unexpected error occurred.", + "alert.unexpected.title": "Oops!", + "boost_modal.combo": "You can press {combo} to skip this next time", + "bundle_column_error.body": "Something went wrong while loading this component.", + "bundle_column_error.retry": "Try again", + "bundle_column_error.title": "Network error", + "bundle_modal_error.close": "Close", + "bundle_modal_error.message": "Something went wrong while loading this component.", + "bundle_modal_error.retry": "Try again", + "column.blocks": "Blocked users", + "column.community": "Local timeline", + "column.direct": "Direct messages", + "column.domain_blocks": "Hidden domains", + "column.favourites": "Squeaks", + "column.follow_requests": "Follow requests", + "column.home": "Home", + "column.lists": "Lists", + "column.mutes": "Muted users", + "column.notifications": "Notifications", + "column.pins": "Pinned toots", + "column.public": "Federated timeline", + "column_back_button.label": "Back", + "column_header.hide_settings": "Hide settings", + "column_header.moveLeft_settings": "Move column to the left", + "column_header.moveRight_settings": "Move column to the right", + "column_header.pin": "Pin", + "column_header.show_settings": "Show settings", + "column_header.unpin": "Unpin", + "column_subheading.settings": "Settings", + "community.column_settings.media_only": "Media Only", + "compose_form.direct_message_warning": "This toot will only be sent to the mentioned users.", + "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", + "compose_form.lock_disclaimer.lock": "locked", + "compose_form.placeholder": "What's on your mind?", + "compose_form.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive.marked": "Media is marked as sensitive", + "compose_form.sensitive.unmarked": "Media is not marked as sensitive", + "compose_form.spoiler.marked": "Text is hidden behind warning", + "compose_form.spoiler.unmarked": "Text is not hidden", + "compose_form.spoiler_placeholder": "Write your warning here", + "confirmation_modal.cancel": "Cancel", + "confirmations.block.confirm": "Block", + "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.delete.confirm": "Delete", + "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.domain_block.confirm": "Hide entire domain", + "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.mute.confirm": "Mute", + "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, pumps and squeaks to it.", + "confirmations.unfollow.confirm": "Unfollow", + "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "embed.instructions": "Embed this status on your website by copying the code below.", + "embed.preview": "Here is what it will look like:", + "emoji_button.activity": "Activity", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flags", + "emoji_button.food": "Food & Drink", + "emoji_button.label": "Insert emoji", + "emoji_button.nature": "Nature", + "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Objects", + "emoji_button.people": "People", + "emoji_button.recent": "Frequently used", + "emoji_button.search": "Search...", + "emoji_button.search_results": "Search results", + "emoji_button.symbols": "Symbols", + "emoji_button.travel": "Travel & Places", + "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home.public_timeline": "the public timeline", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", + "follow_request.authorize": "Authorize", + "follow_request.reject": "Reject", + "getting_started.developers": "Developers", + "getting_started.documentation": "Documentation", + "getting_started.find_friends": "Find friends from Twitter", + "getting_started.heading": "Getting started", + "getting_started.invite": "Invite people", + "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.security": "Security", + "getting_started.terms": "Terms of service", + "home.column_settings.basic": "Basic", + "home.column_settings.show_reblogs": "Show pumps", + "home.column_settings.show_replies": "Show replies", + "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.boost": "to pump", + "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.compose": "to focus the compose textarea", + "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.favourite": "to squeak", + "keyboard_shortcuts.heading": "Keyboard shortcuts", + "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.up": "to move up in the list", + "lightbox.close": "Close", + "lightbox.next": "Next", + "lightbox.previous": "Previous", + "lists.account.add": "Add to list", + "lists.account.remove": "Remove from list", + "lists.delete": "Delete list", + "lists.edit": "Edit list", + "lists.new.create": "Add list", + "lists.new.title_placeholder": "New list title", + "lists.search": "Search among people you follow", + "lists.subheading": "Your lists", + "loading_indicator.label": "Loading...", + "media_gallery.toggle_visible": "Toggle visibility", + "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", + "mute_modal.hide_notifications": "Hide notifications from this user?", + "navigation_bar.blocks": "Blocked users", + "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", + "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.edit_profile": "Edit profile", + "navigation_bar.favourites": "Squeaks", + "navigation_bar.filters": "Muted words", + "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.info": "About this instance", + "navigation_bar.keyboard_shortcuts": "Hotkeys", + "navigation_bar.lists": "Lists", + "navigation_bar.logout": "Logout", + "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", + "navigation_bar.pins": "Pinned toots", + "navigation_bar.preferences": "Preferences", + "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", + "notification.favourite": "{name} squeaked your status", + "notification.follow": "{name} followed you", + "notification.mention": "{name} mentioned you", + "notification.reblog": "{name} pumped your status", + "notifications.clear": "Clear notifications", + "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.favourite": "Squeaks:", + "notifications.column_settings.follow": "New followers:", + "notifications.column_settings.mention": "Mentions:", + "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.push_meta": "This device", + "notifications.column_settings.reblog": "Pumps:", + "notifications.column_settings.show": "Show in column", + "notifications.column_settings.sound": "Play sound", + "notifications.group": "{count} notifications", + "onboarding.done": "Done", + "onboarding.next": "Next", + "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_four.home": "The home timeline shows posts from people you follow.", + "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", + "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.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", + "onboarding.page_one.welcome": "Welcome to Mastodon!", + "onboarding.page_six.admin": "Your instance's admin is {admin}.", + "onboarding.page_six.almost_done": "Almost done...", + "onboarding.page_six.appetoot": "Bon Appetoot!", + "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.", + "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.guidelines": "community guidelines", + "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", + "onboarding.page_six.various_app": "mobile apps", + "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.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_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", + "onboarding.skip": "Skip", + "privacy.change": "Adjust status privacy", + "privacy.direct.long": "Post to mentioned users only", + "privacy.direct.short": "Direct", + "privacy.private.long": "Post to followers only", + "privacy.private.short": "Followers-only", + "privacy.public.long": "Post to public timelines", + "privacy.public.short": "Public", + "privacy.unlisted.long": "Do not post to public timelines", + "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}h", + "relative_time.just_now": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Cancel", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "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.placeholder": "Additional comments", + "report.submit": "Submit", + "report.target": "Reporting {target}", + "search.placeholder": "Search", + "search_popout.search_format": "Advanced search format", + "search_popout.tips.full_text": "Simple text returns statuses you have written, squeaked, pumped, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.status": "status", + "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.user": "user", + "search_results.accounts": "People", + "search_results.hashtags": "Hashtags", + "search_results.statuses": "Toots", + "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "standalone.public_title": "A look inside...", + "status.block": "Block @{name}", + "status.cancel_reblog_private": "Deflate", + "status.cannot_reblog": "This post cannot be pumped", + "status.delete": "Delete", + "status.direct": "Direct message @{name}", + "status.embed": "Embed", + "status.favourite": "Squeak", + "status.filtered": "Filtered", + "status.load_more": "Load more", + "status.media_hidden": "Media hidden", + "status.mention": "Mention @{name}", + "status.more": "More", + "status.mute": "Mute @{name}", + "status.mute_conversation": "Mute conversation", + "status.open": "Expand this status", + "status.pin": "Pin on profile", + "status.pinned": "Pinned toot", + "status.reblog": "Pump", + "status.reblog_private": "Pump to original audience", + "status.reblogged_by": "{name} pumped", + "status.redraft": "Delete & re-draft", + "status.reply": "Reply", + "status.replyAll": "Reply to thread", + "status.report": "Report @{name}", + "status.sensitive_toggle": "Click to view", + "status.sensitive_warning": "Sensitive content", + "status.share": "Share", + "status.show_less": "Show less", + "status.show_less_all": "Show less for all", + "status.show_more": "Show more", + "status.show_more_all": "Show more for all", + "status.unmute_conversation": "Unmute conversation", + "status.unpin": "Unpin from profile", + "tabs_bar.federated_timeline": "Federated", + "tabs_bar.home": "Home", + "tabs_bar.local_timeline": "Local", + "tabs_bar.notifications": "Notifications", + "tabs_bar.search": "Search", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", + "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", + "upload_area.title": "Drag & drop to upload", + "upload_button.label": "Add media", + "upload_form.description": "Describe for the visually impaired", + "upload_form.focus": "Crop", + "upload_form.undo": "Delete", + "upload_progress.label": "Uploading...", + "video.close": "Close video", + "video.exit_fullscreen": "Exit full screen", + "video.expand": "Expand video", + "video.fullscreen": "Full screen", + "video.hide": "Hide video", + "video.mute": "Mute sound", + "video.pause": "Pause", + "video.play": "Play", + "video.unmute": "Unmute sound" +} diff --git a/app/javascript/mastodon/locales/whitelist_squeak.json b/app/javascript/mastodon/locales/whitelist_squeak.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_squeak.json @@ -0,0 +1,2 @@ +[ +] diff --git a/config/application.rb b/config/application.rb index e52403690..2e14cb747 100644 --- a/config/application.rb +++ b/config/application.rb @@ -36,6 +36,7 @@ module Mastodon # All translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] config.i18n.available_locales = [ + :squeak, :dog, :lion, :en, @@ -85,7 +86,7 @@ module Mastodon config.i18n.default_locale = ENV['DEFAULT_LOCALE']&.to_sym unless config.i18n.available_locales.include?(config.i18n.default_locale) - config.i18n.default_locale = :dog + config.i18n.default_locale = :en end # config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb') diff --git a/config/locales/activerecord.squeak.yml b/config/locales/activerecord.squeak.yml new file mode 100644 index 000000000..44820d94f --- /dev/null +++ b/config/locales/activerecord.squeak.yml @@ -0,0 +1,13 @@ +--- +squeak: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: only letters, numbers and underscores + status: + attributes: + reblog: + taken: of status already exists diff --git a/config/locales/devise.squeak.yml b/config/locales/devise.squeak.yml new file mode 100644 index 000000000..db09f1878 --- /dev/null +++ b/config/locales/devise.squeak.yml @@ -0,0 +1,82 @@ +--- +squeak: + devise: + confirmations: + confirmed: Your email address has been successfully confirmed. + send_instructions: You will receive an email with instructions for how to confirm your email address in a few minutes. Please check your spam folder if you didn't receive this email. + send_paranoid_instructions: If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes. Please check your spam folder if you didn't receive this email. + failure: + already_authenticated: You are already signed in. + inactive: Your account is not activated yet. + invalid: Invalid %{authentication_keys} or password. + last_attempt: You have one more attempt before your account is locked. + locked: Your account is locked. + not_found_in_database: Invalid %{authentication_keys} or password. + timeout: Your session expired. Please sign in again to continue. + unauthenticated: You need to sign in or sign up before continuing. + unconfirmed: You have to confirm your email address before continuing. + mailer: + confirmation_instructions: + action: Verify email address + explanation: You have created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email. + extra_html: Please also check out the rules of the instance and our terms of service. + subject: 'Mastodon: Confirmation instructions for %{instance}' + title: Verify email address + email_changed: + explanation: 'The email address for your account is being changed to:' + extra: If you did not change your email, it is likely that someone has gained access to your account. Please change your password immediately or contact the instance admin if you're locked out of your account. + subject: 'Mastodon: Email changed' + title: New email address + password_change: + explanation: The password for your account has been changed. + extra: If you did not change your password, it is likely that someone has gained access to your account. Please change your password immediately or contact the instance admin if you're locked out of your account. + subject: 'Mastodon: Password changed' + title: Password changed + reconfirmation_instructions: + explanation: Confirm the new address to change your email. + extra: If this change wasn't initiated by you, please ignore this email. The email address for the Mastodon account won't change until you access the link above. + subject: 'Mastodon: Confirm email for %{instance}' + title: Verify email address + reset_password_instructions: + action: Change password + explanation: You requested a new password for your account. + extra: If you didn't request this, please ignore this email. Your password won't change until you access the link above and create a new one. + subject: 'Mastodon: Reset password instructions' + title: Password reset + unlock_instructions: + subject: 'Mastodon: Unlock instructions' + omniauth_callbacks: + failure: Could not authenticate you from %{kind} because "%{reason}". + success: Successfully authenticated from %{kind} account. + passwords: + no_token: You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided. + send_instructions: If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes. Please check your spam folder if you didn't receive this email. + send_paranoid_instructions: If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes. Please check your spam folder if you didn't receive this email. + updated: Your password has been changed successfully. You are now signed in. + updated_not_active: Your password has been changed successfully. + registrations: + destroyed: Bye! Your account has been successfully cancelled. We hope to see you again soon. + signed_up: Welcome! You have signed up successfully. + signed_up_but_inactive: You have signed up successfully. However, we could not sign you in because your account is not yet activated. + signed_up_but_locked: You have signed up successfully. However, we could not sign you in because your account is locked. + signed_up_but_unconfirmed: A message with a confirmation link has been sent to your email address. Please follow the link to activate your account. Please check your spam folder if you didn't receive this email. + update_needs_confirmation: You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address. Please check your spam folder if you didn't receive this email. + updated: Your account has been updated successfully. + sessions: + already_signed_out: Signed out successfully. + signed_in: Signed in successfully. + signed_out: Signed out successfully. + unlocks: + send_instructions: You will receive an email with instructions for how to unlock your account in a few minutes. Please check your spam folder if you didn't receive this email. + send_paranoid_instructions: If your account exists, you will receive an email with instructions for how to unlock it in a few minutes. Please check your spam folder if you didn't receive this email. + unlocked: Your account has been unlocked successfully. Please sign in to continue. + errors: + messages: + already_confirmed: was already confirmed, please try signing in + confirmation_period_expired: needs to be confirmed within %{period}, please request a new one + expired: has expired, please request a new one + not_found: not found + not_locked: was not locked + not_saved: + one: '1 error prohibited this %{resource} from being saved:' + other: "%{count} errors prohibited this %{resource} from being saved:" diff --git a/config/locales/doorkeeper.squeak.yml b/config/locales/doorkeeper.squeak.yml new file mode 100644 index 000000000..c3487036a --- /dev/null +++ b/config/locales/doorkeeper.squeak.yml @@ -0,0 +1,142 @@ +--- +squeak: + activerecord: + attributes: + doorkeeper/application: + name: Application name + redirect_uri: Redirect URI + scopes: Scopes + website: Application website + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: cannot contain a fragment. + invalid_uri: must be a valid URI. + relative_uri: must be an absolute URI. + secured_uri: must be an HTTPS/SSL URI. + doorkeeper: + applications: + buttons: + authorize: Authorize + cancel: Cancel + destroy: Destroy + edit: Edit + submit: Submit + confirmations: + destroy: Are you sure? + edit: + title: Edit application + form: + error: Whoops! Check your form for possible errors + help: + native_redirect_uri: Use %{native_redirect_uri} for local tests + redirect_uri: Use one line per URI + scopes: Separate scopes with spaces. Leave blank to use the default scopes. + index: + application: Application + callback_url: Callback URL + delete: Delete + name: Name + new: New application + scopes: Scopes + show: Show + title: Your applications + new: + title: New application + show: + actions: Actions + application_id: Client key + callback_urls: Callback URLs + scopes: Scopes + secret: Client secret + title: 'Application: %{name}' + authorizations: + buttons: + authorize: Authorize + deny: Deny + error: + title: An error has occurred + new: + able_to: It will be able to + prompt: Application %{client_name} requests access to your account + title: Authorization required + show: + title: Copy this authorization code and paste it to the application. + authorized_applications: + buttons: + revoke: Revoke + confirmations: + revoke: Are you sure? + index: + application: Application + created_at: Authorized + date_format: "%Y-%m-%d %H:%M:%S" + scopes: Scopes + title: Your authorized applications + errors: + messages: + access_denied: The resource owner or authorization server denied the request. + credential_flow_not_configured: Resource Owner Password Credentials flow failed due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured. + invalid_client: Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method. + invalid_grant: The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client. + invalid_redirect_uri: The redirect uri included is not valid. + invalid_request: The request is missing a required parameter, includes an unsupported parameter value, or is otherwise malformed. + invalid_resource_owner: The provided resource owner credentials are not valid, or resource owner cannot be found + invalid_scope: The requested scope is invalid, unknown, or malformed. + invalid_token: + expired: The access token expired + revoked: The access token was revoked + unknown: The access token is invalid + resource_owner_authenticator_not_configured: Resource Owner find failed due to Doorkeeper.configure.resource_owner_authenticator being unconfiged. + server_error: The authorization server encountered an unexpected condition which prevented it from fulfilling the request. + temporarily_unavailable: The authorization server is currently unable to handle the request due to a temporary overloading or maintenance of the server. + unauthorized_client: The client is not authorized to perform this request using this method. + unsupported_grant_type: The authorization grant type is not supported by the authorization server. + unsupported_response_type: The authorization server does not support this response type. + flash: + applications: + create: + notice: Application created. + destroy: + notice: Application deleted. + update: + notice: Application updated. + authorized_applications: + destroy: + notice: Application revoked. + layouts: + admin: + nav: + applications: Applications + oauth2_provider: OAuth2 Provider + application: + title: OAuth authorization required + scopes: + follow: modify account relationships + push: receive your push notifications + read: read all your account's data + read:accounts: see accounts information + read:blocks: see your blocks + read:favourites: see your squeaks + read:filters: see your filters + read:follows: see your followed blimps + read:lists: see your lists + read:mutes: see your mutes + read:notifications: see your notifications + read:reports: see your reports + read:search: search on your behalf + read:statuses: see all toots + write: modify all your account's data + write:accounts: modify your profile + write:blocks: block accounts and domains + write:favourites: squeaked toots + write:filters: create filters + write:follows: follow blimps + write:lists: create lists + write:media: upload media files + write:mutes: mute blimps and conversations + write:notifications: clear your notifications + write:reports: report other blimps + write:statuses: publish toots diff --git a/config/locales/simple_form.squeak.yml b/config/locales/simple_form.squeak.yml new file mode 100644 index 000000000..9d905626d --- /dev/null +++ b/config/locales/simple_form.squeak.yml @@ -0,0 +1,99 @@ +--- +squeak: + simple_form: + hints: + defaults: + autofollow: People who sign up through the invite will automatically follow you + avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px + bot: This account mainly performs automated actions and might not be monitored + context: One or multiple contexts where the filter should apply + digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence + display_name: + one: 1 character left + other: %{count} characters left + fields: You can have up to 4 items displayed as a table on your profile + header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px + inbox_url: Copy the URL from the frontpage of the relay you want to use + irreversible: Filtered toots will disappear irreversibly, even if filter is later removed + locale: The language of the user interface, e-mails and push notifications + locked: Requires you to manually approve followers + note: + one: 1 character left + other: %{count} characters left + phrase: Will be matched regardless of casing in text or content warning of a toot + scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. + setting_default_language: The language of your toots can be detected automatically, but it's not always accurate + setting_hide_network: Who you follow and who follows you will not be shown on your profile + setting_noindex: Affects your public profile and status pages + setting_theme: Affects how Mastodon looks when you're logged in from any device. + whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word + imports: + data: CSV file exported from another Mastodon instance + sessions: + otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:' + user: + chosen_languages: When checked, only toots in selected languages will be displayed in public timelines + labels: + account: + fields: + name: Label + value: Content + defaults: + autofollow: Invite to follow your account + avatar: Avatar + bot: This is a bot account + chosen_languages: Filter languages + confirm_new_password: Confirm new password + confirm_password: Confirm password + context: Filter contexts + current_password: Current password + data: Data + display_name: Display name + email: E-mail address + expires_in: Expire after + fields: Profile metadata + header: Header + inbox_url: URL of the relay inbox + irreversible: Drop instead of hide + locale: Interface language + locked: Lock account + max_uses: Max number of uses + new_password: New password + note: Bio + otp_attempt: Two-factor code + password: Password + phrase: Keyword or phrase + setting_auto_play_gif: Auto-play animated GIFs + setting_boost_modal: Show confirmation dialog before boosting + setting_default_language: Posting language + setting_default_privacy: Post privacy + setting_default_sensitive: Always mark media as sensitive + setting_delete_modal: Show confirmation dialog before deleting a toot + setting_display_sensitive_media: Always show media marked as sensitive + setting_hide_network: Hide your network + setting_noindex: Opt-out of search engine indexing + setting_reduce_motion: Reduce motion in animations + setting_system_font_ui: Use system's default font + setting_theme: Site theme + setting_unfollow_modal: Show confirmation dialog before unfollowing someone + severity: Severity + type: Import type + username: Username + username_or_email: Username or Email + whole_word: Whole word + interactions: + must_be_follower: Block notifications from non-followers + must_be_following: Block notifications from people you don't follow + must_be_following_dm: Block direct messages from people you don't follow + notification_emails: + digest: Send digest e-mails + favourite: Send e-mail when someone favourites your status + follow: Send e-mail when someone follows you + follow_request: Send e-mail when someone requests to follow you + mention: Send e-mail when someone mentions you + reblog: Send e-mail when someone boosts your status + 'no': 'No' + required: + mark: "*" + text: required + 'yes': 'Yes' diff --git a/config/locales/squeak.yml b/config/locales/squeak.yml new file mode 100644 index 000000000..d1b2a19bc --- /dev/null +++ b/config/locales/squeak.yml @@ -0,0 +1,863 @@ +--- +en: + about: + about_hashtag_html: These are public toots tagged with #%{hashtag}. You can interact with them if you have an account anywhere in the fediverse. + about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail. + about_this: About + administered_by: 'Administered by:' + closed_registrations: Registrations are currently closed on this instance. However! You can find a different instance to make an account on and get access to the very same network from there. + contact: Contact + contact_missing: Not set + contact_unavailable: N/A + description_headline: What is %{domain}? + domain_count_after: other instances + domain_count_before: Connected to + extended_description_html: | +

    A good place for rules

    +

    The extended description has not been set up yet.

    + features: + humane_approach_body: Learning from failures of other networks, Mastodon aims to make ethical design choices to combat the misuse of social media. + humane_approach_title: A more humane approach + not_a_product_body: Mastodon is not a commercial network. No advertising, no data mining, no walled gardens. There is no central authority. + not_a_product_title: You’re a person, not a product + real_conversation_body: With 500 characters at your disposal and support for granular content and media warnings, you can express yourself the way you want to. + real_conversation_title: Built for real conversation + within_reach_body: Multiple apps for iOS, Android, and other platforms thanks to a developer-friendly API ecosystem allow you to keep up with your friends anywhere. + within_reach_title: Always within reach + generic_description: "%{domain} is one server in the network" + hosted_on: Mastodon hosted on %{domain} + learn_more: Learn more + other_instances: Instance list + source_code: Source code + status_count_after: statuses + status_count_before: Who authored + user_count_after: users + user_count_before: Home to + what_is_mastodon: What is Mastodon? + accounts: + follow: Follow + followers: Followers + following: Following + media: Media + moved_html: "%{name} has moved to %{new_profile_link}:" + network_hidden: This information is not available + nothing_here: There is nothing here! + people_followed_by: People whom %{name} follows + people_who_follow: People who follow %{name} + posts: Toots + posts_with_replies: Toots and replies + remote_follow: Remote follow + reserved_username: The username is reserved + roles: + admin: Admin + bot: Bot + moderator: Mod + unfollow: Unfollow + admin: + account_moderation_notes: + create: Leave note + created_msg: Moderation note successfully created! + delete: Delete + destroyed_msg: Moderation note successfully destroyed! + accounts: + are_you_sure: Are you sure? + avatar: Avatar + by_domain: Domain + change_email: + changed_msg: Account email successfully changed! + current_email: Current Email + label: Change Email + new_email: New Email + submit: Change Email + title: Change Email for %{username} + confirm: Confirm + confirmed: Confirmed + confirming: Confirming + demote: Demote + disable: Disable + disable_two_factor_authentication: Disable 2FA + disabled: Disabled + display_name: Display name + domain: Domain + edit: Edit + email: E-mail + email_status: E-mail Status + enable: Enable + enabled: Enabled + feed_url: Feed URL + followers: Followers + followers_url: Followers URL + follows: Follows + inbox_url: Inbox URL + ip: IP + location: + all: All + local: Local + remote: Remote + title: Location + login_status: Login status + media_attachments: Media attachments + memorialize: Turn into memoriam + moderation: + all: All + silenced: Silenced + suspended: Suspended + title: Moderation + moderation_notes: Moderation notes + most_recent_activity: Most recent activity + most_recent_ip: Most recent IP + not_subscribed: Not subscribed + order: + alphabetic: Alphabetic + most_recent: Most recent + title: Order + outbox_url: Outbox URL + perform_full_suspension: Perform full suspension + profile_url: Profile URL + promote: Promote + protocol: Protocol + public: Public + push_subscription_expires: PuSH subscription expires + redownload: Refresh avatar + remove_avatar: Remove avatar + resend_confirmation: + already_confirmed: This user is already confirmed + send: Resend confirmation email + success: Confirmation email successfully sent! + reset: Reset + reset_password: Reset password + resubscribe: Resubscribe + role: Permissions + roles: + admin: Administrator + moderator: Moderator + staff: Staff + user: User + salmon_url: Salmon URL + search: Search + shared_inbox_url: Shared Inbox URL + show: + created_reports: Reports created by this account + report: report + targeted_reports: Reports made about this account + silence: Silence + statuses: Statuses + subscribe: Subscribe + title: Accounts + unconfirmed_email: Unconfirmed E-mail + undo_silenced: Undo silence + undo_suspension: Undo suspension + unsubscribe: Unsubscribe + username: Username + web: Web + action_logs: + actions: + assigned_to_self_report: "%{name} assigned report %{target} to themselves" + change_email_user: "%{name} changed the e-mail address of user %{target}" + confirm_user: "%{name} confirmed e-mail address of user %{target}" + create_custom_emoji: "%{name} uploaded new emoji %{target}" + create_domain_block: "%{name} blocked domain %{target}" + create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" + demote_user: "%{name} demoted user %{target}" + destroy_domain_block: "%{name} unblocked domain %{target}" + destroy_email_domain_block: "%{name} whitelisted e-mail domain %{target}" + destroy_status: "%{name} removed status by %{target}" + disable_2fa_user: "%{name} disabled two factor requirement for user %{target}" + disable_custom_emoji: "%{name} disabled emoji %{target}" + disable_user: "%{name} disabled login for user %{target}" + enable_custom_emoji: "%{name} enabled emoji %{target}" + enable_user: "%{name} enabled login for user %{target}" + memorialize_account: "%{name} turned %{target}'s account into a memoriam page" + promote_user: "%{name} promoted user %{target}" + remove_avatar_user: "%{name} removed %{target}'s avatar" + reopen_report: "%{name} reopened report %{target}" + reset_password_user: "%{name} reset password of user %{target}" + resolve_report: "%{name} resolved report %{target}" + silence_account: "%{name} silenced %{target}'s account" + suspend_account: "%{name} suspended %{target}'s account" + unassigned_report: "%{name} unassigned report %{target}" + unsilence_account: "%{name} unsilenced %{target}'s account" + unsuspend_account: "%{name} unsuspended %{target}'s account" + update_custom_emoji: "%{name} updated emoji %{target}" + update_status: "%{name} updated status by %{target}" + title: Audit log + custom_emojis: + by_domain: Domain + copied_msg: Successfully created local copy of the emoji + copy: Copy + copy_failed_msg: Could not make a local copy of that emoji + created_msg: Emoji successfully created! + delete: Delete + destroyed_msg: Emojo successfully destroyed! + disable: Disable + disabled_msg: Successfully disabled that emoji + emoji: Emoji + enable: Enable + enabled_msg: Successfully enabled that emoji + image_hint: PNG up to 50KB + listed: Listed + new: + title: Add new custom emoji + overwrite: Overwrite + shortcode: Shortcode + shortcode_hint: At least 2 characters, only alphanumeric characters and underscores + title: Custom emojis + unlisted: Unlisted + update_failed_msg: Could not update that emoji + updated_msg: Emoji successfully updated! + upload: Upload + domain_blocks: + add_new: Add new + created_msg: Domain block is now being processed + destroyed_msg: Domain block has been undone + domain: Domain + new: + create: Create block + hint: The domain block will not prevent creation of account entries in the database, but will retroactively and automatically apply specific moderation methods on those accounts. + severity: + desc_html: "Silence will make the account's posts invisible to anyone who isn't following them. Suspend will remove all of the account's content, media, and profile data. Use None if you just want to reject media files." + noop: None + silence: Silence + suspend: Suspend + title: New domain block + reject_media: Reject media files + reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions + severities: + noop: None + silence: Silence + suspend: Suspend + severity: Severity + show: + affected_accounts: + one: One account in the database affected + other: "%{count} accounts in the database affected" + retroactive: + silence: Unsilence all existing accounts from this domain + suspend: Unsuspend all existing accounts from this domain + title: Undo domain block for %{domain} + undo: Undo + title: Domain blocks + undo: Undo + email_domain_blocks: + add_new: Add new + created_msg: Successfully added e-mail domain to blacklist + delete: Delete + destroyed_msg: Successfully deleted e-mail domain from blacklist + domain: Domain + new: + create: Add domain + title: New e-mail blacklist entry + title: E-mail blacklist + instances: + account_count: Known accounts + domain_name: Domain + reset: Reset + search: Search + title: Known instances + invites: + filter: + all: All + available: Available + expired: Expired + title: Filter + title: Invites + relays: + add_new: Add new relay + description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. + enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. + inbox_url: Relay URL + setup: Setup a relay connection + status: Status + title: Relays + report_notes: + created_msg: Report note successfully created! + destroyed_msg: Report note successfully deleted! + reports: + account: + note: note + report: report + action_taken_by: Action taken by + are_you_sure: Are you sure? + assign_to_self: Assign to me + assigned: Assigned moderator + comment: + none: None + created_at: Reported + id: ID + mark_as_resolved: Mark as resolved + mark_as_unresolved: Mark as unresolved + notes: + create: Add note + create_and_resolve: Resolve with note + create_and_unresolve: Reopen with note + delete: Delete + placeholder: Describe what actions have been taken, or any other related updates... + reopen: Reopen report + report: 'Report #%{id}' + report_contents: Contents + reported_account: Reported account + reported_by: Reported by + resolved: Resolved + resolved_msg: Report successfully resolved! + silence_account: Silence account + status: Status + suspend_account: Suspend account + target: Target + title: Reports + unassign: Unassign + unresolved: Unresolved + updated_at: Updated + view: View + settings: + activity_api_enabled: + desc_html: Counts of locally posted statuses, active users, and new registrations in weekly buckets + title: Publish aggregate statistics about user activity + bootstrap_timeline_accounts: + desc_html: Separate multiple usernames by comma. Only local and unlocked accounts will work. Default when empty is all local admins. + title: Default follows for new users + contact_information: + email: Business e-mail + username: Contact username + hero: + desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to instance thumbnail + title: Hero image + peers_api_enabled: + desc_html: Domain names this instance has encountered in the fediverse + title: Publish list of discovered instances + preview_sensitive_media: + desc_html: Link previews on other websites will display a thumbnail even if the media is marked as sensitive + title: Show sensitive media in OpenGraph previews + registrations: + closed_message: + desc_html: Displayed on frontpage when registrations are closed. You can use HTML tags + title: Closed registration message + deletion: + desc_html: Allow anyone to delete their account + title: Open account deletion + min_invite_role: + disabled: No one + title: Allow invitations by + open: + desc_html: Allow anyone to create an account + title: Open registration + show_known_fediverse_at_about_page: + desc_html: When toggled, it will show toots from all the known fediverse on preview. Otherwise it will only show local toots. + title: Show known fediverse on timeline preview + show_staff_badge: + desc_html: Show a staff badge on a user page + title: Show staff badge + site_description: + desc_html: Introductory paragraph on the frontpage and in meta tags. You can use HTML tags, in particular <a> and <em>. + title: Instance description + site_description_extended: + desc_html: A good place for your code of conduct, rules, guidelines and other things that set your instance apart. You can use HTML tags + title: Custom extended information + site_terms: + desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags + title: Custom terms of service + site_title: Instance name + thumbnail: + desc_html: Used for previews via OpenGraph and API. 1200x630px recommended + title: Instance thumbnail + timeline_preview: + desc_html: Display public timeline on landing page + title: Timeline preview + title: Site settings + statuses: + back_to_account: Back to account page + batch: + delete: Delete + nsfw_off: Mark as not sensitive + nsfw_on: Mark as sensitive + failed_to_execute: Failed to execute + media: + title: Media + no_media: No media + title: Account statuses + with_media: With media + subscriptions: + callback_url: Callback URL + confirmed: Confirmed + expires_in: Expires in + last_delivery: Last delivery + title: WebSub + topic: Topic + title: Administration + admin_mailer: + new_report: + body: "%{reporter} has reported %{target}" + body_remote: Someone from %{domain} has reported %{target} + subject: New report for %{instance} (#%{id}) + application_mailer: + notification_preferences: Change e-mail preferences + salutation: "%{name}," + settings: 'Change e-mail preferences: %{link}' + view: 'View:' + view_profile: View Profile + view_status: View status + applications: + created: Application successfully created + destroyed: Application successfully deleted + invalid_url: The provided URL is invalid + regenerate_token: Regenerate access token + token_regenerated: Access token successfully regenerated + warning: Be very careful with this data. Never share it with anyone! + your_token: Your access token + auth: + agreement_html: By signing up you agree to follow the rules of the instance and our terms of service. + change_password: Password + confirm_email: Confirm email + delete_account: Delete account + delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. + didnt_get_confirmation: Didn't receive confirmation instructions? + forgot_password: Forgot your password? + invalid_reset_password_token: Password reset token is invalid or expired. Please request a new one. + login: Log in + logout: Logout + migrate_account: Move to a different account + migrate_account_html: If you wish to redirect this account to a different one, you can configure it here. + or: or + or_log_in_with: Or log in with + providers: + cas: CAS + saml: SAML + register: Sign up + register_elsewhere: Sign up on another server + resend_confirmation: Resend confirmation instructions + reset_password: Reset password + security: Security + set_new_password: Set new password + authorize_follow: + already_following: You are already following this account + error: Unfortunately, there was an error looking up the remote account + follow: Follow + follow_request: 'You have sent a follow request to:' + following: 'Success! You are now following:' + post_follow: + close: Or, you can just close this window. + return: Show the user's profile + web: Go to web + title: Follow %{acct} + datetime: + distance_in_words: + about_x_hours: "%{count}h" + about_x_months: "%{count}mo" + about_x_years: "%{count}y" + almost_x_years: "%{count}y" + half_a_minute: Just now + less_than_x_minutes: "%{count}m" + less_than_x_seconds: Just now + over_x_years: "%{count}y" + x_days: "%{count}d" + x_minutes: "%{count}m" + x_months: "%{count}mo" + x_seconds: "%{count}s" + deletes: + bad_password_msg: Nice try, hackers! Incorrect password + confirm_password: Enter your current password to verify your identity + description_html: This will permanently, irreversibly remove content from your account and deactivate it. Your username will remain reserved to prevent future impersonations. + proceed: Delete account + success_msg: Your account was successfully deleted + warning_html: Only deletion of content from this particular instance is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases. + warning_title: Disseminated content availability + errors: + '403': You don't have permission to view this page. + '404': The page you were looking for doesn't exist. + '410': The page you were looking for doesn't exist anymore. + '422': + content: Security verification failed. Are you blocking cookies? + title: Security verification failed + '429': Throttled + '500': + content: We're sorry, but something went wrong on our end. + title: This page is not correct + noscript_html: To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform. + exports: + archive_takeout: + date: Date + download: Download your archive + hint_html: You can request an archive of your toots and uploaded media. The exported data will be in ActivityPub format, readable by any compliant software. You can request an archive every 7 days. + in_progress: Compiling your archive... + request: Request your archive + size: Size + blocks: You block + csv: CSV + follows: You follow + mutes: You mute + storage: Media storage + filters: + contexts: + home: Home timeline + notifications: Notifications + public: Public timelines + thread: Conversations + edit: + title: Edit filter + errors: + invalid_context: None or invalid context supplied + invalid_irreversible: Irreversible filtering only works with home or notifications context + index: + delete: Delete + title: Filters + new: + title: Add new filter + followers: + domain: Domain + explanation_html: If you want to ensure the privacy of your statuses, you must be aware of who is following you. Your private statuses are delivered to all instances where you have followers. You may wish to review them, and remove followers if you do not trust your privacy to be respected by the staff or software of those instances. + followers_count: Number of followers + lock_link: Lock your account + purge: Remove from followers + success: + one: In the process of soft-blocking followers from one domain... + other: In the process of soft-blocking followers from %{count} domains... + true_privacy_html: Please mind that true privacy can only be achieved with end-to-end encryption. + unlocked_warning_html: Anyone can follow you to immediately view your private statuses. %{lock_link} to be able to review and reject followers. + unlocked_warning_title: Your account is not locked + generic: + changes_saved_msg: Changes successfully saved! + powered_by: powered by %{link} + save_changes: Save changes + validation_errors: + one: Something isn't quite right yet! Please review the error below + other: Something isn't quite right yet! Please review %{count} errors below + imports: + preface: You can import data that you have exported from another instance, such as a list of the people you are following or blocking. + success: Your data was successfully uploaded and will now be processed in due time + types: + blocking: Blocking list + following: Following list + muting: Muting list + upload: Upload + in_memoriam_html: In Memoriam. + invites: + delete: Deactivate + expired: Expired + expires_in: + '1800': 30 minutes + '21600': 6 hours + '3600': 1 hour + '43200': 12 hours + '604800': 1 week + '86400': 1 day + expires_in_prompt: Never + generate: Generate + invited_by: 'You were invited by:' + max_uses: + one: 1 use + other: "%{count} uses" + max_uses_prompt: No limit + prompt: Generate and share links with others to grant access to this instance + table: + expires_at: Expires + uses: Uses + title: Invite people + landing_strip_html: "%{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." + landing_strip_signup_html: If you don't, you can sign up here. + lists: + errors: + limit: You have reached the maximum amount of lists + media_attachments: + validations: + images_and_video: Cannot attach a video to a status that already contains images + too_many: Cannot attach more than 4 files + migrations: + acct: username@domain of the new account + currently_redirecting: 'Your profile is set to redirect to:' + proceed: Save + updated_msg: Your account migration setting successfully updated! + moderation: + title: Moderation + notification_mailer: + digest: + action: View all notifications + body: Here is a brief summary of the messages you missed since your last visit on %{since} + mention: "%{name} mentioned you in:" + new_followers_summary: + one: Also, you have acquired one new follower while being away! Yay! + other: Also, you have acquired %{count} new followers while being away! Amazing! + subject: + one: "1 new notification since your last visit \U0001F418" + other: "%{count} new notifications since your last visit \U0001F418" + title: In your absence... + favourite: + body: 'Your status was squeaked by %{name}:' + subject: "%{name} squeaked your status" + title: New squeak + follow: + body: "%{name} is now following you!" + subject: "%{name} is now following you" + title: New follower + follow_request: + action: Manage follow requests + body: "%{name} has requested to follow you" + subject: 'Pending follower: %{name}' + title: New follow request + mention: + action: Reply + body: 'You were mentioned by %{name} in:' + subject: You were mentioned by %{name} + title: New mention + reblog: + body: 'Your status was pumped by %{name}:' + subject: "%{name} pumped your status" + title: New pump + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: Q + thousand: K + trillion: T + unit: '' + pagination: + newer: Newer + next: Next + older: Older + prev: Prev + truncate: "…" + preferences: + languages: Languages + other: Other + publishing: Publishing + web: Web + remote_follow: + acct: Enter your username@domain you want to follow from + missing_resource: Could not find the required redirect URL for your account + no_account_html: Don't have an account? You can sign up here + proceed: Proceed to follow + prompt: 'You are going to follow:' + remote_unfollow: + error: Error + title: Title + unfollowed: Unfollowed + sessions: + activity: Last activity + browser: Browser + browsers: + alipay: Alipay + blackberry: Blackberry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox + generic: Unknown browser + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Nokia S40 Ovi Browser + opera: Opera + otter: Otter + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UCBrowser + weibo: Weibo + current_session: Current session + description: "%{browser} on %{platform}" + explanation: These are the web browsers currently logged in to your Mastodon account. + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: Linux + mac: Mac + other: unknown platform + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone + revoke: Revoke + revoke_success: Session successfully revoked + title: Sessions + settings: + authorized_apps: Authorized apps + back: Back to Mastodon + delete: Account deletion + development: Development + edit_profile: Edit profile + export: Data export + followers: Authorized followers + import: Import + migrate: Account migration + notifications: Notifications + preferences: Preferences + settings: Settings + two_factor_authentication: Two-factor Auth + your_apps: Your applications + statuses: + attached: + description: 'Attached: %{attached}' + image: + one: "%{count} image" + other: "%{count} images" + video: + one: "%{count} video" + other: "%{count} videos" + boosted_from_html: Boosted from %{acct_link} + content_warning: 'Content warning: %{warning}' + disallowed_hashtags: + one: 'contained a disallowed hashtag: %{tags}' + other: 'contained the disallowed hashtags: %{tags}' + language_detection: Automatically detect language + open_in_web: Open in web + over_character_limit: character limit of %{max} exceeded + pin_errors: + limit: You have already pinned the maximum number of toots + ownership: Someone else's toot cannot be pinned + private: Non-public toot cannot be pinned + reblog: A boost cannot be pinned + show_more: Show more + title: '%{name}: "%{quote}"' + visibilities: + private: Followers-only + private_long: Only show to followers + public: Public + public_long: Everyone can see + unlisted: Unlisted + unlisted_long: Everyone can see, but not listed on public timelines + stream_entries: + click_to_show: Click to show + pinned: Pinned toot + reblogged: boosted + sensitive_content: Sensitive content + terms: + body_html: | +

    Privacy Policy

    +

    What information do we collect?

    + +
      +
    • Basic account information: If you register on this server, you may be asked to enter a username, an e-mail address and a password. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly.
    • +
    • Posts, following and other public information: The list of people you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.
    • +
    • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and users who are mentioned in them, and direct posts are delivered only to users mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
    • +
    • IPs and other metadata: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.
    • +
    + +
    + +

    What do we use your information for?

    + +

    Any of the information we collect from you may be used in the following ways:

    + +
      +
    • To provide the core functionality of Mastodon. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.
    • +
    • To aid moderation of the community, for example comparing your IP address with other known ones to determine ban evasion or other violations.
    • +
    • The email address you provide may be used to send you information, notifications about other people interacting with your content or sending you messages, and to respond to inquiries, and/or other requests or questions.
    • +
    + +
    + +

    How do we protect your information?

    + +

    We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL, and your password is hashed using a strong one-way algorithm. You may enable two-factor authentication to further secure access to your account.

    + +
    + +

    What is our data retention policy?

    + +

    We will make a good faith effort to:

    + +
      +
    • Retain server logs containing the IP address of all requests to this server, in so far as such logs are kept, no more than 90 days.
    • +
    • Retain the IP addresses associated with registered users no more than 12 months.
    • +
    + +

    You can request and download an archive of your content, including your posts, media attachments, profile picture, and header image.

    + +

    You may irreversibly delete your account at any time.

    + +
    + +

    Do we use cookies?

    + +

    Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.

    + +

    We use cookies to understand and save your preferences for future visits.

    + +
    + +

    Do we disclose any information to outside parties?

    + +

    We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety.

    + +

    Your public content may be downloaded by other servers in the network. Your public and followers-only posts are delivered to the servers where your followers reside, and direct messages are delivered to the servers of the recipients, in so far as those followers or recipients reside on a different server than this.

    + +

    When you authorize an application to use your account, depending on the scope of permissions you approve, it may access your public profile information, your following list, your followers, your lists, all your posts, and your squeaks. Applications can never access your e-mail address or password.

    + +
    + +

    Site usage by children

    + +

    If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site.

    + +

    If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

    + +

    Law requirements can be different if this server is in another jurisdiction.

    + +
    + +

    Changes to our Privacy Policy

    + +

    If we decide to change our privacy policy, we will post those changes on this page.

    + +

    This document is CC-BY-SA. It was last updated March 7, 2018.

    + +

    Originally adapted from the Discourse privacy policy.

    + title: "%{instance} Terms of Service and Privacy Policy" + themes: + contrast: High contrast + default: Dog + mastodon: The default Mastodon theme + mastodon-light: Mastodon (light) + time: + formats: + default: "%b %d, %Y, %H:%M" + two_factor_authentication: + code_hint: Enter the code generated by your authenticator app to confirm + description_html: If you enable two-factor authentication, logging in will require you to be in possession of your phone, which will generate tokens for you to enter. + disable: Disable + enable: Enable + enabled: Two-factor authentication is enabled + enabled_success: Two-factor authentication successfully enabled + generate_recovery_codes: Generate recovery codes + instructions_html: "Scan this QR code into Google Authenticator or a similiar TOTP app on your phone. From now on, that app will generate tokens that you will have to enter when logging in." + lost_recovery_codes: Recovery codes allow you to regain access to your account if you lose your phone. If you've lost your recovery codes, you can regenerate them here. Your old recovery codes will be invalidated. + manual_instructions: 'If you can''t scan the QR code and need to enter it manually, here is the plain-text secret:' + recovery_codes: Backup recovery codes + recovery_codes_regenerated: Recovery codes successfully regenerated + recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. Keep the recovery codes safe. For example, you may print them and store them with other important documents. + setup: Set up + wrong_code: The entered code was invalid! Are server time and device time correct? + user_mailer: + backup_ready: + explanation: You requested a full backup of your Mastodon account. It's now ready for download! + subject: Your archive is ready for download + title: Archive takeout + welcome: + edit_profile_action: Setup profile + edit_profile_step: You can customize your profile by uploading an avatar, header, changing your display name and more. If you’d like to review new followers before they’re allowed to follow you, you can lock your account. + explanation: Here are some tips to get you started + final_action: Start posting + final_step: 'Start posting! Even without followers your public messages may be seen by others, for example on the local timeline and in hashtags. You may want to introduce yourself on the #introductions hashtag.' + full_handle: Your full handle + full_handle_hint: This is what you would tell your friends so they can message or follow you from another instance. + review_preferences_action: Change preferences + review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay. + subject: Welcome to Mastodon + tip_bridge_html: If you are coming from Twitter, you can find your friends on Mastodon by using the bridge app. It only works if they also used the bridge app though! + tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes people your neighbours are subscribed to, so it's not complete. + tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines. + tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours! + tip_mobile_webapp: If your mobile browser offers you to add Mastodon to your homescreen, you can receive push notifications. It acts like a native app in many ways! + tips: Tips + title: Welcome aboard, %{name}! + users: + invalid_email: The e-mail address is invalid + invalid_otp_token: Invalid two-factor code + otp_lost_help_html: If you lost access to both, you may get in touch with %{email} + seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available. + signed_in_as: 'Signed in as:' From 6d5d064461f79c51d9cc2fc6b4a90f50b78d6cee Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 23 Aug 2018 23:21:39 -0500 Subject: [PATCH 051/274] Add option in UI for Squeak, use :en as fallback --- app/helpers/settings_helper.rb | 1 + config/i18n-tasks.yml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index f58d94f47..2ddc21cba 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -2,6 +2,7 @@ module SettingsHelper HUMAN_LOCALES = { + squeak: 'Squeak', dog: 'Dog', lion: 'Lion', en: 'English', diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index e4fa74893..eec8b6dbe 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -1,7 +1,7 @@ # i18n-tasks finds and manages missing and unused translations: https://github.com/glebm/i18n-tasks # The "main" locale. -base_locale: dog +base_locale: en data: read: - config/locales/%{locale}.yml From 0fd274e507654f2222eecc65216b345ce6431093 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 23 Aug 2018 23:41:54 -0500 Subject: [PATCH 052/274] Don't call squeak 'en' --- config/locales/squeak.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/squeak.yml b/config/locales/squeak.yml index d1b2a19bc..524e36b66 100644 --- a/config/locales/squeak.yml +++ b/config/locales/squeak.yml @@ -1,5 +1,5 @@ --- -en: +squeak: about: about_hashtag_html: These are public toots tagged with #%{hashtag}. You can interact with them if you have an account anywhere in the fediverse. about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail. From 39992f55c1b82e2bed027e952e4e8354f2d30b1f Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 24 Jul 2018 18:09:12 -0500 Subject: [PATCH 053/274] Add telegram link --- app/lib/formatter.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index b1623d5bf..3d029c75d 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -235,6 +235,8 @@ class Formatter return link_to_github(username) when 'gitlab.com' return link_to_gitlab(username) + when 'telegram.org' + return link_to_telegram(username) else return link_to_account(acct) unless linkable_accounts end @@ -299,6 +301,10 @@ class Formatter "@#{username}@gitlab.com" end + def link_to_telegram(username) + "@#{username}@telegram.org" + end + def link_to_account(acct) username, domain = acct.split('@') From d04b032340e739177c1966a67b785c5e87e91466 Mon Sep 17 00:00:00 2001 From: Ceralor Date: Fri, 24 Aug 2018 00:08:29 -0500 Subject: [PATCH 054/274] Added bitbucket, picarto, twitch, and reddit formats --- app/lib/formatter.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 3d029c75d..5feb03310 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -235,8 +235,16 @@ class Formatter return link_to_github(username) when 'gitlab.com' return link_to_gitlab(username) + when 'bitbucket.org' + return link_to_bitbucket(username) when 'telegram.org' return link_to_telegram(username) + when 'picarto.tv' + return link_to_picarto(username) + when 'twitch.tv' + return link_to_twitch(username) + when 'reddit.com' + return link_to_reddit(username) else return link_to_account(acct) unless linkable_accounts end @@ -301,10 +309,26 @@ class Formatter "@#{username}@gitlab.com" end + def link_to_bitbucket(username) + "@#{username}@bitbucket.org" + end + def link_to_telegram(username) "@#{username}@telegram.org" end + def link_to_picarto(username) + "@#{username}@picarto.tv" + end + + def link_to_twitch(username) + "@#{username}@twitch.tv" + end + + def link_to_reddit(username) + "@#{username}@reddit.com" + end + def link_to_account(acct) username, domain = acct.split('@') From 86792bd309f3b49c924b6a9fc08313886a916dc6 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 24 Aug 2018 18:17:11 +0200 Subject: [PATCH 055/274] Upgrade Doorkeeper to 5.0.0 (#8409) See doorkeeper-gem/doorkeeper#1137 --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index c9e74455a..15f2af41c 100644 --- a/Gemfile +++ b/Gemfile @@ -41,7 +41,7 @@ gem 'omniauth-cas', '~> 1.1' gem 'omniauth-saml', '~> 1.10' gem 'omniauth', '~> 1.2' -gem 'doorkeeper', '~> 4.4' +gem 'doorkeeper', '~> 5.0' gem 'fast_blank', '~> 1.0' gem 'fastimage' gem 'goldfinger', '~> 2.1' diff --git a/Gemfile.lock b/Gemfile.lock index 2da3fe324..945c0776e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -181,7 +181,7 @@ GEM docile (1.3.0) domain_name (0.5.20180417) unf (>= 0.0.5, < 1.0.0) - doorkeeper (4.4.2) + doorkeeper (5.0.0) railties (>= 4.2) dotenv (2.2.2) dotenv-rails (2.2.2) @@ -670,7 +670,7 @@ DEPENDENCIES devise (~> 4.4) devise-two-factor (~> 3.0) devise_pam_authenticatable2 (~> 9.1) - doorkeeper (~> 4.4) + doorkeeper (~> 5.0) dotenv-rails (~> 2.2, < 2.3) fabrication (~> 2.20) faker (~> 1.8) From 3f4812c5832ebc98a79746120bfef0d2b15286af Mon Sep 17 00:00:00 2001 From: Akihiko Odaki Date: Sun, 15 Jul 2018 21:56:00 +0900 Subject: [PATCH 056/274] Fix index detection a migration to revert index change (#8026) --- ...hange_on_statuses_for_api_v1_accounts_account_id_statuses.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb b/db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb index 4a8761fec..ccd2ec7ea 100644 --- a/db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb +++ b/db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb @@ -5,7 +5,7 @@ class RevertIndexChangeOnStatusesForApiV1AccountsAccountIdStatuses < ActiveRecor def change safety_assured do - add_index :statuses, [:account_id, :id, :visibility, :updated_at], order: { id: :desc }, algorithm: :concurrently, name: :index_statuses_20180106 unless index_exists?(:statuses, name: "index_statuses_20180106") + add_index :statuses, [:account_id, :id, :visibility, :updated_at], order: { id: :desc }, algorithm: :concurrently, name: :index_statuses_20180106 unless index_name_exists?(:statuses, "index_statuses_20180106") end # These index may not exists (see migration 20180514130000) From f6ad5edbaa178a120d281840f6650f8213bcd8bf Mon Sep 17 00:00:00 2001 From: ThibG Date: Sat, 11 Aug 2018 18:00:41 +0200 Subject: [PATCH 057/274] Make some migration script more robust (fixes #8007) (#8170) Include a dummy Account class in the migration script containing only the attributes relevant to the migration in order to not rely as much on the codebase being in sync with the database schema. --- db/migrate/20180528141303_fix_accounts_unique_index.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/db/migrate/20180528141303_fix_accounts_unique_index.rb b/db/migrate/20180528141303_fix_accounts_unique_index.rb index 96cee37f9..624ea229e 100644 --- a/db/migrate/20180528141303_fix_accounts_unique_index.rb +++ b/db/migrate/20180528141303_fix_accounts_unique_index.rb @@ -1,4 +1,13 @@ class FixAccountsUniqueIndex < ActiveRecord::Migration[5.2] + class Account < ApplicationRecord + # Dummy class, to make migration possible across version changes + has_one :user, inverse_of: :account + + def local? + domain.nil? + end + end + disable_ddl_transaction! def up From a16d41e9fbacac1c0e1a5557c1a0a140530e2713 Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 15 Aug 2018 20:23:12 +0200 Subject: [PATCH 058/274] Fix FixAccountsUniqueIndex migration (#8212) --- db/migrate/20180528141303_fix_accounts_unique_index.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/db/migrate/20180528141303_fix_accounts_unique_index.rb b/db/migrate/20180528141303_fix_accounts_unique_index.rb index 624ea229e..bd4e158b7 100644 --- a/db/migrate/20180528141303_fix_accounts_unique_index.rb +++ b/db/migrate/20180528141303_fix_accounts_unique_index.rb @@ -6,6 +6,10 @@ class FixAccountsUniqueIndex < ActiveRecord::Migration[5.2] def local? domain.nil? end + + def acct + local? ? username : "#{username}@#{domain}" + end end disable_ddl_transaction! From 221c8c771f0a275e4924f038b71c52dd4bf93b5f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 28 Jul 2018 23:14:55 +0200 Subject: [PATCH 059/274] Prevent ActivityPub movedTo recursion (#8092) Fix #8051 --- app/services/activitypub/fetch_remote_account_service.rb | 4 ++-- app/services/activitypub/process_account_service.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/services/activitypub/fetch_remote_account_service.rb b/app/services/activitypub/fetch_remote_account_service.rb index 6fa4e9a1b..1ec9ee5dd 100644 --- a/app/services/activitypub/fetch_remote_account_service.rb +++ b/app/services/activitypub/fetch_remote_account_service.rb @@ -7,14 +7,14 @@ class ActivityPub::FetchRemoteAccountService < BaseService # Should be called when uri has already been checked for locality # Does a WebFinger roundtrip on each call - def call(uri, id: true, prefetched_body: nil) + def call(uri, id: true, prefetched_body: nil, break_on_redirect: false) @json = if prefetched_body.nil? fetch_resource(uri, id) else body_to_json(prefetched_body, compare_id: id ? uri : nil) end - return unless supported_context? && expected_type? + return if !supported_context? || !expected_type? || (break_on_redirect && @json['movedTo'].present?) @uri = @json['id'] @username = @json['preferredUsername'] diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index 453253db4..7f95678b0 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -175,7 +175,7 @@ class ActivityPub::ProcessAccountService < BaseService def moved_account account = ActivityPub::TagManager.instance.uri_to_resource(@json['movedTo'], Account) - account ||= ActivityPub::FetchRemoteAccountService.new.call(@json['movedTo'], id: true) + account ||= ActivityPub::FetchRemoteAccountService.new.call(@json['movedTo'], id: true, break_on_redirect: true) account end From add3b63a0c84dbad936c461ae2617b1f995fe85b Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 24 Aug 2018 20:11:40 +0200 Subject: [PATCH 060/274] Bump version to 2.4.5 --- lib/mastodon/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 87099675b..38debbd6e 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 4 + 5 end def pre From 4a53e9d4df334b8ebe82dd10636206a22ced0ad3 Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 24 Aug 2018 17:17:04 -0500 Subject: [PATCH 061/274] Add more theme options, revert to 'sock' masto icons --- app/javascript/styles/contrast-wider.scss | 2 ++ app/javascript/styles/dog-wider.scss | 2 ++ app/javascript/styles/dog.scss | 2 +- .../styles/mastodon-light-wider.scss | 2 ++ app/javascript/styles/mastodon-wider.scss | 2 ++ .../styles/{custom.scss => wide.scss} | 2 -- config/settings.yml | 4 ++-- config/themes.yml | 8 ++++++-- public/android-chrome-192x192.png | Bin 29428 -> 13534 bytes public/apple-touch-icon.png | Bin 29541 -> 4880 bytes public/favicon.ico | Bin 8522 -> 9086 bytes public/mstile-150x150.png | Bin 21709 -> 4523 bytes 12 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 app/javascript/styles/contrast-wider.scss create mode 100644 app/javascript/styles/dog-wider.scss create mode 100644 app/javascript/styles/mastodon-light-wider.scss create mode 100644 app/javascript/styles/mastodon-wider.scss rename app/javascript/styles/{custom.scss => wide.scss} (61%) diff --git a/app/javascript/styles/contrast-wider.scss b/app/javascript/styles/contrast-wider.scss new file mode 100644 index 000000000..b20d638a2 --- /dev/null +++ b/app/javascript/styles/contrast-wider.scss @@ -0,0 +1,2 @@ +@import 'custom'; +@import 'contrast'; diff --git a/app/javascript/styles/dog-wider.scss b/app/javascript/styles/dog-wider.scss new file mode 100644 index 000000000..b37204892 --- /dev/null +++ b/app/javascript/styles/dog-wider.scss @@ -0,0 +1,2 @@ +@import 'custom'; +@import 'dog'; diff --git a/app/javascript/styles/dog.scss b/app/javascript/styles/dog.scss index c07d33051..86e6c5294 100644 --- a/app/javascript/styles/dog.scss +++ b/app/javascript/styles/dog.scss @@ -25,4 +25,4 @@ $ui-primary-color: #c9c7c5; // Echo Blue $ui-secondary-color: #ebe9e8; // Pattens Blue $ui-highlight-color: #48b9c7; // Summer Sky -@import 'custom'; +@import 'application'; diff --git a/app/javascript/styles/mastodon-light-wider.scss b/app/javascript/styles/mastodon-light-wider.scss new file mode 100644 index 000000000..efa2f2724 --- /dev/null +++ b/app/javascript/styles/mastodon-light-wider.scss @@ -0,0 +1,2 @@ +@import 'custom'; +@import 'mastodon-light'; diff --git a/app/javascript/styles/mastodon-wider.scss b/app/javascript/styles/mastodon-wider.scss new file mode 100644 index 000000000..cdd8c29e1 --- /dev/null +++ b/app/javascript/styles/mastodon-wider.scss @@ -0,0 +1,2 @@ +@import 'custom'; +@import 'application'; diff --git a/app/javascript/styles/custom.scss b/app/javascript/styles/wide.scss similarity index 61% rename from app/javascript/styles/custom.scss rename to app/javascript/styles/wide.scss index 7b9e92dce..f1b6d920a 100644 --- a/app/javascript/styles/custom.scss +++ b/app/javascript/styles/wide.scss @@ -1,5 +1,3 @@ -@import 'application'; - .column { flex-grow: 1 !important; } diff --git a/config/settings.yml b/config/settings.yml index 1b8c3b39b..0d485e7b0 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -7,7 +7,7 @@ # For more information, see docs/Running-Mastodon/Administration-guide.md # defaults: &defaults - site_title: asonix.dog + site_title: Mastodon site_description: '' site_extended_description: '' site_terms: '' @@ -30,7 +30,7 @@ defaults: &defaults reduce_motion: false system_font_ui: false noindex: false - theme: 'default' + theme: 'dog-wider' notification_emails: follow: false reblog: false diff --git a/config/themes.yml b/config/themes.yml index 2771c7344..9b19f5b78 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,4 +1,8 @@ contrast: styles/contrast.scss -default: styles/dog.scss -mastodon: styles/custom.scss +contrast-wider: styles/contrast-wider.scss +dog-wider: styles/dog-wider.scss +dog: styles/dog.scss +mastodon: styles/application.scss +mastodon-wider: styles/mastodon-wider.scss mastodon-light: styles/mastodon-light.scss +mastodon-light-wider: styles/mastodon-light-wider.scss diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png index 9665a92f1e395793cbab7abd8dc98bfdc50e431a..7a99a19641acd1558c8416b16c16a814fd953491 100644 GIT binary patch literal 13534 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 or$%(~|6j$7AfEAaB@#ecUPG={#v9>Z;Rc@7nux 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 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index b22f0b2c249b4ba70ad977b3bbceba6b1137e1b9..b12aa55a3a3fc09638befb2e678e53d31bd4e151 100644 GIT binary patch literal 4880 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 literal 29541 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 U;@idsbN~PV07*qoM6N<$f(4Hw-T(jq diff --git a/public/favicon.ico b/public/favicon.ico index d4855f7a12da8debddf21a7ac252bcc002d32227..79000c9cc43c2044b5ab5129202e993aa2cf70af 100644 GIT binary patch literal 9086 zcmdT~TWl0n7@k@cG)M&lYBb2LS}E-=pg}YN6Ql8#Xi^J4Xdomcrcb`8#F(&9=oX4f z4JP6(L5&JXjF*5sm=y7n618-<+fqs|SPBISmX@WrWsl!?c4v1kXU4ryphLd?=ltit zd~@cXGqY#Vv>f~^@@n`yU3+DgrcKo}tpF$jRshszax_#TX#8lbEY3lHJTL*62`mHr zz_&mha1yu(MB?a$JPP~_ya%iZReEPb(*FiMF4}rCD`||w_`qCXC9n%P1&A!r2H$sq z#lZDh5mh)NW+AW@I1XgPQ{@{*%-a=d(^esl^nok|IssL_%c1LQtn}WNHbIMnf$xee zxpEHA0IZ{b9b%n_ew>9uMqR{t)***#ZUGsu z99YLkQsn#>?562qa9`!3e=~3^Fa@|1xEr_!m=VWx$Z5b`z*Jx|a0@Ul==a)cI^_50 z;Tp8-^Js?r^R?W4eBz)Qeez(>Fyfak+|lk3;&TRTs8yqbb@H>&4h%G*Y$TG-5jH39|ae# z1z!Vv-P0fweB=E*=pw*qamXev>+5AB;ZQ{}&!ONN1to39wJS zop;8Z`I|aykB56Z1I~f+`%JZ|cc{1L$e8mth&5u5mnr80ou)|!$_p+h=U>2=>xVsN zM)Q0{I0uz{c@Ebu=YPf^XYQMfwc6+hXX|gESZzDh#)!*vFt~n>>E6>jT(9ldGq!Gw zr2iZoMlALFJ~$s%J-Y{b-*jY`1;B+{Piep-^<}D6`p8(Xq2kaNLv!=g{`Wa+^K#F|P|} z)`i1wQOt|KNQ95q+2Z!pZpZuL0uu+W!Qrle&6bMr@p@rhqv_vsaJ$Vu+*v0YD?yjj8&F?=cuj7$z&xzj9-lPreqa#BmzuwRuK|5Y| z`qAHZz>oQu*K|$HbIU*O&*~W(Zy2UAQqO=~;UNHx> zW1jXeSJ~^x%y}>Pu5seb`;5H%TYt5tcJ24nekKCz@&#)souj|?K%B2*U2y)_0o)UI zz7|+Nnzk$!!{<+?lz!l3NY*;v+|H1ed^tga96!x{Qu*C@zVhJ`MCF00l52ceFZwddqecM{f6I(tzzhG zhZsE5D*9S##IfD4ih%Oj;gx!h(~kDi5B`k9cyjHwt=~#M{I(~*(?NOwKF8g8v%bNr ze(fwdmyP`WjT#7`&u5^UKgVfDd+CQ*j1zlC>et0Je-Gj(Ho?%o4ybg?X&;Ntd$JB( z^BK-3Q$O!UaLA4A*TuFV(VqnTY3G(Imr=Fj9`R)I4fzv%+2uaiOn`f;hIzT_ZLSZq z*!qCLRpQRyPkeUdx$#Z%PJYXP&vf7^ zfc4LB5`(~K%>NMLa^Ifc8<=lKl22l(&{ay=WcVgY1H|AO&hG)-E6WE;fYku^Cw~BH zffj(ZcLCu0t^S_NKJ^?w2+*E>^nU>;02r6?6aPnoc>`6+Z=>w%hp5qV#h|7MC@7-}~L~ ze&^it9x~bY`1geuWc>Ge*`lAxWPdA@$$rh?DcOHB#QDel85>ELZ9bAJd)+^8Bcp+F zmjQdc8&QMMt0qJ%KYyY))@j6n@@t40{Sx5=x3M*%0A~tgVAQ0-Y7mi*2~!@UfRPQW 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 diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png index f916d5c458c700cee23ce68f158974d0a48e3939..a4994062de166baf39263f4505ace305e31a3770 100644 GIT binary patch delta 4495 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 o2;YE$DpG`= Date: Fri, 24 Aug 2018 17:19:54 -0500 Subject: [PATCH 062/274] Limit width --- app/javascript/styles/wide.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/styles/wide.scss b/app/javascript/styles/wide.scss index f1b6d920a..9ea34d333 100644 --- a/app/javascript/styles/wide.scss +++ b/app/javascript/styles/wide.scss @@ -1,3 +1,4 @@ .column { flex-grow: 1 !important; + max-width: 540px; } From b7dcefe02a2f66a740102efc75632baa8222edb8 Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 24 Aug 2018 17:25:12 -0500 Subject: [PATCH 063/274] Set default mastodon theme, add translations --- config/locales/dog.yml | 8 ++++++-- config/locales/en.yml | 8 ++++++-- config/locales/lion.yml | 8 ++++++-- config/locales/squeak.yml | 8 ++++++-- config/settings.yml | 2 +- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 785eeab40..c6ccf4d8b 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -810,9 +810,13 @@ dog: title: "%{instance} Terms of Service and Privacy Policy" themes: contrast: High contrast - default: Dog - mastodon: The default Mastodon theme + contrast-wider: High contrast (wider) + dog: Dog + dog-wider: Dog (wider) + mastodon: Mastodon + mastodon-wider: Mastodon (wider) mastodon-light: Mastodon (light) + mastodon-light-wider: Mastodon (light, wider) time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/locales/en.yml b/config/locales/en.yml index a29d5e4db..664fbeef0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -810,9 +810,13 @@ en: title: "%{instance} Terms of Service and Privacy Policy" themes: contrast: High contrast - default: Dog - mastodon: The default Mastodon theme + contrast-wider: High contrast (wider) + dog: Dog + dog-wider: Dog (wider) + mastodon: Mastodon + mastodon-wider: Mastodon (wider) mastodon-light: Mastodon (light) + mastodon-light-wider: Mastodon (light, wider) time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 7417fdf82..328f3c2d9 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -809,9 +809,13 @@ lion: title: "%{instance} Terms of Service and Privacy Policy" themes: contrast: High contrast - default: Dog - mastodon: The default Mastodon theme + contrast-wider: High contrast (wider) + dog: Dog + dog-wider: Dog (wider) + mastodon: Mastodon + mastodon-wider: Mastodon (wider) mastodon-light: Mastodon (light) + mastodon-light-wider: Mastodon (light, wider) time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/locales/squeak.yml b/config/locales/squeak.yml index 524e36b66..6c294b358 100644 --- a/config/locales/squeak.yml +++ b/config/locales/squeak.yml @@ -810,9 +810,13 @@ squeak: title: "%{instance} Terms of Service and Privacy Policy" themes: contrast: High contrast - default: Dog - mastodon: The default Mastodon theme + contrast-wider: High contrast (wider) + dog: Dog + dog-wider: Dog (wider) + mastodon: Mastodon + mastodon-wider: Mastodon (wider) mastodon-light: Mastodon (light) + mastodon-light-wider: Mastodon (light, wider) time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/settings.yml b/config/settings.yml index 0d485e7b0..946f2ddea 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -30,7 +30,7 @@ defaults: &defaults reduce_motion: false system_font_ui: false noindex: false - theme: 'dog-wider' + theme: 'mastodon' notification_emails: follow: false reblog: false From ee371616c318b925291680b1b4cd28e0d5a9f772 Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 24 Aug 2018 17:27:05 -0500 Subject: [PATCH 064/274] Fix themes --- app/javascript/styles/contrast-wider.scss | 2 +- app/javascript/styles/dog-wider.scss | 2 +- app/javascript/styles/mastodon-light-wider.scss | 2 +- app/javascript/styles/mastodon-wider.scss | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/javascript/styles/contrast-wider.scss b/app/javascript/styles/contrast-wider.scss index b20d638a2..31df8e273 100644 --- a/app/javascript/styles/contrast-wider.scss +++ b/app/javascript/styles/contrast-wider.scss @@ -1,2 +1,2 @@ -@import 'custom'; +@import 'wide'; @import 'contrast'; diff --git a/app/javascript/styles/dog-wider.scss b/app/javascript/styles/dog-wider.scss index b37204892..38b49b34f 100644 --- a/app/javascript/styles/dog-wider.scss +++ b/app/javascript/styles/dog-wider.scss @@ -1,2 +1,2 @@ -@import 'custom'; +@import 'wide'; @import 'dog'; diff --git a/app/javascript/styles/mastodon-light-wider.scss b/app/javascript/styles/mastodon-light-wider.scss index efa2f2724..71c09ff2e 100644 --- a/app/javascript/styles/mastodon-light-wider.scss +++ b/app/javascript/styles/mastodon-light-wider.scss @@ -1,2 +1,2 @@ -@import 'custom'; +@import 'wide'; @import 'mastodon-light'; diff --git a/app/javascript/styles/mastodon-wider.scss b/app/javascript/styles/mastodon-wider.scss index cdd8c29e1..d1cb0aee7 100644 --- a/app/javascript/styles/mastodon-wider.scss +++ b/app/javascript/styles/mastodon-wider.scss @@ -1,2 +1,2 @@ -@import 'custom'; +@import 'wide'; @import 'application'; From d8ee4d9cf6ebb381c08b06ab71f6a03067db701f Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 24 Aug 2018 18:43:16 -0500 Subject: [PATCH 065/274] Rename 'dog' theme to 'Pop' --- app/javascript/styles/{dog-wider.scss => pop-wider.scss} | 0 app/javascript/styles/{dog.scss => pop.scss} | 0 config/locales/dog.yml | 4 ++-- config/locales/en.yml | 4 ++-- config/locales/lion.yml | 4 ++-- config/locales/squeak.yml | 4 ++-- config/themes.yml | 4 ++-- 7 files changed, 10 insertions(+), 10 deletions(-) rename app/javascript/styles/{dog-wider.scss => pop-wider.scss} (100%) rename app/javascript/styles/{dog.scss => pop.scss} (100%) diff --git a/app/javascript/styles/dog-wider.scss b/app/javascript/styles/pop-wider.scss similarity index 100% rename from app/javascript/styles/dog-wider.scss rename to app/javascript/styles/pop-wider.scss diff --git a/app/javascript/styles/dog.scss b/app/javascript/styles/pop.scss similarity index 100% rename from app/javascript/styles/dog.scss rename to app/javascript/styles/pop.scss diff --git a/config/locales/dog.yml b/config/locales/dog.yml index c6ccf4d8b..03d368dc9 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -811,8 +811,8 @@ dog: themes: contrast: High contrast contrast-wider: High contrast (wider) - dog: Dog - dog-wider: Dog (wider) + pop: Pop + pop-wider: Pop (wider) mastodon: Mastodon mastodon-wider: Mastodon (wider) mastodon-light: Mastodon (light) diff --git a/config/locales/en.yml b/config/locales/en.yml index 664fbeef0..304f7bb47 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -811,8 +811,8 @@ en: themes: contrast: High contrast contrast-wider: High contrast (wider) - dog: Dog - dog-wider: Dog (wider) + pop: Pop + pop-wider: Pop (wider) mastodon: Mastodon mastodon-wider: Mastodon (wider) mastodon-light: Mastodon (light) diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 328f3c2d9..37d472e6e 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -810,8 +810,8 @@ lion: themes: contrast: High contrast contrast-wider: High contrast (wider) - dog: Dog - dog-wider: Dog (wider) + pop: Pop + pop-wider: Pop (wider) mastodon: Mastodon mastodon-wider: Mastodon (wider) mastodon-light: Mastodon (light) diff --git a/config/locales/squeak.yml b/config/locales/squeak.yml index 6c294b358..236bb94a5 100644 --- a/config/locales/squeak.yml +++ b/config/locales/squeak.yml @@ -811,8 +811,8 @@ squeak: themes: contrast: High contrast contrast-wider: High contrast (wider) - dog: Dog - dog-wider: Dog (wider) + pop: Pop + pop-wider: Pop (wider) mastodon: Mastodon mastodon-wider: Mastodon (wider) mastodon-light: Mastodon (light) diff --git a/config/themes.yml b/config/themes.yml index 9b19f5b78..e50b11933 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,7 +1,7 @@ contrast: styles/contrast.scss contrast-wider: styles/contrast-wider.scss -dog-wider: styles/dog-wider.scss -dog: styles/dog.scss +pop-wider: styles/pop-wider.scss +pop: styles/pop.scss mastodon: styles/application.scss mastodon-wider: styles/mastodon-wider.scss mastodon-light: styles/mastodon-light.scss From f64adca068bbaaedb8e643ea8ac93fa37ee1ab9a Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 24 Aug 2018 18:50:15 -0500 Subject: [PATCH 066/274] Fix themes --- app/javascript/styles/pop-wider.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/pop-wider.scss b/app/javascript/styles/pop-wider.scss index 38b49b34f..76fee9d1a 100644 --- a/app/javascript/styles/pop-wider.scss +++ b/app/javascript/styles/pop-wider.scss @@ -1,2 +1,2 @@ @import 'wide'; -@import 'dog'; +@import 'pop'; From 54b9d468cb8201a153b83056e0690c9d4262eeb3 Mon Sep 17 00:00:00 2001 From: asonix Date: Sat, 25 Aug 2018 13:07:28 -0500 Subject: [PATCH 067/274] Add light pop theme, rename 'Pop' to 'Inflate' for squeak lang --- app/javascript/styles/pop-light-wider.scss | 2 + app/javascript/styles/pop-light.scss | 55 ++++++++++++++++++++++ config/locales/dog.yml | 2 + config/locales/en.yml | 2 + config/locales/lion.yml | 2 + config/locales/squeak.yml | 6 ++- config/themes.yml | 4 +- 7 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 app/javascript/styles/pop-light-wider.scss create mode 100644 app/javascript/styles/pop-light.scss diff --git a/app/javascript/styles/pop-light-wider.scss b/app/javascript/styles/pop-light-wider.scss new file mode 100644 index 000000000..dea903bd5 --- /dev/null +++ b/app/javascript/styles/pop-light-wider.scss @@ -0,0 +1,2 @@ +@import 'wide'; +@import 'pop-light'; diff --git a/app/javascript/styles/pop-light.scss b/app/javascript/styles/pop-light.scss new file mode 100644 index 000000000..1492540c0 --- /dev/null +++ b/app/javascript/styles/pop-light.scss @@ -0,0 +1,55 @@ +// Commonly used web colors +$black: #3b3633; // Black +$white: #fafafa; // White + +$classic-base-color: #49423e; // Midnight Express +$classic-primary-color: #c9c7c5; // Echo Blue +$classic-secondary-color: #ebe9e8; // Pattens Blue +$classic-highlight-color: #48b9c7; // Summer Sky + +// Differences +$success-green: #3e935b; // Padua + +$base-overlay-background: $white !default; +$valid-value-color: $success-green !default; + +$ui-base-color: $classic-secondary-color !default; // Midnight Express +$ui-base-lighter-color: #ababab; +$ui-primary-color: #9a938e; // Echo Blue +$ui-secondary-color: $classic-base-color !default; // Pattens Blue +$ui-highlight-color: #48b9c7; // Summer Sky + +$primary-text-color: $black !default; +$darker-text-color: $classic-base-color !default; +$dark-text-color: #0c0c0c; +$action-button-color: #635d58; + +$error-red: #a3360a; // Cerise +$warning-red: #f9dfb6; // Sunset Orange +$gold-star: #faa41a; // Dark Goldenrod + +$inverted-text-color: $black !default; +$lighter-text-color: $classic-base-color !default; +$light-text-color: #444b5d; + +$base-shadow-color: #3b3633; +$base-overlay-background: #3b3633; +$base-border-color: #fafafa; +$simple-background-color: #fafafa; +$valid-value-color: #3e935b; +$error-value-color: #a3360a; + +//Newly added colors +$account-background-color: $white !default; + +//Invert darkened and lightened colors +@function darken($color, $amount) { + @return hsl(hue($color), saturation($color), lightness($color) + $amount); +} + +@function lighten($color, $amount) { + @return hsl(hue($color), saturation($color), lightness($color) - $amount); +} + +@import 'application'; +@import 'mastodon-light/diff'; diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 03d368dc9..8c0d6651f 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -813,6 +813,8 @@ dog: contrast-wider: High contrast (wider) pop: Pop pop-wider: Pop (wider) + pop-light: Pop (light) + pop-light-wider: Pop (light, wider) mastodon: Mastodon mastodon-wider: Mastodon (wider) mastodon-light: Mastodon (light) diff --git a/config/locales/en.yml b/config/locales/en.yml index 304f7bb47..b1fdde05f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -813,6 +813,8 @@ en: contrast-wider: High contrast (wider) pop: Pop pop-wider: Pop (wider) + pop-light: Pop (light) + pop-light-wider: Pop (light, wider) mastodon: Mastodon mastodon-wider: Mastodon (wider) mastodon-light: Mastodon (light) diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 37d472e6e..5d94bfdaa 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -812,6 +812,8 @@ lion: contrast-wider: High contrast (wider) pop: Pop pop-wider: Pop (wider) + pop-light: Pop (light) + pop-light-wider: Pop (light, wider) mastodon: Mastodon mastodon-wider: Mastodon (wider) mastodon-light: Mastodon (light) diff --git a/config/locales/squeak.yml b/config/locales/squeak.yml index 236bb94a5..0b4f87e82 100644 --- a/config/locales/squeak.yml +++ b/config/locales/squeak.yml @@ -811,8 +811,10 @@ squeak: themes: contrast: High contrast contrast-wider: High contrast (wider) - pop: Pop - pop-wider: Pop (wider) + pop: Inflate + pop-wider: Inflate (wider) + pop-light: Inflate (light) + pop-light-wider: Inflate (light, wider) mastodon: Mastodon mastodon-wider: Mastodon (wider) mastodon-light: Mastodon (light) diff --git a/config/themes.yml b/config/themes.yml index e50b11933..53ff44bda 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,7 +1,9 @@ contrast: styles/contrast.scss contrast-wider: styles/contrast-wider.scss -pop-wider: styles/pop-wider.scss pop: styles/pop.scss +pop-wider: styles/pop-wider.scss +pop-light: styles/pop-light.scss +pop-light-wider: styles/pop-light-wider.scss mastodon: styles/application.scss mastodon-wider: styles/mastodon-wider.scss mastodon-light: styles/mastodon-light.scss From ae0f1facade5e6a2dc17581d6d229ca7cfc748e6 Mon Sep 17 00:00:00 2001 From: asonix Date: Sun, 26 Aug 2018 18:40:17 -0500 Subject: [PATCH 068/274] Update translations --- app/javascript/mastodon/locales/dog.json | 20 ++++- app/javascript/mastodon/locales/lion.json | 16 ++++ app/javascript/mastodon/locales/squeak.json | 16 ++++ config/locales/dog.yml | 91 +++++++++++++++++---- config/locales/lion.yml | 82 ++++++++++++++++--- config/locales/simple_form.dog.yml | 4 +- config/locales/simple_form.lion.yml | 15 +++- config/locales/simple_form.squeak.yml | 4 +- config/locales/squeak.yml | 85 +++++++++++++++---- 9 files changed, 279 insertions(+), 54 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index 2bec09291..d44b94968 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -7,9 +7,12 @@ "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.domain_blocked": "Domain hidden", "account.edit_profile": "Edit profile", + "account.endorse": "Feature on profile", "account.follow": "Join Pack", "account.followers": "Pack Members", + "account.followers.empty": "No one follows this dog yet.", "account.follows": "Joined Packs", + "account.follows.empty": "This dog doesn't follow anyone yet.", "account.follows_you": "In your pack", "account.hide_reblogs": "Hide awoos from @{name}", "account.media": "Media", @@ -26,6 +29,7 @@ "account.show_reblogs": "Show awoos from @{name}", "account.unblock": "Unblock @{name}", "account.unblock_domain": "Unhide {domain}", + "account.unendorse": "Don't feature on profile", "account.unfollow": "Leave Pack", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", @@ -104,12 +108,19 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.blocks": "You haven't blocked any dogs yet.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.domain_blocks": "There are no hidden domains yet.", + "empty_column.favourited_statuses": "You don't have any booped toots yet. When you boop one, it will show up here.", + "empty_column.favourites": "No one has booped this toot yet. When someone does, they will show up here.", + "empty_column.follow_requests": "You don't have any pack requests yet. When you receive one, it will show up here.", "empty_column.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other dogs.", "empty_column.home.public_timeline": "the public timeline", "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", + "empty_column.mutes": "You haven't muted any dogs yet.", "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", "empty_column.public": "There is nothing here! Write something publicly, or manually follow dogs from other instances to fill it up", "follow_request.authorize": "Authorize", @@ -126,17 +137,18 @@ "home.column_settings.show_reblogs": "Show awoos", "home.column_settings.show_replies": "Show barks", "keyboard_shortcuts.back": "to navigate back", - "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.boost": "to awoo", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", "keyboard_shortcuts.description": "Description", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", - "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.favourite": "to boop", "keyboard_shortcuts.heading": "Keyboard shortcuts", "keyboard_shortcuts.hotkey": "Hotkey", "keyboard_shortcuts.legend": "to display this legend", "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.profile": "to open author's profile", "keyboard_shortcuts.reply": "to reply", "keyboard_shortcuts.search": "to focus search", "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", @@ -159,8 +171,10 @@ "missing_indicator.label": "Not found", "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", + "navigation_bar.apps": "Mobile apps", "navigation_bar.blocks": "Blocked dogs", "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.compose": "Compose new toot", "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", @@ -254,6 +268,7 @@ "status.cancel_reblog_private": "Unawoo", "status.cannot_reblog": "This toot cannot be awooed", "status.delete": "Delete", + "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Boop", @@ -270,6 +285,7 @@ "status.reblog": "Awoo", "status.reblog_private": "Awoo to original audience", "status.reblogged_by": "{name} awooed", + "status.reblogs.empty": "No one has awooed this toot yet. When someone does, they will show up here.", "status.redraft": "Delete & re-draft", "status.reply": "Bark", "status.replyAll": "Bark in thread", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index 970bbaa1b..6a4e588b7 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -7,9 +7,12 @@ "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.domain_blocked": "Domain hidden", "account.edit_profile": "Edit profile", + "account.endorse": "Feature on profile", "account.follow": "Join pride", "account.followers": "Pride Members", + "account.followers.empty": "No one follows this lion yet.", "account.follows": "Joined Prides", + "account.follows.empty": "This lion doesn't follow anyone yet.", "account.follows_you": "In your pride", "account.hide_reblogs": "Hide roars from @{name}", "account.media": "Media", @@ -26,6 +29,7 @@ "account.show_reblogs": "Show roars from @{name}", "account.unblock": "Unblock @{name}", "account.unblock_domain": "Unhide {domain}", + "account.unendorse": "Don't feature on profile", "account.unfollow": "Leave Pride", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", @@ -104,12 +108,19 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.blocks": "You haven't blocked any lions yet.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.domain_blocks": "There are no hidden domains yet.", + "empty_column.favourited_statuses": "You don't have any booped toots yet. When you boop one, it will show up here.", + "empty_column.favourites": "No one has booped this toot yet. When someone does, they will show up here.", + "empty_column.follow_requests": "You don't have any pride requests yet. When you receive one, it will show up here.", "empty_column.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other lions.", "empty_column.home.public_timeline": "the public timeline", "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", + "empty_column.mutes": "You haven't muted any lions yet.", "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", "empty_column.public": "There is nothing here! Write something publicly, or manually follow lions from other instances to fill it up", "follow_request.authorize": "Authorize", @@ -137,6 +148,7 @@ "keyboard_shortcuts.hotkey": "Hotkey", "keyboard_shortcuts.legend": "to display this legend", "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.profile": "to open author's profile", "keyboard_shortcuts.reply": "to reply", "keyboard_shortcuts.search": "to focus search", "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", @@ -159,8 +171,10 @@ "missing_indicator.label": "Not found", "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", + "navigation_bar.apps": "Mobile apps", "navigation_bar.blocks": "Blocked lions", "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.compose": "Compose new toot", "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", @@ -254,6 +268,7 @@ "status.cancel_reblog_private": "Unroar", "status.cannot_reblog": "This toot cannot be roared", "status.delete": "Delete", + "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Boop", @@ -270,6 +285,7 @@ "status.reblog": "Roar", "status.reblog_private": "Roar to original audience", "status.reblogged_by": "{name} roared", + "status.reblogs.empty": "No one has roared this toot yet. When someone does, they will show up here.", "status.redraft": "Delete & re-draft", "status.reply": "Meow", "status.replyAll": "Meow in thread", diff --git a/app/javascript/mastodon/locales/squeak.json b/app/javascript/mastodon/locales/squeak.json index e88cb2107..97b59d0f2 100644 --- a/app/javascript/mastodon/locales/squeak.json +++ b/app/javascript/mastodon/locales/squeak.json @@ -7,9 +7,12 @@ "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", "account.domain_blocked": "Domain hidden", "account.edit_profile": "Edit profile", + "account.endorse": "Feature on profile", "account.follow": "Follow", "account.followers": "Followers", + "account.followers.empty": "No one follows this user yet.", "account.follows": "Follows", + "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Follows you", "account.hide_reblogs": "Hide pumps from @{name}", "account.media": "Media", @@ -26,6 +29,7 @@ "account.show_reblogs": "Show pumps from @{name}", "account.unblock": "Unblock @{name}", "account.unblock_domain": "Unhide {domain}", + "account.unendorse": "Don't feature on profile", "account.unfollow": "Unfollow", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", @@ -104,12 +108,19 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.domain_blocks": "There are no hidden domains yet.", + "empty_column.favourited_statuses": "You don't have any squeaked toots yet. When you squeak one, it will show up here.", + "empty_column.favourites": "No one has squeaked this toot yet. When someone does, they will show up here.", + "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", "empty_column.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", "empty_column.home.public_timeline": "the public timeline", "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", + "empty_column.mutes": "You haven't muted any users yet.", "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", "follow_request.authorize": "Authorize", @@ -137,6 +148,7 @@ "keyboard_shortcuts.hotkey": "Hotkey", "keyboard_shortcuts.legend": "to display this legend", "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.profile": "to open author's profile", "keyboard_shortcuts.reply": "to reply", "keyboard_shortcuts.search": "to focus search", "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", @@ -159,8 +171,10 @@ "missing_indicator.label": "Not found", "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", + "navigation_bar.apps": "Mobile apps", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.compose": "Compose new toot", "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", @@ -254,6 +268,7 @@ "status.cancel_reblog_private": "Deflate", "status.cannot_reblog": "This post cannot be pumped", "status.delete": "Delete", + "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Squeak", @@ -270,6 +285,7 @@ "status.reblog": "Pump", "status.reblog_private": "Pump to original audience", "status.reblogged_by": "{name} pumped", + "status.reblogs.empty": "No one has pumped this toot yet. When someone does, they will show up here.", "status.redraft": "Delete & re-draft", "status.reply": "Reply", "status.replyAll": "Reply to thread", diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 8c0d6651f..df20dc8cc 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -5,13 +5,13 @@ dog: about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail. about_this: About administered_by: 'Administered by:' + api: API + apps: Mobile apps closed_registrations: Registrations are currently closed on this instance. However! You can find a different instance to make an account on and get access to the very same network from there. contact: Contact contact_missing: Not set contact_unavailable: N/A - description_headline: What is %{domain}? - domain_count_after: other instances - domain_count_before: Connected to + documentation: Documentation extended_description_html: |

    A good place for rules

    The extended description has not been set up yet.

    @@ -19,7 +19,7 @@ dog: humane_approach_body: Learning from failures of other networks, Mastodon aims to make ethical design choices to combat the misuse of social media. humane_approach_title: A more humane approach not_a_product_body: Mastodon is not a commercial network. No advertising, no data mining, no walled gardens. There is no central authority. - not_a_product_title: You’re a person, not a product + not_a_product_title: You’re a dog, not a product real_conversation_body: With 500 characters at your disposal and support for granular content and media warnings, you can express yourself the way you want to. real_conversation_title: Built for real conversation within_reach_body: Multiple apps for iOS, Android, and other platforms thanks to a developer-friendly API ecosystem allow you to keep up with your friends anywhere. @@ -28,25 +28,39 @@ dog: hosted_on: Mastodon hosted on %{domain} learn_more: Learn more other_instances: Instance list + privacy_policy: Privacy policy source_code: Source code status_count_after: toots + one: toot + other: toots status_count_before: Who authored - user_count_after: dogs + terms: Terms of service + user_count_after: + one: dog + other: dogs user_count_before: Home to what_is_mastodon: What is Mastodon? accounts: - follow: Follow - followers: Followers - following: Following + choices_html: "%{name}'s choices:" + follow: Join Pack + followers: + one: Pack Member + other: Pack Members + following: Joined Packs + joined: Joined %{date} media: Media moved_html: "%{name} has moved to %{new_profile_link}:" network_hidden: This information is not available nothing_here: There is nothing here! people_followed_by: People whom %{name} follows people_who_follow: People who follow %{name} - posts: Toots + pin_errors: + following: You must be already following the dog you want to endorse + posts: + one: Toot + other: Toots + posts_tab_heading: Toots posts_with_replies: Toots and replies - remote_follow: Remote follow reserved_username: The username is reserved roles: admin: Admin @@ -180,6 +194,7 @@ dog: unsuspend_account: "%{name} unsuspended %{target}'s account" update_custom_emoji: "%{name} updated emoji %{target}" update_status: "%{name} updated toot by %{target}" + deleted_status: "(deleted toot)" title: Audit log custom_emojis: by_domain: Domain @@ -206,6 +221,27 @@ dog: update_failed_msg: Could not update that emoji updated_msg: Emoji successfully updated! upload: Upload + dashboard: + backlog: backlogged jobs + config: Configuration + feature_deletions: Account deletions + feature_invites: Invite links + feature_registrations: Registrations + feature_relay: Federation relay + features: Features + hidden_service: Federation with hidden services + open_reports: open reports + recent_users: Recent dogs + search: Full-text search + single_user_mode: Single dog mode + software: Software + space: Space usage + title: Dashboard + total_users: dogs in total + trends: Trends + week_interactions: interactions this week + week_users_active: active this week + week_users_new: dogs this week domain_blocks: add_new: Add new created_msg: Domain block is now being processed @@ -255,6 +291,7 @@ dog: search: Search title: Known instances invites: + deactivate_all: Deactivate all filter: all: All available: Available @@ -263,7 +300,7 @@ dog: title: Invites relays: add_new: Add new relay - description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. + description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local dogs manually following other people on remote servers. enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. inbox_url: Relay URL setup: Setup a relay connection @@ -291,7 +328,7 @@ dog: create_and_resolve: Resolve with note create_and_unresolve: Reopen with note delete: Delete - placeholder: Describe what actions have been taken, or any other updates to this report… + placeholder: Describe what actions have been taken, or any other related updates... reopen: Reopen report report: 'Report #%{id}' report_contents: Contents @@ -318,6 +355,9 @@ dog: contact_information: email: Business e-mail username: Contact username + custom_css: + desc_html: Modify the look with CSS loaded on every page + title: Custom CSS hero: desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to instance thumbnail title: Hero image @@ -352,6 +392,9 @@ dog: site_description_extended: desc_html: A good place for your code of conduct, rules, guidelines and other things that set your instance apart. You can use HTML tags title: Custom extended information + site_short_description: + desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph. If empty, defaults to instance description. + title: Short instance description site_terms: desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags title: Custom terms of service @@ -373,6 +416,7 @@ dog: media: title: Media no_media: No media + no_status_selected: No toots were changed as none were selected title: Account Toots with_media: With media subscriptions: @@ -382,6 +426,12 @@ dog: last_delivery: Last delivery title: WebSub topic: Topic + suspensions: + bad_acct_msg: The confirmation value didn't match up. Are you suspending the right account? + hint_html: 'To confirm the suspension of the account, please enter %{value} into the field below:' + proceed: Proceed + title: Suspend %{acct} + warning_html: 'Suspending this account will irreversibly delete data from this account, which includes:' title: Administration admin_mailer: new_report: @@ -513,9 +563,12 @@ dog: true_privacy_html: Please mind that true privacy can only be achieved with end-to-end encryption. unlocked_warning_html: Anyone can follow you to immediately view your private toots. %{lock_link} to be able to review and reject followers. unlocked_warning_title: Your account is not locked + footer: + developers: Developers + more: More… + resources: Resources generic: changes_saved_msg: Changes successfully saved! - powered_by: powered by %{link} save_changes: Save changes validation_errors: one: Something isn't quite right yet! Please review the error below @@ -551,8 +604,6 @@ dog: expires_at: Expires uses: Uses title: Invite people - landing_strip_html: "%{name} is a dog on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." - landing_strip_signup_html: If you don't, you can sign up here. lists: errors: limit: You have reached the maximum amount of lists @@ -629,6 +680,9 @@ dog: no_account_html: Don't have an account? You can sign up here proceed: Proceed to follow prompt: 'You are going to follow:' + remote_interaction: + proceed: Proceed to interact + prompt: 'You want to interact with this toot:' remote_unfollow: error: Error title: Title @@ -712,6 +766,7 @@ dog: private: Non-public toot cannot be pinned reblog: An awoo cannot be pinned show_more: Show more + sign_in_to_participate: Sign in to participate in the conversation title: '%{name}: "%{quote}"' visibilities: private: Followers-only @@ -721,7 +776,6 @@ dog: unlisted: Unlisted unlisted_long: Everyone can see, but not listed on public timelines stream_entries: - click_to_show: Click to show pinned: Pinned toot reblogged: awooed sensitive_content: Sensitive content @@ -733,7 +787,7 @@ dog:
    • Basic account information: If you register on this server, you may be asked to enter a username, an e-mail address and a password. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly.
    • Posts, following and other public information: The list of people you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.
    • -
    • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and dogs who are mentioned in them, and direct posts are delivered only to dogs mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
    • +
    • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and dogs who are mentioned in them, and direct posts are delivered only to dogs mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized dogs, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
    • IPs and other metadata: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.
    @@ -786,7 +840,7 @@ dog:

    Your public content may be downloaded by other servers in the network. Your public and followers-only posts are delivered to the servers where your followers reside, and direct messages are delivered to the servers of the recipients, in so far as those followers or recipients reside on a different server than this.

    -

    When you authorize an application to use your account, depending on the scope of permissions you approve, it may access your public profile information, your following list, your followers, your lists, all your posts, and your favourites. Applications can never access your e-mail address or password.

    +

    When you authorize an application to use your account, depending on the scope of permissions you approve, it may access your public profile information, your following list, your followers, your lists, all your posts, and your boops. Applications can never access your e-mail address or password.


    @@ -822,6 +876,7 @@ dog: time: formats: default: "%b %d, %Y, %H:%M" + month: "%b %Y" two_factor_authentication: code_hint: Enter the code generated by your authenticator app to confirm description_html: If you enable two-factor authentication, logging in will require you to be in possession of your phone, which will generate tokens for you to enter. diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 5d94bfdaa..4a7c8e9e6 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -5,13 +5,13 @@ lion: about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail. about_this: About administered_by: 'Administered by:' + api: API + apps: Mobile apps closed_registrations: Registrations are currently closed on this instance. However! You can find a different instance to make an account on and get access to the very same network from there. contact: Contact contact_missing: Not set contact_unavailable: N/A - description_headline: What is %{domain}? - domain_count_after: other instances - domain_count_before: Connected to + documentation: Documentation extended_description_html: |

    A good place for rules

    The extended description has not been set up yet.

    @@ -28,25 +28,39 @@ lion: hosted_on: Mastodon hosted on %{domain} learn_more: Learn more other_instances: Instance list + privacy_policy: Privacy policy source_code: Source code - status_count_after: toots + status_count_after: + one: toot + other: toots status_count_before: Who authored - user_count_after: lions + terms: Terms of service + user_count_after: + one: lion + other: lions user_count_before: Home to what_is_mastodon: What is Mastodon? accounts: + choices_html: "%{name}'s choices:" follow: Follow - followers: Followers + followers: + one: Pride Member + other: Pride Members following: Following + joined: Joined %{date} media: Media moved_html: "%{name} has moved to %{new_profile_link}:" network_hidden: This information is not available nothing_here: There is nothing here! people_followed_by: People whom %{name} follows people_who_follow: People who follow %{name} - posts: Toots + pin_errors: + following: You must be already following the lion you want to endorse + posts: + one: Toot + other: Toots + posts_tab_heading: Toots posts_with_replies: Toots and replies - remote_follow: Remote follow reserved_username: The username is reserved roles: admin: Admin @@ -180,6 +194,7 @@ lion: unsuspend_account: "%{name} unsuspended %{target}'s account" update_custom_emoji: "%{name} updated emoji %{target}" update_status: "%{name} updated toot by %{target}" + deleted_status: "(deleted toot)" title: Audit log custom_emojis: by_domain: Domain @@ -206,6 +221,27 @@ lion: update_failed_msg: Could not update that emoji updated_msg: Emoji successfully updated! upload: Upload + dashboard: + backlog: backlogged jobs + config: Configuration + feature_deletions: Account deletions + feature_invites: Invite links + feature_registrations: Registrations + feature_relay: Federation relay + features: Features + hidden_service: Federation with hidden services + open_reports: open reports + recent_users: Recent lions + search: Full-text search + single_user_mode: Single lion mode + software: Software + space: Space usage + title: Dashboard + total_users: lions in total + trends: Trends + week_interactions: interactions this week + week_users_active: active this week + week_users_new: lions this week domain_blocks: add_new: Add new created_msg: Domain block is now being processed @@ -255,6 +291,7 @@ lion: search: Search title: Known instances invites: + deactivate_all: Deactivate all filter: all: All available: Available @@ -291,7 +328,7 @@ lion: create_and_resolve: Resolve with note create_and_unresolve: Reopen with note delete: Delete - placeholder: Describe what actions have been taken, or any other updates to this report… + placeholder: Describe what actions have been taken, or any other related updates... reopen: Reopen report report: 'Report #%{id}' report_contents: Contents @@ -318,6 +355,9 @@ lion: contact_information: email: Business e-mail username: Contact username + custom_css: + desc_html: Modify the look with CSS loaded on every page + title: Custom CSS hero: desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to instance thumbnail title: Hero image @@ -352,6 +392,9 @@ lion: site_description_extended: desc_html: A good place for your code of conduct, rules, guidelines and other things that set your instance apart. You can use HTML tags title: Custom extended information + site_short_description: + desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph. If empty, defaults to instance description. + title: Short instance description site_terms: desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags title: Custom terms of service @@ -373,6 +416,7 @@ lion: media: title: Media no_media: No media + no_status_selected: No toots were changed as none were selected title: Account Toots with_media: With media subscriptions: @@ -382,6 +426,12 @@ lion: last_delivery: Last delivery title: WebSub topic: Topic + suspensions: + bad_acct_msg: The confirmation value didn't match up. Are you suspending the right account? + hint_html: 'To confirm the suspension of the account, please enter %{value} into the field below:' + proceed: Proceed + title: Suspend %{acct} + warning_html: 'Suspending this account will irreversibly delete data from this account, which includes:' title: Administration admin_mailer: new_report: @@ -513,9 +563,12 @@ lion: true_privacy_html: Please mind that true privacy can only be achieved with end-to-end encryption. unlocked_warning_html: Anyone can follow you to immediately view your private toots. %{lock_link} to be able to review and reject followers. unlocked_warning_title: Your account is not locked + footer: + developers: Developers + more: More… + resources: Resources generic: changes_saved_msg: Changes successfully saved! - powered_by: powered by %{link} save_changes: Save changes validation_errors: one: Something isn't quite right yet! Please review the error below @@ -551,8 +604,6 @@ lion: expires_at: Expires uses: Uses title: Invite people - landing_strip_html: "%{name} is a lion on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." - landing_strip_signup_html: If you don't, you can sign up here. lists: errors: limit: You have reached the maximum amount of lists @@ -626,8 +677,12 @@ lion: remote_follow: acct: Enter your username@domain you want to follow from missing_resource: Could not find the required redirect URL for your account + no_account_html: Don't have an account? You can sign up here proceed: Proceed to follow prompt: 'You are going to follow:' + remote_interaction: + proceed: Proceed to interact + prompt: 'You want to interact with this toot:' remote_unfollow: error: Error title: Title @@ -711,6 +766,7 @@ lion: private: Non-public toot cannot be pinned reblog: A roar cannot be pinned show_more: Show more + sign_in_to_participate: Sign in to participate in the conversation title: '%{name}: "%{quote}"' visibilities: private: Followers-only @@ -720,7 +776,6 @@ lion: unlisted: Unlisted unlisted_long: Everyone can see, but not listed on public timelines stream_entries: - click_to_show: Click to show pinned: Pinned toot reblogged: roared sensitive_content: Sensitive content @@ -821,6 +876,7 @@ lion: time: formats: default: "%b %d, %Y, %H:%M" + month: "%b %Y" two_factor_authentication: code_hint: Enter the code generated by your authenticator app to confirm description_html: If you enable two-factor authentication, logging in will require you to be in possession of your phone, which will generate tokens for you to enter. diff --git a/config/locales/simple_form.dog.yml b/config/locales/simple_form.dog.yml index a653af306..654a75520 100644 --- a/config/locales/simple_form.dog.yml +++ b/config/locales/simple_form.dog.yml @@ -4,7 +4,7 @@ dog: hints: defaults: autofollow: People who sign up through the invite will automatically follow you - avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px + avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px bot: This account mainly performs automated actions and might not be monitored context: One or multiple contexts where the filter should apply digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence @@ -12,7 +12,7 @@ dog: one: 1 character left other: %{count} characters left fields: You can have up to 4 items displayed as a table on your profile - header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px + header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px inbox_url: Copy the URL from the frontpage of the relay you want to use irreversible: Filtered toots will disappear irreversibly, even if filter is later removed locale: The language of the user interface, e-mails and push notifications diff --git a/config/locales/simple_form.lion.yml b/config/locales/simple_form.lion.yml index 4d524ccd5..095d92376 100644 --- a/config/locales/simple_form.lion.yml +++ b/config/locales/simple_form.lion.yml @@ -4,23 +4,29 @@ lion: hints: defaults: autofollow: People who sign up through the invite will automatically follow you - avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px + avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px bot: This account mainly performs automated actions and might not be monitored + context: One or multiple contexts where the filter should apply digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence display_name: one: 1 character left other: %{count} characters left fields: You can have up to 4 items displayed as a table on your profile - header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px + header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px + inbox_url: Copy the URL from the frontpage of the relay you want to use + irreversible: Filtered toots will disappear irreversibly, even if filter is later removed locale: The language of the user interface, e-mails and push notifications locked: Requires you to manually approve followers note: one: 1 character left other: %{count} characters left + phrase: Will be matched regardless of casing in text or content warning of a toot + scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. setting_default_language: The language of your toots can be detected automatically, but it's not always accurate setting_hide_network: Who you follow and who follows you will not be shown on your profile setting_noindex: Affects your public profile and status pages setting_theme: Affects how Mastodon looks when you're logged in from any device. + whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word imports: data: CSV file exported from another Mastodon instance sessions: @@ -39,6 +45,7 @@ lion: chosen_languages: Filter languages confirm_new_password: Confirm new password confirm_password: Confirm password + context: Filter contexts current_password: Current password data: Data display_name: Display name @@ -46,6 +53,8 @@ lion: expires_in: Expire after fields: Profile metadata header: Header + inbox_url: URL of the relay inbox + irreversible: Drop instead of hide locale: Interface language locked: Lock account max_uses: Max number of uses @@ -53,6 +62,7 @@ lion: note: Bio otp_attempt: Two-factor code password: Password + phrase: Keyword or phrase setting_auto_play_gif: Auto-play animated GIFs setting_boost_modal: Show confirmation dialog before boosting setting_default_language: Posting language @@ -70,6 +80,7 @@ lion: type: Import type username: Username username_or_email: Username or Email + whole_word: Whole word interactions: must_be_follower: Block notifications from non-followers must_be_following: Block notifications from people you don't follow diff --git a/config/locales/simple_form.squeak.yml b/config/locales/simple_form.squeak.yml index 9d905626d..21afdb6f3 100644 --- a/config/locales/simple_form.squeak.yml +++ b/config/locales/simple_form.squeak.yml @@ -4,7 +4,7 @@ squeak: hints: defaults: autofollow: People who sign up through the invite will automatically follow you - avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px + avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px bot: This account mainly performs automated actions and might not be monitored context: One or multiple contexts where the filter should apply digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence @@ -12,7 +12,7 @@ squeak: one: 1 character left other: %{count} characters left fields: You can have up to 4 items displayed as a table on your profile - header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px + header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px inbox_url: Copy the URL from the frontpage of the relay you want to use irreversible: Filtered toots will disappear irreversibly, even if filter is later removed locale: The language of the user interface, e-mails and push notifications diff --git a/config/locales/squeak.yml b/config/locales/squeak.yml index 0b4f87e82..2aa92c8ee 100644 --- a/config/locales/squeak.yml +++ b/config/locales/squeak.yml @@ -5,13 +5,13 @@ squeak: about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail. about_this: About administered_by: 'Administered by:' + api: API + apps: Mobile apps closed_registrations: Registrations are currently closed on this instance. However! You can find a different instance to make an account on and get access to the very same network from there. contact: Contact contact_missing: Not set contact_unavailable: N/A - description_headline: What is %{domain}? - domain_count_after: other instances - domain_count_before: Connected to + documentation: Documentation extended_description_html: |

    A good place for rules

    The extended description has not been set up yet.

    @@ -28,25 +28,39 @@ squeak: hosted_on: Mastodon hosted on %{domain} learn_more: Learn more other_instances: Instance list + privacy_policy: Privacy policy source_code: Source code - status_count_after: statuses + status_count_after: + one: status + other: statuses status_count_before: Who authored - user_count_after: users + terms: Terms of service + user_count_after: + one: user + other: users user_count_before: Home to what_is_mastodon: What is Mastodon? accounts: + choices_html: "%{name}'s choices:" follow: Follow - followers: Followers + followers: + one: Follower + other: Followers following: Following + joined: Joined %{date} media: Media moved_html: "%{name} has moved to %{new_profile_link}:" network_hidden: This information is not available nothing_here: There is nothing here! people_followed_by: People whom %{name} follows people_who_follow: People who follow %{name} - posts: Toots + pin_errors: + following: You must be already following the person you want to endorse + posts: + one: Toot + other: Toots + posts_tab_heading: Toots posts_with_replies: Toots and replies - remote_follow: Remote follow reserved_username: The username is reserved roles: admin: Admin @@ -180,6 +194,7 @@ squeak: unsuspend_account: "%{name} unsuspended %{target}'s account" update_custom_emoji: "%{name} updated emoji %{target}" update_status: "%{name} updated status by %{target}" + deleted_status: "(deleted status)" title: Audit log custom_emojis: by_domain: Domain @@ -206,6 +221,27 @@ squeak: update_failed_msg: Could not update that emoji updated_msg: Emoji successfully updated! upload: Upload + dashboard: + backlog: backlogged jobs + config: Configuration + feature_deletions: Account deletions + feature_invites: Invite links + feature_registrations: Registrations + feature_relay: Federation relay + features: Features + hidden_service: Federation with hidden services + open_reports: open reports + recent_users: Recent users + search: Full-text search + single_user_mode: Single user mode + software: Software + space: Space usage + title: Dashboard + total_users: users in total + trends: Trends + week_interactions: interactions this week + week_users_active: active this week + week_users_new: users this week domain_blocks: add_new: Add new created_msg: Domain block is now being processed @@ -255,6 +291,7 @@ squeak: search: Search title: Known instances invites: + deactivate_all: Deactivate all filter: all: All available: Available @@ -318,6 +355,9 @@ squeak: contact_information: email: Business e-mail username: Contact username + custom_css: + desc_html: Modify the look with CSS loaded on every page + title: Custom CSS hero: desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to instance thumbnail title: Hero image @@ -352,6 +392,9 @@ squeak: site_description_extended: desc_html: A good place for your code of conduct, rules, guidelines and other things that set your instance apart. You can use HTML tags title: Custom extended information + site_short_description: + desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph. If empty, defaults to instance description. + title: Short instance description site_terms: desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags title: Custom terms of service @@ -373,6 +416,7 @@ squeak: media: title: Media no_media: No media + no_status_selected: No statuses were changed as none were selected title: Account statuses with_media: With media subscriptions: @@ -382,6 +426,12 @@ squeak: last_delivery: Last delivery title: WebSub topic: Topic + suspensions: + bad_acct_msg: The confirmation value didn't match up. Are you suspending the right account? + hint_html: 'To confirm the suspension of the account, please enter %{value} into the field below:' + proceed: Proceed + title: Suspend %{acct} + warning_html: 'Suspending this account will irreversibly delete data from this account, which includes:' title: Administration admin_mailer: new_report: @@ -513,9 +563,12 @@ squeak: true_privacy_html: Please mind that true privacy can only be achieved with end-to-end encryption. unlocked_warning_html: Anyone can follow you to immediately view your private statuses. %{lock_link} to be able to review and reject followers. unlocked_warning_title: Your account is not locked + footer: + developers: Developers + more: More… + resources: Resources generic: changes_saved_msg: Changes successfully saved! - powered_by: powered by %{link} save_changes: Save changes validation_errors: one: Something isn't quite right yet! Please review the error below @@ -551,8 +604,6 @@ squeak: expires_at: Expires uses: Uses title: Invite people - landing_strip_html: "%{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." - landing_strip_signup_html: If you don't, you can sign up here. lists: errors: limit: You have reached the maximum amount of lists @@ -629,6 +680,9 @@ squeak: no_account_html: Don't have an account? You can sign up here proceed: Proceed to follow prompt: 'You are going to follow:' + remote_interaction: + proceed: Proceed to interact + prompt: 'You want to interact with this toot:' remote_unfollow: error: Error title: Title @@ -698,7 +752,7 @@ squeak: video: one: "%{count} video" other: "%{count} videos" - boosted_from_html: Boosted from %{acct_link} + boosted_from_html: Pumped from %{acct_link} content_warning: 'Content warning: %{warning}' disallowed_hashtags: one: 'contained a disallowed hashtag: %{tags}' @@ -710,8 +764,9 @@ squeak: limit: You have already pinned the maximum number of toots ownership: Someone else's toot cannot be pinned private: Non-public toot cannot be pinned - reblog: A boost cannot be pinned + reblog: A pump cannot be pinned show_more: Show more + sign_in_to_participate: Sign in to participate in the conversation title: '%{name}: "%{quote}"' visibilities: private: Followers-only @@ -721,9 +776,8 @@ squeak: unlisted: Unlisted unlisted_long: Everyone can see, but not listed on public timelines stream_entries: - click_to_show: Click to show pinned: Pinned toot - reblogged: boosted + reblogged: pumped sensitive_content: Sensitive content terms: body_html: | @@ -822,6 +876,7 @@ squeak: time: formats: default: "%b %d, %Y, %H:%M" + month: "%b %Y" two_factor_authentication: code_hint: Enter the code generated by your authenticator app to confirm description_html: If you enable two-factor authentication, logging in will require you to be in possession of your phone, which will generate tokens for you to enter. From 20a3b79af2c4f8c1fa3f0d148e84e881a99a1989 Mon Sep 17 00:00:00 2001 From: asonix Date: Sun, 26 Aug 2018 19:23:36 -0500 Subject: [PATCH 069/274] Fix locales --- config/locales/dog.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/dog.yml b/config/locales/dog.yml index df20dc8cc..2e308758e 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -30,7 +30,7 @@ dog: other_instances: Instance list privacy_policy: Privacy policy source_code: Source code - status_count_after: toots + status_count_after: one: toot other: toots status_count_before: Who authored From 093103e5b383535efa69bb6866afb0fc127e7d31 Mon Sep 17 00:00:00 2001 From: asonix Date: Sat, 1 Sep 2018 11:57:57 -0500 Subject: [PATCH 070/274] Update translations --- app/javascript/mastodon/locales/dog.json | 20 ++++++++++++++++---- app/javascript/mastodon/locales/lion.json | 20 ++++++++++++++++---- app/javascript/mastodon/locales/squeak.json | 11 +++++++++++ config/locales/dog.yml | 2 ++ config/locales/lion.yml | 2 ++ config/locales/squeak.yml | 2 ++ 6 files changed, 49 insertions(+), 8 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index d44b94968..dea8d5129 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -4,7 +4,7 @@ "account.block_domain": "Hide everything from {domain}", "account.blocked": "Blocked", "account.direct": "Direct message @{name}", - "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.disclaimer_full": "Information below may reflect the dog's profile incompletely.", "account.domain_blocked": "Domain hidden", "account.edit_profile": "Edit profile", "account.endorse": "Feature on profile", @@ -24,7 +24,7 @@ "account.posts": "Toots", "account.posts_with_replies": "Toots with barks", "account.report": "Report @{name}", - "account.requested": "Awaiting approval. Click to cancel follow request", + "account.requested": "Awaiting approval. Click to cancel pack request", "account.share": "Share @{name}'s profile", "account.show_reblogs": "Show awoos from @{name}", "account.unblock": "Unblock @{name}", @@ -137,20 +137,32 @@ "home.column_settings.show_reblogs": "Show awoos", "home.column_settings.show_replies": "Show barks", "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.blocked": "to open blocked dogs list", "keyboard_shortcuts.boost": "to awoo", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to boop", + "keyboard_shortcuts.favourites": "to open boops list", + "keyboard_shortcuts.federated": "to open federated timeline", "keyboard_shortcuts.heading": "Keyboard shortcuts", + "keyboard_shortcuts.home": "to open home timeline", "keyboard_shortcuts.hotkey": "Hotkey", "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.local": "to open local timeline", "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.muted": "to open muted dogs list", + "keyboard_shortcuts.my_profile": "to open your profile", + "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.pinned": "to open pinned toots list", "keyboard_shortcuts.profile": "to open author's profile", "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.requests": "to open pack requests list", "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.start": "to open \"get started\" column", "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", "keyboard_shortcuts.toot": "to start a brand new toot", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", @@ -170,7 +182,7 @@ "media_gallery.toggle_visible": "Toggle visibility", "missing_indicator.label": "Not found", "missing_indicator.sublabel": "This resource could not be found", - "mute_modal.hide_notifications": "Hide notifications from this user?", + "mute_modal.hide_notifications": "Hide notifications from this dog?", "navigation_bar.apps": "Mobile apps", "navigation_bar.blocks": "Blocked dogs", "navigation_bar.community_timeline": "Local timeline", @@ -258,7 +270,7 @@ "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", - "search_popout.tips.user": "user", + "search_popout.tips.user": "dog", "search_results.accounts": "Dogs", "search_results.hashtags": "Hashtags", "search_results.statuses": "Toots", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index 6a4e588b7..bf3c16a8d 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -4,7 +4,7 @@ "account.block_domain": "Hide everything from {domain}", "account.blocked": "Blocked", "account.direct": "Direct message @{name}", - "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.disclaimer_full": "Information below may reflect the lion's profile incompletely.", "account.domain_blocked": "Domain hidden", "account.edit_profile": "Edit profile", "account.endorse": "Feature on profile", @@ -24,7 +24,7 @@ "account.posts": "Toots", "account.posts_with_replies": "Toots with meows", "account.report": "Report @{name}", - "account.requested": "Awaiting approval. Click to cancel follow request", + "account.requested": "Awaiting approval. Click to cancel pride request", "account.share": "Share @{name}'s profile", "account.show_reblogs": "Show roars from @{name}", "account.unblock": "Unblock @{name}", @@ -137,20 +137,32 @@ "home.column_settings.show_reblogs": "Show roars", "home.column_settings.show_replies": "Show meows", "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.blocked": "to open blocked dogs list", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.favourites": "to open boops list", + "keyboard_shortcuts.federated": "to open federated timeline", "keyboard_shortcuts.heading": "Keyboard shortcuts", + "keyboard_shortcuts.home": "to open home timeline", "keyboard_shortcuts.hotkey": "Hotkey", "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.local": "to open local timeline", "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.muted": "to open muted lions list", + "keyboard_shortcuts.my_profile": "to open your profile", + "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.pinned": "to open pinned toots list", "keyboard_shortcuts.profile": "to open author's profile", "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.requests": "to open pride requests list", "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.start": "to open \"get started\" column", "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", "keyboard_shortcuts.toot": "to start a brand new toot", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", @@ -170,7 +182,7 @@ "media_gallery.toggle_visible": "Toggle visibility", "missing_indicator.label": "Not found", "missing_indicator.sublabel": "This resource could not be found", - "mute_modal.hide_notifications": "Hide notifications from this user?", + "mute_modal.hide_notifications": "Hide notifications from this lion?", "navigation_bar.apps": "Mobile apps", "navigation_bar.blocks": "Blocked lions", "navigation_bar.community_timeline": "Local timeline", @@ -258,7 +270,7 @@ "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", - "search_popout.tips.user": "user", + "search_popout.tips.user": "lion", "search_results.accounts": "Lions", "search_results.hashtags": "Hashtags", "search_results.statuses": "Toots", diff --git a/app/javascript/mastodon/locales/squeak.json b/app/javascript/mastodon/locales/squeak.json index 97b59d0f2..6a4faf932 100644 --- a/app/javascript/mastodon/locales/squeak.json +++ b/app/javascript/mastodon/locales/squeak.json @@ -137,6 +137,7 @@ "home.column_settings.show_reblogs": "Show pumps", "home.column_settings.show_replies": "Show replies", "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.blocked": "to open blocked users list", "keyboard_shortcuts.boost": "to pump", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", @@ -144,13 +145,23 @@ "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to squeak", + "keyboard_shortcuts.favourites": "to open squeaks list", + "keyboard_shortcuts.federated": "to open federated timeline", "keyboard_shortcuts.heading": "Keyboard shortcuts", + "keyboard_shortcuts.home": "to open home timeline", "keyboard_shortcuts.hotkey": "Hotkey", "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.local": "to open local timeline", "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.muted": "to open muted users list", + "keyboard_shortcuts.my_profile": "to open your profile", + "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.pinned": "to open pinned toots list", "keyboard_shortcuts.profile": "to open author's profile", "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.requests": "to open follow requests list", "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.start": "to open \"get started\" column", "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", "keyboard_shortcuts.toot": "to start a brand new toot", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 2e308758e..2270fdaa8 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -303,6 +303,8 @@ dog: description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local dogs manually following other people on remote servers. enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. inbox_url: Relay URL + pending: Waiting for relay's approval + save_and_enable: Save and enable setup: Setup a relay connection status: Status title: Relays diff --git a/config/locales/lion.yml b/config/locales/lion.yml index 4a7c8e9e6..099624dc0 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -303,6 +303,8 @@ lion: description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. inbox_url: Relay URL + pending: Waiting for relay's approval + save_and_enable: Save and enable setup: Setup a relay connection status: Status title: Relays diff --git a/config/locales/squeak.yml b/config/locales/squeak.yml index 2aa92c8ee..3c5bc23a1 100644 --- a/config/locales/squeak.yml +++ b/config/locales/squeak.yml @@ -303,6 +303,8 @@ squeak: description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. inbox_url: Relay URL + pending: Waiting for relay's approval + save_and_enable: Save and enable setup: Setup a relay connection status: Status title: Relays From 9bc56925761ac4caf48d19751dad123654a8db49 Mon Sep 17 00:00:00 2001 From: asonix Date: Sun, 2 Sep 2018 19:03:47 -0500 Subject: [PATCH 071/274] Update translations --- config/locales/simple_form.dog.yml | 1 + config/locales/simple_form.lion.yml | 1 + config/locales/simple_form.squeak.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/config/locales/simple_form.dog.yml b/config/locales/simple_form.dog.yml index 654a75520..7565d982c 100644 --- a/config/locales/simple_form.dog.yml +++ b/config/locales/simple_form.dog.yml @@ -92,6 +92,7 @@ dog: follow_request: Send e-mail when someone requests to follow you mention: Send e-mail when someone mentions you reblog: Send e-mail when someone boosts your status + report: Send e-mail when a new report is submitted 'no': 'No' required: mark: "*" diff --git a/config/locales/simple_form.lion.yml b/config/locales/simple_form.lion.yml index 095d92376..2602f7cd4 100644 --- a/config/locales/simple_form.lion.yml +++ b/config/locales/simple_form.lion.yml @@ -92,6 +92,7 @@ lion: follow_request: Send e-mail when someone requests to follow you mention: Send e-mail when someone mentions you reblog: Send e-mail when someone boosts your status + report: Send e-mail when a new report is submitted 'no': 'No' required: mark: "*" diff --git a/config/locales/simple_form.squeak.yml b/config/locales/simple_form.squeak.yml index 21afdb6f3..f083bd027 100644 --- a/config/locales/simple_form.squeak.yml +++ b/config/locales/simple_form.squeak.yml @@ -92,6 +92,7 @@ squeak: follow_request: Send e-mail when someone requests to follow you mention: Send e-mail when someone mentions you reblog: Send e-mail when someone boosts your status + report: Send e-mail when a new report is submitted 'no': 'No' required: mark: "*" From 39e84d174d84e4bb909b152858c40ad737ec8299 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 17 Sep 2018 20:24:46 +0200 Subject: [PATCH 072/274] Unconditionally re-encode locally-uploaded images to strip metadata (#8714) This strips metadata on file upload by re-encoding the files, at the cost of possible slight image quality decrease and processing resources. --- lib/paperclip/lazy_thumbnail.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/paperclip/lazy_thumbnail.rb b/lib/paperclip/lazy_thumbnail.rb index ea675a5bf..542c17fb2 100644 --- a/lib/paperclip/lazy_thumbnail.rb +++ b/lib/paperclip/lazy_thumbnail.rb @@ -20,7 +20,7 @@ module Paperclip private def needs_convert? - needs_different_geometry? || needs_different_format? + needs_different_geometry? || needs_different_format? || needs_metadata_stripping? end def needs_different_geometry? @@ -31,5 +31,9 @@ module Paperclip def needs_different_format? @format.present? && @current_format != @format end + + def needs_metadata_stripping? + @attachment.instance.respond_to?(:local?) && @attachment.instance.local? + end end end From 10f7278e9ac99fd43060b30b0e091b3f565f1b91 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 28 Sep 2018 17:02:53 +0200 Subject: [PATCH 073/274] Fix class autoloading issue in ActivityPub::Activity::Create (#8820) --- app/lib/activitypub/activity/create.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index f40e1fa3e..978289788 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -92,7 +92,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity return if tag['href'].blank? 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? account.mentions.create(status: status) end From 38a48a627c290072d6c6c1e99952cecb59d39f51 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sun, 30 Sep 2018 07:05:59 +0900 Subject: [PATCH 074/274] Fix that Rails.cache information could not be sent via StatsD (#8831) --- config/initializers/statsd.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/statsd.rb b/config/initializers/statsd.rb index 45702ac94..ce83fd9de 100644 --- a/config/initializers/statsd.rb +++ b/config/initializers/statsd.rb @@ -9,7 +9,7 @@ if ENV['STATSD_ADDR'].present? ::NSA.inform_statsd(statsd) do |informant| informant.collect(:action_controller, :web) informant.collect(:active_record, :db) - informant.collect(:cache, :cache) + informant.collect(:active_support_cache, :cache) informant.collect(:sidekiq, :sidekiq) end end From c2f31d908ec8764ab3a91e3c6edb8f8d8309d503 Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 3 Oct 2018 23:44:13 +0200 Subject: [PATCH 075/274] Fix handling of ActivityPub activities lacking some attributes (#8864) --- app/lib/activitypub/activity/accept.rb | 2 +- app/lib/activitypub/activity/delete.rb | 2 ++ app/lib/activitypub/activity/reject.rb | 2 +- app/lib/activitypub/activity/undo.rb | 2 ++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/lib/activitypub/activity/accept.rb b/app/lib/activitypub/activity/accept.rb index 7e60b2c00..348ee0d1c 100644 --- a/app/lib/activitypub/activity/accept.rb +++ b/app/lib/activitypub/activity/accept.rb @@ -26,7 +26,7 @@ class ActivityPub::Activity::Accept < ActivityPub::Activity end def relay - @relay ||= Relay.find_by(follow_activity_id: object_uri) + @relay ||= Relay.find_by(follow_activity_id: object_uri) unless object_uri.nil? end def relay_follow? diff --git a/app/lib/activitypub/activity/delete.rb b/app/lib/activitypub/activity/delete.rb index 3474d55d9..457047ac0 100644 --- a/app/lib/activitypub/activity/delete.rb +++ b/app/lib/activitypub/activity/delete.rb @@ -17,6 +17,8 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity end def delete_note + return if object_uri.nil? + @status = Status.find_by(uri: object_uri, account: @account) @status ||= Status.find_by(uri: @object['atomUri'], account: @account) if @object.is_a?(Hash) && @object['atomUri'].present? diff --git a/app/lib/activitypub/activity/reject.rb b/app/lib/activitypub/activity/reject.rb index d81b157de..dba21fb9a 100644 --- a/app/lib/activitypub/activity/reject.rb +++ b/app/lib/activitypub/activity/reject.rb @@ -28,7 +28,7 @@ class ActivityPub::Activity::Reject < ActivityPub::Activity end def relay - @relay ||= Relay.find_by(follow_activity_id: object_uri) + @relay ||= Relay.find_by(follow_activity_id: object_uri) unless object_uri.nil? end def relay_follow? diff --git a/app/lib/activitypub/activity/undo.rb b/app/lib/activitypub/activity/undo.rb index 64c2be7d9..599823c6e 100644 --- a/app/lib/activitypub/activity/undo.rb +++ b/app/lib/activitypub/activity/undo.rb @@ -19,6 +19,8 @@ class ActivityPub::Activity::Undo < ActivityPub::Activity private def undo_announce + return if object_uri.nil? + status = Status.find_by(uri: object_uri, account: @account) status ||= Status.find_by(uri: @object['atomUri'], account: @account) if @object.is_a?(Hash) && @object['atomUri'].present? From 0d844c078044dafcfea14df9700bd6d338b6ce6a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 5 Oct 2018 04:07:44 +0200 Subject: [PATCH 076/274] [Security] Bump nokogiri from 1.8.4 to 1.8.5 (#8881) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.8.4 to 1.8.5. **This update includes security fixes.** - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/master/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.8.4...v1.8.5) Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 502d08efe..ad5ade8ee 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -347,7 +347,7 @@ GEM net-ssh (>= 2.6.5) net-ssh (4.2.0) nio4r (2.3.1) - nokogiri (1.8.4) + nokogiri (1.8.5) mini_portile2 (~> 2.3.0) nokogumbo (1.5.0) nokogiri From a1b904441ebed76a77daaad8bdd217f0d6dda047 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Fri, 5 Oct 2018 18:58:13 +0200 Subject: [PATCH 077/274] Bump puma from 3.11.4 to 3.12.0 (#8883) Bumps [puma](https://github.com/puma/puma) from 3.11.4 to 3.12.0. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v3.11.4...v3.12.0) Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index bdac00b48..fc61a268f 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,7 @@ ruby '>= 2.3.0', '< 2.6.0' gem 'pkg-config', '~> 1.3' -gem 'puma', '~> 3.11' +gem 'puma', '~> 3.12' gem 'rails', '~> 5.2.1' gem 'thor', '~> 0.20' diff --git a/Gemfile.lock b/Gemfile.lock index ad5ade8ee..bbbcc3423 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -412,7 +412,7 @@ GEM pry-rails (0.3.6) pry (>= 0.10.4) public_suffix (3.0.2) - puma (3.11.4) + puma (3.12.0) pundit (1.1.0) activesupport (>= 3.0.0) rack (2.0.5) @@ -721,7 +721,7 @@ DEPENDENCIES private_address_check (~> 0.4.1) pry-byebug (~> 3.6) pry-rails (~> 0.3) - puma (~> 3.11) + puma (~> 3.12) pundit (~> 1.1) rack-attack (~> 5.2) rack-cors (~> 1.0) @@ -765,4 +765,4 @@ RUBY VERSION ruby 2.5.0p0 BUNDLED WITH - 1.16.3 + 1.16.5 From 485dc7d5594b21add2ee0825c5940d053f8989ca Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 7 Oct 2018 04:40:37 +0200 Subject: [PATCH 078/274] Add fallback for PostgreSQL without upsert in CopyStatusStats (#8903) Fix #8590 --- .../20180812173710_copy_status_stats.rb | 50 +++++++++++++++---- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/db/migrate/20180812173710_copy_status_stats.rb b/db/migrate/20180812173710_copy_status_stats.rb index 850aa9c13..ff10c18d9 100644 --- a/db/migrate/20180812173710_copy_status_stats.rb +++ b/db/migrate/20180812173710_copy_status_stats.rb @@ -3,15 +3,10 @@ class CopyStatusStats < ActiveRecord::Migration[5.2] def up safety_assured do - Status.unscoped.select('id').find_in_batches(batch_size: 5_000) do |statuses| - execute <<-SQL.squish - INSERT INTO status_stats (status_id, reblogs_count, favourites_count, created_at, updated_at) - SELECT id, reblogs_count, favourites_count, created_at, updated_at - FROM statuses - WHERE id IN (#{statuses.map(&:id).join(', ')}) - ON CONFLICT (status_id) DO UPDATE - SET reblogs_count = EXCLUDED.reblogs_count, favourites_count = EXCLUDED.favourites_count - SQL + if supports_upsert? + up_fast + else + up_slow end end end @@ -19,4 +14,41 @@ class CopyStatusStats < ActiveRecord::Migration[5.2] def down # Nothing end + + private + + def supports_upsert? + version = select_one("SELECT current_setting('server_version_num') AS v")['v'].to_i + version >= 90500 + end + + def up_fast + say 'Upsert is available, importing counters using the fast method' + + Status.unscoped.select('id').find_in_batches(batch_size: 5_000) do |statuses| + execute <<-SQL.squish + INSERT INTO status_stats (status_id, reblogs_count, favourites_count, created_at, updated_at) + SELECT id, reblogs_count, favourites_count, created_at, updated_at + FROM statuses + WHERE id IN (#{statuses.map(&:id).join(', ')}) + ON CONFLICT (status_id) DO UPDATE + SET reblogs_count = EXCLUDED.reblogs_count, favourites_count = EXCLUDED.favourites_count + SQL + end + end + + def up_slow + say 'Upsert is not available in PostgreSQL below 9.5, falling back to slow import of counters' + + # We cannot use bulk INSERT or overarching transactions here because of possible + # uniqueness violations that we need to skip over + Status.unscoped.select('id, reblogs_count, favourites_count, created_at, updated_at').find_each do |status| + begin + params = [[nil, status.id], [nil, status.reblogs_count], [nil, status.favourites_count], [nil, status.created_at], [nil, status.updated_at]] + exec_insert('INSERT INTO status_stats (status_id, reblogs_count, favourites_count, created_at, updated_at) VALUES ($1, $2, $3, $4, $5)', nil, params) + rescue ActiveRecord::RecordNotUnique + next + end + end + end end From 6984396b1157df3754c5d2c85bcd02d0a7003df5 Mon Sep 17 00:00:00 2001 From: ThibG Date: Sun, 7 Oct 2018 19:45:40 +0200 Subject: [PATCH 079/274] Ensure only toots from the reported users are reported (#8916) --- app/controllers/api/v1/reports_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/v1/reports_controller.rb b/app/controllers/api/v1/reports_controller.rb index a954101cb..2aac5e61e 100644 --- a/app/controllers/api/v1/reports_controller.rb +++ b/app/controllers/api/v1/reports_controller.rb @@ -27,7 +27,7 @@ class Api::V1::ReportsController < Api::BaseController private def reported_status_ids - Status.find(status_ids).pluck(:id) + reported_account.statuses.find(status_ids).pluck(:id) end def status_ids From 65662b384742ba733dd590fd7eccb5abf8c6d0c8 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 7 Oct 2018 20:13:54 +0200 Subject: [PATCH 080/274] Bump version to 2.5.1 --- CHANGELOG.md | 10 ++++++++++ lib/mastodon/version.rb | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..220cb6591 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +## 2.5.1 + +- Fix some local images not having their EXIF metadata stripped on upload (#8714) +- Fix class autoloading issue in ActivityPub Create handler (#8820) +- Fix cache statistics not being sent via statsd when statsd enabled (#8831) +- Fix being able to enable a disabled relay via ActivityPub Accept handler (#8864) +- Bump nokogiri from 1.8.4 to 1.8.5 (#8881) +- Bump puma from 3.11.4 to 3.12.0 (#8883) +- Fix database migrations for PostgreSQL below 9.5 (#8903) +- Fix being able to report statuses not belonging to the reported account (#8916) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 0e41a9a6d..e6d3af35d 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 0 + 1 end def pre From 1787704e1c283410481b44cd0128dac8b52e087d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 12 Oct 2018 00:15:55 +0200 Subject: [PATCH 081/274] Improve signature verification safeguards (#8959) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Downcase signed_headers string before building the signed string The HTTP Signatures draft does not mandate the “headers” field to be downcased, but mandates the header field names to be downcased in the signed string, which means that prior to this patch, Mastodon could fail to process signatures from some compliant clients. It also means that it would not actually check the Digest of non-compliant clients that wouldn't use a lowercased Digest field name. Thankfully, I don't know of any such client. * Revert "Remove dead code (#8919)" This reverts commit a00ce8c92c06f42109aad5cfe65d46862cf037bb. * Restore time window checking, change it to 12 hours By checking the Date header, we can prevent replaying old vulnerable signatures. The focus is to prevent replaying old vulnerable requests from software that has been fixed in the meantime, so a somewhat long window should be fine and accounts for timezone misconfiguration. * Escape users' URLs when formatting them Fixes possible HTML injection * Escape all string interpolations in Formatter class Slightly improve performance by reducing class allocations from repeated Formatter#encode calls * Fix code style issues --- .../concerns/signature_verification.rb | 12 +++++++--- app/lib/formatter.rb | 16 ++++++++----- .../concerns/signature_verification_spec.rb | 24 +++++++++++++++++++ 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb index 4d77fa432..e5d5e2ca6 100644 --- a/app/controllers/concerns/signature_verification.rb +++ b/app/controllers/concerns/signature_verification.rb @@ -22,6 +22,12 @@ module SignatureVerification return end + if request.headers['Date'].present? && !matches_time_window? + @signature_verification_failure_reason = 'Signed request date outside acceptable time window' + @signed_request_account = nil + return + end + raw_signature = request.headers['Signature'] signature_params = {} @@ -76,7 +82,7 @@ module SignatureVerification def build_signed_string(signed_headers) signed_headers = 'date' if signed_headers.blank? - signed_headers.split(' ').map do |signed_header| + signed_headers.downcase.split(' ').map do |signed_header| if signed_header == Request::REQUEST_TARGET "#{Request::REQUEST_TARGET}: #{request.method.downcase} #{request.path}" elsif signed_header == 'digest' @@ -89,12 +95,12 @@ module SignatureVerification def matches_time_window? begin - time_sent = DateTime.httpdate(request.headers['Date']) + time_sent = Time.httpdate(request.headers['Date']) rescue ArgumentError return false end - (Time.now.utc - time_sent).abs <= 30 + (Time.now.utc - time_sent).abs <= 12.hours end def body_digest diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 8b694536c..35d5a09b7 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -90,8 +90,12 @@ class Formatter private + def html_entities + @html_entities ||= HTMLEntities.new + end + def encode(html) - HTMLEntities.new.encode(html) + html_entities.encode(html) end def encode_and_link_urls(html, accounts = nil, options = {}) @@ -143,7 +147,7 @@ class Formatter emoji = emoji_map[shortcode] if emoji - replacement = "\":#{shortcode}:\"" + replacement = "\":#{encode(shortcode)}:\"" before_html = shortname_start_index.positive? ? html[0..shortname_start_index - 1] : '' html = before_html + replacement + html[i + 1..-1] i += replacement.size - (shortcode.size + 2) - 1 @@ -212,7 +216,7 @@ class Formatter return link_to_account(acct) unless linkable_accounts account = linkable_accounts.find { |item| TagManager.instance.same_acct?(item.acct, acct) } - account ? mention_html(account) : "@#{acct}" + account ? mention_html(account) : "@#{encode(acct)}" end def link_to_account(acct) @@ -221,7 +225,7 @@ class Formatter domain = nil if TagManager.instance.local_domain?(domain) account = EntityCache.instance.mention(username, domain) - account ? mention_html(account) : "@#{acct}" + account ? mention_html(account) : "@#{encode(acct)}" end def link_to_hashtag(entity) @@ -239,10 +243,10 @@ class Formatter end def hashtag_html(tag) - "##{tag}" + "##{encode(tag)}" end def mention_html(account) - "@#{account.username}" + "@#{encode(account.username)}" end end diff --git a/spec/controllers/concerns/signature_verification_spec.rb b/spec/controllers/concerns/signature_verification_spec.rb index 3daf1fc4e..720690097 100644 --- a/spec/controllers/concerns/signature_verification_spec.rb +++ b/spec/controllers/concerns/signature_verification_spec.rb @@ -73,6 +73,30 @@ describe ApplicationController, type: :controller do end end + context 'with request older than a day' do + before do + get :success + + fake_request = Request.new(:get, request.url) + fake_request.add_headers({ 'Date' => 2.days.ago.utc.httpdate }) + fake_request.on_behalf_of(author) + + request.headers.merge!(fake_request.headers) + end + + describe '#signed_request?' do + it 'returns true' do + expect(controller.signed_request?).to be true + end + end + + describe '#signed_request_account' do + it 'returns nil' do + expect(controller.signed_request_account).to be_nil + end + end + end + context 'with body' do before do post :success, body: 'Hello world' From e8a4ba49cfda3b7461fe349266a6ea479e667bf5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 12 Oct 2018 00:22:38 +0200 Subject: [PATCH 082/274] Bump version to 2.5.2 --- CHANGELOG.md | 4 ++++ lib/mastodon/version.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 220cb6591..75a51fc7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.5.2 + +- Fix XSS vulnerability (#8959) + ## 2.5.1 - Fix some local images not having their EXIF metadata stripped on upload (#8714) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index e6d3af35d..a49e7f102 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 1 + 2 end def pre From 9454841a697e1e2aa8b7474865c33200df705d77 Mon Sep 17 00:00:00 2001 From: Alex Huddleston Date: Wed, 24 Oct 2018 00:19:17 +0000 Subject: [PATCH 083/274] Changes to themes. --- app/javascript/styles/werefox-wide.scss | 2 ++ app/javascript/styles/werefox.scss | 28 +++++++++++++++++++++++++ app/javascript/styles/wide.scss | 4 ++++ config/initializers/source.rb | 9 ++++++++ config/locales/en.yml | 4 +++- config/themes.yml | 4 +++- config/webpacker.yml | 2 +- 7 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 app/javascript/styles/werefox-wide.scss create mode 100644 app/javascript/styles/werefox.scss create mode 100644 app/javascript/styles/wide.scss create mode 100644 config/initializers/source.rb diff --git a/app/javascript/styles/werefox-wide.scss b/app/javascript/styles/werefox-wide.scss new file mode 100644 index 000000000..d044a62fe --- /dev/null +++ b/app/javascript/styles/werefox-wide.scss @@ -0,0 +1,2 @@ +@import 'wide'; +@import 'werefox'; diff --git a/app/javascript/styles/werefox.scss b/app/javascript/styles/werefox.scss new file mode 100644 index 000000000..9aeca694d --- /dev/null +++ b/app/javascript/styles/werefox.scss @@ -0,0 +1,28 @@ +// Commonly used web colors +$black: #3b3633; // Black +$white: #fafafa; // White +$success-green: #3e935b; // Padua +$error-red: #a3360a; // Cerise +$warning-red: #f9dfb6; // Sunset Orange +$gold-star: #faa41a; // Dark Goldenrod + +$base-shadow-color: #999; +$base-overlay-background: #3b3633; +$base-border-color: #fafafa; +$simple-background-color: #fafafa; +$primary-text-color: #fafafa; +$valid-value-color: #3e935b; +$error-value-color: #a3360a; + +// Values from the classic Mastodon UI +$classic-base-color: #2a2a2a; // WS Black +$classic-primary-color: #aaaaaa; // WS Light Gray +$classic-secondary-color: #9e9e9e; // WS Gray +$classic-highlight-color: #1c70ce; // WS Blue + +$ui-base-color: #2a2a2a; // WS Black +$ui-primary-color: #aaaaaa; // WS Light Gray +$ui-secondary-color: #9e9e9e; // WS Gray +$ui-highlight-color: #1c70ce; // WS Blue + +@import 'application'; diff --git a/app/javascript/styles/wide.scss b/app/javascript/styles/wide.scss new file mode 100644 index 000000000..9ea34d333 --- /dev/null +++ b/app/javascript/styles/wide.scss @@ -0,0 +1,4 @@ +.column { + flex-grow: 1 !important; + max-width: 540px; +} diff --git a/config/initializers/source.rb b/config/initializers/source.rb new file mode 100644 index 000000000..25c5129df --- /dev/null +++ b/config/initializers/source.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +module Mastodon + module Version + module_function + def source_base_url + 'https://github.com//mastodon' + end + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml index 501694eac..32a57f0f6 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -866,8 +866,10 @@ en: title: "%{instance} Terms of Service and Privacy Policy" themes: contrast: High contrast - default: Mastodon + default: Werefox Software Theme but W I D E + mastodon: Mastodon mastodon-light: Mastodon (light) + werefox: Werefox Software Theme time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/themes.yml b/config/themes.yml index 9c21c9459..a057112bb 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,3 +1,5 @@ -default: styles/application.scss +default: styles/werefox-wide.scss contrast: styles/contrast.scss +mastodon: styles/application.scss mastodon-light: styles/mastodon-light.scss +werefox: styles/werefox.scss diff --git a/config/webpacker.yml b/config/webpacker.yml index 8d8470651..dc21dc510 100644 --- a/config/webpacker.yml +++ b/config/webpacker.yml @@ -47,4 +47,4 @@ production: compile: false # Cache manifest.json for performance - cache_manifest: true + cache_manifest: false From fc856a5c4551eefc7fa06293026601af002631c7 Mon Sep 17 00:00:00 2001 From: Alex Huddleston Date: Wed, 24 Oct 2018 00:23:42 +0000 Subject: [PATCH 084/274] change to link to source code. --- config/initializers/source.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/source.rb b/config/initializers/source.rb index 25c5129df..f7efd4b93 100644 --- a/config/initializers/source.rb +++ b/config/initializers/source.rb @@ -3,7 +3,7 @@ module Mastodon module Version module_function def source_base_url - 'https://github.com//mastodon' + 'https://gitea.werefoxsoftware.com/shadow8t4/Mastodon' end end end From ce161bc978f0a8aebc4f462763b893df7cd8e777 Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 23 Oct 2018 22:56:13 -0500 Subject: [PATCH 085/274] use 2.5.3 for shadow8t4 --- .ruby-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ruby-version b/.ruby-version index 73462a5a1..aedc15bb0 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.5.1 +2.5.3 From 698976e3ca038ea9ad72a92fc1fac69e116ff6c7 Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 23 Oct 2018 23:05:27 -0500 Subject: [PATCH 086/274] Reset upstream settings --- config/initializers/source.rb | 2 +- config/settings.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/initializers/source.rb b/config/initializers/source.rb index f7efd4b93..3b77c80c9 100644 --- a/config/initializers/source.rb +++ b/config/initializers/source.rb @@ -3,7 +3,7 @@ module Mastodon module Version module_function def source_base_url - 'https://gitea.werefoxsoftware.com/shadow8t4/Mastodon' + 'https://git.asonix.dog/asonix/mastodon' end end end diff --git a/config/settings.yml b/config/settings.yml index 136baa29c..3d10eba0f 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -31,7 +31,7 @@ defaults: &defaults reduce_motion: false system_font_ui: false noindex: false - theme: 'werefox-wider' + theme: 'mastodon' notification_emails: follow: false reblog: false From ced44ac8484f15d7143f426f695b76033a943769 Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 30 Oct 2018 20:45:32 -0500 Subject: [PATCH 087/274] Update translations --- app/javascript/mastodon/locales/dog.json | 9 +++++-- app/javascript/mastodon/locales/lion.json | 7 +++++- app/javascript/mastodon/locales/squeak.json | 8 +++++- config/locales/dog.yml | 28 +++++++++++++++------ config/locales/lion.yml | 26 ++++++++++++++----- config/locales/simple_form.dog.yml | 18 +++++++------ config/locales/simple_form.lion.yml | 18 +++++++------ config/locales/simple_form.squeak.yml | 18 +++++++------ config/locales/squeak.yml | 26 ++++++++++++++----- 9 files changed, 114 insertions(+), 44 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index dea8d5129..8e55cb8f2 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -15,6 +15,7 @@ "account.follows.empty": "This dog doesn't follow anyone yet.", "account.follows_you": "In your pack", "account.hide_reblogs": "Hide awoos from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Bark at @{name}", "account.moved_to": "{name} has moved to:", @@ -90,6 +91,8 @@ "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this toot and re-draft it? You will lose all barks, awoos, and boops to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the toot you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Leave Pack", "confirmations.unfollow.message": "Are you sure you want to leave {name}'s pack?", "embed.instructions": "Embed this toot on your website by copying the code below.", @@ -192,7 +195,7 @@ "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Boops", - "navigation_bar.follow_requests": "Pack requests", + "navigation_bar.filters": "Muted words", "navigation_bar.follow_requests": "Pack requests", "navigation_bar.info": "About this instance", "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", @@ -215,7 +218,6 @@ "notifications.column_settings.follow": "New pack members:", "notifications.column_settings.mention": "Barks:", "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.push_meta": "This device", "notifications.column_settings.reblog": "Awoos:", "notifications.column_settings.show": "Show in column", "notifications.column_settings.sound": "Play sound", @@ -294,6 +296,7 @@ "status.open": "Expand this toot", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Awoo", "status.reblog_private": "Awoo to original audience", "status.reblogged_by": "{name} awooed", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federated", "tabs_bar.home": "Home", "tabs_bar.local_timeline": "Local", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index bf3c16a8d..29bed3dca 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -15,6 +15,7 @@ "account.follows.empty": "This lion doesn't follow anyone yet.", "account.follows_you": "In your pride", "account.hide_reblogs": "Hide roars from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Meow at @{name}", "account.moved_to": "{name} has moved to:", @@ -90,6 +91,8 @@ "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this toot and re-draft it? You will lose all meows, roars, and boops to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the toot you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Leave Pride", "confirmations.unfollow.message": "Are you sure you want to leave {name}'s pride?", "embed.instructions": "Embed this toot on your website by copying the code below.", @@ -215,7 +218,6 @@ "notifications.column_settings.follow": "New pride members:", "notifications.column_settings.mention": "Meows:", "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.push_meta": "This device", "notifications.column_settings.reblog": "Roars:", "notifications.column_settings.show": "Show in column", "notifications.column_settings.sound": "Play sound", @@ -294,6 +296,7 @@ "status.open": "Expand this toot", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Roar", "status.reblog_private": "Roar to original audience", "status.reblogged_by": "{name} roared", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federated", "tabs_bar.home": "Home", "tabs_bar.local_timeline": "Local", diff --git a/app/javascript/mastodon/locales/squeak.json b/app/javascript/mastodon/locales/squeak.json index 6a4faf932..28efab291 100644 --- a/app/javascript/mastodon/locales/squeak.json +++ b/app/javascript/mastodon/locales/squeak.json @@ -15,6 +15,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Follows you", "account.hide_reblogs": "Hide pumps from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", "account.media": "Media", "account.mention": "Mention @{name}", "account.moved_to": "{name} has moved to:", @@ -90,6 +91,8 @@ "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, pumps and squeaks to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -142,6 +145,7 @@ "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to squeak", @@ -214,7 +218,6 @@ "notifications.column_settings.follow": "New followers:", "notifications.column_settings.mention": "Mentions:", "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.push_meta": "This device", "notifications.column_settings.reblog": "Pumps:", "notifications.column_settings.show": "Show in column", "notifications.column_settings.sound": "Play sound", @@ -293,6 +296,7 @@ "status.open": "Expand this status", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Pump", "status.reblog_private": "Pump to original audience", "status.reblogged_by": "{name} pumped", @@ -310,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federated", "tabs_bar.home": "Home", "tabs_bar.local_timeline": "Local", diff --git a/config/locales/dog.yml b/config/locales/dog.yml index a59595237..3fa46138c 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -48,6 +48,7 @@ dog: other: Pack Members following: Joined Packs joined: Joined %{date} + link_verified_on: Ownership of this link was checked on %{date} media: Media moved_html: "%{name} has moved to %{new_profile_link}:" network_hidden: This information is not available @@ -120,13 +121,14 @@ dog: moderation_notes: Moderation notes most_recent_activity: Most recent activity most_recent_ip: Most recent IP + no_limits_imposed: No limits imposed not_subscribed: Not subscribed order: alphabetic: Alphabetic most_recent: Most recent title: Order outbox_url: Outbox URL - perform_full_suspension: Perform full suspension + perform_full_suspension: Suspend profile_url: Profile URL promote: Promote protocol: Protocol @@ -155,8 +157,10 @@ dog: report: report targeted_reports: Reports made about this account silence: Silence + silenced: Silenced statuses: Toots subscribe: Subscribe + suspended: Suspended title: Accounts unconfirmed_email: Unconfirmed E-mail undo_silenced: Undo silence @@ -173,6 +177,7 @@ dog: create_domain_block: "%{name} blocked domain %{target}" create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" demote_user: "%{name} demoted dog %{target}" + destroy_custom_emoji: "%{name} destroyed emoji %{target}" destroy_domain_block: "%{name} unblocked domain %{target}" destroy_email_domain_block: "%{name} whitelisted e-mail domain %{target}" destroy_status: "%{name} removed toot by %{target}" @@ -258,6 +263,8 @@ dog: title: New domain block reject_media: Reject media files reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions + reject_reports: Reject reports + reject_reports_hint: Ignore all reports coming from this domain. Irrelevant for suspensions severities: noop: None silence: Silence @@ -300,8 +307,13 @@ dog: title: Invites relays: add_new: Add new relay + delete: Delete description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local dogs manually following other people on remote servers. + disable: Disable + disabled: Disabled + enable: Enable enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. + enabled: Enabled inbox_url: Relay URL pending: Waiting for relay's approval save_and_enable: Save and enable @@ -322,7 +334,6 @@ dog: comment: none: None created_at: Reported - id: ID mark_as_resolved: Mark as resolved mark_as_unresolved: Mark as unresolved notes: @@ -333,20 +344,15 @@ dog: placeholder: Describe what actions have been taken, or any other related updates... reopen: Reopen report report: 'Report #%{id}' - report_contents: Contents reported_account: Reported account reported_by: Reported by resolved: Resolved resolved_msg: Report successfully resolved! silence_account: Silence account - status: Toot - suspend_account: Suspend account - target: Target title: Reports unassign: Unassign unresolved: Unresolved updated_at: Updated - view: View settings: activity_api_enabled: desc_html: Counts of locally posted toots, active dogs, and new registrations in weekly buckets @@ -363,6 +369,9 @@ dog: hero: desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to instance thumbnail title: Hero image + mascot: + desc_html: Displayed on multiple pages. At least 293×205px recommended. When not set, falls back to default mascot + title: Mascot image peers_api_enabled: desc_html: Domain names this instance has encountered in the fediverse title: Publish list of discovered instances @@ -571,6 +580,7 @@ dog: resources: Resources generic: changes_saved_msg: Changes successfully saved! + copy: Copy save_changes: Save changes validation_errors: one: Something isn't quite right yet! Please review the error below @@ -921,8 +931,12 @@ dog: tips: Tips title: Welcome aboard, %{name}! users: + follow_limit_reached: You cannot follow more than %{limit} people invalid_email: The e-mail address is invalid invalid_otp_token: Invalid two-factor code otp_lost_help_html: If you lost access to both, you may get in touch with %{email} seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available. signed_in_as: 'Signed in as:' + verification: + explanation_html: 'You can verify yourself as the owner of the links in your profile metadata. For that, the linked website must contain a link back to your Mastodon profile. The link back must have a rel="me" attribute. The text content of the link does not matter. Here is an example:' + verification: Verification diff --git a/config/locales/lion.yml b/config/locales/lion.yml index e8f6b4038..af355f37a 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -48,6 +48,7 @@ lion: other: Pride Members following: Following joined: Joined %{date} + link_verified_on: Ownership of this link was checked on %{date} media: Media moved_html: "%{name} has moved to %{new_profile_link}:" network_hidden: This information is not available @@ -120,6 +121,7 @@ lion: moderation_notes: Moderation notes most_recent_activity: Most recent activity most_recent_ip: Most recent IP + no_limits_imposed: No limits imposed not_subscribed: Not subscribed order: alphabetic: Alphabetic @@ -155,8 +157,10 @@ lion: report: report targeted_reports: Reports made about this account silence: Silence + silenced: Silenced statuses: Toots subscribe: Subscribe + suspended: Suspended title: Accounts unconfirmed_email: Unconfirmed E-mail undo_silenced: Undo silence @@ -173,6 +177,7 @@ lion: create_domain_block: "%{name} blocked domain %{target}" create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" demote_user: "%{name} demoted lion %{target}" + destroy_custom_emoji: "%{name} destroyed emoji %{target}" destroy_domain_block: "%{name} unblocked domain %{target}" destroy_email_domain_block: "%{name} whitelisted e-mail domain %{target}" destroy_status: "%{name} removed toot by %{target}" @@ -258,6 +263,8 @@ lion: title: New domain block reject_media: Reject media files reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions + reject_reports: Reject reports + reject_reports_hint: Ignore all reports coming from this domain. Irrelevant for suspensions severities: noop: None silence: Silence @@ -300,8 +307,13 @@ lion: title: Invites relays: add_new: Add new relay + delete: Delete description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. + disable: Disable + disabled: Disabled + enable: Enable enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. + enabled: Enabled inbox_url: Relay URL pending: Waiting for relay's approval save_and_enable: Save and enable @@ -322,7 +334,6 @@ lion: comment: none: None created_at: Reported - id: ID mark_as_resolved: Mark as resolved mark_as_unresolved: Mark as unresolved notes: @@ -333,20 +344,15 @@ lion: placeholder: Describe what actions have been taken, or any other related updates... reopen: Reopen report report: 'Report #%{id}' - report_contents: Contents reported_account: Reported account reported_by: Reported by resolved: Resolved resolved_msg: Report successfully resolved! silence_account: Silence account - status: Toot - suspend_account: Suspend account - target: Target title: Reports unassign: Unassign unresolved: Unresolved updated_at: Updated - view: View settings: activity_api_enabled: desc_html: Counts of locally posted toots, active lions, and new registrations in weekly buckets @@ -363,6 +369,9 @@ lion: hero: desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to instance thumbnail title: Hero image + mascot: + desc_html: Displayed on multiple pages. At least 293×205px recommended. When not set, falls back to default mascot + title: Mascot image peers_api_enabled: desc_html: Domain names this instance has encountered in the fediverse title: Publish list of discovered instances @@ -571,6 +580,7 @@ lion: resources: Resources generic: changes_saved_msg: Changes successfully saved! + copy: Copy save_changes: Save changes validation_errors: one: Something isn't quite right yet! Please review the error below @@ -921,8 +931,12 @@ lion: tips: Tips title: Welcome aboard, %{name}! users: + follow_limit_reached: You cannot follow more than %{limit} people invalid_email: The e-mail address is invalid invalid_otp_token: Invalid two-factor code otp_lost_help_html: If you lost access to both, you may get in touch with %{email} seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available. signed_in_as: 'Signed in as:' + verification: + explanation_html: 'You can verify yourself as the owner of the links in your profile metadata. For that, the linked website must contain a link back to your Mastodon profile. The link back must have a rel="me" attribute. The text content of the link does not matter. Here is an example:' + verification: Verification diff --git a/config/locales/simple_form.dog.yml b/config/locales/simple_form.dog.yml index 7565d982c..4909dd76d 100644 --- a/config/locales/simple_form.dog.yml +++ b/config/locales/simple_form.dog.yml @@ -8,24 +8,24 @@ dog: bot: This account mainly performs automated actions and might not be monitored context: One or multiple contexts where the filter should apply digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence - display_name: - one: 1 character left - other: %{count} characters left + email: You will be sent a confirmation e-mail fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px inbox_url: Copy the URL from the frontpage of the relay you want to use irreversible: Filtered toots will disappear irreversibly, even if filter is later removed locale: The language of the user interface, e-mails and push notifications locked: Requires you to manually approve followers - note: - one: 1 character left - other: %{count} characters left + password: Use at least 8 characters phrase: Will be matched regardless of casing in text or content warning of a toot scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. setting_default_language: The language of your toots can be detected automatically, but it's not always accurate + setting_display_media_default: Hide media marked as sensitive + setting_display_media_hide_all: Always hide all media + setting_display_media_show_all: Always show media marked as sensitive setting_hide_network: Who you follow and who follows you will not be shown on your profile setting_noindex: Affects your public profile and status pages setting_theme: Affects how Mastodon looks when you're logged in from any device. + username: Your username will be unique on %{domain} whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word imports: data: CSV file exported from another Mastodon instance @@ -69,7 +69,11 @@ dog: setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot - setting_display_sensitive_media: Always show media marked as sensitive + setting_display_media: Media display + setting_display_media_default: Default + setting_display_media_hide_all: Hide all + setting_display_media_show_all: Show all + setting_expand_spoilers: Always expand toots marked with content warnings setting_hide_network: Hide your network setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations diff --git a/config/locales/simple_form.lion.yml b/config/locales/simple_form.lion.yml index 2602f7cd4..28ef0a1fc 100644 --- a/config/locales/simple_form.lion.yml +++ b/config/locales/simple_form.lion.yml @@ -8,24 +8,24 @@ lion: bot: This account mainly performs automated actions and might not be monitored context: One or multiple contexts where the filter should apply digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence - display_name: - one: 1 character left - other: %{count} characters left + email: You will be sent a confirmation e-mail fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px inbox_url: Copy the URL from the frontpage of the relay you want to use irreversible: Filtered toots will disappear irreversibly, even if filter is later removed locale: The language of the user interface, e-mails and push notifications locked: Requires you to manually approve followers - note: - one: 1 character left - other: %{count} characters left + password: Use at least 8 characters phrase: Will be matched regardless of casing in text or content warning of a toot scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. setting_default_language: The language of your toots can be detected automatically, but it's not always accurate + setting_display_media_default: Hide media marked as sensitive + setting_display_media_hide_all: Always hide all media + setting_display_media_show_all: Always show media marked as sensitive setting_hide_network: Who you follow and who follows you will not be shown on your profile setting_noindex: Affects your public profile and status pages setting_theme: Affects how Mastodon looks when you're logged in from any device. + username: Your username will be unique on %{domain} whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word imports: data: CSV file exported from another Mastodon instance @@ -69,7 +69,11 @@ lion: setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot - setting_display_sensitive_media: Always show media marked as sensitive + setting_display_media: Media display + setting_display_media_default: Default + setting_display_media_hide_all: Hide all + setting_display_media_show_all: Show all + setting_expand_spoilers: Always expand toots marked with content warnings setting_hide_network: Hide your network setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations diff --git a/config/locales/simple_form.squeak.yml b/config/locales/simple_form.squeak.yml index f083bd027..e70a6b2f5 100644 --- a/config/locales/simple_form.squeak.yml +++ b/config/locales/simple_form.squeak.yml @@ -8,24 +8,24 @@ squeak: bot: This account mainly performs automated actions and might not be monitored context: One or multiple contexts where the filter should apply digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence - display_name: - one: 1 character left - other: %{count} characters left + email: You will be sent a confirmation e-mail fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px inbox_url: Copy the URL from the frontpage of the relay you want to use irreversible: Filtered toots will disappear irreversibly, even if filter is later removed locale: The language of the user interface, e-mails and push notifications locked: Requires you to manually approve followers - note: - one: 1 character left - other: %{count} characters left + password: Use at least 8 characters phrase: Will be matched regardless of casing in text or content warning of a toot scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. setting_default_language: The language of your toots can be detected automatically, but it's not always accurate + setting_display_media_default: Hide media marked as sensitive + setting_display_media_hide_all: Always hide all media + setting_display_media_show_all: Always show media marked as sensitive setting_hide_network: Who you follow and who follows you will not be shown on your profile setting_noindex: Affects your public profile and status pages setting_theme: Affects how Mastodon looks when you're logged in from any device. + username: Your username will be unique on %{domain} whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word imports: data: CSV file exported from another Mastodon instance @@ -69,7 +69,11 @@ squeak: setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot - setting_display_sensitive_media: Always show media marked as sensitive + setting_display_media: Media display + setting_display_media_default: Default + setting_display_media_hide_all: Hide all + setting_display_media_show_all: Show all + setting_expand_spoilers: Always expand toots marked with content warnings setting_hide_network: Hide your network setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations diff --git a/config/locales/squeak.yml b/config/locales/squeak.yml index a78db4cd5..c8c842ba2 100644 --- a/config/locales/squeak.yml +++ b/config/locales/squeak.yml @@ -48,6 +48,7 @@ squeak: other: Followers following: Following joined: Joined %{date} + link_verified_on: Ownership of this link was checked on %{date} media: Media moved_html: "%{name} has moved to %{new_profile_link}:" network_hidden: This information is not available @@ -120,6 +121,7 @@ squeak: moderation_notes: Moderation notes most_recent_activity: Most recent activity most_recent_ip: Most recent IP + no_limits_imposed: No limits imposed not_subscribed: Not subscribed order: alphabetic: Alphabetic @@ -155,8 +157,10 @@ squeak: report: report targeted_reports: Reports made about this account silence: Silence + silenced: Silenced statuses: Statuses subscribe: Subscribe + suspended: Suspended title: Accounts unconfirmed_email: Unconfirmed E-mail undo_silenced: Undo silence @@ -173,6 +177,7 @@ squeak: create_domain_block: "%{name} blocked domain %{target}" create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" demote_user: "%{name} demoted user %{target}" + destroy_custom_emoji: "%{name} destroyed emoji %{target}" destroy_domain_block: "%{name} unblocked domain %{target}" destroy_email_domain_block: "%{name} whitelisted e-mail domain %{target}" destroy_status: "%{name} removed status by %{target}" @@ -258,6 +263,8 @@ squeak: title: New domain block reject_media: Reject media files reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions + reject_reports: Reject reports + reject_reports_hint: Ignore all reports coming from this domain. Irrelevant for suspensions severities: noop: None silence: Silence @@ -300,8 +307,13 @@ squeak: title: Invites relays: add_new: Add new relay + delete: Delete description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. + disable: Disable + disabled: Disabled + enable: Enable enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it. + enabled: Enabled inbox_url: Relay URL pending: Waiting for relay's approval save_and_enable: Save and enable @@ -322,7 +334,6 @@ squeak: comment: none: None created_at: Reported - id: ID mark_as_resolved: Mark as resolved mark_as_unresolved: Mark as unresolved notes: @@ -333,20 +344,15 @@ squeak: placeholder: Describe what actions have been taken, or any other related updates... reopen: Reopen report report: 'Report #%{id}' - report_contents: Contents reported_account: Reported account reported_by: Reported by resolved: Resolved resolved_msg: Report successfully resolved! - silence_account: Silence account status: Status - suspend_account: Suspend account - target: Target title: Reports unassign: Unassign unresolved: Unresolved updated_at: Updated - view: View settings: activity_api_enabled: desc_html: Counts of locally posted statuses, active users, and new registrations in weekly buckets @@ -363,6 +369,9 @@ squeak: hero: desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to instance thumbnail title: Hero image + mascot: + desc_html: Displayed on multiple pages. At least 293×205px recommended. When not set, falls back to default mascot + title: Mascot image peers_api_enabled: desc_html: Domain names this instance has encountered in the fediverse title: Publish list of discovered instances @@ -571,6 +580,7 @@ squeak: resources: Resources generic: changes_saved_msg: Changes successfully saved! + copy: Copy save_changes: Save changes validation_errors: one: Something isn't quite right yet! Please review the error below @@ -921,8 +931,12 @@ squeak: tips: Tips title: Welcome aboard, %{name}! users: + follow_limit_reached: You cannot follow more than %{limit} people invalid_email: The e-mail address is invalid invalid_otp_token: Invalid two-factor code otp_lost_help_html: If you lost access to both, you may get in touch with %{email} seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available. signed_in_as: 'Signed in as:' + verification: + explanation_html: 'You can verify yourself as the owner of the links in your profile metadata. For that, the linked website must contain a link back to your Mastodon profile. The link back must have a rel="me" attribute. The text content of the link does not matter. Here is an example:' + verification: Verification From 449e6e451f6185c44ed3b2d60b56b46b55e52281 Mon Sep 17 00:00:00 2001 From: Steven Tappert Date: Mon, 5 Nov 2018 18:51:43 +0100 Subject: [PATCH 088/274] Check for empty "last_status" before sorting DM column (#9207) * Check for empty "last_status" before sorting * Small touchups for codeclimate --- app/javascript/mastodon/reducers/conversations.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/reducers/conversations.js b/app/javascript/mastodon/reducers/conversations.js index b13a9fdf4..955a07754 100644 --- a/app/javascript/mastodon/reducers/conversations.js +++ b/app/javascript/mastodon/reducers/conversations.js @@ -56,7 +56,13 @@ const expandNormalizedConversations = (state, conversations, next) => { list = list.concat(items); - return list.sortBy(x => x.get('last_status'), (a, b) => compareId(a, b) * -1); + return list.sortBy(x => x.get('last_status'), (a, b) => { + if(a === null || b === null) { + return -1; + } + + return compareId(a, b) * -1; + }); }); } From 430499fbe12057b833897dada6407c55a0dab048 Mon Sep 17 00:00:00 2001 From: "m.b" Date: Mon, 5 Nov 2018 18:54:07 +0100 Subject: [PATCH 089/274] Update resolve_url_service.rb (#9188) --- app/services/resolve_url_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/resolve_url_service.rb b/app/services/resolve_url_service.rb index 1db1917e2..ed0c56923 100644 --- a/app/services/resolve_url_service.rb +++ b/app/services/resolve_url_service.rb @@ -20,7 +20,7 @@ class ResolveURLService < BaseService def process_url if equals_or_includes_any?(type, %w(Application Group Organization Person Service)) FetchRemoteAccountService.new.call(atom_url, body, protocol) - elsif equals_or_includes_any?(type, %w(Note Article Image Video)) + elsif equals_or_includes_any?(type, %w(Note Article Image Video Page)) FetchRemoteStatusService.new.call(atom_url, body, protocol) end end From 5ee4fd46063a2c36d92805ede4b8860065e56dc2 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 8 Nov 2018 07:42:17 +0100 Subject: [PATCH 090/274] Increase default column width from 330px to 350px (#9227) --- app/javascript/styles/mastodon/components.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index e5d9f7b9f..6e535baed 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1847,7 +1847,7 @@ a.account__display-name { } .column { - width: 330px; + width: 350px; position: relative; box-sizing: border-box; display: flex; From 330401bec0146be9762358c774efe9a58954d8c4 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 8 Nov 2018 21:05:42 +0100 Subject: [PATCH 091/274] Optimize the process of following someone (#9220) * Eliminate extra accounts select query from FollowService * Optimistically update follow state in web UI and hide loading bar Fix #6205 * Asynchronize NotifyService in FollowService And fix failing test * Skip Webfinger resolve routine when called from FollowService if possible If an account is ActivityPub, then webfinger re-resolving is not necessary when called from FollowService. Improve options of ResolveAccountService --- app/controllers/api/v1/accounts_controller.rb | 2 +- app/javascript/mastodon/actions/accounts.js | 18 ++++++++--- .../mastodon/reducers/relationships.js | 12 +++++++ app/services/concerns/author_extractor.rb | 2 +- app/services/follow_service.rb | 8 ++--- app/services/process_mentions_service.rb | 2 +- app/services/resolve_account_service.rb | 32 ++++++++++++------- app/workers/local_notification_worker.rb | 13 ++++++-- .../authorize_interactions_controller_spec.rb | 4 ++- 9 files changed, 67 insertions(+), 26 deletions(-) diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index 1d5372a8c..f711c4676 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -17,7 +17,7 @@ class Api::V1::AccountsController < Api::BaseController end def follow - FollowService.new.call(current_user.account, @account.acct, reblogs: truthy_param?(:reblogs)) + FollowService.new.call(current_user.account, @account, reblogs: truthy_param?(:reblogs)) options = @account.locked? ? {} : { following_map: { @account.id => { reblogs: truthy_param?(:reblogs) } }, requested_map: { @account.id => false } } diff --git a/app/javascript/mastodon/actions/accounts.js b/app/javascript/mastodon/actions/accounts.js index cbae62a0f..d4a824e2c 100644 --- a/app/javascript/mastodon/actions/accounts.js +++ b/app/javascript/mastodon/actions/accounts.js @@ -145,12 +145,14 @@ export function fetchAccountFail(id, error) { export function followAccount(id, reblogs = true) { return (dispatch, getState) => { const alreadyFollowing = getState().getIn(['relationships', id, 'following']); - dispatch(followAccountRequest(id)); + const locked = getState().getIn(['accounts', id, 'locked'], false); + + dispatch(followAccountRequest(id, locked)); api(getState).post(`/api/v1/accounts/${id}/follow`, { reblogs }).then(response => { dispatch(followAccountSuccess(response.data, alreadyFollowing)); }).catch(error => { - dispatch(followAccountFail(error)); + dispatch(followAccountFail(error, locked)); }); }; }; @@ -167,10 +169,12 @@ export function unfollowAccount(id) { }; }; -export function followAccountRequest(id) { +export function followAccountRequest(id, locked) { return { type: ACCOUNT_FOLLOW_REQUEST, id, + locked, + skipLoading: true, }; }; @@ -179,13 +183,16 @@ export function followAccountSuccess(relationship, alreadyFollowing) { type: ACCOUNT_FOLLOW_SUCCESS, relationship, alreadyFollowing, + skipLoading: true, }; }; -export function followAccountFail(error) { +export function followAccountFail(error, locked) { return { type: ACCOUNT_FOLLOW_FAIL, error, + locked, + skipLoading: true, }; }; @@ -193,6 +200,7 @@ export function unfollowAccountRequest(id) { return { type: ACCOUNT_UNFOLLOW_REQUEST, id, + skipLoading: true, }; }; @@ -201,6 +209,7 @@ export function unfollowAccountSuccess(relationship, statuses) { type: ACCOUNT_UNFOLLOW_SUCCESS, relationship, statuses, + skipLoading: true, }; }; @@ -208,6 +217,7 @@ export function unfollowAccountFail(error) { return { type: ACCOUNT_UNFOLLOW_FAIL, error, + skipLoading: true, }; }; diff --git a/app/javascript/mastodon/reducers/relationships.js b/app/javascript/mastodon/reducers/relationships.js index f46049297..8322780de 100644 --- a/app/javascript/mastodon/reducers/relationships.js +++ b/app/javascript/mastodon/reducers/relationships.js @@ -1,6 +1,10 @@ import { ACCOUNT_FOLLOW_SUCCESS, + ACCOUNT_FOLLOW_REQUEST, + ACCOUNT_FOLLOW_FAIL, ACCOUNT_UNFOLLOW_SUCCESS, + ACCOUNT_UNFOLLOW_REQUEST, + ACCOUNT_UNFOLLOW_FAIL, ACCOUNT_BLOCK_SUCCESS, ACCOUNT_UNBLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS, @@ -37,6 +41,14 @@ const initialState = ImmutableMap(); export default function relationships(state = initialState, action) { switch(action.type) { + case ACCOUNT_FOLLOW_REQUEST: + return state.setIn([action.id, action.locked ? 'requested' : 'following'], true); + case ACCOUNT_FOLLOW_FAIL: + return state.setIn([action.id, action.locked ? 'requested' : 'following'], false); + case ACCOUNT_UNFOLLOW_REQUEST: + return state.setIn([action.id, 'following'], false); + case ACCOUNT_UNFOLLOW_FAIL: + return state.setIn([action.id, 'following'], true); case ACCOUNT_FOLLOW_SUCCESS: case ACCOUNT_UNFOLLOW_SUCCESS: case ACCOUNT_BLOCK_SUCCESS: diff --git a/app/services/concerns/author_extractor.rb b/app/services/concerns/author_extractor.rb index 1e00eb803..c2419e9ec 100644 --- a/app/services/concerns/author_extractor.rb +++ b/app/services/concerns/author_extractor.rb @@ -18,6 +18,6 @@ module AuthorExtractor acct = "#{username}@#{domain}" end - ResolveAccountService.new.call(acct, update_profile) + ResolveAccountService.new.call(acct, update_profile: update_profile) end end diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb index f6888a68d..0020bc9fe 100644 --- a/app/services/follow_service.rb +++ b/app/services/follow_service.rb @@ -7,9 +7,9 @@ class FollowService < BaseService # @param [Account] source_account From which to follow # @param [String, Account] uri User URI to follow in the form of username@domain (or account record) # @param [true, false, nil] reblogs Whether or not to show reblogs, defaults to true - def call(source_account, uri, reblogs: nil) + def call(source_account, target_account, reblogs: nil) reblogs = true if reblogs.nil? - target_account = uri.is_a?(Account) ? uri : ResolveAccountService.new.call(uri) + target_account = ResolveAccountService.new.call(target_account, skip_webfinger: true) raise ActiveRecord::RecordNotFound if target_account.nil? || target_account.id == source_account.id || target_account.suspended? raise Mastodon::NotPermittedError if target_account.blocking?(source_account) || source_account.blocking?(target_account) @@ -42,7 +42,7 @@ class FollowService < BaseService follow_request = FollowRequest.create!(account: source_account, target_account: target_account, show_reblogs: reblogs) if target_account.local? - NotifyService.new.call(target_account, follow_request) + LocalNotificationWorker.perform_async(target_account.id, follow_request.id, follow_request.class.name) elsif target_account.ostatus? NotificationWorker.perform_async(build_follow_request_xml(follow_request), source_account.id, target_account.id) AfterRemoteFollowRequestWorker.perform_async(follow_request.id) @@ -57,7 +57,7 @@ class FollowService < BaseService follow = source_account.follow!(target_account, reblogs: reblogs) if target_account.local? - NotifyService.new.call(target_account, follow) + LocalNotificationWorker.perform_async(target_account.id, follow.id, follow.class.name) else Pubsubhubbub::SubscribeWorker.perform_async(target_account.id) unless target_account.subscribed? NotificationWorker.perform_async(build_follow_xml(follow), source_account.id, target_account.id) diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb index b4641c4b4..ec7d33b1d 100644 --- a/app/services/process_mentions_service.rb +++ b/app/services/process_mentions_service.rb @@ -47,7 +47,7 @@ class ProcessMentionsService < BaseService mentioned_account = mention.account if mentioned_account.local? - LocalNotificationWorker.perform_async(mention.id) + LocalNotificationWorker.perform_async(mentioned_account.id, mention.id, mention.class.name) elsif mentioned_account.ostatus? && !@status.stream_entry.hidden? NotificationWorker.perform_async(ostatus_xml, @status.account_id, mentioned_account.id) elsif mentioned_account.activitypub? diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb index 4323e7f06..c3064211d 100644 --- a/app/services/resolve_account_service.rb +++ b/app/services/resolve_account_service.rb @@ -9,17 +9,27 @@ class ResolveAccountService < BaseService # Find or create a local account for a remote user. # When creating, look up the user's webfinger and fetch all # important information from their feed - # @param [String] uri User URI in the form of username@domain + # @param [String, Account] uri User URI in the form of username@domain + # @param [Hash] options # @return [Account] - def call(uri, update_profile = true, redirected = nil) - @username, @domain = uri.split('@') - @update_profile = update_profile + def call(uri, options = {}) + @options = options - return Account.find_local(@username) if TagManager.instance.local_domain?(@domain) + if uri.is_a?(Account) + @account = uri + @username = @account.username + @domain = @account.domain - @account = Account.find_remote(@username, @domain) + return @account if @account.local? || !webfinger_update_due? + else + @username, @domain = uri.split('@') - return @account unless webfinger_update_due? + return Account.find_local(@username) if TagManager.instance.local_domain?(@domain) + + @account = Account.find_remote(@username, @domain) + + return @account unless webfinger_update_due? + end Rails.logger.debug "Looking up webfinger for #{uri}" @@ -30,8 +40,8 @@ class ResolveAccountService < BaseService if confirmed_username.casecmp(@username).zero? && confirmed_domain.casecmp(@domain).zero? @username = confirmed_username @domain = confirmed_domain - elsif redirected.nil? - return call("#{confirmed_username}@#{confirmed_domain}", update_profile, true) + elsif options[:redirected].nil? + return call("#{confirmed_username}@#{confirmed_domain}", options.merge(redirected: true)) else Rails.logger.debug 'Requested and returned acct URIs do not match' return @@ -76,7 +86,7 @@ class ResolveAccountService < BaseService end def webfinger_update_due? - @account.nil? || @account.possibly_stale? + @account.nil? || ((!@options[:skip_webfinger] || @account.ostatus?) && @account.possibly_stale?) end def activitypub_ready? @@ -93,7 +103,7 @@ class ResolveAccountService < BaseService end def update_profile? - @update_profile + @options[:update_profile] end def handle_activitypub diff --git a/app/workers/local_notification_worker.rb b/app/workers/local_notification_worker.rb index 748270563..48635e498 100644 --- a/app/workers/local_notification_worker.rb +++ b/app/workers/local_notification_worker.rb @@ -3,9 +3,16 @@ class LocalNotificationWorker include Sidekiq::Worker - def perform(mention_id) - mention = Mention.find(mention_id) - NotifyService.new.call(mention.account, mention) + def perform(receiver_account_id, activity_id = nil, activity_class_name = nil) + if activity_id.nil? && activity_class_name.nil? + activity = Mention.find(receiver_account_id) + receiver = activity.account + else + receiver = Account.find(receiver_account_id) + activity = activity_class_name.constantize.find(activity_id) + end + + NotifyService.new.call(receiver, activity) rescue ActiveRecord::RecordNotFound true end diff --git a/spec/controllers/authorize_interactions_controller_spec.rb b/spec/controllers/authorize_interactions_controller_spec.rb index 81fd9ceb7..ce4257b68 100644 --- a/spec/controllers/authorize_interactions_controller_spec.rb +++ b/spec/controllers/authorize_interactions_controller_spec.rb @@ -99,10 +99,12 @@ describe AuthorizeInteractionsController do allow(ResolveAccountService).to receive(:new).and_return(service) allow(service).to receive(:call).with('user@hostname').and_return(target_account) + allow(service).to receive(:call).with(target_account, skip_webfinger: true).and_return(target_account) + post :create, params: { acct: 'acct:user@hostname' } - expect(service).to have_received(:call).with('user@hostname') + expect(service).to have_received(:call).with(target_account, skip_webfinger: true) expect(account.following?(target_account)).to be true expect(response).to render_template(:success) end From b3c29ece478d2e34525b4edb9b4eaed4904b1cb5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 8 Nov 2018 21:06:01 +0100 Subject: [PATCH 092/274] Fix follow limit validator reporting lower number past threshold (#9230) * Fix follow limit validator reporting lower number past threshold * Avoid floating point follow limit --- app/validators/follow_limit_validator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/validators/follow_limit_validator.rb b/app/validators/follow_limit_validator.rb index eb083ed85..409bf0176 100644 --- a/app/validators/follow_limit_validator.rb +++ b/app/validators/follow_limit_validator.rb @@ -14,7 +14,7 @@ class FollowLimitValidator < ActiveModel::Validator if account.following_count < LIMIT LIMIT else - account.followers_count * RATIO + [(account.followers_count * RATIO).round, LIMIT].max end end end From 4b2f2548061cbbe37a98951c01438e327c915c92 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 8 Nov 2018 21:06:14 +0100 Subject: [PATCH 093/274] Fix form validation flash message color and input borders (#9235) * Fix form validation flash message color and input borders * Fix typo --- app/javascript/styles/mastodon/forms.scss | 7 +++++-- app/views/shared/_error_messages.html.haml | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 8c4c934ea..46ef85774 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -330,9 +330,12 @@ code { } input[type=text], + input[type=number], input[type=email], - input[type=password] { - border-bottom-color: $valid-value-color; + input[type=password], + textarea, + select { + border-color: lighten($error-red, 12%); } .error { diff --git a/app/views/shared/_error_messages.html.haml b/app/views/shared/_error_messages.html.haml index b73890216..28becd6c4 100644 --- a/app/views/shared/_error_messages.html.haml +++ b/app/views/shared/_error_messages.html.haml @@ -1,3 +1,3 @@ - if object.errors.any? - .flash-message#error_explanation + .flash-message.alert#error_explanation %strong= t('generic.validation_errors', count: object.errors.count) From 21fd335dd7722d512962e5f49812b3e9a0cd426f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 8 Nov 2018 21:06:26 +0100 Subject: [PATCH 094/274] Display amount of freed disk space in tootctl media remove (#9229) * Display amount of freed disk space in tootctl media remove Fix #9213 * Fix code style issue --- lib/mastodon/media_cli.rb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb index 179d1b6b5..affc4cedb 100644 --- a/lib/mastodon/media_cli.rb +++ b/lib/mastodon/media_cli.rb @@ -6,6 +6,8 @@ require_relative 'cli_helper' module Mastodon class MediaCLI < Thor + include ActionView::Helpers::NumberHelper + def self.exit_on_failure? true end @@ -36,11 +38,13 @@ module Mastodon time_ago = options[:days].days.ago queued = 0 processed = 0 - dry_run = options[:dry_run] ? '(DRY RUN)' : '' + size = 0 + dry_run = options[:dry_run] ? '(DRY RUN)' : '' if options[:background] - MediaAttachment.where.not(remote_url: '').where.not(file_file_name: nil).where('created_at < ?', time_ago).select(:id).reorder(nil).find_in_batches do |media_attachments| + MediaAttachment.where.not(remote_url: '').where.not(file_file_name: nil).where('created_at < ?', time_ago).select(:id, :file_file_size).reorder(nil).find_in_batches do |media_attachments| queued += media_attachments.size + size += media_attachments.reduce(0) { |sum, m| sum + (m.file_file_size || 0) } Maintenance::UncacheMediaWorker.push_bulk(media_attachments.map(&:id)) unless options[:dry_run] end else @@ -49,6 +53,7 @@ module Mastodon Maintenance::UncacheMediaWorker.new.perform(m) unless options[:dry_run] options[:verbose] ? say(m.id) : say('.', :green, false) processed += 1 + size += m.file_file_size end end end @@ -56,9 +61,9 @@ module Mastodon say if options[:background] - say("Scheduled the deletion of #{queued} media attachments #{dry_run}", :green, true) + say("Scheduled the deletion of #{queued} media attachments (approx. #{number_to_human_size(size)}) #{dry_run}", :green, true) else - say("Removed #{processed} media attachments #{dry_run}", :green, true) + say("Removed #{processed} media attachments (approx. #{number_to_human_size(size)}) #{dry_run}", :green, true) end end end From 0f436de035d848ce481a1d21a774031eef41f10d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 8 Nov 2018 21:08:57 +0100 Subject: [PATCH 095/274] Add "Show thread" link to self-replies (#9228) Fix #4716 --- app/javascript/mastodon/components/status.js | 9 ++++++++- app/javascript/mastodon/components/status_action_bar.js | 5 +---- app/javascript/mastodon/components/status_list.js | 2 ++ .../mastodon/features/status/components/action_bar.js | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 9fa8cc008..fd0780025 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -67,6 +67,7 @@ class Status extends ImmutablePureComponent { unread: PropTypes.bool, onMoveUp: PropTypes.func, onMoveDown: PropTypes.func, + showThread: PropTypes.bool, }; // Avoid checking props that are functions (and whose equality will always @@ -168,7 +169,7 @@ class Status extends ImmutablePureComponent { let media = null; let statusAvatar, prepend, rebloggedByText; - const { intl, hidden, featured, otherAccounts, unread } = this.props; + const { intl, hidden, featured, otherAccounts, unread, showThread } = this.props; let { status, account, ...other } = this.props; @@ -309,6 +310,12 @@ class Status extends ImmutablePureComponent { {media} + {showThread && status.get('in_reply_to_id') && status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) && ( + + )} +
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index e7e5b0a6c..68a1fda24 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -148,7 +148,6 @@ class StatusActionBar extends ImmutablePureComponent { let menu = []; let reblogIcon = 'retweet'; - let replyIcon; let replyTitle; menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen }); @@ -191,10 +190,8 @@ class StatusActionBar extends ImmutablePureComponent { } if (status.get('in_reply_to_id', null) === null) { - replyIcon = 'reply'; replyTitle = intl.formatMessage(messages.reply); } else { - replyIcon = 'reply-all'; replyTitle = intl.formatMessage(messages.replyAll); } @@ -204,7 +201,7 @@ class StatusActionBar extends ImmutablePureComponent { return (
-
{obfuscatedCount(status.get('replies_count'))}
+
{obfuscatedCount(status.get('replies_count'))}
{shareButton} diff --git a/app/javascript/mastodon/components/status_list.js b/app/javascript/mastodon/components/status_list.js index 37f21fb44..f3e304618 100644 --- a/app/javascript/mastodon/components/status_list.js +++ b/app/javascript/mastodon/components/status_list.js @@ -104,6 +104,7 @@ export default class StatusList extends ImmutablePureComponent { onMoveUp={this.handleMoveUp} onMoveDown={this.handleMoveDown} contextType={timelineId} + showThread /> )) ) : null; @@ -117,6 +118,7 @@ export default class StatusList extends ImmutablePureComponent { onMoveUp={this.handleMoveUp} onMoveDown={this.handleMoveDown} contextType={timelineId} + showThread /> )).concat(scrollableContent); } diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js index fa6fd56e5..565009be2 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.js +++ b/app/javascript/mastodon/features/status/components/action_bar.js @@ -159,7 +159,7 @@ class ActionBar extends React.PureComponent { return (
-
+
{shareButton} From 63f168c3bf26f8c336d966b3619307801cab7cab Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 8 Nov 2018 21:55:59 +0100 Subject: [PATCH 096/274] Fix nil error regression from #9229 in tootctl media remove (#9239) Fix #9237 --- lib/mastodon/media_cli.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb index affc4cedb..99660dd1d 100644 --- a/lib/mastodon/media_cli.rb +++ b/lib/mastodon/media_cli.rb @@ -53,7 +53,7 @@ module Mastodon Maintenance::UncacheMediaWorker.new.perform(m) unless options[:dry_run] options[:verbose] ? say(m.id) : say('.', :green, false) processed += 1 - size += m.file_file_size + size += m.file_file_size || 0 end end end From f73b7e77dacd94c1d0c7c4bc0c0227eb3159ad19 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 9 Nov 2018 09:08:01 +0100 Subject: [PATCH 097/274] Improve ActiveRecord connection in on_worker_boot (#9238) This is how it looks in the example in the Puma README --- config/puma.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/puma.rb b/config/puma.rb index 5ebf5ed19..1afdb1c6d 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -13,7 +13,9 @@ workers ENV.fetch('WEB_CONCURRENCY') { 2 } preload_app! on_worker_boot do - ActiveRecord::Base.establish_connection if defined?(ActiveRecord) + ActiveSupport.on_load(:active_record) do + ActiveRecord::Base.establish_connection + end end plugin :tmp_restart From d06a724b1c097b4e8b7f1fa2591b0753c349a5ad Mon Sep 17 00:00:00 2001 From: ThibG Date: Sat, 10 Nov 2018 20:42:04 +0100 Subject: [PATCH 098/274] Check that twitter:player is valid before using it (#9254) Fixes #9251 --- app/services/fetch_link_card_service.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index 3e77579bb..38c578de2 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -136,14 +136,15 @@ class FetchLinkCardService < BaseService detector = CharlockHolmes::EncodingDetector.new detector.strip_tags = true - guess = detector.detect(@html, @html_charset) - page = Nokogiri::HTML(@html, nil, guess&.fetch(:encoding, nil)) + guess = detector.detect(@html, @html_charset) + page = Nokogiri::HTML(@html, nil, guess&.fetch(:encoding, nil)) + player_url = meta_property(page, 'twitter:player') - if meta_property(page, 'twitter:player') + if player_url && !bad_url?(Addressable::URI.parse(player_url)) @card.type = :video @card.width = meta_property(page, 'twitter:player:width') || 0 @card.height = meta_property(page, 'twitter:player:height') || 0 - @card.html = content_tag(:iframe, nil, src: meta_property(page, 'twitter:player'), + @card.html = content_tag(:iframe, nil, src: player_url, width: @card.width, height: @card.height, allowtransparency: 'true', From 886ef1cc384f758944407ac0255afe7d71afc513 Mon Sep 17 00:00:00 2001 From: ThibG Date: Sat, 10 Nov 2018 23:59:51 +0100 Subject: [PATCH 099/274] Fix emoji update date processing (#9255) --- app/lib/activitypub/activity/create.rb | 2 +- app/services/activitypub/process_account_service.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 45079e2b3..9d2ddd3f6 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -177,7 +177,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity updated = tag['updated'] emoji = CustomEmoji.find_by(shortcode: shortcode, domain: @account.domain) - return unless emoji.nil? || image_url != emoji.image_remote_url || (updated && emoji.updated_at >= updated) + return unless emoji.nil? || image_url != emoji.image_remote_url || (updated && updated >= emoji.updated_at) emoji ||= CustomEmoji.new(domain: @account.domain, shortcode: shortcode, uri: uri) emoji.image_remote_url = image_url diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index c77858f1d..5c865dae2 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -232,7 +232,7 @@ class ActivityPub::ProcessAccountService < BaseService updated = tag['updated'] emoji = CustomEmoji.find_by(shortcode: shortcode, domain: @account.domain) - return unless emoji.nil? || image_url != emoji.image_remote_url || (updated && emoji.updated_at >= updated) + return unless emoji.nil? || image_url != emoji.image_remote_url || (updated && updated >= emoji.updated_at) emoji ||= CustomEmoji.new(domain: @account.domain, shortcode: shortcode, uri: uri) emoji.image_remote_url = image_url From 4ce6ed20211b83d36746f61d4fb7dd001339baa1 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 12 Nov 2018 18:17:50 +0100 Subject: [PATCH 100/274] Perform deep comparison for card data when receiving new props (#9270) Fixes #9226 --- app/javascript/mastodon/features/status/components/card.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/status/components/card.js b/app/javascript/mastodon/features/status/components/card.js index 743fe779a..3474a11e5 100644 --- a/app/javascript/mastodon/features/status/components/card.js +++ b/app/javascript/mastodon/features/status/components/card.js @@ -73,7 +73,7 @@ export default class Card extends React.PureComponent { }; componentWillReceiveProps (nextProps) { - if (this.props.card !== nextProps.card) { + if (!this.props.card.equals(nextProps.card)) { this.setState({ embedded: false }); } } From cd8575aef671dd44b4384b79b568f367add43537 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 12 Nov 2018 22:07:31 +0100 Subject: [PATCH 101/274] Fix null error introduced in #9270 (#9275) --- app/javascript/mastodon/features/status/components/card.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/status/components/card.js b/app/javascript/mastodon/features/status/components/card.js index 3474a11e5..235d209b8 100644 --- a/app/javascript/mastodon/features/status/components/card.js +++ b/app/javascript/mastodon/features/status/components/card.js @@ -73,7 +73,7 @@ export default class Card extends React.PureComponent { }; componentWillReceiveProps (nextProps) { - if (!this.props.card.equals(nextProps.card)) { + if (!Immutable.is(this.props.card, nextProps.card)) { this.setState({ embedded: false }); } } From a3ef0761602481515207c0cf93cae0119dff4b25 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 13 Nov 2018 14:58:14 +0100 Subject: [PATCH 102/274] Fix race condition causing shallow status with only a "favourited" attribute (#9272) Fixes #9231 --- app/javascript/mastodon/reducers/statuses.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js index 6e3d830da..885cc221c 100644 --- a/app/javascript/mastodon/reducers/statuses.js +++ b/app/javascript/mastodon/reducers/statuses.js @@ -38,11 +38,11 @@ export default function statuses(state = initialState, action) { case FAVOURITE_REQUEST: return state.setIn([action.status.get('id'), 'favourited'], true); case FAVOURITE_FAIL: - return state.setIn([action.status.get('id'), 'favourited'], false); + return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'favourited'], false); case REBLOG_REQUEST: return state.setIn([action.status.get('id'), 'reblogged'], true); case REBLOG_FAIL: - return state.setIn([action.status.get('id'), 'reblogged'], false); + return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'reblogged'], false); case STATUS_MUTE_SUCCESS: return state.setIn([action.id, 'muted'], true); case STATUS_UNMUTE_SUCCESS: From 01a8ab921e6e2b23cfea834c63b2cd196d15ff0b Mon Sep 17 00:00:00 2001 From: mayaeh Date: Fri, 16 Nov 2018 17:47:40 +0900 Subject: [PATCH 103/274] Fix "tootctl media remove" can't count the file size (#9288) * Fixed an issue where "tootctl media remove" can not count the file size. * Fixed the problem pointed out by codeclimate. --- lib/mastodon/media_cli.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb index 99660dd1d..6152d5a09 100644 --- a/lib/mastodon/media_cli.rb +++ b/lib/mastodon/media_cli.rb @@ -50,10 +50,10 @@ module Mastodon else MediaAttachment.where.not(remote_url: '').where.not(file_file_name: nil).where('created_at < ?', time_ago).reorder(nil).find_in_batches do |media_attachments| media_attachments.each do |m| + size += m.file_file_size || 0 Maintenance::UncacheMediaWorker.new.perform(m) unless options[:dry_run] options[:verbose] ? say(m.id) : say('.', :green, false) processed += 1 - size += m.file_file_size || 0 end end end From 6d4438a6ae351e2a8a73c7373c22d28f10838f65 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 16 Nov 2018 15:02:18 +0100 Subject: [PATCH 104/274] Remove intermediary arrays when creating hash maps from results (#9291) --- app/controllers/application_controller.rb | 2 +- app/lib/entity_cache.rb | 2 +- app/lib/formatter.rb | 4 ++-- app/lib/settings/scoped_settings.rb | 4 ++-- app/models/concerns/account_interactions.rb | 4 ++-- app/models/notification.rb | 2 +- app/models/setting.rb | 2 +- app/models/status.rb | 10 +++++----- app/models/trending_tags.rb | 2 +- app/services/batched_remove_status_service.rb | 6 +++--- spec/models/notification_spec.rb | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7bb14aa4c..b54e7b008 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -113,7 +113,7 @@ class ApplicationController < ActionController::Base klass.reload_stale_associations!(cached_keys_with_value.values) if klass.respond_to?(:reload_stale_associations!) unless uncached_ids.empty? - uncached = klass.where(id: uncached_ids).with_includes.map { |item| [item.id, item] }.to_h + uncached = klass.where(id: uncached_ids).with_includes.each_with_object({}) { |item, h| h[item.id] = item } uncached.each_value do |item| Rails.cache.write(item, item) diff --git a/app/lib/entity_cache.rb b/app/lib/entity_cache.rb index 2aa37389c..8fff544a0 100644 --- a/app/lib/entity_cache.rb +++ b/app/lib/entity_cache.rb @@ -21,7 +21,7 @@ class EntityCache end unless uncached_ids.empty? - uncached = CustomEmoji.where(shortcode: shortcodes, domain: domain, disabled: false).map { |item| [item.shortcode, item] }.to_h + uncached = CustomEmoji.where(shortcode: shortcodes, domain: domain, disabled: false).each_with_object({}) { |item, h| h[item.shortcode] = item } uncached.each_value { |item| Rails.cache.write(to_key(:emoji, item.shortcode, domain), item, expires_in: MAX_EXPIRATION) } end diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index d13884ec8..05fd9eeb1 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -128,9 +128,9 @@ class Formatter return html if emojis.empty? emoji_map = if animate - emojis.map { |e| [e.shortcode, full_asset_url(e.image.url)] }.to_h + emojis.each_with_object({}) { |e, h| h[e.shortcode] = full_asset_url(e.image.url) } else - emojis.map { |e| [e.shortcode, full_asset_url(e.image.url(:static))] }.to_h + emojis.each_with_object({}) { |e, h| h[e.shortcode] = full_asset_url(e.image.url(:static)) } end i = -1 diff --git a/app/lib/settings/scoped_settings.rb b/app/lib/settings/scoped_settings.rb index 5ee30825d..3653ab114 100644 --- a/app/lib/settings/scoped_settings.rb +++ b/app/lib/settings/scoped_settings.rb @@ -31,7 +31,7 @@ module Settings def all_as_records vars = thing_scoped - records = vars.map { |r| [r.var, r] }.to_h + records = vars.each_with_object({}) { |r, h| h[r.var] = r } Setting.default_settings.each do |key, default_value| next if records.key?(key) || default_value.is_a?(Hash) @@ -65,7 +65,7 @@ module Settings class << self def default_settings - defaulting = DEFAULTING_TO_UNSCOPED.map { |k| [k, Setting[k]] }.to_h + defaulting = DEFAULTING_TO_UNSCOPED.each_with_object({}) { |k, h| h[k] = Setting[k] } Setting.default_settings.merge!(defaulting) end end diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb index f5f833446..ad2909d91 100644 --- a/app/models/concerns/account_interactions.rb +++ b/app/models/concerns/account_interactions.rb @@ -45,9 +45,9 @@ module AccountInteractions end def domain_blocking_map(target_account_ids, account_id) - accounts_map = Account.where(id: target_account_ids).select('id, domain').map { |a| [a.id, a.domain] }.to_h + accounts_map = Account.where(id: target_account_ids).select('id, domain').each_with_object({}) { |a, h| h[a.id] = a.domain } blocked_domains = domain_blocking_map_by_domain(accounts_map.values.compact, account_id) - accounts_map.map { |id, domain| [id, blocked_domains[domain]] }.to_h + accounts_map.reduce({}) { |h, (id, domain)| h.merge(id => blocked_domains[domain]) } end def domain_blocking_map_by_domain(target_domains, account_id) diff --git a/app/models/notification.rb b/app/models/notification.rb index 78b180301..4233532d0 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -75,7 +75,7 @@ class Notification < ApplicationRecord return if account_ids.empty? - accounts = Account.where(id: account_ids).map { |a| [a.id, a] }.to_h + accounts = Account.where(id: account_ids).each_with_object({}) { |a, h| h[a.id] = a } cached_items.each do |item| item.from_account = accounts[item.from_account_id] diff --git a/app/models/setting.rb b/app/models/setting.rb index 033d09fd5..a5878e96a 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -40,7 +40,7 @@ class Setting < RailsSettings::Base def all_as_records vars = thing_scoped - records = vars.map { |r| [r.var, r] }.to_h + records = vars.each_with_object({}) { |r, h| h[r.var] = r } default_settings.each do |key, default_value| next if records.key?(key) || default_value.is_a?(Hash) diff --git a/app/models/status.rb b/app/models/status.rb index 32fedb924..a7216f910 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -310,19 +310,19 @@ class Status < ApplicationRecord end def favourites_map(status_ids, account_id) - Favourite.select('status_id').where(status_id: status_ids).where(account_id: account_id).map { |f| [f.status_id, true] }.to_h + Favourite.select('status_id').where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |f, h| h[f.status_id] = true } end def reblogs_map(status_ids, account_id) - select('reblog_of_id').where(reblog_of_id: status_ids).where(account_id: account_id).reorder(nil).map { |s| [s.reblog_of_id, true] }.to_h + select('reblog_of_id').where(reblog_of_id: status_ids).where(account_id: account_id).reorder(nil).each_with_object({}) { |s, h| h[s.reblog_of_id] = true } end def mutes_map(conversation_ids, account_id) - ConversationMute.select('conversation_id').where(conversation_id: conversation_ids).where(account_id: account_id).map { |m| [m.conversation_id, true] }.to_h + ConversationMute.select('conversation_id').where(conversation_id: conversation_ids).where(account_id: account_id).each_with_object({}) { |m, h| h[m.conversation_id] = true } end def pins_map(status_ids, account_id) - StatusPin.select('status_id').where(status_id: status_ids).where(account_id: account_id).map { |p| [p.status_id, true] }.to_h + StatusPin.select('status_id').where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |p, h| h[p.status_id] = true } end def reload_stale_associations!(cached_items) @@ -337,7 +337,7 @@ class Status < ApplicationRecord return if account_ids.empty? - accounts = Account.where(id: account_ids).map { |a| [a.id, a] }.to_h + accounts = Account.where(id: account_ids).each_with_object({}) { |a, h| h[a.id] = a } cached_items.each do |item| item.account = accounts[item.account_id] diff --git a/app/models/trending_tags.rb b/app/models/trending_tags.rb index c559651c6..3a8be2164 100644 --- a/app/models/trending_tags.rb +++ b/app/models/trending_tags.rb @@ -18,7 +18,7 @@ class TrendingTags def get(limit) key = "#{KEY}:#{Time.now.utc.beginning_of_day.to_i}" tag_ids = redis.zrevrange(key, 0, limit - 1).map(&:to_i) - tags = Tag.where(id: tag_ids).to_a.map { |tag| [tag.id, tag] }.to_h + tags = Tag.where(id: tag_ids).to_a.each_with_object({}) { |tag, h| h[tag.id] = tag } tag_ids.map { |tag_id| tags[tag_id] }.compact end diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb index b8ab58938..75d756495 100644 --- a/app/services/batched_remove_status_service.rb +++ b/app/services/batched_remove_status_service.rb @@ -12,12 +12,12 @@ class BatchedRemoveStatusService < BaseService def call(statuses) statuses = Status.where(id: statuses.map(&:id)).includes(:account, :stream_entry).flat_map { |status| [status] + status.reblogs.includes(:account, :stream_entry).to_a } - @mentions = statuses.map { |s| [s.id, s.active_mentions.includes(:account).to_a] }.to_h - @tags = statuses.map { |s| [s.id, s.tags.pluck(:name)] }.to_h + @mentions = statuses.each_with_object({}) { |s, h| h[s.id] = s.active_mentions.includes(:account).to_a } + @tags = statuses.each_with_object({}) { |s, h| h[s.id] = s.tags.pluck(:name) } @stream_entry_batches = [] @salmon_batches = [] - @json_payloads = statuses.map { |s| [s.id, Oj.dump(event: :delete, payload: s.id.to_s)] }.to_h + @json_payloads = statuses.each_with_object({}) { |s, h| h[s.id] = Oj.dump(event: :delete, payload: s.id.to_s) } @activity_xml = {} # Ensure that rendered XML reflects destroyed state diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb index c781f2a29..be5545646 100644 --- a/spec/models/notification_spec.rb +++ b/spec/models/notification_spec.rb @@ -101,7 +101,7 @@ RSpec.describe Notification, type: :model do before do allow(accounts_with_ids).to receive(:[]).with(stale_account1.id).and_return(account1) allow(accounts_with_ids).to receive(:[]).with(stale_account2.id).and_return(account2) - allow(Account).to receive_message_chain(:where, :map, :to_h).and_return(accounts_with_ids) + allow(Account).to receive_message_chain(:where, :each_with_object).and_return(accounts_with_ids) end let(:cached_items) do From ecc58c0f2358ea764c4a4ebd7f9daf4c9143ec7a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 16 Nov 2018 19:46:23 +0100 Subject: [PATCH 105/274] Prevent multiple handlers for Delete of Actor from running (#9292) --- app/lib/activitypub/activity.rb | 6 ++++++ app/lib/activitypub/activity/delete.rb | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 999954cb5..0a729011f 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -129,4 +129,10 @@ class ActivityPub::Activity ::FetchRemoteStatusService.new.call(@object['url']) end end + + def lock_or_return(key, expire_after = 7.days.seconds) + yield if redis.set(key, true, nx: true, ex: expire_after) + ensure + redis.del(key) + end end diff --git a/app/lib/activitypub/activity/delete.rb b/app/lib/activitypub/activity/delete.rb index 457047ac0..8270fed1b 100644 --- a/app/lib/activitypub/activity/delete.rb +++ b/app/lib/activitypub/activity/delete.rb @@ -12,8 +12,10 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity private def delete_person - SuspendAccountService.new.call(@account) - @account.destroy! + lock_or_return("delete_in_progress:#{@account.id}") do + SuspendAccountService.new.call(@account) + @account.destroy! + end end def delete_note From fa02f878fc6fdbc1aae8d3f45e71b4aeb589e7ea Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 19 Nov 2018 10:37:57 +0100 Subject: [PATCH 106/274] Fix filter ID not being a string in REST API (#9303) --- app/serializers/rest/filter_serializer.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/serializers/rest/filter_serializer.rb b/app/serializers/rest/filter_serializer.rb index 3134be371..57205630b 100644 --- a/app/serializers/rest/filter_serializer.rb +++ b/app/serializers/rest/filter_serializer.rb @@ -3,4 +3,8 @@ class REST::FilterSerializer < ActiveModel::Serializer attributes :id, :phrase, :context, :whole_word, :expires_at, :irreversible + + def id + object.id.to_s + end end From c0736c466c33473b4db55bf59ed6edc0a0020b27 Mon Sep 17 00:00:00 2001 From: Dan Hunsaker Date: Tue, 20 Nov 2018 14:24:35 -0700 Subject: [PATCH 107/274] Update Nginx config for Nanobox apps (#9310) The Nanobox files have gotten out of sync, a touch, with what Masto needs for Nginx settings. This PR updates them accordingly. --- nanobox/nginx-local.conf | 2 +- nanobox/nginx-stream.conf.erb | 2 +- nanobox/nginx-web.conf.erb | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/nanobox/nginx-local.conf b/nanobox/nginx-local.conf index f56339cac..c0e883603 100644 --- a/nanobox/nginx-local.conf +++ b/nanobox/nginx-local.conf @@ -38,7 +38,7 @@ http { root /app/public; - client_max_body_size 8M; + client_max_body_size 80M; location / { try_files $uri @rails; diff --git a/nanobox/nginx-stream.conf.erb b/nanobox/nginx-stream.conf.erb index 2a047dd9f..12bcc8ca5 100644 --- a/nanobox/nginx-stream.conf.erb +++ b/nanobox/nginx-stream.conf.erb @@ -32,7 +32,7 @@ http { listen 8080; add_header Strict-Transport-Security "max-age=31536000"; - add_header Content-Security-Policy "style-src 'self' 'unsafe-inline'; script-src 'self'; object-src 'self'; img-src data: https:; media-src data: https:; connect-src 'self' wss://<%= ENV["LOCAL_DOMAIN"] %>; upgrade-insecure-requests"; + # add_header Content-Security-Policy "style-src 'self' 'unsafe-inline'; script-src 'self'; object-src 'self'; img-src data: https:; media-src data: https:; connect-src 'self' wss://<%= ENV["LOCAL_DOMAIN"] %>; upgrade-insecure-requests"; root /app/public; diff --git a/nanobox/nginx-web.conf.erb b/nanobox/nginx-web.conf.erb index 797201eab..d96f1bfc7 100644 --- a/nanobox/nginx-web.conf.erb +++ b/nanobox/nginx-web.conf.erb @@ -32,11 +32,11 @@ http { listen 8080; add_header Strict-Transport-Security "max-age=31536000"; - add_header Content-Security-Policy "style-src 'self' 'unsafe-inline'; script-src 'self'; object-src 'self'; img-src data: https:; media-src data: https:; connect-src 'self' wss://<%= ENV["LOCAL_DOMAIN"] %>; upgrade-insecure-requests"; + # add_header Content-Security-Policy "style-src 'self' 'unsafe-inline'; script-src 'self'; object-src 'self'; img-src data: https:; media-src data: https:; connect-src 'self' wss://<%= ENV["LOCAL_DOMAIN"] %>; upgrade-insecure-requests"; root /app/public; - client_max_body_size 8M; + client_max_body_size 80M; location / { try_files $uri @rails; From 2c36d357848c7d7cb64da6fd3464306ea6729da7 Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Tue, 20 Nov 2018 22:25:04 +0100 Subject: [PATCH 108/274] WebSub: ATOM before RSS (#9302) Hello, The ATOM feed contains the hub declaration for WebSub, but the RSS version does not. RSS/ATOM readers will typically pick whichever version comes first, and will thus not see the WebSub feature. I therefore suggest putting the ATOM version first, as it is more feature-rich than its RSS counterpart is. Clients not compatible with ATOM would not pick it anyway due to the different type attribute. A more complicated alternative would be to declare the WebSub feature in the RSS version as well, using something like the following code, and ensuring that clients subscribed to the RSS version would receive PuSH updates just like those subscribed to the ATOM version. ````xml ``` --- app/views/accounts/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml index b825b82cb..0ee9dd7de 100644 --- a/app/views/accounts/show.html.haml +++ b/app/views/accounts/show.html.haml @@ -8,8 +8,8 @@ %meta{ name: 'robots', content: 'noindex' }/ %link{ rel: 'salmon', href: api_salmon_url(@account.id) }/ - %link{ rel: 'alternate', type: 'application/rss+xml', href: account_url(@account, format: 'rss') }/ %link{ rel: 'alternate', type: 'application/atom+xml', href: account_url(@account, format: 'atom') }/ + %link{ rel: 'alternate', type: 'application/rss+xml', href: account_url(@account, format: 'rss') }/ %link{ rel: 'alternate', type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(@account) }/ - if @older_url From 15dcb414bf2faaf21a686aa467015d244743c04e Mon Sep 17 00:00:00 2001 From: "Renato \"Lond\" Cerqueira" Date: Tue, 20 Nov 2018 22:25:32 +0100 Subject: [PATCH 109/274] Touch account on successful response, change char shown when culled (#9293) Just the color is not enough change since not everyone uses colored terminals. Touching the account makes it so that the account is not in the threshold window in case of running again --- lib/mastodon/accounts_cli.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb index 142436c19..9f7870bcd 100644 --- a/lib/mastodon/accounts_cli.rb +++ b/lib/mastodon/accounts_cli.rb @@ -242,8 +242,9 @@ module Mastodon end culled += 1 - say('.', :green, false) + say('+', :green, false) else + account.touch # Touch account even during dry run to avoid getting the account into the window again say('.', nil, false) end end From 12bdd7dc5f05e1b9eecf3b56dbcc24cf77bee884 Mon Sep 17 00:00:00 2001 From: valerauko Date: Thu, 22 Nov 2018 20:49:07 +0900 Subject: [PATCH 110/274] Ignore JSON-LD profile in mime type comparison (#9179) Ignore JSON-LD profile in mime type comparison --- app/services/fetch_atom_service.rb | 4 ++-- spec/services/fetch_atom_service_spec.rb | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/app/services/fetch_atom_service.rb b/app/services/fetch_atom_service.rb index 550e75f33..d6508a988 100644 --- a/app/services/fetch_atom_service.rb +++ b/app/services/fetch_atom_service.rb @@ -29,7 +29,7 @@ class FetchAtomService < BaseService def perform_request(&block) accept = 'text/html' - accept = 'application/activity+json, application/ld+json, application/atom+xml, ' + accept unless @unsupported_activity + accept = 'application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams", application/atom+xml, ' + accept unless @unsupported_activity Request.new(:get, @url).add_headers('Accept' => accept).perform(&block) end @@ -39,7 +39,7 @@ class FetchAtomService < BaseService if response.mime_type == 'application/atom+xml' [@url, { prefetched_body: response.body_with_limit }, :ostatus] - elsif ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(response.mime_type) + elsif ['application/activity+json', 'application/ld+json'].include?(response.mime_type) body = response.body_with_limit json = body_to_json(body) if supported_context?(json) && equals_or_includes_any?(json['type'], ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES) && json['inbox'].present? diff --git a/spec/services/fetch_atom_service_spec.rb b/spec/services/fetch_atom_service_spec.rb index 30e5b0935..495540004 100644 --- a/spec/services/fetch_atom_service_spec.rb +++ b/spec/services/fetch_atom_service_spec.rb @@ -60,8 +60,15 @@ RSpec.describe FetchAtomService, type: :service do it { is_expected.to eq [url, { :prefetched_body => "" }, :ostatus] } end - context 'content_type is json' do - let(:content_type) { 'application/activity+json' } + context 'content_type is activity+json' do + let(:content_type) { 'application/activity+json; charset=utf-8' } + let(:body) { json } + + it { is_expected.to eq [1, { prefetched_body: body, id: true }, :activitypub] } + end + + context 'content_type is ld+json with profile' do + let(:content_type) { 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' } let(:body) { json } it { is_expected.to eq [1, { prefetched_body: body, id: true }, :activitypub] } From a2cda74ba3cf6690f257ae612f28e890b7df2237 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 22 Nov 2018 20:12:04 +0100 Subject: [PATCH 111/274] Fix connect timeout not being enforced (#9329) * Fix connect timeout not being enforced The loop was catching the timeout exception that should stop execution, so the next IP would no longer be within a timed block, which led to requests taking much longer than 10 seconds. * Use timeout on each IP attempt, but limit to 2 attempts * Fix code style issue * Do not break Request#perform if no block given * Update method stub in spec for Request * Move timeout inside the begin/rescue block * Use Resolv::DNS with timeout of 1 to get IP addresses * Update Request spec to stub Resolv::DNS instead of Addrinfo * Fix Resolve::DNS stubs in Request spec --- app/lib/request.rb | 32 +++++++++++++++++++++++--------- spec/lib/request_spec.rb | 17 +++++++++++------ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/app/lib/request.rb b/app/lib/request.rb index 36c211dbf..bb6ef4661 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -2,6 +2,7 @@ require 'ipaddr' require 'socket' +require 'resolv' class Request REQUEST_TARGET = '(request-target)' @@ -45,7 +46,7 @@ class Request end begin - yield response.extend(ClientLimit) + yield response.extend(ClientLimit) if block_given? ensure http_client.close end @@ -94,7 +95,7 @@ class Request end def timeout - { write: 10, connect: 10, read: 10 } + { connect: nil, read: 10, write: 10 } end def http_client @@ -139,16 +140,29 @@ class Request class Socket < TCPSocket class << self def open(host, *args) - return super host, *args if thru_hidden_service? host + return super(host, *args) if thru_hidden_service?(host) + outer_e = nil - Addrinfo.foreach(host, nil, nil, :SOCK_STREAM) do |address| - begin - raise Mastodon::HostValidationError if PrivateAddressCheck.private_address? IPAddr.new(address.ip_address) - return super address.ip_address, *args - rescue => e - outer_e = e + + Resolv::DNS.open do |dns| + dns.timeouts = 1 + + addresses = dns.getaddresses(host).take(2) + time_slot = 10.0 / addresses.size + + addresses.each do |address| + begin + raise Mastodon::HostValidationError if PrivateAddressCheck.private_address?(IPAddr.new(address.to_s)) + + ::Timeout.timeout(time_slot, HTTP::TimeoutError) do + return super(address.to_s, *args) + end + rescue => e + outer_e = e + end end end + raise outer_e if outer_e end diff --git a/spec/lib/request_spec.rb b/spec/lib/request_spec.rb index 8cc5d90ce..2d300f18d 100644 --- a/spec/lib/request_spec.rb +++ b/spec/lib/request_spec.rb @@ -48,9 +48,11 @@ describe Request do end it 'executes a HTTP request when the first address is private' do - allow(Addrinfo).to receive(:foreach).with('example.com', nil, nil, :SOCK_STREAM) - .and_yield(Addrinfo.new(["AF_INET", 0, "example.com", "0.0.0.0"], :PF_INET, :SOCK_STREAM)) - .and_yield(Addrinfo.new(["AF_INET6", 0, "example.com", "2001:4860:4860::8844"], :PF_INET6, :SOCK_STREAM)) + resolver = double + + allow(resolver).to receive(:getaddresses).with('example.com').and_return(%w(0.0.0.0 2001:4860:4860::8844)) + allow(resolver).to receive(:timeouts=).and_return(nil) + allow(Resolv::DNS).to receive(:open).and_yield(resolver) expect { |block| subject.perform &block }.to yield_control expect(a_request(:get, 'http://example.com')).to have_been_made.once @@ -81,9 +83,12 @@ describe Request do end it 'raises Mastodon::ValidationError' do - allow(Addrinfo).to receive(:foreach).with('example.com', nil, nil, :SOCK_STREAM) - .and_yield(Addrinfo.new(["AF_INET", 0, "example.com", "0.0.0.0"], :PF_INET, :SOCK_STREAM)) - .and_yield(Addrinfo.new(["AF_INET6", 0, "example.com", "2001:db8::face"], :PF_INET6, :SOCK_STREAM)) + resolver = double + + allow(resolver).to receive(:getaddresses).with('example.com').and_return(%w(0.0.0.0 2001:db8::face)) + allow(resolver).to receive(:timeouts=).and_return(nil) + allow(Resolv::DNS).to receive(:open).and_yield(resolver) + expect { subject.perform }.to raise_error Mastodon::ValidationError end end From 404dc97fb013b7f835df65dfc22d07f68e482e23 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 23 Nov 2018 22:32:20 +0100 Subject: [PATCH 112/274] Bump version to 2.6.2 --- CHANGELOG.md | 34 ++++++++++++++++++++++++++++++++++ lib/mastodon/version.rb | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb8bf3272..e5eba30d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,40 @@ Changelog All notable changes to this project will be documented in this file. +## [2.6.2] - 2018-11-23 +### Added + +- Add Page to whitelisted ActivityPub types (#9188) +- Add 20px to column width in web UI (#9227) +- Add amount of freed disk space in `tootctl media remove` (#9229, #9239, #9288) +- Add "Show thread" link to self-replies (#9228) + +### Changed + +- Change order of Atom and RSS links so Atom is first (#9302) +- Change Nginx configuration for Nanobox apps (#9310) +- Change the follow action to appear instant in web UI (#9220) +- Change how the ActiveRecord connection is instantiated in on_worker_boot (#9238) +- Change `tootctl accounts cull` to always touch accounts so they can be skipped (#9293) +- Change mime type comparison to ignore JSON-LD profile (#9179) + +### Fixed + +- Fix web UI crash when conversation has no last status (#9207) +- Fix follow limit validator reporting lower number past threshold (#9230) +- Fix form validation flash message color and input borders (#9235) +- Fix invalid twitter:player cards being displayed (#9254) +- Fix emoji update date being processed incorrectly (#9255) +- Fix playing embed resetting if status is reloaded in web UI (#9270, #9275) +- Fix web UI crash when favouriting a deleted status (#9272) +- Fix intermediary arrays being created for hash maps (#9291) +- Fix filter ID not being a string in REST API (#9303) + +### Security + +- Fix multiple remote account deletions being able to deadlock the database (#9292) +- Fix HTTP connection timeout of 10s not being enforced (#9329) + ## [2.6.1] - 2018-10-30 ### Fixed diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 2e39ad01e..4a7987203 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 1 + 2 end def pre From ec20a5d53aa5d234498d0140ce772cd9f027adfb Mon Sep 17 00:00:00 2001 From: Hugo Gameiro Date: Tue, 27 Nov 2018 11:19:12 +0000 Subject: [PATCH 113/274] add loglevel to ffmpeg in gif upload (#9368) --- app/models/media_attachment.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index 1bfe02fd6..62a11185a 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -59,6 +59,7 @@ class MediaAttachment < ApplicationRecord format: 'mp4', convert_options: { output: { + 'loglevel' => 'fatal', 'movflags' => 'faststart', 'pix_fmt' => 'yuv420p', 'vf' => 'scale=\'trunc(iw/2)*2:trunc(ih/2)*2\'', From 49f49cf367b6fb8413b1967870a709a5e31c9b71 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 27 Nov 2018 12:28:01 +0100 Subject: [PATCH 114/274] Allow hyphens in the middle of remote user names (#9345) Fixes #9309 This only allows hyphens in the middle of a username, much like dots, although I don't have a compelling reason to do so other than keeping the changes minimal. --- app/models/account.rb | 2 +- spec/models/account_spec.rb | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/models/account.rb b/app/models/account.rb index 44963f3e6..acba6770b 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -49,7 +49,7 @@ # class Account < ApplicationRecord - USERNAME_RE = /[a-z0-9_]+([a-z0-9_\.]+[a-z0-9_]+)?/i + USERNAME_RE = /[a-z0-9_]+([a-z0-9_\.-]+[a-z0-9_]+)?/i MENTION_RE = /(?<=^|[^\/[:word:]])@((#{USERNAME_RE})(?:@[a-z0-9\.\-]+[a-z0-9]+)?)/i include AccountAvatar diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 60d13d32e..b25b66d2d 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -618,9 +618,15 @@ RSpec.describe Account, type: :model do expect(account).not_to model_have_error_on_field(:username) end - it 'is invalid if the username doesn\'t only contains letters, numbers and underscores' do + it 'is valid even if the username contains hyphens' do account = Fabricate.build(:account, domain: 'domain', username: 'the-doctor') account.valid? + expect(account).to_not model_have_error_on_field(:username) + end + + it 'is invalid if the username doesn\'t only contains letters, numbers, underscores and hyphens' do + account = Fabricate.build(:account, domain: 'domain', username: 'the doctor') + account.valid? expect(account).to model_have_error_on_field(:username) end From cc0c1674f03cfbbe3ee28208429f216db1678731 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 27 Nov 2018 18:13:36 +0100 Subject: [PATCH 115/274] Fix nil error when no DNS addresses are found for host (#9379) --- app/lib/request.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/lib/request.rb b/app/lib/request.rb index bb6ef4661..024fce88a 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -163,7 +163,11 @@ class Request end end - raise outer_e if outer_e + if outer_e + raise outer_e + else + raise SocketError, "No address for #{host}" + end end alias new open From 58108b448159a8796500f2d3441cfe7b1ca99a67 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 27 Nov 2018 18:49:37 +0100 Subject: [PATCH 116/274] Don't count suspended users in user count (#9380) Fix #7637 --- app/presenters/instance_presenter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb index 9a9157f1b..bf33c7287 100644 --- a/app/presenters/instance_presenter.rb +++ b/app/presenters/instance_presenter.rb @@ -18,7 +18,7 @@ class InstancePresenter end def user_count - Rails.cache.fetch('user_count') { User.confirmed.count } + Rails.cache.fetch('user_count') { User.confirmed.joins(:account).merge(Account.without_suspended).count } end def status_count From 442f335504129f99bc405539967df628d4701761 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 27 Nov 2018 19:15:08 +0100 Subject: [PATCH 117/274] Skip deliveries to inboxes that have already been marked as unavailable (#9358) --- app/workers/activitypub/delivery_worker.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/workers/activitypub/delivery_worker.rb b/app/workers/activitypub/delivery_worker.rb index adbb496d9..f9c385ea3 100644 --- a/app/workers/activitypub/delivery_worker.rb +++ b/app/workers/activitypub/delivery_worker.rb @@ -11,6 +11,8 @@ class ActivityPub::DeliveryWorker HEADERS = { 'Content-Type' => 'application/activity+json' }.freeze def perform(json, source_account_id, inbox_url, options = {}) + return if DeliveryFailureTracker.unavailable?(inbox_url) + @options = options.with_indifferent_access @json = json @source_account = Account.find(source_account_id) From 34de90c486176992d8bc3d0f5f9f1156509d448c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 27 Nov 2018 19:46:05 +0100 Subject: [PATCH 118/274] Fix TLS handshake timeout not being enforced (#9381) Follow-up to #9329 --- app/lib/request.rb | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/lib/request.rb b/app/lib/request.rb index 024fce88a..4a81773e3 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -4,6 +4,16 @@ require 'ipaddr' require 'socket' require 'resolv' +# Monkey-patch the HTTP.rb timeout class to avoid using a timeout block +# around the Socket#open method, since we use our own timeout blocks inside +# that method +class HTTP::Timeout::PerOperation + def connect(socket_class, host, port, nodelay = false) + @socket = socket_class.open(host, port) + @socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) if nodelay + end +end + class Request REQUEST_TARGET = '(request-target)' @@ -95,7 +105,11 @@ class Request end def timeout - { connect: nil, read: 10, write: 10 } + # We enforce a 1s timeout on DNS resolving, 10s timeout on socket opening + # and 5s timeout on the TLS handshake, meaning the worst case should take + # about 16s in total + + { connect: 5, read: 10, write: 10 } end def http_client From a1216e631537b1fbf07f2c8724ac05e757800be6 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 30 Nov 2018 03:08:37 +0100 Subject: [PATCH 119/274] Bump version to 2.6.3 --- CHANGELOG.md | 19 +++++++++++++++++++ lib/mastodon/version.rb | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e5eba30d5..47fa6a25d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,25 @@ Changelog All notable changes to this project will be documented in this file. +## [2.6.3] - 2018-11-30 +### Added + +- Add hyphen to characters allowed in remote usernames (#9345) + +### Changed + +- Change server user count to exclude suspended accounts (#9380) + +### Fixed + +- Fix ffmpeg processing sometimes stalling due to overfilled stdout buffer (#9368) +- Fix missing DNS records raising the wrong kind of exception (#9379) +- Fix already queued deliveries still trying to reach inboxes marked as unavailable (#9358) + +### Security + +- Fix TLS handshake timeout not being enforced (#9381) + ## [2.6.2] - 2018-11-23 ### Added diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 4a7987203..7157ae90e 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 2 + 3 end def pre From 82570019ba01ec11b93f62921b3fc92f369ec53c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 30 Nov 2018 19:16:32 +0100 Subject: [PATCH 120/274] Remove npm-run-all dependency (#9401) Fix #9359 --- package.json | 3 +- yarn.lock | 141 ++------------------------------------------------- 2 files changed, 6 insertions(+), 138 deletions(-) diff --git a/package.json b/package.json index 7b162e576..ee138c374 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "build:production": "cross-env RAILS_ENV=production NODE_ENV=production ./bin/webpack", "manage:translations": "node ./config/webpack/translationRunner.js", "start": "node ./streaming/index.js", - "test": "npm-run-all test:lint test:jest", + "test": "npm run test:lint && npm run test:jest", "test:lint": "eslint -c .eslintrc.yml --ext=js app/javascript/ config/webpack/ streaming/", "test:jest": "cross-env NODE_ENV=test jest --coverage" }, @@ -76,7 +76,6 @@ "mini-css-extract-plugin": "^0.4.2", "mkdirp": "^0.5.1", "node-sass": "^4.9.2", - "npm-run-all": "^4.1.2", "npmlog": "^4.1.2", "object-assign": "^4.1.1", "object-fit-images": "^3.2.3", diff --git a/yarn.lock b/yarn.lock index 38a91d10b..eb7a6c2c2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1109,11 +1109,6 @@ array-equal@^1.0.0: resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= - array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -1137,16 +1132,6 @@ array-includes@^3.0.3: define-properties "^1.1.2" es-abstract "^1.7.0" -array-map@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= - array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -2411,7 +2396,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.0, cross-spawn@^6.0.4, cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -2920,7 +2905,7 @@ double-ended-queue@^2.1.0-0: resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw= -duplexer@^0.1.1, duplexer@~0.1.1: +duplexer@^0.1.1: version "0.1.1" resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= @@ -3079,7 +3064,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.10.0, es-abstract@^1.4.3, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: +es-abstract@^1.10.0, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== @@ -3329,20 +3314,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -event-stream@~3.3.0: - version "3.3.6" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.6.tgz#cac1230890e07e73ec9cacd038f60a5b66173eef" - integrity sha512-dGXNg4F/FgVzlApjzItL+7naHutA3fDqbV/zAZqDDlXTjiMnQmZKu+prImWKszeBM5UQeGvAl3u1wBiKeDh61g== - dependencies: - duplexer "^0.1.1" - flatmap-stream "^0.1.0" - from "^0.1.7" - map-stream "0.0.7" - pause-stream "^0.0.11" - split "^1.0.1" - stream-combiner "^0.2.2" - through "^2.3.8" - eventemitter3@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" @@ -3744,11 +3715,6 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" -flatmap-stream@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/flatmap-stream/-/flatmap-stream-0.1.0.tgz#ed54e01422cd29281800914fcb968d58b685d5f1" - integrity sha512-Nlic4ZRYxikqnK5rj3YoxDVKGGtUjcNDUtvQ7XsdGLZmMwdUYnXf10o1zcXtzEZTBgc6GxeRpQxV/Wu3WPIIHA== - flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" @@ -3846,11 +3812,6 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -from@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= - fs-extra@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6" @@ -5642,16 +5603,6 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -5841,11 +5792,6 @@ map-obj@^1.0.0, map-obj@^1.0.1: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= -map-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" - integrity sha1-ih8HiW2CsQkmvTdEokIACfiJdKg= - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -5905,11 +5851,6 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= - meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -6462,21 +6403,6 @@ npm-packlist@^1.1.6: ignore-walk "^3.0.1" npm-bundled "^1.0.1" -npm-run-all@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.3.tgz#49f15b55a66bb4101664ce270cb18e7103f8f185" - integrity sha512-aOG0N3Eo/WW+q6sUIdzcV2COS8VnTZCmdji0VQIAZF3b+a3YWb0AD0vFIyjKec18A7beLGbaQ5jFTNI2bPt9Cg== - dependencies: - ansi-styles "^3.2.0" - chalk "^2.1.0" - cross-spawn "^6.0.4" - memorystream "^0.3.1" - minimatch "^3.0.4" - ps-tree "^1.1.0" - read-pkg "^3.0.0" - shell-quote "^1.6.1" - string.prototype.padend "^3.0.0" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -6979,20 +6905,6 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -pause-stream@^0.0.11: - version "0.0.11" - resolved "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU= - dependencies: - through "~2.3" - pbkdf2@^3.0.3: version "3.0.16" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" @@ -7663,13 +7575,6 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -ps-tree@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" - integrity sha1-tCGyQUDWID8e08dplrRCewjowBQ= - dependencies: - event-stream "~3.3.0" - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -8115,15 +8020,6 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6: version "2.3.6" resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -8827,16 +8723,6 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shell-quote@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -9039,7 +8925,7 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split@^1.0.0, split@^1.0.1: +split@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== @@ -9124,14 +9010,6 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" -stream-combiner@^0.2.2: - version "0.2.2" - resolved "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" - integrity sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg= - dependencies: - duplexer "~0.1.1" - through "~2.3.4" - stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -9181,15 +9059,6 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string.prototype.padend@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0" - integrity sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.4.3" - function-bind "^1.0.2" - string.prototype.trim@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" @@ -9407,7 +9276,7 @@ through2@^2.0.0: readable-stream "^2.1.5" xtend "~4.0.1" -through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.4: +through@2, through@^2.3.6: version "2.3.8" resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= From 13979a84f93ab07dc002111f9a86eb358260dd00 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 30 Nov 2018 19:54:24 +0100 Subject: [PATCH 121/274] Bump version to 2.6.4 --- CHANGELOG.md | 5 +++++ lib/mastodon/version.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47fa6a25d..d09dc452a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ Changelog All notable changes to this project will be documented in this file. +## [2.6.4] - 2018-11-30 +### Fixed + +- Fix yarn dependencies not installing due to yanked event-stream package (#9401) + ## [2.6.3] - 2018-11-30 ### Added diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 7157ae90e..9c2542ac7 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 3 + 4 end def pre From f13d08314e1d683fd40b3cb48c667aced222ce28 Mon Sep 17 00:00:00 2001 From: ThibG Date: Sun, 2 Dec 2018 16:46:13 +0100 Subject: [PATCH 122/274] Preload common JSON-LD contexts (#9412) Fixes #9411 --- Gemfile | 1 + Gemfile.lock | 5 ++++ config/initializers/json_ld.rb | 3 ++ lib/json_ld/security.rb | 50 ++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 config/initializers/json_ld.rb create mode 100644 lib/json_ld/security.rb diff --git a/Gemfile b/Gemfile index bf23015e6..6e1c9403a 100644 --- a/Gemfile +++ b/Gemfile @@ -90,6 +90,7 @@ gem 'webpacker', '~> 3.5' gem 'webpush' gem 'json-ld', '~> 2.2' +gem 'json-ld-preloaded', '~> 2.2' gem 'rdf-normalize', '~> 0.3' group :development, :test do diff --git a/Gemfile.lock b/Gemfile.lock index 91a2e8281..d83ad6d8b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -291,6 +291,10 @@ GEM json-ld (2.2.1) multi_json (~> 1.12) rdf (>= 2.2.8, < 4.0) + json-ld-preloaded (2.2.3) + json-ld (>= 2.2, < 4.0) + multi_json (~> 1.12) + rdf (>= 2.2, < 4.0) jsonapi-renderer (0.2.0) jwt (2.1.0) kaminari (1.1.1) @@ -696,6 +700,7 @@ DEPENDENCIES idn-ruby iso-639 json-ld (~> 2.2) + json-ld-preloaded (~> 2.2) kaminari (~> 1.1) letter_opener (~> 1.4) letter_opener_web (~> 1.3) diff --git a/config/initializers/json_ld.rb b/config/initializers/json_ld.rb new file mode 100644 index 000000000..d5575d135 --- /dev/null +++ b/config/initializers/json_ld.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require_relative '../../lib/json_ld/security' diff --git a/lib/json_ld/security.rb b/lib/json_ld/security.rb new file mode 100644 index 000000000..1230206f0 --- /dev/null +++ b/lib/json_ld/security.rb @@ -0,0 +1,50 @@ +# -*- encoding: utf-8 -*- +# frozen_string_literal: true +# This file generated automatically from https://w3id.org/security/v1 +require 'json/ld' +class JSON::LD::Context + add_preloaded("https://w3id.org/security/v1") do + new(processingMode: "json-ld-1.0", term_definitions: { + "CryptographicKey" => TermDefinition.new("CryptographicKey", id: "https://w3id.org/security#Key", simple: true), + "EcdsaKoblitzSignature2016" => TermDefinition.new("EcdsaKoblitzSignature2016", id: "https://w3id.org/security#EcdsaKoblitzSignature2016", simple: true), + "EncryptedMessage" => TermDefinition.new("EncryptedMessage", id: "https://w3id.org/security#EncryptedMessage", simple: true), + "GraphSignature2012" => TermDefinition.new("GraphSignature2012", id: "https://w3id.org/security#GraphSignature2012", simple: true), + "LinkedDataSignature2015" => TermDefinition.new("LinkedDataSignature2015", id: "https://w3id.org/security#LinkedDataSignature2015", simple: true), + "LinkedDataSignature2016" => TermDefinition.new("LinkedDataSignature2016", id: "https://w3id.org/security#LinkedDataSignature2016", simple: true), + "authenticationTag" => TermDefinition.new("authenticationTag", id: "https://w3id.org/security#authenticationTag", simple: true), + "canonicalizationAlgorithm" => TermDefinition.new("canonicalizationAlgorithm", id: "https://w3id.org/security#canonicalizationAlgorithm", simple: true), + "cipherAlgorithm" => TermDefinition.new("cipherAlgorithm", id: "https://w3id.org/security#cipherAlgorithm", simple: true), + "cipherData" => TermDefinition.new("cipherData", id: "https://w3id.org/security#cipherData", simple: true), + "cipherKey" => TermDefinition.new("cipherKey", id: "https://w3id.org/security#cipherKey", simple: true), + "created" => TermDefinition.new("created", id: "http://purl.org/dc/terms/created", type_mapping: "http://www.w3.org/2001/XMLSchema#dateTime"), + "creator" => TermDefinition.new("creator", id: "http://purl.org/dc/terms/creator", type_mapping: "@id"), + "dc" => TermDefinition.new("dc", id: "http://purl.org/dc/terms/", simple: true, prefix: true), + "digestAlgorithm" => TermDefinition.new("digestAlgorithm", id: "https://w3id.org/security#digestAlgorithm", simple: true), + "digestValue" => TermDefinition.new("digestValue", id: "https://w3id.org/security#digestValue", simple: true), + "domain" => TermDefinition.new("domain", id: "https://w3id.org/security#domain", simple: true), + "encryptionKey" => TermDefinition.new("encryptionKey", id: "https://w3id.org/security#encryptionKey", simple: true), + "expiration" => TermDefinition.new("expiration", id: "https://w3id.org/security#expiration", type_mapping: "http://www.w3.org/2001/XMLSchema#dateTime"), + "expires" => TermDefinition.new("expires", id: "https://w3id.org/security#expiration", type_mapping: "http://www.w3.org/2001/XMLSchema#dateTime"), + "id" => TermDefinition.new("id", id: "@id", simple: true), + "initializationVector" => TermDefinition.new("initializationVector", id: "https://w3id.org/security#initializationVector", simple: true), + "iterationCount" => TermDefinition.new("iterationCount", id: "https://w3id.org/security#iterationCount", simple: true), + "nonce" => TermDefinition.new("nonce", id: "https://w3id.org/security#nonce", simple: true), + "normalizationAlgorithm" => TermDefinition.new("normalizationAlgorithm", id: "https://w3id.org/security#normalizationAlgorithm", simple: true), + "owner" => TermDefinition.new("owner", id: "https://w3id.org/security#owner", type_mapping: "@id"), + "password" => TermDefinition.new("password", id: "https://w3id.org/security#password", simple: true), + "privateKey" => TermDefinition.new("privateKey", id: "https://w3id.org/security#privateKey", type_mapping: "@id"), + "privateKeyPem" => TermDefinition.new("privateKeyPem", id: "https://w3id.org/security#privateKeyPem", simple: true), + "publicKey" => TermDefinition.new("publicKey", id: "https://w3id.org/security#publicKey", type_mapping: "@id"), + "publicKeyPem" => TermDefinition.new("publicKeyPem", id: "https://w3id.org/security#publicKeyPem", simple: true), + "publicKeyService" => TermDefinition.new("publicKeyService", id: "https://w3id.org/security#publicKeyService", type_mapping: "@id"), + "revoked" => TermDefinition.new("revoked", id: "https://w3id.org/security#revoked", type_mapping: "http://www.w3.org/2001/XMLSchema#dateTime"), + "salt" => TermDefinition.new("salt", id: "https://w3id.org/security#salt", simple: true), + "sec" => TermDefinition.new("sec", id: "https://w3id.org/security#", simple: true, prefix: true), + "signature" => TermDefinition.new("signature", id: "https://w3id.org/security#signature", simple: true), + "signatureAlgorithm" => TermDefinition.new("signatureAlgorithm", id: "https://w3id.org/security#signingAlgorithm", simple: true), + "signatureValue" => TermDefinition.new("signatureValue", id: "https://w3id.org/security#signatureValue", simple: true), + "type" => TermDefinition.new("type", id: "@type", simple: true), + "xsd" => TermDefinition.new("xsd", id: "http://www.w3.org/2001/XMLSchema#", simple: true, prefix: true) + }) + end +end From e625425c8feb611e037c62855845b38ceb4b35c1 Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 21 Nov 2018 17:02:58 +0100 Subject: [PATCH 123/274] Include replies to list owner and replies to list members in list statuses (#9324) --- app/lib/feed_manager.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 3d7db2721..31ff53860 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -40,7 +40,11 @@ class FeedManager end def push_to_list(list, status) - return false if status.reply? && status.in_reply_to_account_id != status.account_id + if status.reply? && status.in_reply_to_account_id != status.account_id + should_filter = status.in_reply_to_account_id != list.account_id + should_filter &&= !ListAccount.where(list_id: list.id, account_id: status.in_reply_to_account_id).exists? + return false if should_filter + end return false unless add_to_feed(:list, list.id, status) trim(:list, list.id) PushUpdateWorker.perform_async(list.account_id, status.id, "timeline:list:#{list.id}") if push_update_required?("timeline:list:#{list.id}") From 887f9de6dc12ef405f92b94eeaa775df74ebb1ef Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 2 Dec 2018 16:52:40 +0100 Subject: [PATCH 124/274] Bump version to 2.6.5 --- CHANGELOG.md | 9 +++++++++ lib/mastodon/version.rb | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d09dc452a..1e24df451 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,15 @@ Changelog All notable changes to this project will be documented in this file. +## [2.6.5] - 2018-12-01 +### Changed + +- Change lists to display replies to others on the list and list owner (#9324) + +### Fixed + +- Fix failures caused by commonly-used JSON-LD contexts being unavailable (#9412) + ## [2.6.4] - 2018-11-30 ### Fixed diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 9c2542ac7..cb5c2440c 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 4 + 5 end def pre From 365b5ba28dd0e68de3b6fe725f22232f8b9a0043 Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 8 Jan 2019 22:37:44 -0600 Subject: [PATCH 125/274] Update translations --- app/javascript/mastodon/locales/dog.json | 75 ++++++---- app/javascript/mastodon/locales/lion.json | 77 ++++++---- app/javascript/mastodon/locales/squeak.json | 61 +++++--- config/locales/devise.dog.yml | 1 + config/locales/devise.lion.yml | 1 + config/locales/devise.squeak.yml | 1 + config/locales/dog.yml | 150 +++++++++++++------ config/locales/lion.yml | 150 +++++++++++++------ config/locales/simple_form.dog.yml | 31 +++- config/locales/simple_form.lion.yml | 31 +++- config/locales/simple_form.squeak.yml | 29 +++- config/locales/squeak.yml | 154 ++++++++++++++------ 12 files changed, 541 insertions(+), 220 deletions(-) diff --git a/app/javascript/mastodon/locales/dog.json b/app/javascript/mastodon/locales/dog.json index 8e55cb8f2..39c275dc6 100644 --- a/app/javascript/mastodon/locales/dog.json +++ b/app/javascript/mastodon/locales/dog.json @@ -1,4 +1,5 @@ { + "account.add_or_remove_from_list": "Add or Remove from lists", "account.badges.bot": "Bot", "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", @@ -16,6 +17,7 @@ "account.follows_you": "In your pack", "account.hide_reblogs": "Hide awoos from @{name}", "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", "account.mention": "Bark at @{name}", "account.moved_to": "{name} has moved to:", @@ -91,8 +93,8 @@ "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this toot and re-draft it? You will lose all barks, awoos, and boops to it.", - "confirmations.reply.confirm": "Reply", - "confirmations.reply.message": "Replying now will overwrite the toot you are currently composing. Are you sure you want to proceed?", + "confirmations.reply.confirm": "Bark", + "confirmations.reply.message": "Barking now will overwrite the toot you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Leave Pack", "confirmations.unfollow.message": "Are you sure you want to leave {name}'s pack?", "embed.instructions": "Embed this toot on your website by copying the code below.", @@ -111,6 +113,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_timeline": "No toots here!", "empty_column.blocks": "You haven't blocked any dogs yet.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", @@ -129,16 +132,40 @@ "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", "getting_started.developers": "Developers", + "getting_started.directory": "Profile directory", "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", "getting_started.heading": "Getting started", "getting_started.invite": "Invite dogs", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", + "hashtag.column_header.tag_mode.all": "and {additional}", + "hashtag.column_header.tag_mode.any": "or {additional}", + "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.tag_mode.all": "All of these", + "hashtag.column_settings.tag_mode.any": "Any of these", + "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_settings.tag_toggle": "Include additional tags for this column", "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Show awoos", "home.column_settings.show_replies": "Show barks", + "introduction.federation.action": "Next", + "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.text": "Public toots from other servers of the fediverse will appear in the federated timeline.", + "introduction.federation.home.headline": "Home", + "introduction.federation.home.text": "Toots from dogs you follow will appear in your home feed. You can follow anyone on any server!", + "introduction.federation.local.headline": "Local", + "introduction.federation.local.text": "Public toots from dogs on the same server as you will appear in the local timeline.", + "introduction.interactions.action": "Finish tutorial!", + "introduction.interactions.favourite.headline": "Boop", + "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "introduction.interactions.reblog.headline": "Awoo", + "introduction.interactions.reblog.text": "You can share other dogs' toots with your followers by awooing them.", + "introduction.interactions.reply.headline": "Bark", + "introduction.interactions.reply.text": "You can bark at other dogs' and your own toots, which will chain them together in a conversation.", + "introduction.welcome.action": "Let's go!", + "introduction.welcome.headline": "First steps", + "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.blocked": "to open blocked dogs list", "keyboard_shortcuts.boost": "to awoo", @@ -162,7 +189,7 @@ "keyboard_shortcuts.notifications": "to open notifications column", "keyboard_shortcuts.pinned": "to open pinned toots list", "keyboard_shortcuts.profile": "to open author's profile", - "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.reply": "to bark", "keyboard_shortcuts.requests": "to open pack requests list", "keyboard_shortcuts.search": "to focus search", "keyboard_shortcuts.start": "to open \"get started\" column", @@ -217,34 +244,21 @@ "notifications.column_settings.favourite": "Boops:", "notifications.column_settings.follow": "New pack members:", "notifications.column_settings.mention": "Barks:", + "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.follow": "New pack members:", + "notifications.column_settings.mention": "Barks:", "notifications.column_settings.push": "Push notifications", "notifications.column_settings.reblog": "Awoos:", "notifications.column_settings.show": "Show in column", "notifications.column_settings.sound": "Play sound", + "notifications.filter.all": "All", + "notifications.filter.boosts": "Awoos", + "notifications.filter.favourites": "Boops", + "notifications.filter.follows": "Joined Packs", + "notifications.filter.mentions": "Barks", "notifications.group": "{count} notifications", - "onboarding.done": "Done", - "onboarding.next": "Next", - "onboarding.page_five.public_timelines": "The local timeline shows public toots from everyone on {domain}. The federated timeline shows public toots from everyone who dogs on {domain} follow. These are the Public Timelines, a great way to discover new dogs.", - "onboarding.page_four.home": "The home timeline shows toots from dogs you follow.", - "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", - "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.full_handle": "Your full handle", - "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", - "onboarding.page_one.welcome": "Welcome to Mastodon!", - "onboarding.page_six.admin": "Your instance's admin is {admin}.", - "onboarding.page_six.almost_done": "Almost done...", - "onboarding.page_six.appetoot": "Bon Appetoot!", - "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.", - "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.guidelines": "community guidelines", - "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", - "onboarding.page_six.various_app": "mobile apps", - "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.search": "Use the search bar to find dogs and look at hashtags, such as {illustration} and {introductions}. To look for a dog who is not on this instance, use their full handle.", - "onboarding.page_two.compose": "Write toots from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", - "onboarding.skip": "Skip", - "privacy.change": "Adjust toot privacy", - "privacy.direct.long": "Toot to mentioned dogs only", + "privacy.change": "Adjust status privacy", + "privacy.direct.long": "Post to mentioned users only", "privacy.direct.short": "Direct", "privacy.private.long": "Toot to followers only", "privacy.private.short": "Pack Members-only", @@ -278,6 +292,8 @@ "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", + "status.admin_account": "Open moderation interface for @{name}", + "status.admin_status": "Open this status in the moderation interface", "status.block": "Block @{name}", "status.cancel_reblog_private": "Unawoo", "status.cannot_reblog": "This toot cannot be awooed", @@ -312,6 +328,7 @@ "status.show_less_all": "Show less for all", "status.show_more": "Show more", "status.show_more_all": "Show more for all", + "status.show_thread": "Show thread", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", @@ -324,9 +341,9 @@ "trends.count_by_accounts": "{count} {rawCount, plural, one {dog} other {dogs}} barking", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", - "upload_button.label": "Add media", + "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_form.description": "Describe for the visually impaired", - "upload_form.focus": "Crop", + "upload_form.focus": "Change preview", "upload_form.undo": "Delete", "upload_progress.label": "Uploading...", "video.close": "Close video", diff --git a/app/javascript/mastodon/locales/lion.json b/app/javascript/mastodon/locales/lion.json index 29bed3dca..b2e690bef 100644 --- a/app/javascript/mastodon/locales/lion.json +++ b/app/javascript/mastodon/locales/lion.json @@ -1,4 +1,5 @@ { + "account.add_or_remove_from_list": "Add or Remove from lists", "account.badges.bot": "Bot", "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", @@ -16,6 +17,7 @@ "account.follows_you": "In your pride", "account.hide_reblogs": "Hide roars from @{name}", "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", "account.mention": "Meow at @{name}", "account.moved_to": "{name} has moved to:", @@ -91,8 +93,8 @@ "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this toot and re-draft it? You will lose all meows, roars, and boops to it.", - "confirmations.reply.confirm": "Reply", - "confirmations.reply.message": "Replying now will overwrite the toot you are currently composing. Are you sure you want to proceed?", + "confirmations.reply.confirm": "Meow", + "confirmations.reply.message": "Meowing now will overwrite the toot you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Leave Pride", "confirmations.unfollow.message": "Are you sure you want to leave {name}'s pride?", "embed.instructions": "Embed this toot on your website by copying the code below.", @@ -112,6 +114,7 @@ "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", "empty_column.blocks": "You haven't blocked any lions yet.", + "empty_column.blocks": "You haven't blocked any lions yet.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no hidden domains yet.", @@ -129,16 +132,40 @@ "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", "getting_started.developers": "Developers", + "getting_started.directory": "Profile directory", "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", "getting_started.heading": "Getting started", - "getting_started.invite": "Invite people", + "getting_started.invite": "Invite lions", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", + "hashtag.column_header.tag_mode.all": "and {additional}", + "hashtag.column_header.tag_mode.any": "or {additional}", + "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.tag_mode.all": "All of these", + "hashtag.column_settings.tag_mode.any": "Any of these", + "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_settings.tag_toggle": "Include additional tags for this column", "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Show roars", "home.column_settings.show_replies": "Show meows", + "introduction.federation.action": "Next", + "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.text": "Public toots from other servers of the fediverse will appear in the federated timeline.", + "introduction.federation.home.headline": "Home", + "introduction.federation.home.text": "Toots from lions you follow will appear in your home feed. You can follow anyone on any server!", + "introduction.federation.local.headline": "Local", + "introduction.federation.local.text": "Public toots from lions on the same server as you will appear in the local timeline.", + "introduction.interactions.action": "Finish tutorial!", + "introduction.interactions.favourite.headline": "Favourite", + "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "introduction.interactions.reblog.headline": "Boost", + "introduction.interactions.reblog.text": "You can share other lions' toots with your followers by boosting them.", + "introduction.interactions.reply.headline": "Meow", + "introduction.interactions.reply.text": "You can meow at other lions' and your own toots, which will chain them together in a conversation.", + "introduction.welcome.action": "Let's go!", + "introduction.welcome.headline": "First steps", + "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.blocked": "to open blocked dogs list", "keyboard_shortcuts.boost": "to boost", @@ -162,7 +189,7 @@ "keyboard_shortcuts.notifications": "to open notifications column", "keyboard_shortcuts.pinned": "to open pinned toots list", "keyboard_shortcuts.profile": "to open author's profile", - "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.reply": "to meow", "keyboard_shortcuts.requests": "to open pride requests list", "keyboard_shortcuts.search": "to focus search", "keyboard_shortcuts.start": "to open \"get started\" column", @@ -217,34 +244,21 @@ "notifications.column_settings.favourite": "Boops:", "notifications.column_settings.follow": "New pride members:", "notifications.column_settings.mention": "Meows:", + "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.follow": "New Pride Members:", + "notifications.column_settings.mention": "Meows:", "notifications.column_settings.push": "Push notifications", "notifications.column_settings.reblog": "Roars:", "notifications.column_settings.show": "Show in column", "notifications.column_settings.sound": "Play sound", + "notifications.filter.all": "All", + "notifications.filter.boosts": "Roars", + "notifications.filter.favourites": "Boops", + "notifications.filter.follows": "Pride Members", + "notifications.filter.mentions": "Meows", "notifications.group": "{count} notifications", - "onboarding.done": "Done", - "onboarding.next": "Next", - "onboarding.page_five.public_timelines": "The local timeline shows public toots from everyone on {domain}. The federated timeline shows public toots from everyone who lions on {domain} follow. These are the Public Timelines, a great way to discover new lions.", - "onboarding.page_four.home": "The home timeline shows toots from lions you follow.", - "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", - "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.full_handle": "Your full handle", - "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", - "onboarding.page_one.welcome": "Welcome to Mastodon!", - "onboarding.page_six.admin": "Your instance's admin is {admin}.", - "onboarding.page_six.almost_done": "Almost done...", - "onboarding.page_six.appetoot": "Bon Appetoot!", - "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.", - "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.guidelines": "community guidelines", - "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", - "onboarding.page_six.various_app": "mobile apps", - "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.search": "Use the search bar to find lions and look at hashtags, such as {illustration} and {introductions}. To look for a lion who is not on this instance, use their full handle.", - "onboarding.page_two.compose": "Write toots from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", - "onboarding.skip": "Skip", - "privacy.change": "Adjust toot privacy", - "privacy.direct.long": "Toot to mentioned lions only", + "privacy.change": "Adjust status privacy", + "privacy.direct.long": "Post to mentioned users only", "privacy.direct.short": "Direct", "privacy.private.long": "Toot to followers only", "privacy.private.short": "Pride Members-only", @@ -278,6 +292,8 @@ "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", + "status.admin_account": "Open moderation interface for @{name}", + "status.admin_status": "Open this status in the moderation interface", "status.block": "Block @{name}", "status.cancel_reblog_private": "Unroar", "status.cannot_reblog": "This toot cannot be roared", @@ -312,6 +328,7 @@ "status.show_less_all": "Show less for all", "status.show_more": "Show more", "status.show_more_all": "Show more for all", + "status.show_thread": "Show thread", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", @@ -324,9 +341,9 @@ "trends.count_by_accounts": "{count} {rawCount, plural, one {lion} other {lions}} meowing", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", - "upload_button.label": "Add media", + "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_form.description": "Describe for the visually impaired", - "upload_form.focus": "Crop", + "upload_form.focus": "Change preview", "upload_form.undo": "Delete", "upload_progress.label": "Uploading...", "video.close": "Close video", diff --git a/app/javascript/mastodon/locales/squeak.json b/app/javascript/mastodon/locales/squeak.json index 28efab291..bf9444d04 100644 --- a/app/javascript/mastodon/locales/squeak.json +++ b/app/javascript/mastodon/locales/squeak.json @@ -1,4 +1,5 @@ { + "account.add_or_remove_from_list": "Add or Remove from lists", "account.badges.bot": "Bot", "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", @@ -16,6 +17,7 @@ "account.follows_you": "Follows you", "account.hide_reblogs": "Hide pumps from @{name}", "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", "account.mention": "Mention @{name}", "account.moved_to": "{name} has moved to:", @@ -111,6 +113,7 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", + "empty_column.account_timeline": "No toots here!", "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", @@ -129,16 +132,40 @@ "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", "getting_started.developers": "Developers", + "getting_started.directory": "Profile directory", "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", "getting_started.heading": "Getting started", "getting_started.invite": "Invite people", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", + "hashtag.column_header.tag_mode.all": "and {additional}", + "hashtag.column_header.tag_mode.any": "or {additional}", + "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.tag_mode.all": "All of these", + "hashtag.column_settings.tag_mode.any": "Any of these", + "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_settings.tag_toggle": "Include additional tags for this column", "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Show pumps", "home.column_settings.show_replies": "Show replies", + "introduction.federation.action": "Next", + "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", + "introduction.federation.home.headline": "Home", + "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", + "introduction.federation.local.headline": "Local", + "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", + "introduction.interactions.action": "Finish tutorial!", + "introduction.interactions.favourite.headline": "Squeak", + "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by squeaking it.", + "introduction.interactions.reblog.headline": "Pump", + "introduction.interactions.reblog.text": "You can share other people's toots with your followers by pumping them.", + "introduction.interactions.reply.headline": "Reply", + "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", + "introduction.welcome.action": "Let's go!", + "introduction.welcome.headline": "First steps", + "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.blocked": "to open blocked users list", "keyboard_shortcuts.boost": "to pump", @@ -215,34 +242,21 @@ "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Squeaks:", + "notifications.column_settings.filter_bar.advanced": "Display all categories", + "notifications.column_settings.filter_bar.category": "Quick filter bar", + "notifications.column_settings.filter_bar.show": "Show", "notifications.column_settings.follow": "New followers:", "notifications.column_settings.mention": "Mentions:", "notifications.column_settings.push": "Push notifications", "notifications.column_settings.reblog": "Pumps:", "notifications.column_settings.show": "Show in column", "notifications.column_settings.sound": "Play sound", + "notifications.filter.all": "All", + "notifications.filter.boosts": "Pumps", + "notifications.filter.favourites": "Squeaks", + "notifications.filter.follows": "Follows", + "notifications.filter.mentions": "Mentions", "notifications.group": "{count} notifications", - "onboarding.done": "Done", - "onboarding.next": "Next", - "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_four.home": "The home timeline shows posts from people you follow.", - "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", - "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.full_handle": "Your full handle", - "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", - "onboarding.page_one.welcome": "Welcome to Mastodon!", - "onboarding.page_six.admin": "Your instance's admin is {admin}.", - "onboarding.page_six.almost_done": "Almost done...", - "onboarding.page_six.appetoot": "Bon Appetoot!", - "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.", - "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.guidelines": "community guidelines", - "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", - "onboarding.page_six.various_app": "mobile apps", - "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.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_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", - "onboarding.skip": "Skip", "privacy.change": "Adjust status privacy", "privacy.direct.long": "Post to mentioned users only", "privacy.direct.short": "Direct", @@ -278,6 +292,8 @@ "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "A look inside...", + "status.admin_account": "Open moderation interface for @{name}", + "status.admin_status": "Open this status in the moderation interface", "status.block": "Block @{name}", "status.cancel_reblog_private": "Deflate", "status.cannot_reblog": "This post cannot be pumped", @@ -312,6 +328,7 @@ "status.show_less_all": "Show less for all", "status.show_more": "Show more", "status.show_more_all": "Show more for all", + "status.show_thread": "Show thread", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", diff --git a/config/locales/devise.dog.yml b/config/locales/devise.dog.yml index c10b94bca..165a23c7a 100644 --- a/config/locales/devise.dog.yml +++ b/config/locales/devise.dog.yml @@ -18,6 +18,7 @@ dog: mailer: confirmation_instructions: action: Verify email address + action_with_app: Confirm and return to %{app} explanation: You have created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email. extra_html: Please also check out the rules of the instance and our terms of service. subject: 'Mastodon: Confirmation instructions for %{instance}' diff --git a/config/locales/devise.lion.yml b/config/locales/devise.lion.yml index 9f88369ec..7b19e48f0 100644 --- a/config/locales/devise.lion.yml +++ b/config/locales/devise.lion.yml @@ -18,6 +18,7 @@ lion: mailer: confirmation_instructions: action: Verify email address + action_with_app: Confirm and return to %{app} explanation: You have created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email. extra_html: Please also check out the rules of the instance and our terms of service. subject: 'Mastodon: Confirmation instructions for %{instance}' diff --git a/config/locales/devise.squeak.yml b/config/locales/devise.squeak.yml index db09f1878..6e2fe03d8 100644 --- a/config/locales/devise.squeak.yml +++ b/config/locales/devise.squeak.yml @@ -18,6 +18,7 @@ squeak: mailer: confirmation_instructions: action: Verify email address + action_with_app: Confirm and return to %{app} explanation: You have created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email. extra_html: Please also check out the rules of the instance and our terms of service. subject: 'Mastodon: Confirmation instructions for %{instance}' diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 3fa46138c..48e9db233 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -48,6 +48,7 @@ dog: other: Pack Members following: Joined Packs joined: Joined %{date} + last_active: last active link_verified_on: Ownership of this link was checked on %{date} media: Media moved_html: "%{name} has moved to %{new_profile_link}:" @@ -69,6 +70,9 @@ dog: moderator: Mod unfollow: Unfollow admin: + account_actions: + action: Perform action + title: Perform moderation action on %{acct} account_moderation_notes: create: Leave note created_msg: Moderation note successfully created! @@ -80,14 +84,15 @@ dog: by_domain: Domain change_email: changed_msg: Account email successfully changed! - current_email: Current Email - label: Change Email - new_email: New Email - submit: Change Email - title: Change Email for %{username} + current_email: Current email + label: Change email + new_email: New email + submit: Change email + title: Change email for %{username} confirm: Confirm confirmed: Confirmed confirming: Confirming + deleted: Deleted demote: Demote disable: Disable disable_two_factor_authentication: Disable 2FA @@ -95,16 +100,19 @@ dog: display_name: Display name domain: Domain edit: Edit - email: E-mail - email_status: E-mail Status + email: Email + email_status: Email status enable: Enable enabled: Enabled feed_url: Feed URL followers: Followers followers_url: Followers URL follows: Follows + header: Header inbox_url: Inbox URL + invited_by: Invited by ip: IP + joined: Joined location: all: All local: Local @@ -114,6 +122,7 @@ dog: media_attachments: Media attachments memorialize: Turn into memoriam moderation: + active: Active all: All silenced: Silenced suspended: Suspended @@ -123,10 +132,6 @@ dog: most_recent_ip: Most recent IP no_limits_imposed: No limits imposed not_subscribed: Not subscribed - order: - alphabetic: Alphabetic - most_recent: Most recent - title: Order outbox_url: Outbox URL perform_full_suspension: Suspend profile_url: Profile URL @@ -134,8 +139,9 @@ dog: protocol: Protocol public: Public push_subscription_expires: PuSH subscription expires - redownload: Refresh avatar + redownload: Refresh profile remove_avatar: Remove avatar + remove_header: Remove header resend_confirmation: already_confirmed: This dog is already confirmed send: Resend confirmation email @@ -151,28 +157,29 @@ dog: user: Dog salmon_url: Salmon URL search: Search - shared_inbox_url: Shared Inbox URL + shared_inbox_url: Shared inbox URL show: - created_reports: Reports created by this account - report: report - targeted_reports: Reports made about this account + created_reports: Made reports + targeted_reports: Reported by others silence: Silence silenced: Silenced statuses: Toots subscribe: Subscribe suspended: Suspended title: Accounts - unconfirmed_email: Unconfirmed E-mail + unconfirmed_email: Unconfirmed email undo_silenced: Undo silence undo_suspension: Undo suspension unsubscribe: Unsubscribe username: Username + warn: Warn web: Web action_logs: actions: assigned_to_self_report: "%{name} assigned report %{target} to themselves" change_email_user: "%{name} changed the e-mail address of dog %{target}" confirm_user: "%{name} confirmed e-mail address of dog %{target}" + create_account_warning: "%{name} sent a warning to %{target}" create_custom_emoji: "%{name} uploaded new emoji %{target}" create_domain_block: "%{name} blocked domain %{target}" create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" @@ -231,6 +238,7 @@ dog: config: Configuration feature_deletions: Account deletions feature_invites: Invite links + feature_profile_directory: Profile directory feature_registrations: Registrations feature_relay: Federation relay features: Features @@ -265,11 +273,11 @@ dog: reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions reject_reports: Reject reports reject_reports_hint: Ignore all reports coming from this domain. Irrelevant for suspensions - severities: - noop: None - silence: Silence - suspend: Suspend - severity: Severity + rejecting_media: rejecting media files + rejecting_reports: rejecting reports + severity: + silence: silenced + suspend: suspended show: affected_accounts: one: One account in the database affected @@ -279,8 +287,7 @@ dog: suspend: Unsuspend all existing accounts from this domain title: Undo domain block for %{domain} undo: Undo - title: Domain blocks - undo: Undo + undo: Undo domain block email_domain_blocks: add_new: Add new created_msg: Successfully added e-mail domain to blacklist @@ -291,12 +298,24 @@ dog: create: Add domain title: New e-mail blacklist entry title: E-mail blacklist + followers: + back_to_account: Back To Account + title: "%{acct}'s Pack Members" instances: - account_count: Known accounts - domain_name: Domain - reset: Reset - search: Search - title: Known instances + delivery_available: Delivery is available + known_accounts: + one: "%{count} known account" + other: "%{count} known accounts" + moderation: + all: All + limited: Limited + title: Moderation + title: Federation + total_blocked_by_us: Blocked by us + total_followed_by_them: Followed by them + total_followed_by_us: Followed by us + total_reported: Reports about them + total_storage: Media attachments invites: deactivate_all: Deactivate all filter: @@ -348,7 +367,7 @@ dog: reported_by: Reported by resolved: Resolved resolved_msg: Report successfully resolved! - silence_account: Silence account + status: Status title: Reports unassign: Unassign unresolved: Unresolved @@ -378,6 +397,9 @@ dog: preview_sensitive_media: desc_html: Link previews on other websites will display a thumbnail even if the media is marked as sensitive title: Show sensitive media in OpenGraph previews + profile_directory: + desc_html: Allow dogs to be discoverable + title: Enable profile directory registrations: closed_message: desc_html: Displayed on frontpage when registrations are closed. You can use HTML tags @@ -398,7 +420,7 @@ dog: desc_html: Show a staff badge on a dog page title: Show staff badge site_description: - desc_html: Introductory paragraph on the frontpage and in meta tags. You can use HTML tags, in particular <a> and <em>. + desc_html: Introductory paragraph on the frontpage. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <a> and <em>. title: Instance description site_description_extended: desc_html: A good place for your code of conduct, rules, guidelines and other things that set your instance apart. You can use HTML tags @@ -437,13 +459,21 @@ dog: last_delivery: Last delivery title: WebSub topic: Topic - suspensions: - bad_acct_msg: The confirmation value didn't match up. Are you suspending the right account? - hint_html: 'To confirm the suspension of the account, please enter %{value} into the field below:' - proceed: Proceed - title: Suspend %{acct} - warning_html: 'Suspending this account will irreversibly delete data from this account, which includes:' + tags: + accounts: Accounts + hidden: Hidden + hide: Hide from directory + name: Hashtag + title: Hashtags + unhide: Show in directory + visible: Visible title: Administration + warning_presets: + add_new: Add new + delete: Delete + edit: Edit + edit_preset: Edit warning preset + title: Manage warning presets admin_mailer: new_report: body: "%{reporter} has reported %{target}" @@ -465,7 +495,7 @@ dog: warning: Be very careful with this data. Never share it with anyone! your_token: Your access token auth: - agreement_html: By signing up you agree to follow the rules of the instance and our terms of service. + agreement_html: By clicking "Sign up" below you agree to follow the rules of the instance and our terms of service. change_password: Password confirm_email: Confirm email delete_account: Delete account @@ -521,6 +551,13 @@ dog: success_msg: Your account was successfully deleted warning_html: Only deletion of content from this particular instance is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases. warning_title: Disseminated content availability + directories: + directory: Profile directory + explanation: Discover dogs based on their interests + explore_mastodon: Explore %{title} + people: + one: "%{count} dog" + other: "%{count} dogs" errors: '403': You don't have permission to view this page. '404': The page you were looking for doesn't exist. @@ -543,7 +580,9 @@ dog: size: Size blocks: You block csv: CSV + domain_blocks: Domain blocks follows: You follow + lists: Lists mutes: You mute storage: Media storage filters: @@ -687,18 +726,30 @@ dog: publishing: Publishing web: Web remote_follow: - acct: Enter your username@domain you want to follow from + acct: Enter your username@domain you want to act from missing_resource: Could not find the required redirect URL for your account no_account_html: Don't have an account? You can sign up here proceed: Proceed to follow prompt: 'You are going to follow:' + reason_html: "Why is this step necessary? %{instance} might not be the server where you are registered, so we need to redirect you to your home server first." remote_interaction: - proceed: Proceed to interact - prompt: 'You want to interact with this toot:' + favourite: + proceed: Proceed to boop + prompt: 'You want to boop this toot:' + reblog: + proceed: Proceed to awoo + prompt: 'You want to awoo this toot:' + reply: + proceed: Proceed to bark + prompt: 'You want to bark at this toot:' remote_unfollow: error: Error title: Title unfollowed: Unfollowed + scheduled_statuses: + over_daily_limit: You have exceeded the limit of %{limit} scheduled toots for that day + over_total_limit: You have exceeded the limit of %{limit} scheduled toots + too_soon: The scheduled date must be in the future sessions: activity: Last activity browser: Browser @@ -912,6 +963,22 @@ dog: explanation: You requested a full backup of your Mastodon account. It's now ready for download! subject: Your archive is ready for download title: Archive takeout + warning: + explanation: + disable: While your account is frozen, your account data remains intact, but you cannot perform any actions until it is unlocked. + silence: While your account is limited, only people who are already following you will see your toots on this server, and you may be excluded from various public listings. However, others may still manually follow you. + suspend: Your account has been suspended, and all of your toots and your uploaded media files have been irreversibly removed from this server, and servers where you had followers. + review_server_policies: Review server policies + subject: + disable: Your account %{acct} has been frozen + none: Warning for %{acct} + silence: Your account %{acct} has been limited + suspend: Your account %{acct} has been suspended + title: + disable: Account frozen + none: Warning + silence: Account limited + suspend: Account suspended welcome: edit_profile_action: Setup profile edit_profile_step: You can customize your profile by uploading an avatar, header, changing your display name and more. If you’d like to review new followers before they’re allowed to follow you, you can lock your account. @@ -923,7 +990,6 @@ dog: review_preferences_action: Change preferences review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay. subject: Welcome to Mastodon - tip_bridge_html: If you are coming from Twitter, you can find your friends on Mastodon by using the bridge app. It only works if they also used the bridge app though! tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes people your neighbours are subscribed to, so it's not complete. tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines. tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours! diff --git a/config/locales/lion.yml b/config/locales/lion.yml index af355f37a..c05756ef2 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -48,6 +48,7 @@ lion: other: Pride Members following: Following joined: Joined %{date} + last_active: last active link_verified_on: Ownership of this link was checked on %{date} media: Media moved_html: "%{name} has moved to %{new_profile_link}:" @@ -69,6 +70,9 @@ lion: moderator: Mod unfollow: Unfollow admin: + account_actions: + action: Perform action + title: Perform moderation action on %{acct} account_moderation_notes: create: Leave note created_msg: Moderation note successfully created! @@ -80,14 +84,15 @@ lion: by_domain: Domain change_email: changed_msg: Account email successfully changed! - current_email: Current Email - label: Change Email - new_email: New Email - submit: Change Email - title: Change Email for %{username} + current_email: Current email + label: Change email + new_email: New email + submit: Change email + title: Change email for %{username} confirm: Confirm confirmed: Confirmed confirming: Confirming + deleted: Deleted demote: Demote disable: Disable disable_two_factor_authentication: Disable 2FA @@ -95,16 +100,19 @@ lion: display_name: Display name domain: Domain edit: Edit - email: E-mail - email_status: E-mail Status + email: Email + email_status: Email status enable: Enable enabled: Enabled feed_url: Feed URL followers: Followers followers_url: Followers URL follows: Follows + header: Header inbox_url: Inbox URL + invited_by: Invited by ip: IP + joined: Joined location: all: All local: Local @@ -114,6 +122,7 @@ lion: media_attachments: Media attachments memorialize: Turn into memoriam moderation: + active: Active all: All silenced: Silenced suspended: Suspended @@ -123,19 +132,16 @@ lion: most_recent_ip: Most recent IP no_limits_imposed: No limits imposed not_subscribed: Not subscribed - order: - alphabetic: Alphabetic - most_recent: Most recent - title: Order outbox_url: Outbox URL - perform_full_suspension: Perform full suspension + perform_full_suspension: Suspend profile_url: Profile URL promote: Promote protocol: Protocol public: Public push_subscription_expires: PuSH subscription expires - redownload: Refresh avatar + redownload: Refresh profile remove_avatar: Remove avatar + remove_header: Remove header resend_confirmation: already_confirmed: This lion is already confirmed send: Resend confirmation email @@ -151,28 +157,29 @@ lion: user: Lion salmon_url: Salmon URL search: Search - shared_inbox_url: Shared Inbox URL + shared_inbox_url: Shared inbox URL show: - created_reports: Reports created by this account - report: report - targeted_reports: Reports made about this account + created_reports: Made reports + targeted_reports: Reported by others silence: Silence silenced: Silenced statuses: Toots subscribe: Subscribe suspended: Suspended title: Accounts - unconfirmed_email: Unconfirmed E-mail + unconfirmed_email: Unconfirmed email undo_silenced: Undo silence undo_suspension: Undo suspension unsubscribe: Unsubscribe username: Username + warn: Warn web: Web action_logs: actions: assigned_to_self_report: "%{name} assigned report %{target} to themselves" change_email_user: "%{name} changed the e-mail address of lion %{target}" confirm_user: "%{name} confirmed e-mail address of lion %{target}" + create_account_warning: "%{name} sent a warning to %{target}" create_custom_emoji: "%{name} uploaded new emoji %{target}" create_domain_block: "%{name} blocked domain %{target}" create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" @@ -231,6 +238,7 @@ lion: config: Configuration feature_deletions: Account deletions feature_invites: Invite links + feature_profile_directory: Profile directory feature_registrations: Registrations feature_relay: Federation relay features: Features @@ -265,11 +273,11 @@ lion: reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions reject_reports: Reject reports reject_reports_hint: Ignore all reports coming from this domain. Irrelevant for suspensions - severities: - noop: None - silence: Silence - suspend: Suspend - severity: Severity + rejecting_media: rejecting media files + rejecting_reports: rejecting reports + severity: + silence: silenced + suspend: suspended show: affected_accounts: one: One account in the database affected @@ -279,8 +287,7 @@ lion: suspend: Unsuspend all existing accounts from this domain title: Undo domain block for %{domain} undo: Undo - title: Domain blocks - undo: Undo + undo: Undo domain block email_domain_blocks: add_new: Add new created_msg: Successfully added e-mail domain to blacklist @@ -291,12 +298,24 @@ lion: create: Add domain title: New e-mail blacklist entry title: E-mail blacklist + followers: + back_to_account: Back To Account + title: "%{acct}'s Pride members" instances: - account_count: Known accounts - domain_name: Domain - reset: Reset - search: Search - title: Known instances + delivery_available: Delivery is available + known_accounts: + one: "%{count} known account" + other: "%{count} known accounts" + moderation: + all: All + limited: Limited + title: Moderation + title: Federation + total_blocked_by_us: Blocked by us + total_followed_by_them: Followed by them + total_followed_by_us: Followed by us + total_reported: Reports about them + total_storage: Media attachments invites: deactivate_all: Deactivate all filter: @@ -348,7 +367,7 @@ lion: reported_by: Reported by resolved: Resolved resolved_msg: Report successfully resolved! - silence_account: Silence account + status: Status title: Reports unassign: Unassign unresolved: Unresolved @@ -378,6 +397,9 @@ lion: preview_sensitive_media: desc_html: Link previews on other websites will display a thumbnail even if the media is marked as sensitive title: Show sensitive media in OpenGraph previews + profile_directory: + desc_html: Allow lions to be discoverable + title: Enable profile directory registrations: closed_message: desc_html: Displayed on frontpage when registrations are closed. You can use HTML tags @@ -398,7 +420,7 @@ lion: desc_html: Show a staff badge on a lion page title: Show staff badge site_description: - desc_html: Introductory paragraph on the frontpage and in meta tags. You can use HTML tags, in particular <a> and <em>. + desc_html: Introductory paragraph on the frontpage. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <a> and <em>. title: Instance description site_description_extended: desc_html: A good place for your code of conduct, rules, guidelines and other things that set your instance apart. You can use HTML tags @@ -437,13 +459,21 @@ lion: last_delivery: Last delivery title: WebSub topic: Topic - suspensions: - bad_acct_msg: The confirmation value didn't match up. Are you suspending the right account? - hint_html: 'To confirm the suspension of the account, please enter %{value} into the field below:' - proceed: Proceed - title: Suspend %{acct} - warning_html: 'Suspending this account will irreversibly delete data from this account, which includes:' + tags: + accounts: Accounts + hidden: Hidden + hide: Hide from directory + name: Hashtag + title: Hashtags + unhide: Show in directory + visible: Visible title: Administration + warning_presets: + add_new: Add new + delete: Delete + edit: Edit + edit_preset: Edit warning preset + title: Manage warning presets admin_mailer: new_report: body: "%{reporter} has reported %{target}" @@ -465,7 +495,7 @@ lion: warning: Be very careful with this data. Never share it with anyone! your_token: Your access token auth: - agreement_html: By signing up you agree to follow the rules of the instance and our terms of service. + agreement_html: By clicking "Sign up" below you agree to follow the rules of the instance and our terms of service. change_password: Password confirm_email: Confirm email delete_account: Delete account @@ -521,6 +551,13 @@ lion: success_msg: Your account was successfully deleted warning_html: Only deletion of content from this particular instance is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases. warning_title: Disseminated content availability + directories: + directory: Profile directory + explanation: Discover lions based on their interests + explore_mastodon: Explore %{title} + people: + one: "%{count} person" + other: "%{count} people" errors: '403': You don't have permission to view this page. '404': The page you were looking for doesn't exist. @@ -543,7 +580,9 @@ lion: size: Size blocks: You block csv: CSV + domain_blocks: Domain blocks follows: You follow + lists: Lists mutes: You mute storage: Media storage filters: @@ -692,13 +731,25 @@ lion: no_account_html: Don't have an account? You can sign up here proceed: Proceed to follow prompt: 'You are going to follow:' + reason_html: "Why is this step necessary? %{instance} might not be the server where you are registered, so we need to redirect you to your home server first." remote_interaction: - proceed: Proceed to interact - prompt: 'You want to interact with this toot:' + favourite: + proceed: Proceed to boop + prompt: 'You want to boop this toot:' + reblog: + proceed: Proceed to roar + prompt: 'You want to roar this toot:' + reply: + proceed: Proceed to meow + prompt: 'You want to meow at this toot:' remote_unfollow: error: Error title: Title unfollowed: Unfollowed + scheduled_statuses: + over_daily_limit: You have exceeded the limit of %{limit} scheduled toots for that day + over_total_limit: You have exceeded the limit of %{limit} scheduled toots + too_soon: The scheduled date must be in the future sessions: activity: Last activity browser: Browser @@ -912,6 +963,22 @@ lion: explanation: You requested a full backup of your Mastodon account. It's now ready for download! subject: Your archive is ready for download title: Archive takeout + warning: + explanation: + disable: While your account is frozen, your account data remains intact, but you cannot perform any actions until it is unlocked. + silence: While your account is limited, only people who are already following you will see your toots on this server, and you may be excluded from various public listings. However, others may still manually follow you. + suspend: Your account has been suspended, and all of your toots and your uploaded media files have been irreversibly removed from this server, and servers where you had followers. + review_server_policies: Review server policies + subject: + disable: Your account %{acct} has been frozen + none: Warning for %{acct} + silence: Your account %{acct} has been limited + suspend: Your account %{acct} has been suspended + title: + disable: Account frozen + none: Warning + silence: Account limited + suspend: Account suspended welcome: edit_profile_action: Setup profile edit_profile_step: You can customize your profile by uploading an avatar, header, changing your display name and more. If you’d like to review new followers before they’re allowed to follow you, you can lock your account. @@ -923,7 +990,6 @@ lion: review_preferences_action: Change preferences review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay. subject: Welcome to Mastodon - tip_bridge_html: If you are coming from Twitter, you can find your friends on Mastodon by using the bridge app. It only works if they also used the bridge app though! tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes people your neighbours are subscribed to, so it's not complete. tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines. tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours! diff --git a/config/locales/simple_form.dog.yml b/config/locales/simple_form.dog.yml index 4909dd76d..0057e438c 100644 --- a/config/locales/simple_form.dog.yml +++ b/config/locales/simple_form.dog.yml @@ -2,12 +2,20 @@ dog: simple_form: hints: + account_warning_preset: + text: You can use toot syntax, such as URLs, hashtags and mentions + admin_account_action: + send_email_notification: The user will receive an explanation of what happened with their account + text_html: Optional. You can use toot syntax. You can add warning presets to save time + type_html: Choose what to do with %{acct} + warning_preset_id: Optional. You can still add custom text to end of the preset defaults: autofollow: People who sign up through the invite will automatically follow you avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px bot: This account mainly performs automated actions and might not be monitored context: One or multiple contexts where the filter should apply digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence + discoverable_html: The directory lets people find accounts based on interests and activity. Requires at least %{min_followers} followers email: You will be sent a confirmation e-mail fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px @@ -18,12 +26,13 @@ dog: password: Use at least 8 characters phrase: Will be matched regardless of casing in text or content warning of a toot scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. + setting_aggregate_reblogs: Do not show new awoos for toots that have been recently awooed (only affects newly-received awoos) setting_default_language: The language of your toots can be detected automatically, but it's not always accurate setting_display_media_default: Hide media marked as sensitive setting_display_media_hide_all: Always hide all media setting_display_media_show_all: Always show media marked as sensitive setting_hide_network: Who you follow and who follows you will not be shown on your profile - setting_noindex: Affects your public profile and status pages + setting_noindex: Affects your public profile and toot pages setting_theme: Affects how Mastodon looks when you're logged in from any device. username: Your username will be unique on %{domain} whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word @@ -38,6 +47,18 @@ dog: fields: name: Label value: Content + account_warning_preset: + text: Preset text + admin_account_action: + send_email_notification: Notify the user per e-mail + text: Custom warning + type: Action + types: + disable: Disable + none: Do nothing + silence: Silence + suspend: Suspend and irreversibly delete account data + warning_preset_id: Use a warning preset defaults: autofollow: Invite to follow your account avatar: Avatar @@ -48,6 +69,7 @@ dog: context: Filter contexts current_password: Current password data: Data + discoverable: List this account on the directory display_name: Display name email: E-mail address expires_in: Expire after @@ -63,8 +85,9 @@ dog: otp_attempt: Two-factor code password: Password phrase: Keyword or phrase + setting_aggregate_reblogs: Group awoos in timelines setting_auto_play_gif: Auto-play animated GIFs - setting_boost_modal: Show confirmation dialog before boosting + setting_boost_modal: Show confirmation dialog before awooing setting_default_language: Posting language setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive @@ -91,11 +114,11 @@ dog: must_be_following_dm: Block direct messages from people you don't follow notification_emails: digest: Send digest e-mails - favourite: Send e-mail when someone favourites your status + favourite: Send e-mail when someone boops your toot follow: Send e-mail when someone follows you follow_request: Send e-mail when someone requests to follow you mention: Send e-mail when someone mentions you - reblog: Send e-mail when someone boosts your status + reblog: Send e-mail when someone awoos your toot report: Send e-mail when a new report is submitted 'no': 'No' required: diff --git a/config/locales/simple_form.lion.yml b/config/locales/simple_form.lion.yml index 28ef0a1fc..613c4dd49 100644 --- a/config/locales/simple_form.lion.yml +++ b/config/locales/simple_form.lion.yml @@ -2,12 +2,20 @@ lion: simple_form: hints: + account_warning_preset: + text: You can use toot syntax, such as URLs, hashtags and mentions + admin_account_action: + send_email_notification: The user will receive an explanation of what happened with their account + text_html: Optional. You can use toot syntax. You can add warning presets to save time + type_html: Choose what to do with %{acct} + warning_preset_id: Optional. You can still add custom text to end of the preset defaults: autofollow: People who sign up through the invite will automatically follow you avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px bot: This account mainly performs automated actions and might not be monitored context: One or multiple contexts where the filter should apply digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence + discoverable_html: The directory lets people find accounts based on interests and activity. Requires at least %{min_followers} followers email: You will be sent a confirmation e-mail fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px @@ -18,12 +26,13 @@ lion: password: Use at least 8 characters phrase: Will be matched regardless of casing in text or content warning of a toot scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. + setting_aggregate_reblogs: Do not show new roars for toots that have been recently roared (only affects newly-received roars) setting_default_language: The language of your toots can be detected automatically, but it's not always accurate setting_display_media_default: Hide media marked as sensitive setting_display_media_hide_all: Always hide all media setting_display_media_show_all: Always show media marked as sensitive setting_hide_network: Who you follow and who follows you will not be shown on your profile - setting_noindex: Affects your public profile and status pages + setting_noindex: Affects your public profile and toot pages setting_theme: Affects how Mastodon looks when you're logged in from any device. username: Your username will be unique on %{domain} whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word @@ -38,6 +47,18 @@ lion: fields: name: Label value: Content + account_warning_preset: + text: Preset text + admin_account_action: + send_email_notification: Notify the user per e-mail + text: Custom warning + type: Action + types: + disable: Disable + none: Do nothing + silence: Silence + suspend: Suspend and irreversibly delete account data + warning_preset_id: Use a warning preset defaults: autofollow: Invite to follow your account avatar: Avatar @@ -48,6 +69,7 @@ lion: context: Filter contexts current_password: Current password data: Data + discoverable: List this account on the directory display_name: Display name email: E-mail address expires_in: Expire after @@ -63,8 +85,9 @@ lion: otp_attempt: Two-factor code password: Password phrase: Keyword or phrase + setting_aggregate_reblogs: Group roars in timelines setting_auto_play_gif: Auto-play animated GIFs - setting_boost_modal: Show confirmation dialog before boosting + setting_boost_modal: Show confirmation dialog before roaring setting_default_language: Posting language setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive @@ -91,11 +114,11 @@ lion: must_be_following_dm: Block direct messages from people you don't follow notification_emails: digest: Send digest e-mails - favourite: Send e-mail when someone favourites your status + favourite: Send e-mail when someone boops your toot follow: Send e-mail when someone follows you follow_request: Send e-mail when someone requests to follow you mention: Send e-mail when someone mentions you - reblog: Send e-mail when someone boosts your status + reblog: Send e-mail when someone roars your toot report: Send e-mail when a new report is submitted 'no': 'No' required: diff --git a/config/locales/simple_form.squeak.yml b/config/locales/simple_form.squeak.yml index e70a6b2f5..5852e0fc1 100644 --- a/config/locales/simple_form.squeak.yml +++ b/config/locales/simple_form.squeak.yml @@ -2,12 +2,20 @@ squeak: simple_form: hints: + account_warning_preset: + text: You can use toot syntax, such as URLs, hashtags and mentions + admin_account_action: + send_email_notification: The user will receive an explanation of what happened with their account + text_html: Optional. You can use toot syntax. You can add warning presets to save time + type_html: Choose what to do with %{acct} + warning_preset_id: Optional. You can still add custom text to end of the preset defaults: autofollow: People who sign up through the invite will automatically follow you avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px bot: This account mainly performs automated actions and might not be monitored context: One or multiple contexts where the filter should apply digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence + discoverable_html: The directory lets people find accounts based on interests and activity. Requires at least %{min_followers} followers email: You will be sent a confirmation e-mail fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px @@ -18,6 +26,7 @@ squeak: password: Use at least 8 characters phrase: Will be matched regardless of casing in text or content warning of a toot scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. + setting_aggregate_reblogs: Do not show new pumps for toots that have been recently pumped (only affects newly-received pumps) setting_default_language: The language of your toots can be detected automatically, but it's not always accurate setting_display_media_default: Hide media marked as sensitive setting_display_media_hide_all: Always hide all media @@ -38,6 +47,18 @@ squeak: fields: name: Label value: Content + account_warning_preset: + text: Preset text + admin_account_action: + send_email_notification: Notify the user per e-mail + text: Custom warning + type: Action + types: + disable: Disable + none: Do nothing + silence: Silence + suspend: Suspend and irreversibly delete account data + warning_preset_id: Use a warning preset defaults: autofollow: Invite to follow your account avatar: Avatar @@ -48,6 +69,7 @@ squeak: context: Filter contexts current_password: Current password data: Data + discoverable: List this account on the directory display_name: Display name email: E-mail address expires_in: Expire after @@ -63,8 +85,9 @@ squeak: otp_attempt: Two-factor code password: Password phrase: Keyword or phrase + setting_aggregate_reblogs: Group pumps in timelines setting_auto_play_gif: Auto-play animated GIFs - setting_boost_modal: Show confirmation dialog before boosting + setting_boost_modal: Show confirmation dialog before pumping setting_default_language: Posting language setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive @@ -91,11 +114,11 @@ squeak: must_be_following_dm: Block direct messages from people you don't follow notification_emails: digest: Send digest e-mails - favourite: Send e-mail when someone favourites your status + favourite: Send e-mail when someone squeaks your status follow: Send e-mail when someone follows you follow_request: Send e-mail when someone requests to follow you mention: Send e-mail when someone mentions you - reblog: Send e-mail when someone boosts your status + reblog: Send e-mail when someone pumps your status report: Send e-mail when a new report is submitted 'no': 'No' required: diff --git a/config/locales/squeak.yml b/config/locales/squeak.yml index c8c842ba2..d7cb42ade 100644 --- a/config/locales/squeak.yml +++ b/config/locales/squeak.yml @@ -48,6 +48,7 @@ squeak: other: Followers following: Following joined: Joined %{date} + last_active: last active link_verified_on: Ownership of this link was checked on %{date} media: Media moved_html: "%{name} has moved to %{new_profile_link}:" @@ -69,6 +70,9 @@ squeak: moderator: Mod unfollow: Unfollow admin: + account_actions: + action: Perform action + title: Perform moderation action on %{acct} account_moderation_notes: create: Leave note created_msg: Moderation note successfully created! @@ -80,14 +84,15 @@ squeak: by_domain: Domain change_email: changed_msg: Account email successfully changed! - current_email: Current Email - label: Change Email - new_email: New Email - submit: Change Email - title: Change Email for %{username} + current_email: Current email + label: Change email + new_email: New email + submit: Change email + title: Change email for %{username} confirm: Confirm confirmed: Confirmed confirming: Confirming + deleted: Deleted demote: Demote disable: Disable disable_two_factor_authentication: Disable 2FA @@ -95,16 +100,19 @@ squeak: display_name: Display name domain: Domain edit: Edit - email: E-mail - email_status: E-mail Status + email: Email + email_status: Email status enable: Enable enabled: Enabled feed_url: Feed URL followers: Followers followers_url: Followers URL follows: Follows + header: Header inbox_url: Inbox URL + invited_by: Invited by ip: IP + joined: Joined location: all: All local: Local @@ -114,6 +122,7 @@ squeak: media_attachments: Media attachments memorialize: Turn into memoriam moderation: + active: Active all: All silenced: Silenced suspended: Suspended @@ -123,19 +132,16 @@ squeak: most_recent_ip: Most recent IP no_limits_imposed: No limits imposed not_subscribed: Not subscribed - order: - alphabetic: Alphabetic - most_recent: Most recent - title: Order outbox_url: Outbox URL - perform_full_suspension: Perform full suspension + perform_full_suspension: Suspend profile_url: Profile URL promote: Promote protocol: Protocol public: Public push_subscription_expires: PuSH subscription expires - redownload: Refresh avatar + redownload: Refresh profile remove_avatar: Remove avatar + remove_header: Remove header resend_confirmation: already_confirmed: This user is already confirmed send: Resend confirmation email @@ -151,28 +157,29 @@ squeak: user: User salmon_url: Salmon URL search: Search - shared_inbox_url: Shared Inbox URL + shared_inbox_url: Shared inbox URL show: - created_reports: Reports created by this account - report: report - targeted_reports: Reports made about this account + created_reports: Made reports + targeted_reports: Reported by others silence: Silence silenced: Silenced statuses: Statuses subscribe: Subscribe suspended: Suspended title: Accounts - unconfirmed_email: Unconfirmed E-mail + unconfirmed_email: Unconfirmed email undo_silenced: Undo silence undo_suspension: Undo suspension unsubscribe: Unsubscribe username: Username + warn: Warn web: Web action_logs: actions: assigned_to_self_report: "%{name} assigned report %{target} to themselves" change_email_user: "%{name} changed the e-mail address of user %{target}" confirm_user: "%{name} confirmed e-mail address of user %{target}" + create_account_warning: "%{name} sent a warning to %{target}" create_custom_emoji: "%{name} uploaded new emoji %{target}" create_domain_block: "%{name} blocked domain %{target}" create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" @@ -231,6 +238,7 @@ squeak: config: Configuration feature_deletions: Account deletions feature_invites: Invite links + feature_profile_directory: Profile directory feature_registrations: Registrations feature_relay: Federation relay features: Features @@ -248,7 +256,7 @@ squeak: week_users_active: active this week week_users_new: users this week domain_blocks: - add_new: Add new + add_new: Add new domain block created_msg: Domain block is now being processed destroyed_msg: Domain block has been undone domain: Domain @@ -265,11 +273,11 @@ squeak: reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions reject_reports: Reject reports reject_reports_hint: Ignore all reports coming from this domain. Irrelevant for suspensions - severities: - noop: None - silence: Silence - suspend: Suspend - severity: Severity + rejecting_media: rejecting media files + rejecting_reports: rejecting reports + severity: + silence: silenced + suspend: suspended show: affected_accounts: one: One account in the database affected @@ -279,8 +287,7 @@ squeak: suspend: Unsuspend all existing accounts from this domain title: Undo domain block for %{domain} undo: Undo - title: Domain blocks - undo: Undo + undo: Undo domain block email_domain_blocks: add_new: Add new created_msg: Successfully added e-mail domain to blacklist @@ -291,12 +298,24 @@ squeak: create: Add domain title: New e-mail blacklist entry title: E-mail blacklist + followers: + back_to_account: Back To Account + title: "%{acct}'s Followers" instances: - account_count: Known accounts - domain_name: Domain - reset: Reset - search: Search - title: Known instances + delivery_available: Delivery is available + known_accounts: + one: "%{count} known account" + other: "%{count} known accounts" + moderation: + all: All + limited: Limited + title: Moderation + title: Federation + total_blocked_by_us: Blocked by us + total_followed_by_them: Followed by them + total_followed_by_us: Followed by us + total_reported: Reports about them + total_storage: Media attachments invites: deactivate_all: Deactivate all filter: @@ -378,6 +397,9 @@ squeak: preview_sensitive_media: desc_html: Link previews on other websites will display a thumbnail even if the media is marked as sensitive title: Show sensitive media in OpenGraph previews + profile_directory: + desc_html: Allow users to be discoverable + title: Enable profile directory registrations: closed_message: desc_html: Displayed on frontpage when registrations are closed. You can use HTML tags @@ -398,7 +420,7 @@ squeak: desc_html: Show a staff badge on a user page title: Show staff badge site_description: - desc_html: Introductory paragraph on the frontpage and in meta tags. You can use HTML tags, in particular <a> and <em>. + desc_html: Introductory paragraph on the frontpage. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <a> and <em>. title: Instance description site_description_extended: desc_html: A good place for your code of conduct, rules, guidelines and other things that set your instance apart. You can use HTML tags @@ -437,13 +459,21 @@ squeak: last_delivery: Last delivery title: WebSub topic: Topic - suspensions: - bad_acct_msg: The confirmation value didn't match up. Are you suspending the right account? - hint_html: 'To confirm the suspension of the account, please enter %{value} into the field below:' - proceed: Proceed - title: Suspend %{acct} - warning_html: 'Suspending this account will irreversibly delete data from this account, which includes:' + tags: + accounts: Accounts + hidden: Hidden + hide: Hide from directory + name: Hashtag + title: Hashtags + unhide: Show in directory + visible: Visible title: Administration + warning_presets: + add_new: Add new + delete: Delete + edit: Edit + edit_preset: Edit warning preset + title: Manage warning presets admin_mailer: new_report: body: "%{reporter} has reported %{target}" @@ -465,7 +495,7 @@ squeak: warning: Be very careful with this data. Never share it with anyone! your_token: Your access token auth: - agreement_html: By signing up you agree to follow the rules of the instance and our terms of service. + agreement_html: By clicking "Sign up" below you agree to follow the rules of the instance and our terms of service. change_password: Password confirm_email: Confirm email delete_account: Delete account @@ -521,6 +551,13 @@ squeak: success_msg: Your account was successfully deleted warning_html: Only deletion of content from this particular instance is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases. warning_title: Disseminated content availability + directories: + directory: Profile directory + explanation: Discover users based on their interests + explore_mastodon: Explore %{title} + people: + one: "%{count} person" + other: "%{count} people" errors: '403': You don't have permission to view this page. '404': The page you were looking for doesn't exist. @@ -532,7 +569,7 @@ squeak: '500': content: We're sorry, but something went wrong on our end. title: This page is not correct - noscript_html: To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform. + noscript_html: To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform. exports: archive_takeout: date: Date @@ -543,7 +580,9 @@ squeak: size: Size blocks: You block csv: CSV + domain_blocks: Domain blocks follows: You follow + lists: Lists mutes: You mute storage: Media storage filters: @@ -687,18 +726,30 @@ squeak: publishing: Publishing web: Web remote_follow: - acct: Enter your username@domain you want to follow from + acct: Enter your username@domain you want to act from missing_resource: Could not find the required redirect URL for your account no_account_html: Don't have an account? You can sign up here proceed: Proceed to follow prompt: 'You are going to follow:' + reason_html: "Why is this step necessary? %{instance} might not be the server where you are registered, so we need to redirect you to your home server first." remote_interaction: - proceed: Proceed to interact - prompt: 'You want to interact with this toot:' + favourite: + proceed: Proceed to squeak + prompt: 'You want to squeak this toot:' + reblog: + proceed: Proceed to pump + prompt: 'You want to pump this toot:' + reply: + proceed: Proceed to reply + prompt: 'You want to reply to this toot:' remote_unfollow: error: Error title: Title unfollowed: Unfollowed + scheduled_statuses: + over_daily_limit: You have exceeded the limit of %{limit} scheduled toots for that day + over_total_limit: You have exceeded the limit of %{limit} scheduled toots + too_soon: The scheduled date must be in the future sessions: activity: Last activity browser: Browser @@ -912,6 +963,22 @@ squeak: explanation: You requested a full backup of your Mastodon account. It's now ready for download! subject: Your archive is ready for download title: Archive takeout + warning: + explanation: + disable: While your account is frozen, your account data remains intact, but you cannot perform any actions until it is unlocked. + silence: While your account is limited, only people who are already following you will see your toots on this server, and you may be excluded from various public listings. However, others may still manually follow you. + suspend: Your account has been suspended, and all of your toots and your uploaded media files have been irreversibly removed from this server, and servers where you had followers. + review_server_policies: Review server policies + subject: + disable: Your account %{acct} has been frozen + none: Warning for %{acct} + silence: Your account %{acct} has been limited + suspend: Your account %{acct} has been suspended + title: + disable: Account frozen + none: Warning + silence: Account limited + suspend: Account suspended welcome: edit_profile_action: Setup profile edit_profile_step: You can customize your profile by uploading an avatar, header, changing your display name and more. If you’d like to review new followers before they’re allowed to follow you, you can lock your account. @@ -923,7 +990,6 @@ squeak: review_preferences_action: Change preferences review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay. subject: Welcome to Mastodon - tip_bridge_html: If you are coming from Twitter, you can find your friends on Mastodon by using the bridge app. It only works if they also used the bridge app though! tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes people your neighbours are subscribed to, so it's not complete. tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines. tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours! From f6eb3340a02b1bfd8e6685d0cb717e48d1cfff02 Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 8 Jan 2019 23:06:55 -0600 Subject: [PATCH 126/274] Fix themes --- config/settings.yml | 2 +- config/themes.yml | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/config/settings.yml b/config/settings.yml index 4f7c2c8f3..495688a66 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -28,7 +28,7 @@ defaults: &defaults reduce_motion: false system_font_ui: false noindex: false - theme: 'default' + theme: 'mastodon' aggregate_reblogs: true notification_emails: follow: false diff --git a/config/themes.yml b/config/themes.yml index 9c21c9459..5a8594f74 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,3 +1,12 @@ -default: styles/application.scss contrast: styles/contrast.scss +contrast-wider: styles/contrast-wider.scss +pop: styles/pop.scss +pop-wider: styles/pop-wider.scss +pop-light: styles/pop-light.scss +pop-light-wider: styles/pop-light-wider.scss +mastodon: styles/application.scss +mastodon-wider: styles/mastodon-wider.scss mastodon-light: styles/mastodon-light.scss +mastodon-light-wider: styles/mastodon-light-wider.scss +werefox: styles/werefox.scss +werefox-wider: styles/werefox-wider.scss From 651b0fe1a49261daf50ca51f88534ea91bea6892 Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 9 Jan 2019 00:18:39 -0600 Subject: [PATCH 127/274] Fix languages --- config/application.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/application.rb b/config/application.rb index b4a39b5c8..13106ec05 100644 --- a/config/application.rb +++ b/config/application.rb @@ -36,6 +36,9 @@ module Mastodon # All translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] config.i18n.available_locales = [ + :dog, + :lion, + :squeak, :en, :ar, :ast, From a82ec0535b62a6f7199719a1fc1ad22da4d2a7d5 Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 9 Jan 2019 00:49:09 -0600 Subject: [PATCH 128/274] Fix languages again --- app/helpers/settings_helper.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 0e957e946..274d2e977 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -2,6 +2,9 @@ module SettingsHelper HUMAN_LOCALES = { + squeak: 'Squeak', + dog: 'Dog', + lion: 'Lion', en: 'English', ar: 'العربية', ast: 'l\'asturianu', @@ -30,7 +33,6 @@ module SettingsHelper ja: '日本語', ka: 'ქართული', ko: '한국어', - ml: 'മലയാളം', nl: 'Nederlands', no: 'Norsk', oc: 'Occitan', From c5a984eca1edd2ef0729ea2a5bbce264dd3c3c8b Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 9 Jan 2019 00:51:24 -0600 Subject: [PATCH 129/274] oops --- app/helpers/settings_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 274d2e977..4b1c5b06d 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -33,6 +33,7 @@ module SettingsHelper ja: '日本語', ka: 'ქართული', ko: '한국어', + ml: 'മലയാളം', nl: 'Nederlands', no: 'Norsk', oc: 'Occitan', From cc3d81fab0a90dfcbb982e614ef88464f90fce60 Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 18 Jan 2019 17:31:48 -0600 Subject: [PATCH 130/274] Update translations --- config/locales/dog.yml | 33 +++++++++++++++++-------------- config/locales/lion.yml | 41 +++++++++++++++++++++------------------ config/locales/squeak.yml | 3 +++ 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/config/locales/dog.yml b/config/locales/dog.yml index 48e9db233..db16f0595 100644 --- a/config/locales/dog.yml +++ b/config/locales/dog.yml @@ -54,8 +54,8 @@ dog: moved_html: "%{name} has moved to %{new_profile_link}:" network_hidden: This information is not available nothing_here: There is nothing here! - people_followed_by: People whom %{name} follows - people_who_follow: People who follow %{name} + people_followed_by: Dogs whom %{name} follows + people_who_follow: Dogs who follow %{name} pin_errors: following: You must be already following the dog you want to endorse posts: @@ -327,7 +327,7 @@ dog: relays: add_new: Add new relay delete: Delete - description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local dogs manually following other people on remote servers. + description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local dogs manually following other dogs on remote servers. disable: Disable disabled: Disabled enable: Enable @@ -553,8 +553,11 @@ dog: warning_title: Disseminated content availability directories: directory: Profile directory + enabled: You are currently listed in the directory. + enabled_but_waiting: You have opted-in to be listed in the directory, but you do not have the minimum number of followers (%{min_followers}) to be listed yet. explanation: Discover dogs based on their interests explore_mastodon: Explore %{title} + how_to_enable: You are not currently opted-in to the directory. You can opt-in below. Use hashtags in your bio text to be listed under specific hashtags! people: one: "%{count} dog" other: "%{count} dogs" @@ -625,7 +628,7 @@ dog: one: Something isn't quite right yet! Please review the error below other: Something isn't quite right yet! Please review %{count} errors below imports: - preface: You can import data that you have exported from another instance, such as a list of the people you are following or blocking. + preface: You can import data that you have exported from another instance, such as a list of the dogs you are following or blocking. success: Your data was successfully uploaded and will now be processed in due time types: blocking: Blocking list @@ -654,7 +657,7 @@ dog: table: expires_at: Expires uses: Uses - title: Invite people + title: Invite dogs lists: errors: limit: You have reached the maximum amount of lists @@ -849,7 +852,7 @@ dog:
  • Basic account information: If you register on this server, you may be asked to enter a username, an e-mail address and a password. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly.
  • -
  • Posts, following and other public information: The list of people you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.
  • +
  • Posts, following and other public information: The list of dogs you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.
  • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and dogs who are mentioned in them, and direct posts are delivered only to dogs mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized dogs, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
  • IPs and other metadata: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.
@@ -861,9 +864,9 @@ dog:

Any of the information we collect from you may be used in the following ways:

    -
  • To provide the core functionality of Mastodon. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.
  • +
  • To provide the core functionality of Mastodon. You can only interact with other dogs's content and post your own content when you are logged in. For example, you may follow other dogs to view their combined posts in your own personalized home timeline.
  • To aid moderation of the community, for example comparing your IP address with other known ones to determine ban evasion or other violations.
  • -
  • The email address you provide may be used to send you information, notifications about other people interacting with your content or sending you messages, and to respond to inquiries, and/or other requests or questions.
  • +
  • The email address you provide may be used to send you information, notifications about other dogs interacting with your content or sending you messages, and to respond to inquiries, and/or other requests or questions.

@@ -909,9 +912,9 @@ dog:

Site usage by children

-

If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site.

+

If this server is in the EU or the EEA: Our site, products and services are all directed to dogs who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site.

-

If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

+

If this server is in the USA: Our site, products and services are all directed to dogs who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

Law requirements can be different if this server is in another jurisdiction.

@@ -966,7 +969,7 @@ dog: warning: explanation: disable: While your account is frozen, your account data remains intact, but you cannot perform any actions until it is unlocked. - silence: While your account is limited, only people who are already following you will see your toots on this server, and you may be excluded from various public listings. However, others may still manually follow you. + silence: While your account is limited, only dogs who are already following you will see your toots on this server, and you may be excluded from various public listings. However, others may still manually follow you. suspend: Your account has been suspended, and all of your toots and your uploaded media files have been irreversibly removed from this server, and servers where you had followers. review_server_policies: Review server policies subject: @@ -990,14 +993,14 @@ dog: review_preferences_action: Change preferences review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay. subject: Welcome to Mastodon - tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes people your neighbours are subscribed to, so it's not complete. - tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines. - tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours! + tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes dogs your neighbours are subscribed to, so it's not complete. + tip_following: You follow your server's admin(s) by default. To find more interesting dogs, check the local and federated timelines. + tip_local_timeline: The local timeline is a firehose view of dogs on %{instance}. These are your immediate neighbours! tip_mobile_webapp: If your mobile browser offers you to add Mastodon to your homescreen, you can receive push notifications. It acts like a native app in many ways! tips: Tips title: Welcome aboard, %{name}! users: - follow_limit_reached: You cannot follow more than %{limit} people + follow_limit_reached: You cannot follow more than %{limit} dogs invalid_email: The e-mail address is invalid invalid_otp_token: Invalid two-factor code otp_lost_help_html: If you lost access to both, you may get in touch with %{email} diff --git a/config/locales/lion.yml b/config/locales/lion.yml index c05756ef2..c683dc766 100644 --- a/config/locales/lion.yml +++ b/config/locales/lion.yml @@ -19,7 +19,7 @@ lion: humane_approach_body: Learning from failures of other networks, Mastodon aims to make ethical design choices to combat the misuse of social media. humane_approach_title: A more humane approach not_a_product_body: Mastodon is not a commercial network. No advertising, no data mining, no walled gardens. There is no central authority. - not_a_product_title: You’re a person, not a product + not_a_product_title: You’re a lion, not a product real_conversation_body: With 500 characters at your disposal and support for granular content and media warnings, you can express yourself the way you want to. real_conversation_title: Built for real conversation within_reach_body: Multiple apps for iOS, Android, and other platforms thanks to a developer-friendly API ecosystem allow you to keep up with your friends anywhere. @@ -54,8 +54,8 @@ lion: moved_html: "%{name} has moved to %{new_profile_link}:" network_hidden: This information is not available nothing_here: There is nothing here! - people_followed_by: People whom %{name} follows - people_who_follow: People who follow %{name} + people_followed_by: Lions whom %{name} follows + people_who_follow: Lions who follow %{name} pin_errors: following: You must be already following the lion you want to endorse posts: @@ -327,7 +327,7 @@ lion: relays: add_new: Add new relay delete: Delete - description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other people on remote servers. + description_html: A federation relay is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. It can help small and medium servers discover content from the fediverse, which would otherwise require local users manually following other lions on remote servers. disable: Disable disabled: Disabled enable: Enable @@ -553,11 +553,14 @@ lion: warning_title: Disseminated content availability directories: directory: Profile directory + enabled: You are currently listed in the directory. + enabled_but_waiting: You have opted-in to be listed in the directory, but you do not have the minimum number of followers (%{min_followers}) to be listed yet. explanation: Discover lions based on their interests explore_mastodon: Explore %{title} + how_to_enable: You are not currently opted-in to the directory. You can opt-in below. Use hashtags in your bio text to be listed under specific hashtags! people: - one: "%{count} person" - other: "%{count} people" + one: "%{count} lion" + other: "%{count} lions" errors: '403': You don't have permission to view this page. '404': The page you were looking for doesn't exist. @@ -625,7 +628,7 @@ lion: one: Something isn't quite right yet! Please review the error below other: Something isn't quite right yet! Please review %{count} errors below imports: - preface: You can import data that you have exported from another instance, such as a list of the people you are following or blocking. + preface: You can import data that you have exported from another instance, such as a list of the lions you are following or blocking. success: Your data was successfully uploaded and will now be processed in due time types: blocking: Blocking list @@ -654,7 +657,7 @@ lion: table: expires_at: Expires uses: Uses - title: Invite people + title: Invite lions lists: errors: limit: You have reached the maximum amount of lists @@ -849,8 +852,8 @@ lion:
  • Basic account information: If you register on this server, you may be asked to enter a username, an e-mail address and a password. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly.
  • -
  • Posts, following and other public information: The list of people you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.
  • -
  • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and lions who are mentioned in them, and direct posts are delivered only to lions mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
  • +
  • Posts, following and other public information: The list of lions you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.
  • +
  • Direct and followers-only posts: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and lions who are mentioned in them, and direct posts are delivered only to lions mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized lions, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. Please keep in mind that the operators of the server and any receiving server may view such messages, and that recipients may screenshot, copy or otherwise re-share them. Do not share any dangerous information over Mastodon.
  • IPs and other metadata: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.
@@ -861,9 +864,9 @@ lion:

Any of the information we collect from you may be used in the following ways:

    -
  • To provide the core functionality of Mastodon. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.
  • +
  • To provide the core functionality of Mastodon. You can only interact with other lions's content and post your own content when you are logged in. For example, you may follow other lions to view their combined posts in your own personalized home timeline.
  • To aid moderation of the community, for example comparing your IP address with other known ones to determine ban evasion or other violations.
  • -
  • The email address you provide may be used to send you information, notifications about other people interacting with your content or sending you messages, and to respond to inquiries, and/or other requests or questions.
  • +
  • The email address you provide may be used to send you information, notifications about other lions interacting with your content or sending you messages, and to respond to inquiries, and/or other requests or questions.

@@ -909,9 +912,9 @@ lion:

Site usage by children

-

If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site.

+

If this server is in the EU or the EEA: Our site, products and services are all directed to lions who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site.

-

If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

+

If this server is in the USA: Our site, products and services are all directed to lions who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

Law requirements can be different if this server is in another jurisdiction.

@@ -966,7 +969,7 @@ lion: warning: explanation: disable: While your account is frozen, your account data remains intact, but you cannot perform any actions until it is unlocked. - silence: While your account is limited, only people who are already following you will see your toots on this server, and you may be excluded from various public listings. However, others may still manually follow you. + silence: While your account is limited, only lions who are already following you will see your toots on this server, and you may be excluded from various public listings. However, others may still manually follow you. suspend: Your account has been suspended, and all of your toots and your uploaded media files have been irreversibly removed from this server, and servers where you had followers. review_server_policies: Review server policies subject: @@ -990,14 +993,14 @@ lion: review_preferences_action: Change preferences review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay. subject: Welcome to Mastodon - tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes people your neighbours are subscribed to, so it's not complete. - tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines. - tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours! + tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes lions your neighbours are subscribed to, so it's not complete. + tip_following: You follow your server's admin(s) by default. To find more interesting lions, check the local and federated timelines. + tip_local_timeline: The local timeline is a firehose view of lions on %{instance}. These are your immediate neighbours! tip_mobile_webapp: If your mobile browser offers you to add Mastodon to your homescreen, you can receive push notifications. It acts like a native app in many ways! tips: Tips title: Welcome aboard, %{name}! users: - follow_limit_reached: You cannot follow more than %{limit} people + follow_limit_reached: You cannot follow more than %{limit} lions invalid_email: The e-mail address is invalid invalid_otp_token: Invalid two-factor code otp_lost_help_html: If you lost access to both, you may get in touch with %{email} diff --git a/config/locales/squeak.yml b/config/locales/squeak.yml index d7cb42ade..b8f77e7e7 100644 --- a/config/locales/squeak.yml +++ b/config/locales/squeak.yml @@ -553,8 +553,11 @@ squeak: warning_title: Disseminated content availability directories: directory: Profile directory + enabled: You are currently listed in the directory. + enabled_but_waiting: You have opted-in to be listed in the directory, but you do not have the minimum number of followers (%{min_followers}) to be listed yet. explanation: Discover users based on their interests explore_mastodon: Explore %{title} + how_to_enable: You are not currently opted-in to the directory. You can opt-in below. Use hashtags in your bio text to be listed under specific hashtags! people: one: "%{count} person" other: "%{count} people" From 88a1d0cdb4df422594c3ffb335ad794df4e55ea7 Mon Sep 17 00:00:00 2001 From: Sam Schlinkert Date: Mon, 28 Jan 2019 16:57:42 -0500 Subject: [PATCH 131/274] Bumps copyright year in README.md to 2019 (#9939) This is so incredibly small, but assuming this is a needed change. Might want to check year in other files. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ad6894ca..03c8472b9 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ You can open issues for bugs you've found or features you think are missing. You ## License -Copyright (C) 2016-2018 Eugen Rochko & other Mastodon contributors (see [AUTHORS.md](AUTHORS.md)) +Copyright (C) 2016-2019 Eugen Rochko & other Mastodon contributors (see [AUTHORS.md](AUTHORS.md)) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. From e31970b924a7eaa1279708919b2743a15fb099f0 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 1 Feb 2019 00:15:38 +0100 Subject: [PATCH 132/274] Fix link color in high-contrast theme, add underlines (#9949) Improve sorting of default themes in the dropdown --- app/javascript/styles/contrast/diff.scss | 51 ++++++++++++++++++++++++ config/locales/en.yml | 6 +-- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/app/javascript/styles/contrast/diff.scss b/app/javascript/styles/contrast/diff.scss index eee9ecc3e..7d8993a50 100644 --- a/app/javascript/styles/contrast/diff.scss +++ b/app/javascript/styles/contrast/diff.scss @@ -12,3 +12,54 @@ } } } + +.status__content a, +.reply-indicator__content a { + color: lighten($ui-highlight-color, 12%); + text-decoration: underline; + + &.mention { + text-decoration: none; + } + + &.mention span { + text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } + } + + &:hover, + &:focus, + &:active { + text-decoration: none; + } + + &.status__content__spoiler-link { + color: $secondary-text-color; + text-decoration: none; + } +} + +.status__content__read-more-button { + text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } +} + +.getting-started__footer a { + text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } +} diff --git a/config/locales/en.yml b/config/locales/en.yml index 10749b21b..ba413f8fc 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -929,9 +929,9 @@ en:

Originally adapted from the Discourse privacy policy.

title: "%{instance} Terms of Service and Privacy Policy" themes: - contrast: High contrast - default: Mastodon - mastodon-light: Mastodon (light) + contrast: Mastodon (High contrast) + default: Mastodon (Dark) + mastodon-light: Mastodon (Light) time: formats: default: "%b %d, %Y, %H:%M" From 687a0cbcb036255d02aa1fab5132c51da2adc888 Mon Sep 17 00:00:00 2001 From: Clar Charr Date: Thu, 31 Jan 2019 07:45:15 -0500 Subject: [PATCH 133/274] Replace unlock-alt icon with unlock (#9952) --- app/helpers/stream_entries_helper.rb | 2 +- app/javascript/mastodon/components/account.js | 2 +- app/javascript/mastodon/components/domain.js | 2 +- app/javascript/mastodon/features/account/components/header.js | 2 +- .../mastodon/features/compose/components/privacy_dropdown.js | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/helpers/stream_entries_helper.rb b/app/helpers/stream_entries_helper.rb index 033d435c4..7a74c0b7d 100644 --- a/app/helpers/stream_entries_helper.rb +++ b/app/helpers/stream_entries_helper.rb @@ -170,7 +170,7 @@ module StreamEntriesHelper when 'public' fa_icon 'globe fw' when 'unlisted' - fa_icon 'unlock-alt fw' + fa_icon 'unlock fw' when 'private' fa_icon 'lock fw' when 'direct' diff --git a/app/javascript/mastodon/components/account.js b/app/javascript/mastodon/components/account.js index 206030c00..2705a6001 100644 --- a/app/javascript/mastodon/components/account.js +++ b/app/javascript/mastodon/components/account.js @@ -88,7 +88,7 @@ class Account extends ImmutablePureComponent { if (requested) { buttons = ; } else if (blocking) { - buttons = ; + buttons = ; } else if (muting) { let hidingNotificationsButton; if (account.getIn(['relationship', 'muting_notifications'])) { diff --git a/app/javascript/mastodon/components/domain.js b/app/javascript/mastodon/components/domain.js index 24f80e788..85729ca94 100644 --- a/app/javascript/mastodon/components/domain.js +++ b/app/javascript/mastodon/components/domain.js @@ -32,7 +32,7 @@ class Account extends ImmutablePureComponent {
- +
diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js index 2ab25cde4..4f6d0712d 100644 --- a/app/javascript/mastodon/features/account/components/header.js +++ b/app/javascript/mastodon/features/account/components/header.js @@ -132,7 +132,7 @@ class Header extends ImmutablePureComponent { } else if (account.getIn(['relationship', 'blocking'])) { actionBtn = (
- +
); } diff --git a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js index 5698765d9..e8f57a466 100644 --- a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js +++ b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js @@ -214,7 +214,7 @@ class PrivacyDropdown extends React.PureComponent { this.options = [ { icon: 'globe', value: 'public', text: formatMessage(messages.public_short), meta: formatMessage(messages.public_long) }, - { icon: 'unlock-alt', value: 'unlisted', text: formatMessage(messages.unlisted_short), meta: formatMessage(messages.unlisted_long) }, + { icon: 'unlock', value: 'unlisted', text: formatMessage(messages.unlisted_short), meta: formatMessage(messages.unlisted_long) }, { icon: 'lock', value: 'private', text: formatMessage(messages.private_short), meta: formatMessage(messages.private_long) }, { icon: 'envelope', value: 'direct', text: formatMessage(messages.direct_short), meta: formatMessage(messages.direct_long) }, ]; From fdf819b83e820576164074b6726cb6ffdb4a47f6 Mon Sep 17 00:00:00 2001 From: Jakub Mendyk Date: Sat, 2 Feb 2019 19:01:18 +0100 Subject: [PATCH 134/274] Allow most kinds of characters in URL query (fixes #8408) (#8447) * Allow unicode characters in URL query strings Fixes #8408 * Alternative approach to unicode support in urls Adds PoC/idea to approch this problem. --- app/lib/formatter.rb | 39 +++++++++++++++++++++++++++++++++++++- spec/lib/formatter_spec.rb | 32 ++++++++++++++++++++++++++++--- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 05fd9eeb1..2e3587169 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -99,7 +99,7 @@ class Formatter end def encode_and_link_urls(html, accounts = nil, options = {}) - entities = Extractor.extract_entities_with_indices(html, extract_url_without_protocol: false) + entities = utf8_friendly_extractor(html, extract_url_without_protocol: false) if accounts.is_a?(Hash) options = accounts @@ -199,6 +199,43 @@ class Formatter result.flatten.join end + def utf8_friendly_extractor(text, options = {}) + old_to_new_index = [0] + + escaped = text.chars.map do |c| + output = c.ord.to_s(16).length > 2 ? CGI.escape(c) : c + old_to_new_index << old_to_new_index.last + output.length + output + end.join + + # Note: I couldn't obtain list_slug with @user/list-name format + # for mention so this requires additional check + special = Extractor.extract_entities_with_indices(escaped, options).map do |extract| + # exactly one of :url, :hashtag, :screen_name, :cashtag keys is present + key = (extract.keys & [:url, :hashtag, :screen_name, :cashtag]).first + + new_indices = [ + old_to_new_index.find_index(extract[:indices].first), + old_to_new_index.find_index(extract[:indices].last), + ] + + has_prefix_char = [:hashtag, :screen_name, :cashtag].include?(key) + value_indices = [ + new_indices.first + (has_prefix_char ? 1 : 0), # account for #, @ or $ + new_indices.last - 1, + ] + + next extract.merge( + :indices => new_indices, + key => text[value_indices.first..value_indices.last] + ) + end + + standard = Extractor.extract_entities_with_indices(text, options) + + Extractor.remove_overlapping_entities(special + standard) + end + def link_to_url(entity, options = {}) url = Addressable::URI.parse(entity[:url]) html_attrs = { target: '_blank', rel: 'nofollow noopener' } diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb index 0c1efe7c3..9872d3756 100644 --- a/spec/lib/formatter_spec.rb +++ b/spec/lib/formatter_spec.rb @@ -74,10 +74,36 @@ RSpec.describe Formatter do end context 'given a URL with a query string' do - let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink' } + context 'with escaped unicode character' do + let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink' } - it 'matches the full URL' do - is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink"' + it 'matches the full URL' do + is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink"' + end + end + + context 'with unicode character' do + let(:text) { 'https://www.ruby-toolbox.com/search?utf8=✓&q=autolink' } + + it 'matches the full URL' do + is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=✓&q=autolink"' + end + end + + context 'with unicode character at the end' do + let(:text) { 'https://www.ruby-toolbox.com/search?utf8=✓' } + + it 'matches the full URL' do + is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=✓"' + end + end + + context 'with escaped and not escaped unicode characters' do + let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&utf81=✓&q=autolink' } + + it 'preserves escaped unicode characters' do + is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&utf81=✓&q=autolink"' + end end end From a742a09530b6bdca78713e14dbab51bc3a56d222 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Tue, 5 Feb 2019 06:25:42 +0900 Subject: [PATCH 135/274] Fix authorized applications list page design (#9969) --- app/controllers/oauth/authorized_applications_controller.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb index 0c28d194b..f3d235366 100644 --- a/app/controllers/oauth/authorized_applications_controller.rb +++ b/app/controllers/oauth/authorized_applications_controller.rb @@ -5,6 +5,7 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio before_action :store_current_location before_action :authenticate_resource_owner! + before_action :set_body_classes include Localized @@ -15,6 +16,10 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio private + def set_body_classes + @body_classes = 'admin' + end + def store_current_location store_location_for(:user, request.url) end From 5e7c75cfd328af81a557985e1b5b2c70e6c68645 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Tue, 5 Feb 2019 07:14:57 +0900 Subject: [PATCH 136/274] Fix not showing custom emojis in share page emoji picker (#9970) --- app/javascript/mastodon/containers/compose_container.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/javascript/mastodon/containers/compose_container.js b/app/javascript/mastodon/containers/compose_container.js index 5ee1d2f14..7bc7bbaa4 100644 --- a/app/javascript/mastodon/containers/compose_container.js +++ b/app/javascript/mastodon/containers/compose_container.js @@ -7,6 +7,7 @@ import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from '../locales'; import Compose from '../features/standalone/compose'; import initialState from '../initial_state'; +import { fetchCustomEmojis } from '../actions/custom_emojis'; const { localeData, messages } = getLocale(); addLocaleData(localeData); @@ -17,6 +18,8 @@ if (initialState) { store.dispatch(hydrateStore(initialState)); } +store.dispatch(fetchCustomEmojis()); + export default class TimelineContainer extends React.PureComponent { static propTypes = { From cd36ff43fd214b6b1447e88457b5a3f56461c1dd Mon Sep 17 00:00:00 2001 From: trwnh Date: Mon, 4 Feb 2019 21:46:18 -0600 Subject: [PATCH 137/274] [UI] Fix whitespace being applied to div instead of p (#9968) * fix large line breaks * fix ascii art posts --- app/javascript/styles/mastodon/components.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 10e094648..32fd77385 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -638,7 +638,6 @@ font-weight: 400; overflow: hidden; text-overflow: ellipsis; - white-space: pre-wrap; padding-top: 2px; color: $primary-text-color; @@ -662,6 +661,7 @@ p { margin-bottom: 20px; + white-space: pre-wrap; &:last-child { margin-bottom: 0; From edde07f5ab235d6ceca95db66bb53161d372f830 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 5 Feb 2019 15:11:35 +0100 Subject: [PATCH 138/274] =?UTF-8?q?Hide=20misleading=20=E2=80=9CYou=20will?= =?UTF-8?q?=20be=20sent=20a=20confirmation=20e-mail=E2=80=9D=20hint=20from?= =?UTF-8?q?=20admin=20view=20(#9973)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks @wryk for noticing this issue. --- app/views/admin/change_emails/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admin/change_emails/show.html.haml b/app/views/admin/change_emails/show.html.haml index 6febef9b1..6ff0d785e 100644 --- a/app/views/admin/change_emails/show.html.haml +++ b/app/views/admin/change_emails/show.html.haml @@ -3,7 +3,7 @@ = simple_form_for @user, url: admin_account_change_email_path(@account.id) do |f| .fields-group - = f.input :email, wrapper: :with_label, disabled: true, label: t('admin.accounts.change_email.current_email') + = f.input :email, wrapper: :with_label, hint: false, disabled: true, label: t('admin.accounts.change_email.current_email') .fields-group = f.input :unconfirmed_email, wrapper: :with_label, label: t('admin.accounts.change_email.new_email') From e2afe5fdfba352b35731acf028bad54f32223282 Mon Sep 17 00:00:00 2001 From: abcang Date: Wed, 6 Feb 2019 10:50:52 +0900 Subject: [PATCH 139/274] Fix Tombstone.delete_all ArgumentError (#9978) --- app/services/activitypub/process_account_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index 487456f3a..5e3308428 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -212,7 +212,7 @@ class ActivityPub::ProcessAccountService < BaseService end def clear_tombstones! - Tombstone.delete_all(account_id: @account.id) + Tombstone.where(account_id: @account.id).delete_all end def protocol_changed? From 2a7c091eae68b06ae4ad7c566878a04f9926ac92 Mon Sep 17 00:00:00 2001 From: Hinaloe Date: Sat, 9 Feb 2019 11:39:38 +0900 Subject: [PATCH 140/274] Only URLs extract with pre-escaped text (#9991) * [test] add japanese hashtag testcase * Only URLs extract with pre-escaped text ( https://github.com/tootsuite/mastodon/issues/9989 ) --- app/lib/formatter.rb | 2 +- spec/lib/formatter_spec.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 2e3587169..6603b8df1 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -210,7 +210,7 @@ class Formatter # Note: I couldn't obtain list_slug with @user/list-name format # for mention so this requires additional check - special = Extractor.extract_entities_with_indices(escaped, options).map do |extract| + special = Extractor.extract_urls_with_indices(escaped, options).map do |extract| # exactly one of :url, :hashtag, :screen_name, :cashtag keys is present key = (extract.keys & [:url, :hashtag, :screen_name, :cashtag]).first diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb index 9872d3756..8fb6695a9 100644 --- a/spec/lib/formatter_spec.rb +++ b/spec/lib/formatter_spec.rb @@ -194,6 +194,14 @@ RSpec.describe Formatter do is_expected.to include '/tags/hashtag" class="mention hashtag" rel="tag">#hashtag' end end + + context 'given text containing a hashtag with Unicode chars' do + let(:text) { '#hashtagタグ' } + + it 'creates a hashtag link' do + is_expected.to include '/tags/hashtag%E3%82%BF%E3%82%B0" class="mention hashtag" rel="tag">#hashtagタグ' + end + end end describe '#format_spoiler' do From 6ea4cd5b86b0f96bfa9cfc904ee2c1adb48079a4 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 9 Feb 2019 20:13:11 +0100 Subject: [PATCH 141/274] Fix URL linkifier grabbing full-width spaces and quotations (#9997) Fix #9993 Fix #5654 --- app/lib/formatter.rb | 12 +++++++- config/initializers/twitter_regex.rb | 4 +-- spec/lib/formatter_spec.rb | 44 ++++++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 6603b8df1..0653214f5 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -199,12 +199,22 @@ class Formatter result.flatten.join end + UNICODE_ESCAPE_BLACKLIST_RE = /\p{Z}|\p{P}/ + def utf8_friendly_extractor(text, options = {}) old_to_new_index = [0] escaped = text.chars.map do |c| - output = c.ord.to_s(16).length > 2 ? CGI.escape(c) : c + output = begin + if c.ord.to_s(16).length > 2 && UNICODE_ESCAPE_BLACKLIST_RE.match(c).nil? + CGI.escape(c) + else + c + end + end + old_to_new_index << old_to_new_index.last + output.length + output end.join diff --git a/config/initializers/twitter_regex.rb b/config/initializers/twitter_regex.rb index 0e8f5bfeb..0ddbbee98 100644 --- a/config/initializers/twitter_regex.rb +++ b/config/initializers/twitter_regex.rb @@ -1,7 +1,7 @@ module Twitter class Regex - REGEXEN[:valid_general_url_path_chars] = /[^\p{White_Space}\(\)\?]/iou - REGEXEN[:valid_url_path_ending_chars] = /[^\p{White_Space}\(\)\?!\*';:=\,\.\$%\[\]~&\|@]|(?:#{REGEXEN[:valid_url_balanced_parens]})/iou + REGEXEN[:valid_general_url_path_chars] = /[^\p{White_Space}<>\(\)\?]/iou + REGEXEN[:valid_url_path_ending_chars] = /[^\p{White_Space}\(\)\?!\*"'「」<>;:=\,\.\$%\[\]~&\|@]|(?:#{REGEXEN[:valid_url_balanced_parens]})/iou REGEXEN[:valid_url_balanced_parens] = / \( (?: diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb index 8fb6695a9..96d2fc7e0 100644 --- a/spec/lib/formatter_spec.rb +++ b/spec/lib/formatter_spec.rb @@ -115,6 +115,22 @@ RSpec.describe Formatter do end end + context 'given a URL in quotation marks' do + let(:text) { '"https://example.com/"' } + + it 'does not match the quotation marks' do + is_expected.to include 'href="https://example.com/"' + end + end + + context 'given a URL in angle brackets' do + let(:text) { '' } + + it 'does not match the angle brackets' do + is_expected.to include 'href="https://example.com/"' + end + end + context 'given a URL with Japanese path string' do let(:text) { 'https://ja.wikipedia.org/wiki/日本' } @@ -131,6 +147,22 @@ RSpec.describe Formatter do end end + context 'given a URL with a full-width space' do + let(:text) { 'https://example.com/ abc123' } + + it 'does not match the full-width space' do + is_expected.to include 'href="https://example.com/"' + end + end + + context 'given a URL in Japanese quotation marks' do + let(:text) { '「[https://example.org/」' } + + it 'does not match the quotation marks' do + is_expected.to include 'href="https://example.org/"' + end + end + context 'given a URL with Simplified Chinese path string' do let(:text) { 'https://baike.baidu.com/item/中华人民共和国' } @@ -150,7 +182,11 @@ RSpec.describe Formatter do context 'given a URL containing unsafe code (XSS attack, visible part)' do let(:text) { %q{http://example.com/bb} } - it 'escapes the HTML in the URL' do + it 'does not include the HTML in the URL' do + is_expected.to include '"http://example.com/b"' + end + + it 'escapes the HTML' do is_expected.to include '<del>b</del>' end end @@ -158,7 +194,11 @@ RSpec.describe Formatter do context 'given a URL containing unsafe code (XSS attack, invisible part)' do let(:text) { %q{http://example.com/blahblahblahblah/a} } - it 'escapes the HTML in the URL' do + it 'does not include the HTML in the URL' do + is_expected.to include '"http://example.com/blahblahblahblah/a"' + end + + it 'escapes the HTML' do is_expected.to include '<script>alert("Hello")</script>' end end From d9f0c7fb841bebfa942ddc5b7aae2857eb1381e3 Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 6 Feb 2019 23:36:43 +0100 Subject: [PATCH 142/274] Fix IntersectionObserverArticle not hiding some out-of-view items (#9982) IntersectionObserverArticle is made to save on RAM by avoiding fully rendering items that are far out of view. However, it did not work for items spawned outside the intersection observer. --- .../mastodon/components/intersection_observer_article.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/intersection_observer_article.js b/app/javascript/mastodon/components/intersection_observer_article.js index de2203a4b..e453730ba 100644 --- a/app/javascript/mastodon/components/intersection_observer_article.js +++ b/app/javascript/mastodon/components/intersection_observer_article.js @@ -65,7 +65,7 @@ export default class IntersectionObserverArticle extends React.Component { } updateStateAfterIntersection = (prevState) => { - if (prevState.isIntersecting && !this.entry.isIntersecting) { + if (prevState.isIntersecting !== false && !this.entry.isIntersecting) { scheduleIdleTask(this.hideIfNotIntersecting); } return { From e1dbdf7377f20ace894ee92cf681542cc4b5eddb Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 11 Feb 2019 13:19:59 +0100 Subject: [PATCH 143/274] Fix timeline jumps (#10001) * Avoid two-step rendering of statuses as much as possible Cache width shared by Video player, MediaGallery and Cards at the ScrollableList level, pass it down through StatusList and Notifications. * Adjust scroll when new preview cards appear * Adjust scroll when statuses above the current scroll position are deleted --- .../mastodon/components/media_gallery.js | 10 ++- .../mastodon/components/scrollable_list.js | 28 +++++++- app/javascript/mastodon/components/status.js | 67 +++++++++++++++++-- .../notifications/components/notification.js | 32 ++++++++- .../features/status/components/card.js | 5 +- .../mastodon/features/video/index.js | 4 +- 6 files changed, 134 insertions(+), 12 deletions(-) diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js index c507920d0..a2bc95255 100644 --- a/app/javascript/mastodon/components/media_gallery.js +++ b/app/javascript/mastodon/components/media_gallery.js @@ -194,6 +194,8 @@ class MediaGallery extends React.PureComponent { height: PropTypes.number.isRequired, onOpenMedia: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, + defaultWidth: PropTypes.number, + cacheWidth: PropTypes.func, }; static defaultProps = { @@ -202,6 +204,7 @@ class MediaGallery extends React.PureComponent { state = { visible: displayMedia !== 'hide_all' && !this.props.sensitive || displayMedia === 'show_all', + width: this.props.defaultWidth, }; componentWillReceiveProps (nextProps) { @@ -221,6 +224,7 @@ class MediaGallery extends React.PureComponent { handleRef = (node) => { if (node /*&& this.isStandaloneEligible()*/) { // offsetWidth triggers a layout, so only calculate when we need to + if (this.props.cacheWidth) this.props.cacheWidth(node.offsetWidth); this.setState({ width: node.offsetWidth, }); @@ -233,8 +237,10 @@ class MediaGallery extends React.PureComponent { } render () { - const { media, intl, sensitive, height } = this.props; - const { width, visible } = this.state; + const { media, intl, sensitive, height, defaultWidth } = this.props; + const { visible } = this.state; + + const width = this.state.width || defaultWidth; let children; diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js index fec06e263..0376cf85a 100644 --- a/app/javascript/mastodon/components/scrollable_list.js +++ b/app/javascript/mastodon/components/scrollable_list.js @@ -40,6 +40,7 @@ export default class ScrollableList extends PureComponent { state = { fullscreen: null, + cachedMediaWidth: 250, // Default media/card width using default Mastodon theme }; intersectionObserverWrapper = new IntersectionObserverWrapper(); @@ -130,6 +131,20 @@ export default class ScrollableList extends PureComponent { this.handleScroll(); } + getScrollPosition = () => { + if (this.node && (this.node.scrollTop > 0 || this.mouseMovedRecently)) { + return { height: this.node.scrollHeight, top: this.node.scrollTop }; + } else { + return null; + } + } + + updateScrollBottom = (snapshot) => { + const newScrollTop = this.node.scrollHeight - snapshot; + + this.setScrollTop(newScrollTop); + } + getSnapshotBeforeUpdate (prevProps) { const someItemInserted = React.Children.count(prevProps.children) > 0 && React.Children.count(prevProps.children) < React.Children.count(this.props.children) && @@ -150,6 +165,12 @@ export default class ScrollableList extends PureComponent { } } + cacheMediaWidth = (width) => { + if (width && this.state.cachedMediaWidth !== width) { + this.setState({ cachedMediaWidth: width }); + } + } + componentWillUnmount () { this.clearMouseIdleTimer(); this.detachScrollListener(); @@ -239,7 +260,12 @@ export default class ScrollableList extends PureComponent { intersectionObserverWrapper={this.intersectionObserverWrapper} saveHeightKey={trackScroll ? `${this.context.router.route.location.key}:${scrollKey}` : null} > - {child} + {React.cloneElement(child, { + getScrollPosition: this.getScrollPosition, + updateScrollBottom: this.updateScrollBottom, + cachedMediaWidth: this.state.cachedMediaWidth, + cacheMediaWidth: this.cacheMediaWidth, + })} ))} diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 20d838500..fde8e60a4 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -68,6 +68,10 @@ class Status extends ImmutablePureComponent { onMoveUp: PropTypes.func, onMoveDown: PropTypes.func, showThread: PropTypes.bool, + getScrollPosition: PropTypes.func, + updateScrollBottom: PropTypes.func, + cacheMediaWidth: PropTypes.func, + cachedMediaWidth: PropTypes.number, }; // Avoid checking props that are functions (and whose equality will always @@ -79,6 +83,43 @@ class Status extends ImmutablePureComponent { 'hidden', ]; + // Track height changes we know about to compensate scrolling + componentDidMount () { + this.didShowCard = !this.props.muted && !this.props.hidden && this.props.status.get('card'); + } + + getSnapshotBeforeUpdate () { + if (this.props.getScrollPosition) { + return this.props.getScrollPosition(); + } else { + return null; + } + } + + // Compensate height changes + componentDidUpdate (prevProps, prevState, snapshot) { + const doShowCard = !this.props.muted && !this.props.hidden && this.props.status.get('card'); + if (doShowCard && !this.didShowCard) { + this.didShowCard = true; + if (snapshot !== null && this.props.updateScrollBottom) { + if (this.node && this.node.offsetTop < snapshot.top) { + this.props.updateScrollBottom(snapshot.height - snapshot.top); + } + } + } + } + + componentWillUnmount() { + if (this.node && this.props.getScrollPosition) { + const position = this.props.getScrollPosition(); + if (position !== null && this.node.offsetTop < position.top) { + requestAnimationFrame(() => { + this.props.updateScrollBottom(position.height - position.top); + }); + } + } + } + handleClick = () => { if (this.props.onClick) { this.props.onClick(); @@ -165,6 +206,10 @@ class Status extends ImmutablePureComponent { } } + handleRef = c => { + this.node = c; + } + render () { let media = null; let statusAvatar, prepend, rebloggedByText; @@ -179,7 +224,7 @@ class Status extends ImmutablePureComponent { if (hidden) { return ( -
+
{status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])} {status.get('content')}
@@ -194,7 +239,7 @@ class Status extends ImmutablePureComponent { return ( -
+
@@ -242,11 +287,12 @@ class Status extends ImmutablePureComponent { preview={video.get('preview_url')} src={video.get('url')} alt={video.get('description')} - width={239} + width={this.props.cachedMediaWidth} height={110} inline sensitive={status.get('sensitive')} onOpenVideo={this.handleOpenVideo} + cacheWidth={this.props.cacheMediaWidth} /> )} @@ -254,7 +300,16 @@ class Status extends ImmutablePureComponent { } else { media = ( - {Component => } + {Component => ( + + )} ); } @@ -264,6 +319,8 @@ class Status extends ImmutablePureComponent { onOpenMedia={this.props.onOpenMedia} card={status.get('card')} compact + cacheWidth={this.props.cacheMediaWidth} + defaultWidth={this.props.cachedMediaWidth} /> ); } @@ -290,7 +347,7 @@ class Status extends ImmutablePureComponent { return ( -
+
{prepend}
diff --git a/app/javascript/mastodon/features/notifications/components/notification.js b/app/javascript/mastodon/features/notifications/components/notification.js index 97efff69c..24843a2b6 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.js +++ b/app/javascript/mastodon/features/notifications/components/notification.js @@ -34,6 +34,10 @@ class Notification extends ImmutablePureComponent { onToggleHidden: PropTypes.func.isRequired, status: PropTypes.option, intl: PropTypes.object.isRequired, + getScrollPosition: PropTypes.func, + updateScrollBottom: PropTypes.func, + cacheMediaWidth: PropTypes.func, + cachedMediaWidth: PropTypes.number, }; handleMoveUp = () => { @@ -128,6 +132,10 @@ class Notification extends ImmutablePureComponent { onMoveDown={this.handleMoveDown} onMoveUp={this.handleMoveUp} contextType='notifications' + getScrollPosition={this.props.getScrollPosition} + updateScrollBottom={this.props.updateScrollBottom} + cachedMediaWidth={this.props.cachedMediaWidth} + cacheMediaWidth={this.props.cacheMediaWidth} /> ); } @@ -148,7 +156,17 @@ class Notification extends ImmutablePureComponent {
-
); @@ -170,7 +188,17 @@ class Notification extends ImmutablePureComponent {
-
); diff --git a/app/javascript/mastodon/features/status/components/card.js b/app/javascript/mastodon/features/status/components/card.js index 8491299ef..30ed3fc21 100644 --- a/app/javascript/mastodon/features/status/components/card.js +++ b/app/javascript/mastodon/features/status/components/card.js @@ -60,6 +60,8 @@ export default class Card extends React.PureComponent { maxDescription: PropTypes.number, onOpenMedia: PropTypes.func.isRequired, compact: PropTypes.bool, + defaultWidth: PropTypes.number, + cacheWidth: PropTypes.func, }; static defaultProps = { @@ -68,7 +70,7 @@ export default class Card extends React.PureComponent { }; state = { - width: 280, + width: this.props.defaultWidth || 280, embedded: false, }; @@ -111,6 +113,7 @@ export default class Card extends React.PureComponent { setRef = c => { if (c) { + if (this.props.cacheWidth) this.props.cacheWidth(c.offsetWidth); this.setState({ width: c.offsetWidth }); } } diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js index 0d0c24d71..823bc25ab 100644 --- a/app/javascript/mastodon/features/video/index.js +++ b/app/javascript/mastodon/features/video/index.js @@ -99,6 +99,7 @@ class Video extends React.PureComponent { onCloseVideo: PropTypes.func, detailed: PropTypes.bool, inline: PropTypes.bool, + cacheWidth: PropTypes.func, intl: PropTypes.object.isRequired, }; @@ -108,7 +109,7 @@ class Video extends React.PureComponent { volume: 0.5, paused: true, dragging: false, - containerWidth: false, + containerWidth: this.props.width, fullscreen: false, hovered: false, muted: false, @@ -128,6 +129,7 @@ class Video extends React.PureComponent { this.player = c; if (c) { + if (this.props.cacheWidth) this.props.cacheWidth(this.player.offsetWidth); this.setState({ containerWidth: c.offsetWidth, }); From 41ecf80645d465d67dfee54d3cbb14a825ed8953 Mon Sep 17 00:00:00 2001 From: Hinaloe Date: Tue, 12 Feb 2019 13:10:31 +0900 Subject: [PATCH 144/274] Don't focus spiler input when disabled spoiler (#10017) --- .../mastodon/features/compose/components/compose_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index ac458fd25..294dcb5c1 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -179,7 +179,7 @@ class ComposeForm extends ImmutablePureComponent {
From d66267508ac316ffc2756a6677fcbae5a44605c2 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 12 Feb 2019 05:10:43 +0100 Subject: [PATCH 145/274] =?UTF-8?q?Move=20sending=20account=20Delete=20to?= =?UTF-8?q?=20anyone=20but=20the=20account's=20followers=20to=20the=20pull?= =?UTF-8?q?=CC=80=20queue=20(#10016)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/suspend_account_service.rb | 10 +++++++++- .../activitypub/low_priority_delivery_worker.rb | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 app/workers/activitypub/low_priority_delivery_worker.rb diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb index 1bc2314de..fc3bc03a5 100644 --- a/app/services/suspend_account_service.rb +++ b/app/services/suspend_account_service.rb @@ -102,6 +102,10 @@ class SuspendAccountService < BaseService ActivityPub::DeliveryWorker.push_bulk(delivery_inboxes) do |inbox_url| [delete_actor_json, @account.id, inbox_url] end + + ActivityPub::LowPriorityDeliveryWorker.push_bulk(low_priority_delivery_inboxes) do |inbox_url| + [delete_actor_json, @account.id, inbox_url] + end end def delete_actor_json @@ -117,7 +121,11 @@ class SuspendAccountService < BaseService end def delivery_inboxes - Account.inboxes + Relay.enabled.pluck(:inbox_url) + @delivery_inboxes ||= @account.followers.inboxes + Relay.enabled.pluck(:inbox_url) + end + + def low_priority_delivery_inboxes + Account.inboxes - delivery_inboxes end def associations_for_destruction diff --git a/app/workers/activitypub/low_priority_delivery_worker.rb b/app/workers/activitypub/low_priority_delivery_worker.rb new file mode 100644 index 000000000..a141b8f78 --- /dev/null +++ b/app/workers/activitypub/low_priority_delivery_worker.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class ActivityPub::LowPriorityDeliveryWorker < ActivityPub::DeliveryWorker + sidekiq_options queue: 'pull', retry: 8, dead: false +end From 27310a84a43623da8f08832e30e078ce936f6a1d Mon Sep 17 00:00:00 2001 From: Franck Zoccolo Date: Tue, 12 Feb 2019 14:48:04 +0100 Subject: [PATCH 146/274] Add support for IPv6 only MXes in Email validation (#10009) * Add support for IPv6 only MXes * Fixed email validator tests --- app/validators/email_mx_validator.rb | 1 + spec/validators/email_mx_validator_spec.rb | 38 ++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/app/validators/email_mx_validator.rb b/app/validators/email_mx_validator.rb index 5b4c684b2..96fbedcfc 100644 --- a/app/validators/email_mx_validator.rb +++ b/app/validators/email_mx_validator.rb @@ -24,6 +24,7 @@ class EmailMxValidator < ActiveModel::Validator ([domain] + hostnames).uniq.each do |hostname| ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::A).to_a.map { |e| e.address.to_s }) + ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::AAAA).to_a.map { |e| e.address.to_s }) end end diff --git a/spec/validators/email_mx_validator_spec.rb b/spec/validators/email_mx_validator_spec.rb index bc68f63cf..48e17a4f1 100644 --- a/spec/validators/email_mx_validator_spec.rb +++ b/spec/validators/email_mx_validator_spec.rb @@ -11,6 +11,7 @@ describe EmailMxValidator do allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) allow(resolver).to receive(:timeouts=).and_return(nil) allow(Resolv::DNS).to receive(:open).and_yield(resolver) @@ -23,7 +24,9 @@ describe EmailMxValidator do allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) allow(resolver).to receive(:timeouts=).and_return(nil) allow(Resolv::DNS).to receive(:open).and_yield(resolver) @@ -37,6 +40,21 @@ describe EmailMxValidator do allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '1.2.3.4')]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) + allow(resolver).to receive(:timeouts=).and_return(nil) + allow(Resolv::DNS).to receive(:open).and_yield(resolver) + + subject.validate(user) + expect(user.errors).to have_received(:add) + end + + it 'adds an error if the AAAA record is blacklisted' do + EmailDomainBlock.create!(domain: 'fd00::1') + resolver = double + + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::1')]) allow(resolver).to receive(:timeouts=).and_return(nil) allow(Resolv::DNS).to receive(:open).and_yield(resolver) @@ -50,7 +68,25 @@ describe EmailMxValidator do allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '2.3.4.5')]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) + allow(resolver).to receive(:timeouts=).and_return(nil) + allow(Resolv::DNS).to receive(:open).and_yield(resolver) + + subject.validate(user) + expect(user.errors).to have_received(:add) + end + + it 'adds an error if the MX IPv6 record is blacklisted' do + EmailDomainBlock.create!(domain: 'fd00::2') + resolver = double + + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::2')]) allow(resolver).to receive(:timeouts=).and_return(nil) allow(Resolv::DNS).to receive(:open).and_yield(resolver) @@ -64,7 +100,9 @@ describe EmailMxValidator do allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '2.3.4.5')]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::2')]) allow(resolver).to receive(:timeouts=).and_return(nil) allow(Resolv::DNS).to receive(:open).and_yield(resolver) From 1186b9abebc0b92acecebcd020d2f9c17de5d0b3 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 12 Feb 2019 22:24:14 +0100 Subject: [PATCH 147/274] Save IP address used for sign-up, not only sign-in (#10026) Fixes #9995 --- app/controllers/auth/registrations_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index f2a832542..ad7b1859f 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -28,6 +28,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController resource.invite_code = params[:invite_code] if resource.invite_code.blank? resource.agreement = true + resource.current_sign_in_ip = request.remote_ip if resource.current_sign_in_ip.nil? resource.build_account if resource.account.nil? end From f0f657e77c65923e6d77b5f62f7ee8544b4d9e00 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 13 Feb 2019 05:30:49 +0100 Subject: [PATCH 148/274] Fix color of static page links in high contrast theme (#10028) --- app/javascript/styles/contrast/diff.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/styles/contrast/diff.scss b/app/javascript/styles/contrast/diff.scss index 7d8993a50..8429103b8 100644 --- a/app/javascript/styles/contrast/diff.scss +++ b/app/javascript/styles/contrast/diff.scss @@ -13,6 +13,10 @@ } } +.rich-formatting a, +.rich-formatting p a, +.rich-formatting li a, +.landing-page__short-description p a, .status__content a, .reply-indicator__content a { color: lighten($ui-highlight-color, 12%); From a46487e895fbba23922888820c6b88ad07ebe56b Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 13 Feb 2019 18:34:58 +0100 Subject: [PATCH 149/274] Fix hashtags select styling in default and high contrast themes (#10029) --- .../components/column_settings.js | 55 ++++++----- app/javascript/styles/mastodon/_mixins.scss | 31 ++++++ .../styles/mastodon/components.scss | 95 +++++++++++++------ 3 files changed, 128 insertions(+), 53 deletions(-) diff --git a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js index 9c9f62d82..cdc138c8b 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js +++ b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js @@ -1,10 +1,15 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import Toggle from 'react-toggle'; import AsyncSelect from 'react-select/lib/Async'; +const messages = defineMessages({ + placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' }, + noOptions: { id: 'hashtag.column_settings.select.no_options_message', defaultMessage: 'No suggestions found' }, +}); + export default @injectIntl class ColumnSettings extends React.PureComponent { @@ -25,6 +30,7 @@ class ColumnSettings extends React.PureComponent { tags (mode) { let tags = this.props.settings.getIn(['tags', mode]) || []; + if (tags.toJSON) { return tags.toJSON(); } else { @@ -32,33 +38,36 @@ class ColumnSettings extends React.PureComponent { } }; - onSelect = (mode) => { - return (value) => { - this.props.onChange(['tags', mode], value); - }; - }; + onSelect = mode => value => this.props.onChange(['tags', mode], value); onToggle = () => { if (this.state.open && this.hasTags()) { this.props.onChange('tags', {}); } + this.setState({ open: !this.state.open }); }; + noOptionsMessage = () => this.props.intl.formatMessage(messages.noOptions); + modeSelect (mode) { return ( -
- {this.modeLabel(mode)} +
+ + {this.modeLabel(mode)} + +
); @@ -66,11 +75,15 @@ class ColumnSettings extends React.PureComponent { modeLabel (mode) { switch(mode) { - case 'any': return ; - case 'all': return ; - case 'none': return ; + case 'any': + return ; + case 'all': + return ; + case 'none': + return ; + default: + return ''; } - return ''; }; render () { @@ -78,23 +91,21 @@ class ColumnSettings extends React.PureComponent {
- + +
- {this.state.open && + + {this.state.open && (
{this.modeSelect('any')} {this.modeSelect('all')} {this.modeSelect('none')}
- } + )}
); } diff --git a/app/javascript/styles/mastodon/_mixins.scss b/app/javascript/styles/mastodon/_mixins.scss index d5bafe6b6..08806599e 100644 --- a/app/javascript/styles/mastodon/_mixins.scss +++ b/app/javascript/styles/mastodon/_mixins.scss @@ -41,3 +41,34 @@ font-size: 16px; } } + +@mixin search-popout() { + background: $simple-background-color; + border-radius: 4px; + padding: 10px 14px; + padding-bottom: 14px; + margin-top: 10px; + color: $light-text-color; + box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); + + h4 { + text-transform: uppercase; + color: $light-text-color; + font-size: 13px; + font-weight: 500; + margin-bottom: 10px; + } + + li { + padding: 4px 0; + } + + ul { + margin-bottom: 10px; + } + + em { + font-weight: 500; + color: $inverted-text-color; + } +} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 32fd77385..02bbd345a 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3056,14 +3056,41 @@ a.status-card.compact:hover { display: block; font-weight: 500; margin-bottom: 10px; +} - .column-settings__hashtag-select { +.column-settings__hashtags { + .column-settings__row { + margin-bottom: 15px; + } + + .column-select { &__control { @include search-input(); } + &__placeholder { + color: $dark-text-color; + padding-left: 2px; + font-size: 12px; + } + + &__value-container { + padding-left: 6px; + } + &__multi-value { background: lighten($ui-base-color, 8%); + + &__remove { + cursor: pointer; + + &:hover, + &:active, + &:focus { + background: lighten($ui-base-color, 12%); + color: lighten($darker-text-color, 4%); + } + } } &__multi-value__label, @@ -3071,9 +3098,42 @@ a.status-card.compact:hover { color: $darker-text-color; } - &__indicator-separator, + &__clear-indicator, &__dropdown-indicator { - display: none; + cursor: pointer; + transition: none; + color: $dark-text-color; + + &:hover, + &:active, + &:focus { + color: lighten($dark-text-color, 4%); + } + } + + &__indicator-separator { + background-color: lighten($ui-base-color, 8%); + } + + &__menu { + @include search-popout(); + padding: 0; + background: $ui-secondary-color; + } + + &__menu-list { + padding: 6px; + } + + &__option { + color: $inverted-text-color; + border-radius: 4px; + font-size: 14px; + + &--is-focused, + &--is-selected { + background: darken($ui-secondary-color, 10%); + } } } } @@ -4867,34 +4927,7 @@ a.status-card.compact:hover { } .search-popout { - background: $simple-background-color; - border-radius: 4px; - padding: 10px 14px; - padding-bottom: 14px; - margin-top: 10px; - color: $light-text-color; - box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); - - h4 { - text-transform: uppercase; - color: $light-text-color; - font-size: 13px; - font-weight: 500; - margin-bottom: 10px; - } - - li { - padding: 4px 0; - } - - ul { - margin-bottom: 10px; - } - - em { - font-weight: 500; - color: $inverted-text-color; - } + @include search-popout(); } noscript { From 2a1adab7d7824df9fa148a9431e942d6677c1d71 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 13 Feb 2019 18:36:40 +0100 Subject: [PATCH 150/274] Fix style regressions on landing page (#10030) --- app/javascript/styles/mastodon/about.scss | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index b6c92a09e..b078d4d24 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -49,15 +49,9 @@ $small-breakpoint: 960px; } } + strong, em { - display: inline; - margin: 0; - padding: 0; font-weight: 700; - background: transparent; - font-family: inherit; - font-size: inherit; - line-height: inherit; color: lighten($darker-text-color, 10%); } @@ -796,7 +790,7 @@ $small-breakpoint: 960px; width: 100%; display: flex; flex-direction: row-reverse; - flex-wrap: wrap; + flex-wrap: nowrap; justify-content: space-between; align-items: center; } @@ -846,14 +840,7 @@ $small-breakpoint: 960px; } strong { - display: inline; - margin: 0; - padding: 0; - font-weight: 700; - background: transparent; - font-family: inherit; - font-size: inherit; - line-height: inherit; + font-weight: 500; color: lighten($darker-text-color, 10%); } From 5a04861c7f2e98c80f315a19d7eadade044d8aae Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 14 Feb 2019 06:27:54 +0100 Subject: [PATCH 151/274] Add tight rate-limit for API deletions (#10042) Deletions take a lot of resources to execute and cause a lot of federation traffic, so it makes sense to decrease the number someone can queue up through the API. 30 per 30 minutes --- config/initializers/rack_attack.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb index 35302e37b..28201cc64 100644 --- a/config/initializers/rack_attack.rb +++ b/config/initializers/rack_attack.rb @@ -46,14 +46,14 @@ class Rack::Attack end throttle('throttle_authenticated_api', limit: 300, period: 5.minutes) do |req| - req.api_request? && req.authenticated_user_id + req.authenticated_user_id if req.api_request? end throttle('throttle_unauthenticated_api', limit: 7_500, period: 5.minutes) do |req| req.ip if req.api_request? end - throttle('throttle_media', limit: 30, period: 30.minutes) do |req| + throttle('throttle_api_media', limit: 30, period: 30.minutes) do |req| req.authenticated_user_id if req.post? && req.path.start_with?('/api/v1/media') end @@ -61,6 +61,13 @@ class Rack::Attack req.ip if req.post? && req.path == '/api/v1/accounts' end + API_DELETE_REBLOG_REGEX = /\A\/api\/v1\/statuses\/[\d]+\/unreblog/.freeze + API_DELETE_STATUS_REGEX = /\A\/api\/v1\/statuses\/[\d]+/.freeze + + throttle('throttle_api_delete', limit: 30, period: 30.minutes) do |req| + req.authenticated_user_id if (req.post? && req.path =~ API_DELETE_REBLOG_REGEX) || (req.delete? && req.path =~ API_DELETE_STATUS_REGEX) + end + throttle('protected_paths', limit: 25, period: 5.minutes) do |req| req.ip if req.post? && req.path =~ PROTECTED_PATHS_REGEX end From 17a41e1f779874a270f531086f5576affcdb6cb1 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 14 Feb 2019 15:46:42 +0100 Subject: [PATCH 152/274] Fix hashtag column not subscribing to stream on mount (#10040) Fix #9895 --- .../mastodon/features/hashtag_timeline/index.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/javascript/mastodon/features/hashtag_timeline/index.js b/app/javascript/mastodon/features/hashtag_timeline/index.js index c2e026d13..0d3c97a64 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/index.js +++ b/app/javascript/mastodon/features/hashtag_timeline/index.js @@ -41,15 +41,19 @@ class HashtagTimeline extends React.PureComponent { title = () => { let title = [this.props.params.id]; + if (this.additionalFor('any')) { - title.push(' ', ); + title.push(' ', ); } + if (this.additionalFor('all')) { - title.push(' ', ); + title.push(' ', ); } + if (this.additionalFor('none')) { - title.push(' ', ); + title.push(' ', ); } + return title; } @@ -77,9 +81,10 @@ class HashtagTimeline extends React.PureComponent { let all = (tags.all || []).map(tag => tag.value); let none = (tags.none || []).map(tag => tag.value); - [id, ...any].map((tag) => { - this.disconnects.push(dispatch(connectHashtagStream(id, tag, (status) => { + [id, ...any].map(tag => { + this.disconnects.push(dispatch(connectHashtagStream(id, tag, status => { let tags = status.tags.map(tag => tag.name); + return all.filter(tag => tags.includes(tag)).length === all.length && none.filter(tag => tags.includes(tag)).length === 0; }))); @@ -95,12 +100,14 @@ class HashtagTimeline extends React.PureComponent { const { dispatch } = this.props; const { id, tags } = this.props.params; + this._subscribe(dispatch, id, tags); dispatch(expandHashtagTimeline(id, { tags })); } componentWillReceiveProps (nextProps) { const { dispatch, params } = this.props; const { id, tags } = nextProps.params; + if (id !== params.id || !isEqual(tags, params.tags)) { this._unsubscribe(); this._subscribe(dispatch, id, tags); From 737ac4b59df77e43bed71abc6de80bc89f893de1 Mon Sep 17 00:00:00 2001 From: ysksn Date: Sun, 3 Feb 2019 03:11:38 +0900 Subject: [PATCH 153/274] Create Redisable#redis (#9633) * Create Redisable * Use #redis instead of Redis.current --- app/lib/activity_tracker.rb | 6 ++---- app/lib/activitypub/activity.rb | 5 +---- app/lib/feed_manager.rb | 9 +++------ app/lib/ostatus/activity/base.rb | 6 ++---- app/lib/potential_friendship_tracker.rb | 8 ++------ app/models/concerns/redisable.rb | 11 +++++++++++ app/models/feed.rb | 6 ++---- app/models/trending_tags.rb | 6 ++---- app/services/batched_remove_status_service.rb | 5 +---- app/services/follow_service.rb | 6 ++---- app/services/post_status_service.rb | 6 ++---- app/services/remove_status_service.rb | 19 ++++++++----------- .../scheduler/feed_cleanup_scheduler.rb | 5 +---- 13 files changed, 39 insertions(+), 59 deletions(-) create mode 100644 app/models/concerns/redisable.rb diff --git a/app/lib/activity_tracker.rb b/app/lib/activity_tracker.rb index 5b4972674..ae3c11b6a 100644 --- a/app/lib/activity_tracker.rb +++ b/app/lib/activity_tracker.rb @@ -4,6 +4,8 @@ class ActivityTracker EXPIRE_AFTER = 90.days.seconds class << self + include Redisable + def increment(prefix) key = [prefix, current_week].join(':') @@ -20,10 +22,6 @@ class ActivityTracker private - def redis - Redis.current - end - def current_week Time.zone.today.cweek end diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 87318fb1c..919678618 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -2,6 +2,7 @@ class ActivityPub::Activity include JsonLdHelper + include Redisable def initialize(json, account, **options) @json = json @@ -70,10 +71,6 @@ class ActivityPub::Activity @object_uri ||= value_or_id(@object) end - def redis - Redis.current - end - def distribute(status) crawl_links(status) diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index f99df33e5..d77cdb3a3 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -4,6 +4,7 @@ require 'singleton' class FeedManager include Singleton + include Redisable MAX_ITEMS = 400 @@ -35,7 +36,7 @@ class FeedManager def unpush_from_home(account, status) return false unless remove_from_feed(:home, account.id, status) - Redis.current.publish("timeline:#{account.id}", Oj.dump(event: :delete, payload: status.id.to_s)) + redis.publish("timeline:#{account.id}", Oj.dump(event: :delete, payload: status.id.to_s)) true end @@ -53,7 +54,7 @@ class FeedManager def unpush_from_list(list, status) return false unless remove_from_feed(:list, list.id, status) - Redis.current.publish("timeline:list:#{list.id}", Oj.dump(event: :delete, payload: status.id.to_s)) + redis.publish("timeline:list:#{list.id}", Oj.dump(event: :delete, payload: status.id.to_s)) true end @@ -142,10 +143,6 @@ class FeedManager private - def redis - Redis.current - end - def push_update_required?(timeline_id) redis.exists("subscribed:#{timeline_id}") end diff --git a/app/lib/ostatus/activity/base.rb b/app/lib/ostatus/activity/base.rb index c5933f3ad..db70f1998 100644 --- a/app/lib/ostatus/activity/base.rb +++ b/app/lib/ostatus/activity/base.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class OStatus::Activity::Base + include Redisable + def initialize(xml, account = nil, **options) @xml = xml @account = account @@ -66,8 +68,4 @@ class OStatus::Activity::Base Status.find_by(uri: uri) end end - - def redis - Redis.current - end end diff --git a/app/lib/potential_friendship_tracker.rb b/app/lib/potential_friendship_tracker.rb index 017a9748d..188aa4a27 100644 --- a/app/lib/potential_friendship_tracker.rb +++ b/app/lib/potential_friendship_tracker.rb @@ -11,6 +11,8 @@ class PotentialFriendshipTracker }.freeze class << self + include Redisable + def record(account_id, target_account_id, action) return if account_id == target_account_id @@ -31,11 +33,5 @@ class PotentialFriendshipTracker return [] if account_ids.empty? Account.searchable.where(id: account_ids) end - - private - - def redis - Redis.current - end end end diff --git a/app/models/concerns/redisable.rb b/app/models/concerns/redisable.rb new file mode 100644 index 000000000..c6cf97359 --- /dev/null +++ b/app/models/concerns/redisable.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Redisable + extend ActiveSupport::Concern + + private + + def redis + Redis.current + end +end diff --git a/app/models/feed.rb b/app/models/feed.rb index 5bce88f25..0e8943ff8 100644 --- a/app/models/feed.rb +++ b/app/models/feed.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Feed + include Redisable + def initialize(type, id) @type = type @id = id @@ -27,8 +29,4 @@ class Feed def key FeedManager.instance.key(@type, @id) end - - def redis - Redis.current - end end diff --git a/app/models/trending_tags.rb b/app/models/trending_tags.rb index 3a8be2164..148535c21 100644 --- a/app/models/trending_tags.rb +++ b/app/models/trending_tags.rb @@ -7,6 +7,8 @@ class TrendingTags THRESHOLD = 5 class << self + include Redisable + def record_use!(tag, account, at_time = Time.now.utc) return if disallowed_hashtags.include?(tag.name) || account.silenced? || account.bot? @@ -59,9 +61,5 @@ class TrendingTags @disallowed_hashtags = @disallowed_hashtags.split(' ') if @disallowed_hashtags.is_a? String @disallowed_hashtags = @disallowed_hashtags.map(&:downcase) end - - def redis - Redis.current - end end end diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb index 2e61904fc..cd3b14e08 100644 --- a/app/services/batched_remove_status_service.rb +++ b/app/services/batched_remove_status_service.rb @@ -2,6 +2,7 @@ class BatchedRemoveStatusService < BaseService include StreamEntryRenderer + include Redisable # Delete given statuses and reblogs of them # Dispatch PuSH updates of the deleted statuses, but only local ones @@ -109,10 +110,6 @@ class BatchedRemoveStatusService < BaseService end end - def redis - Redis.current - end - def build_xml(stream_entry) return @activity_xml[stream_entry.id] if @activity_xml.key?(stream_entry.id) diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb index 9d36a1449..92d8c864a 100644 --- a/app/services/follow_service.rb +++ b/app/services/follow_service.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class FollowService < BaseService + include Redisable + # Follow a remote user, notify remote user about the follow # @param [Account] source_account From which to follow # @param [String, Account] uri User URI to follow in the form of username@domain (or account record) @@ -67,10 +69,6 @@ class FollowService < BaseService follow end - def redis - Redis.current - end - def build_follow_request_xml(follow_request) OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.follow_request_salmon(follow_request)) end diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 9959bb1fb..686b10c58 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class PostStatusService < BaseService + include Redisable + MIN_SCHEDULE_OFFSET = 5.minutes.freeze # Post a text status update, fetch and notify remote users mentioned @@ -110,10 +112,6 @@ class PostStatusService < BaseService ProcessHashtagsService.new end - def redis - Redis.current - end - def scheduled? @scheduled_at.present? end diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb index 11d28e783..28c5224b0 100644 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@ -2,6 +2,7 @@ class RemoveStatusService < BaseService include StreamEntryRenderer + include Redisable def call(status, **options) @payload = Oj.dump(event: :delete, payload: status.id.to_s) @@ -55,7 +56,7 @@ class RemoveStatusService < BaseService def remove_from_affected @mentions.map(&:account).select(&:local?).each do |account| - Redis.current.publish("timeline:#{account.id}", @payload) + redis.publish("timeline:#{account.id}", @payload) end end @@ -133,26 +134,22 @@ class RemoveStatusService < BaseService return unless @status.public_visibility? @tags.each do |hashtag| - Redis.current.publish("timeline:hashtag:#{hashtag}", @payload) - Redis.current.publish("timeline:hashtag:#{hashtag}:local", @payload) if @status.local? + redis.publish("timeline:hashtag:#{hashtag}", @payload) + redis.publish("timeline:hashtag:#{hashtag}:local", @payload) if @status.local? end end def remove_from_public return unless @status.public_visibility? - Redis.current.publish('timeline:public', @payload) - Redis.current.publish('timeline:public:local', @payload) if @status.local? + redis.publish('timeline:public', @payload) + redis.publish('timeline:public:local', @payload) if @status.local? end def remove_from_media return unless @status.public_visibility? - Redis.current.publish('timeline:public:media', @payload) - Redis.current.publish('timeline:public:local:media', @payload) if @status.local? - end - - def redis - Redis.current + redis.publish('timeline:public:media', @payload) + redis.publish('timeline:public:local:media', @payload) if @status.local? end end diff --git a/app/workers/scheduler/feed_cleanup_scheduler.rb b/app/workers/scheduler/feed_cleanup_scheduler.rb index cd2273418..bf5e20757 100644 --- a/app/workers/scheduler/feed_cleanup_scheduler.rb +++ b/app/workers/scheduler/feed_cleanup_scheduler.rb @@ -2,6 +2,7 @@ class Scheduler::FeedCleanupScheduler include Sidekiq::Worker + include Redisable sidekiq_options unique: :until_executed, retry: 0 @@ -57,8 +58,4 @@ class Scheduler::FeedCleanupScheduler def feed_manager FeedManager.instance end - - def redis - Redis.current - end end From 6c11f0f8cf91aa4d0b83a0a9c5a92cfa99dcbfdd Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 13 Feb 2019 18:36:23 +0100 Subject: [PATCH 154/274] Alternative handling of private self-boosts (#9998) * When self-boosting, embed original toot into Announce serialization * Process unknown self-boosts from Announce object if it is more than an URI * Add some self-boost specs * Only serialize private toots in self-Announces --- app/lib/activitypub/activity.rb | 32 +++++++++++ app/lib/activitypub/activity/announce.rb | 4 +- app/lib/activitypub/activity/create.rb | 15 ------ .../activitypub/activity_serializer.rb | 8 ++- .../lib/activitypub/activity/announce_spec.rb | 53 ++++++++++++++++--- 5 files changed, 86 insertions(+), 26 deletions(-) diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 919678618..7e4e19531 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -4,6 +4,9 @@ class ActivityPub::Activity include JsonLdHelper include Redisable + SUPPORTED_TYPES = %w(Note).freeze + CONVERTED_TYPES = %w(Image Video Article Page).freeze + def initialize(json, account, **options) @json = json @account = account @@ -71,6 +74,18 @@ class ActivityPub::Activity @object_uri ||= value_or_id(@object) end + def unsupported_object_type? + @object.is_a?(String) || !(supported_object_type? || converted_object_type?) + end + + def supported_object_type? + equals_or_includes_any?(@object['type'], SUPPORTED_TYPES) + end + + def converted_object_type? + equals_or_includes_any?(@object['type'], CONVERTED_TYPES) + end + def distribute(status) crawl_links(status) @@ -120,6 +135,23 @@ class ActivityPub::Activity redis.setex("delete_upon_arrival:#{@account.id}:#{uri}", 6.hours.seconds, uri) end + def status_from_object + # If the status is already known, return it + status = status_from_uri(object_uri) + return status unless status.nil? + + # If the boosted toot is embedded and it is a self-boost, handle it like a Create + unless unsupported_object_type? + actor_id = value_or_id(first_of_value(@object['attributedTo'])) || @account.uri + if actor_id == @account.uri + return ActivityPub::Activity.factory({ 'type' => 'Create', 'actor' => actor_id, 'object' => @object }, @account).perform + end + end + + # If the status is not from the actor, try to fetch it + return fetch_remote_original_status if value_or_id(first_of_value(@json['attributedTo'])) == @account.uri + end + def fetch_remote_original_status if object_uri.start_with?('http') return if ActivityPub::TagManager.instance.local_uri?(object_uri) diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb index 34d1b7cbd..04afeea20 100644 --- a/app/lib/activitypub/activity/announce.rb +++ b/app/lib/activitypub/activity/announce.rb @@ -2,9 +2,7 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity def perform - original_status = status_from_uri(object_uri) - original_status ||= fetch_remote_original_status - + original_status = status_from_object return if original_status.nil? || delete_arrived_first?(@json['id']) || !announceable?(original_status) status = Status.find_by(account: @account, reblog: original_status) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index b49657d4b..9a3db51dd 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -1,9 +1,6 @@ # frozen_string_literal: true class ActivityPub::Activity::Create < ActivityPub::Activity - SUPPORTED_TYPES = %w(Note).freeze - CONVERTED_TYPES = %w(Image Video Article Page).freeze - def perform return if unsupported_object_type? || invalid_origin?(@object['id']) return if Tombstone.exists?(uri: @object['id']) @@ -318,22 +315,10 @@ class ActivityPub::Activity::Create < ActivityPub::Activity @object['nameMap'].is_a?(Hash) && !@object['nameMap'].empty? end - def unsupported_object_type? - @object.is_a?(String) || !(supported_object_type? || converted_object_type?) - end - def unsupported_media_type?(mime_type) mime_type.present? && !(MediaAttachment::IMAGE_MIME_TYPES + MediaAttachment::VIDEO_MIME_TYPES).include?(mime_type) end - def supported_object_type? - equals_or_includes_any?(@object['type'], SUPPORTED_TYPES) - end - - def converted_object_type? - equals_or_includes_any?(@object['type'], CONVERTED_TYPES) - end - def skip_download? return @skip_download if defined?(@skip_download) @skip_download ||= DomainBlock.find_by(domain: @account.domain)&.reject_media? diff --git a/app/serializers/activitypub/activity_serializer.rb b/app/serializers/activitypub/activity_serializer.rb index 50c4f6a04..b51e8c544 100644 --- a/app/serializers/activitypub/activity_serializer.rb +++ b/app/serializers/activitypub/activity_serializer.rb @@ -3,8 +3,8 @@ class ActivityPub::ActivitySerializer < ActiveModel::Serializer attributes :id, :type, :actor, :published, :to, :cc - has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, unless: :announce? - attribute :proper_uri, key: :object, if: :announce? + has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, unless: :owned_announce? + attribute :proper_uri, key: :object, if: :owned_announce? attribute :atom_uri, if: :announce? def id @@ -42,4 +42,8 @@ class ActivityPub::ActivitySerializer < ActiveModel::Serializer def announce? object.reblog? end + + def owned_announce? + announce? && object.account == object.proper.account && object.proper.private_visibility? + end end diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb index 54dd52a60..1725c2843 100644 --- a/spec/lib/activitypub/activity/announce_spec.rb +++ b/spec/lib/activitypub/activity/announce_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe ActivityPub::Activity::Announce do - let(:sender) { Fabricate(:account) } + let(:sender) { Fabricate(:account, followers_url: 'http://example.com/followers') } let(:recipient) { Fabricate(:account) } let(:status) { Fabricate(:status, account: recipient) } @@ -11,19 +11,60 @@ RSpec.describe ActivityPub::Activity::Announce do id: 'foo', type: 'Announce', actor: ActivityPub::TagManager.instance.uri_for(sender), - object: ActivityPub::TagManager.instance.uri_for(status), + object: object_json, }.with_indifferent_access end - describe '#perform' do - subject { described_class.new(json, sender) } + subject { described_class.new(json, sender) } + before do + sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender)) + end + + describe '#perform' do before do subject.perform end - it 'creates a reblog by sender of status' do - expect(sender.reblogged?(status)).to be true + context 'a known status' do + let(:object_json) do + ActivityPub::TagManager.instance.uri_for(status) + end + + it 'creates a reblog by sender of status' do + expect(sender.reblogged?(status)).to be true + end + end + + context 'self-boost of a previously unknown status with missing attributedTo' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'http://example.com/followers', + } + end + + it 'creates a reblog by sender of status' do + expect(sender.reblogged?(sender.statuses.first)).to be true + end + end + + context 'self-boost of a previously unknown status with correct attributedTo' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + attributedTo: ActivityPub::TagManager.instance.uri_for(sender), + to: 'http://example.com/followers', + } + end + + it 'creates a reblog by sender of status' do + expect(sender.reblogged?(sender.statuses.first)).to be true + end end end end From ef45411c537d37f06b23914135460544d348bfd6 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 13 Feb 2019 18:42:47 +0100 Subject: [PATCH 155/274] Filter incoming Create activities by relation to local activity (#10005) Reject those from accounts with no local followers, from relays that are not enabled, which do not address local accounts and are not replies to accounts that do have local followers --- app/lib/activitypub/activity/create.rb | 34 +++++++++++++++++-- .../activitypub/process_collection_service.rb | 1 + app/workers/activitypub/processing_worker.rb | 2 +- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 9a3db51dd..1b31768d9 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -2,8 +2,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def perform - return if unsupported_object_type? || invalid_origin?(@object['id']) - return if Tombstone.exists?(uri: @object['id']) + return if unsupported_object_type? || invalid_origin?(@object['id']) || Tombstone.exists?(uri: @object['id']) || !related_to_local_activity? RedisLock.acquire(lock_options) do |lock| if lock.acquired? @@ -337,6 +336,37 @@ class ActivityPub::Activity::Create < ActivityPub::Activity !replied_to_status.nil? && replied_to_status.account.local? end + def related_to_local_activity? + fetch? || followed_by_local_accounts? || requested_through_relay? || + responds_to_followed_account? || addresses_local_accounts? + end + + def fetch? + !@options[:delivery] + end + + def followed_by_local_accounts? + @account.passive_relationships.exists? + end + + def requested_through_relay? + @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled? + end + + def responds_to_followed_account? + !replied_to_status.nil? && (replied_to_status.account.local? || replied_to_status.account.passive_relationships.exists?) + end + + def addresses_local_accounts? + return true if @options[:delivered_to_account_id] + + local_usernames = (as_array(@object['to']) + as_array(@object['cc'])).uniq.select { |uri| ActivityPub::TagManager.instance.local_uri?(uri) }.map { |uri| ActivityPub::TagManager.instance.uri_to_local_id(uri, :username) } + + return false if local_usernames.empty? + + Account.local.where(username: local_usernames).exists? + end + def forward_for_reply return unless @json['signature'].present? && reply_to_local? ActivityPub::RawDistributionWorker.perform_async(Oj.dump(@json), replied_to_status.account_id, [@account.preferred_inbox_url]) diff --git a/app/services/activitypub/process_collection_service.rb b/app/services/activitypub/process_collection_service.rb index 5c54aad89..881df478b 100644 --- a/app/services/activitypub/process_collection_service.rb +++ b/app/services/activitypub/process_collection_service.rb @@ -44,6 +44,7 @@ class ActivityPub::ProcessCollectionService < BaseService end def verify_account! + @options[:relayed_through_account] = @account @account = ActivityPub::LinkedDataSignature.new(@json).verify_account! rescue JSON::LD::JsonLdError => e Rails.logger.debug "Could not verify LD-Signature for #{value_or_id(@json['actor'])}: #{e.message}" diff --git a/app/workers/activitypub/processing_worker.rb b/app/workers/activitypub/processing_worker.rb index a8a3ebf0f..a3abe72cf 100644 --- a/app/workers/activitypub/processing_worker.rb +++ b/app/workers/activitypub/processing_worker.rb @@ -6,6 +6,6 @@ class ActivityPub::ProcessingWorker sidekiq_options backtrace: true def perform(account_id, body, delivered_to_account_id = nil) - ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true, delivered_to_account_id: delivered_to_account_id) + ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true, delivered_to_account_id: delivered_to_account_id, delivery: true) end end From e84c7618192b1ba1538e3c0af79acdf604aea5fc Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 15 Feb 2019 18:19:45 +0100 Subject: [PATCH 156/274] Filter incoming Announce activities by relation to local activity (#10041) * Filter incoming Announce activities by relation to local activity Reject if announcer is not followed by local accounts, and is not from an enabled relay, and the object is not a local status Follow-up to #10005 * Fix tests --- app/lib/activitypub/activity.rb | 14 ++++++++++++++ app/lib/activitypub/activity/announce.rb | 11 ++++++++++- app/lib/activitypub/activity/create.rb | 12 ------------ spec/lib/activitypub/activity/announce_spec.rb | 1 + 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 7e4e19531..3cf38764a 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -138,11 +138,13 @@ class ActivityPub::Activity def status_from_object # If the status is already known, return it status = status_from_uri(object_uri) + return status unless status.nil? # If the boosted toot is embedded and it is a self-boost, handle it like a Create unless unsupported_object_type? actor_id = value_or_id(first_of_value(@object['attributedTo'])) || @account.uri + if actor_id == @account.uri return ActivityPub::Activity.factory({ 'type' => 'Create', 'actor' => actor_id, 'object' => @object }, @account).perform end @@ -166,4 +168,16 @@ class ActivityPub::Activity ensure redis.del(key) end + + def fetch? + !@options[:delivery] + end + + def followed_by_local_accounts? + @account.passive_relationships.exists? + end + + def requested_through_relay? + @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled? + end end diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb index 04afeea20..28a1cda02 100644 --- a/app/lib/activitypub/activity/announce.rb +++ b/app/lib/activitypub/activity/announce.rb @@ -3,7 +3,8 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity def perform original_status = status_from_object - return if original_status.nil? || delete_arrived_first?(@json['id']) || !announceable?(original_status) + + return if original_status.nil? || delete_arrived_first?(@json['id']) || !announceable?(original_status) || !related_to_local_activity? status = Status.find_by(account: @account, reblog: original_status) @@ -39,4 +40,12 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity def announceable?(status) status.account_id == @account.id || status.public_visibility? || status.unlisted_visibility? end + + def related_to_local_activity? + followed_by_local_accounts? || requested_through_relay? || reblog_of_local_status? + end + + def reblog_of_local_status? + status_from_uri(object_uri)&.account&.local? + end end diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 1b31768d9..4fc37fb4b 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -341,18 +341,6 @@ class ActivityPub::Activity::Create < ActivityPub::Activity responds_to_followed_account? || addresses_local_accounts? end - def fetch? - !@options[:delivery] - end - - def followed_by_local_accounts? - @account.passive_relationships.exists? - end - - def requested_through_relay? - @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled? - end - def responds_to_followed_account? !replied_to_status.nil? && (replied_to_status.account.local? || replied_to_status.account.passive_relationships.exists?) end diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb index 1725c2843..5e6f008ec 100644 --- a/spec/lib/activitypub/activity/announce_spec.rb +++ b/spec/lib/activitypub/activity/announce_spec.rb @@ -18,6 +18,7 @@ RSpec.describe ActivityPub::Activity::Announce do subject { described_class.new(json, sender) } before do + Fabricate(:account).follow!(sender) sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender)) end From 71b831601db2fdc41aaf4ddbe9fd60db109a3153 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 17 Feb 2019 03:38:25 +0100 Subject: [PATCH 157/274] Add logging for rejected ActivityPub payloads and add tests (#10062) --- app/lib/activitypub/activity.rb | 5 + app/lib/activitypub/activity/announce.rb | 4 +- app/lib/activitypub/activity/create.rb | 2 +- .../lib/activitypub/activity/announce_spec.rb | 117 ++- spec/lib/activitypub/activity/create_spec.rb | 738 ++++++++++-------- 5 files changed, 539 insertions(+), 327 deletions(-) diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 3cf38764a..8265810a0 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -180,4 +180,9 @@ class ActivityPub::Activity def requested_through_relay? @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled? end + + def reject_payload! + Rails.logger.info("Rejected #{@json['type']} activity #{@json['id']} from #{@account.uri}#{@options[:relayed_through_account] && "via #{@options[:relayed_through_account].uri}"}") + nil + end end diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb index 28a1cda02..9f8ffd9fb 100644 --- a/app/lib/activitypub/activity/announce.rb +++ b/app/lib/activitypub/activity/announce.rb @@ -2,9 +2,11 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity def perform + return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity? + original_status = status_from_object - return if original_status.nil? || delete_arrived_first?(@json['id']) || !announceable?(original_status) || !related_to_local_activity? + return reject_payload! if original_status.nil? || !announceable?(original_status) status = Status.find_by(account: @account, reblog: original_status) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 4fc37fb4b..d7bd65c80 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -2,7 +2,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def perform - return if unsupported_object_type? || invalid_origin?(@object['id']) || Tombstone.exists?(uri: @object['id']) || !related_to_local_activity? + return reject_payload! if unsupported_object_type? || invalid_origin?(@object['id']) || Tombstone.exists?(uri: @object['id']) || !related_to_local_activity? RedisLock.acquire(lock_options) do |lock| if lock.acquired? diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb index 5e6f008ec..94b9d348d 100644 --- a/spec/lib/activitypub/activity/announce_spec.rb +++ b/spec/lib/activitypub/activity/announce_spec.rb @@ -18,16 +18,63 @@ RSpec.describe ActivityPub::Activity::Announce do subject { described_class.new(json, sender) } before do - Fabricate(:account).follow!(sender) sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender)) end describe '#perform' do - before do - subject.perform + context 'when sender is followed by a local account' do + before do + Fabricate(:account).follow!(sender) + subject.perform + end + + context 'a known status' do + let(:object_json) do + ActivityPub::TagManager.instance.uri_for(status) + end + + it 'creates a reblog by sender of status' do + expect(sender.reblogged?(status)).to be true + end + end + + context 'self-boost of a previously unknown status with missing attributedTo' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'http://example.com/followers', + } + end + + it 'creates a reblog by sender of status' do + expect(sender.reblogged?(sender.statuses.first)).to be true + end + end + + context 'self-boost of a previously unknown status with correct attributedTo' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + attributedTo: ActivityPub::TagManager.instance.uri_for(sender), + to: 'http://example.com/followers', + } + end + + it 'creates a reblog by sender of status' do + expect(sender.reblogged?(sender.statuses.first)).to be true + end + end end - context 'a known status' do + context 'when the status belongs to a local user' do + before do + subject.perform + end + let(:object_json) do ActivityPub::TagManager.instance.uri_for(status) end @@ -37,34 +84,68 @@ RSpec.describe ActivityPub::Activity::Announce do end end - context 'self-boost of a previously unknown status with missing attributedTo' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - to: 'http://example.com/followers', - } + context 'when the sender is relayed' do + let!(:relay_account) { Fabricate(:account, inbox_url: 'https://relay.example.com/inbox') } + let!(:relay) { Fabricate(:relay, inbox_url: 'https://relay.example.com/inbox') } + + subject { described_class.new(json, sender, relayed_through_account: relay_account) } + + context 'and the relay is enabled' do + before do + relay.update(state: :accepted) + subject.perform + end + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'http://example.com/followers', + } + end + + it 'creates a reblog by sender of status' do + expect(sender.statuses.count).to eq 2 + end end - it 'creates a reblog by sender of status' do - expect(sender.reblogged?(sender.statuses.first)).to be true + context 'and the relay is disabled' do + before do + subject.perform + end + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'http://example.com/followers', + } + end + + it 'does not create anything' do + expect(sender.statuses.count).to eq 0 + end end end - context 'self-boost of a previously unknown status with correct attributedTo' do + context 'when the sender has no relevance to local activity' do + before do + subject.perform + end + let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, type: 'Note', content: 'Lorem ipsum', - attributedTo: ActivityPub::TagManager.instance.uri_for(sender), to: 'http://example.com/followers', } end - it 'creates a reblog by sender of status' do - expect(sender.reblogged?(sender.statuses.first)).to be true + it 'does not create anything' do + expect(sender.statuses.count).to eq 0 end end end diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb index cd20b7c7c..26cb84871 100644 --- a/spec/lib/activitypub/activity/create_spec.rb +++ b/spec/lib/activitypub/activity/create_spec.rb @@ -13,8 +13,6 @@ RSpec.describe ActivityPub::Activity::Create do }.with_indifferent_access end - subject { described_class.new(json, sender) } - before do sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender)) @@ -23,11 +21,402 @@ RSpec.describe ActivityPub::Activity::Create do end describe '#perform' do - before do - subject.perform + context 'when fetching' do + subject { described_class.new(json, sender) } + + before do + subject.perform + end + + context 'standalone' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.text).to eq 'Lorem ipsum' + end + + it 'missing to/cc defaults to direct privacy' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'direct' + end + end + + context 'public' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'https://www.w3.org/ns/activitystreams#Public', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'public' + end + end + + context 'unlisted' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + cc: 'https://www.w3.org/ns/activitystreams#Public', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'unlisted' + end + end + + context 'private' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'http://example.com/followers', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'private' + end + end + + context 'limited' do + let(:recipient) { Fabricate(:account) } + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: ActivityPub::TagManager.instance.uri_for(recipient), + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'limited' + end + + it 'creates silent mention' do + status = sender.statuses.first + expect(status.mentions.first).to be_silent + end + end + + context 'direct' do + let(:recipient) { Fabricate(:account) } + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: ActivityPub::TagManager.instance.uri_for(recipient), + tag: { + type: 'Mention', + href: ActivityPub::TagManager.instance.uri_for(recipient), + }, + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'direct' + end + end + + context 'as a reply' do + let(:original_status) { Fabricate(:status) } + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + inReplyTo: ActivityPub::TagManager.instance.uri_for(original_status), + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.thread).to eq original_status + expect(status.reply?).to be true + expect(status.in_reply_to_account).to eq original_status.account + expect(status.conversation).to eq original_status.conversation + end + end + + context 'with mentions' do + let(:recipient) { Fabricate(:account) } + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + tag: [ + { + type: 'Mention', + href: ActivityPub::TagManager.instance.uri_for(recipient), + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.mentions.map(&:account)).to include(recipient) + end + end + + context 'with mentions missing href' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + tag: [ + { + type: 'Mention', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + expect(status).to_not be_nil + end + end + + context 'with media attachments' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + attachment: [ + { + type: 'Document', + mediaType: 'image/png', + url: 'http://example.com/attachment.png', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.media_attachments.map(&:remote_url)).to include('http://example.com/attachment.png') + end + end + + context 'with media attachments with focal points' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + attachment: [ + { + type: 'Document', + mediaType: 'image/png', + url: 'http://example.com/attachment.png', + focalPoint: [0.5, -0.7], + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.media_attachments.map(&:focus)).to include('0.5,-0.7') + end + end + + context 'with media attachments missing url' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + attachment: [ + { + type: 'Document', + mediaType: 'image/png', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + expect(status).to_not be_nil + end + end + + context 'with hashtags' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + tag: [ + { + type: 'Hashtag', + href: 'http://example.com/blah', + name: '#test', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.tags.map(&:name)).to include('test') + end + end + + context 'with hashtags missing name' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + tag: [ + { + type: 'Hashtag', + href: 'http://example.com/blah', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + expect(status).to_not be_nil + end + end + + context 'with emojis' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum :tinking:', + tag: [ + { + type: 'Emoji', + icon: { + url: 'http://example.com/emoji.png', + }, + name: 'tinking', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.emojis.map(&:shortcode)).to include('tinking') + end + end + + context 'with emojis missing name' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum :tinking:', + tag: [ + { + type: 'Emoji', + icon: { + url: 'http://example.com/emoji.png', + }, + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + expect(status).to_not be_nil + end + end + + context 'with emojis missing icon' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum :tinking:', + tag: [ + { + type: 'Emoji', + name: 'tinking', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + expect(status).to_not be_nil + end + end end - context 'standalone' do + context 'when sender is followed by local users' do + subject { described_class.new(json, sender, delivery: true) } + + before do + Fabricate(:account).follow!(sender) + subject.perform + end + let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, @@ -42,78 +431,23 @@ RSpec.describe ActivityPub::Activity::Create do expect(status).to_not be_nil expect(status.text).to eq 'Lorem ipsum' end - - it 'missing to/cc defaults to direct privacy' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.visibility).to eq 'direct' - end end - context 'public' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - to: 'https://www.w3.org/ns/activitystreams#Public', - } + context 'when sender replies to local status' do + let!(:local_status) { Fabricate(:status) } + + subject { described_class.new(json, sender, delivery: true) } + + before do + subject.perform end - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.visibility).to eq 'public' - end - end - - context 'unlisted' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - cc: 'https://www.w3.org/ns/activitystreams#Public', - } - end - - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.visibility).to eq 'unlisted' - end - end - - context 'private' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - to: 'http://example.com/followers', - } - end - - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.visibility).to eq 'private' - end - end - - context 'limited' do - let(:recipient) { Fabricate(:account) } - let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, type: 'Note', content: 'Lorem ipsum', - to: ActivityPub::TagManager.instance.uri_for(recipient), + inReplyTo: ActivityPub::TagManager.instance.uri_for(local_status), } end @@ -121,28 +455,25 @@ RSpec.describe ActivityPub::Activity::Create do status = sender.statuses.first expect(status).to_not be_nil - expect(status.visibility).to eq 'limited' - end - - it 'creates silent mention' do - status = sender.statuses.first - expect(status.mentions.first).to be_silent + expect(status.text).to eq 'Lorem ipsum' end end - context 'direct' do - let(:recipient) { Fabricate(:account) } + context 'when sender targets a local user' do + let!(:local_account) { Fabricate(:account) } + + subject { described_class.new(json, sender, delivery: true) } + + before do + subject.perform + end let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, type: 'Note', content: 'Lorem ipsum', - to: ActivityPub::TagManager.instance.uri_for(recipient), - tag: { - type: 'Mention', - href: ActivityPub::TagManager.instance.uri_for(recipient), - }, + to: ActivityPub::TagManager.instance.uri_for(local_account), } end @@ -150,19 +481,25 @@ RSpec.describe ActivityPub::Activity::Create do status = sender.statuses.first expect(status).to_not be_nil - expect(status.visibility).to eq 'direct' + expect(status.text).to eq 'Lorem ipsum' end end - context 'as a reply' do - let(:original_status) { Fabricate(:status) } + context 'when sender cc\'s a local user' do + let!(:local_account) { Fabricate(:account) } + + subject { described_class.new(json, sender, delivery: true) } + + before do + subject.perform + end let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, type: 'Note', content: 'Lorem ipsum', - inReplyTo: ActivityPub::TagManager.instance.uri_for(original_status), + cc: ActivityPub::TagManager.instance.uri_for(local_account), } end @@ -170,240 +507,27 @@ RSpec.describe ActivityPub::Activity::Create do status = sender.statuses.first expect(status).to_not be_nil - expect(status.thread).to eq original_status - expect(status.reply?).to be true - expect(status.in_reply_to_account).to eq original_status.account - expect(status.conversation).to eq original_status.conversation + expect(status.text).to eq 'Lorem ipsum' end end - context 'with mentions' do - let(:recipient) { Fabricate(:account) } + context 'when the sender has no relevance to local activity' do + subject { described_class.new(json, sender, delivery: true) } + + before do + subject.perform + end let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, type: 'Note', content: 'Lorem ipsum', - tag: [ - { - type: 'Mention', - href: ActivityPub::TagManager.instance.uri_for(recipient), - }, - ], } end - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.mentions.map(&:account)).to include(recipient) - end - end - - context 'with mentions missing href' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - tag: [ - { - type: 'Mention', - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - expect(status).to_not be_nil - end - end - - context 'with media attachments' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - attachment: [ - { - type: 'Document', - mediaType: 'image/png', - url: 'http://example.com/attachment.png', - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.media_attachments.map(&:remote_url)).to include('http://example.com/attachment.png') - end - end - - context 'with media attachments with focal points' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - attachment: [ - { - type: 'Document', - mediaType: 'image/png', - url: 'http://example.com/attachment.png', - focalPoint: [0.5, -0.7], - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.media_attachments.map(&:focus)).to include('0.5,-0.7') - end - end - - context 'with media attachments missing url' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - attachment: [ - { - type: 'Document', - mediaType: 'image/png', - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - expect(status).to_not be_nil - end - end - - context 'with hashtags' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - tag: [ - { - type: 'Hashtag', - href: 'http://example.com/blah', - name: '#test', - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.tags.map(&:name)).to include('test') - end - end - - context 'with hashtags missing name' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - tag: [ - { - type: 'Hashtag', - href: 'http://example.com/blah', - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - expect(status).to_not be_nil - end - end - - context 'with emojis' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum :tinking:', - tag: [ - { - type: 'Emoji', - icon: { - url: 'http://example.com/emoji.png', - }, - name: 'tinking', - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.emojis.map(&:shortcode)).to include('tinking') - end - end - - context 'with emojis missing name' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum :tinking:', - tag: [ - { - type: 'Emoji', - icon: { - url: 'http://example.com/emoji.png', - }, - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - expect(status).to_not be_nil - end - end - - context 'with emojis missing icon' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum :tinking:', - tag: [ - { - type: 'Emoji', - name: 'tinking', - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - expect(status).to_not be_nil + it 'does not create anything' do + expect(sender.statuses.count).to eq 0 end end end From b163368c3e3e3a22c4ef98c0d0cd6c07a2ad13e6 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 17 Feb 2019 15:16:36 +0100 Subject: [PATCH 158/274] Fix Announce activities of unknown statuses not fetching those statuses (#10065) Regression from #9998 --- app/lib/activitypub/activity.rb | 3 +- .../lib/activitypub/activity/announce_spec.rb | 43 +++++++++++++------ 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 8265810a0..11fa3363a 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -150,8 +150,7 @@ class ActivityPub::Activity end end - # If the status is not from the actor, try to fetch it - return fetch_remote_original_status if value_or_id(first_of_value(@json['attributedTo'])) == @account.uri + fetch_remote_original_status end def fetch_remote_original_status diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb index 94b9d348d..aa58d9e23 100644 --- a/spec/lib/activitypub/activity/announce_spec.rb +++ b/spec/lib/activitypub/activity/announce_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe ActivityPub::Activity::Announce do - let(:sender) { Fabricate(:account, followers_url: 'http://example.com/followers') } + let(:sender) { Fabricate(:account, followers_url: 'http://example.com/followers', uri: 'https://example.com/actor') } let(:recipient) { Fabricate(:account) } let(:status) { Fabricate(:status, account: recipient) } @@ -10,21 +10,29 @@ RSpec.describe ActivityPub::Activity::Announce do '@context': 'https://www.w3.org/ns/activitystreams', id: 'foo', type: 'Announce', - actor: ActivityPub::TagManager.instance.uri_for(sender), + actor: 'https://example.com/actor', object: object_json, }.with_indifferent_access end - subject { described_class.new(json, sender) } - - before do - sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender)) + let(:unknown_object_json) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: 'https://example.com/actor/hello-world', + type: 'Note', + attributedTo: 'https://example.com/actor', + content: 'Hello world', + to: 'http://example.com/followers', + } end + subject { described_class.new(json, sender) } + describe '#perform' do context 'when sender is followed by a local account' do before do Fabricate(:account).follow!(sender) + stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json)) subject.perform end @@ -38,10 +46,21 @@ RSpec.describe ActivityPub::Activity::Announce do end end + context 'an unknown status' do + let(:object_json) { 'https://example.com/actor/hello-world' } + + it 'creates a reblog by sender of status' do + reblog = sender.statuses.first + + expect(reblog).to_not be_nil + expect(reblog.reblog.text).to eq 'Hello world' + end + end + context 'self-boost of a previously unknown status with missing attributedTo' do let(:object_json) do { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + id: 'https://example.com/actor#bar', type: 'Note', content: 'Lorem ipsum', to: 'http://example.com/followers', @@ -56,10 +75,10 @@ RSpec.describe ActivityPub::Activity::Announce do context 'self-boost of a previously unknown status with correct attributedTo' do let(:object_json) do { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + id: 'https://example.com/actor#bar', type: 'Note', content: 'Lorem ipsum', - attributedTo: ActivityPub::TagManager.instance.uri_for(sender), + attributedTo: 'https://example.com/actor', to: 'http://example.com/followers', } end @@ -98,7 +117,7 @@ RSpec.describe ActivityPub::Activity::Announce do let(:object_json) do { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + id: 'https://example.com/actor#bar', type: 'Note', content: 'Lorem ipsum', to: 'http://example.com/followers', @@ -117,7 +136,7 @@ RSpec.describe ActivityPub::Activity::Announce do let(:object_json) do { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + id: 'https://example.com/actor#bar', type: 'Note', content: 'Lorem ipsum', to: 'http://example.com/followers', @@ -137,7 +156,7 @@ RSpec.describe ActivityPub::Activity::Announce do let(:object_json) do { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + id: 'https://example.com/actor#bar', type: 'Note', content: 'Lorem ipsum', to: 'http://example.com/followers', From 8ad75eea62117f8635de8897c74297a5a8b3bd5c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 15 Feb 2019 16:08:59 +0100 Subject: [PATCH 159/274] Fix relay enabling/disabling not resetting inbox availability status (#10048) Fix #10033 --- app/models/relay.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/relay.rb b/app/models/relay.rb index 7478c110d..6934a5c62 100644 --- a/app/models/relay.rb +++ b/app/models/relay.rb @@ -29,6 +29,7 @@ class Relay < ApplicationRecord payload = Oj.dump(follow_activity(activity_id)) update!(state: :pending, follow_activity_id: activity_id) + DeliveryFailureTracker.new(inbox_url).track_success! ActivityPub::DeliveryWorker.perform_async(payload, some_local_account.id, inbox_url) end @@ -37,6 +38,7 @@ class Relay < ApplicationRecord payload = Oj.dump(unfollow_activity(activity_id)) update!(state: :idle, follow_activity_id: nil) + DeliveryFailureTracker.new(inbox_url).track_success! ActivityPub::DeliveryWorker.perform_async(payload, some_local_account.id, inbox_url) end From 637f0007b9535ed988cbe94c9b9b40a8f8e8a24f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 13 Feb 2019 21:28:18 +0100 Subject: [PATCH 160/274] Change robots.txt to exclude some URLs (#10037) - Exclude static assets - Exclude uploaded files - Exclude alternate versions of the profile page - Exclude media proxy URLs --- public/robots.txt | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/public/robots.txt b/public/robots.txt index 3c9c7c01f..36afc85ef 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,5 +1,13 @@ -# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file -# -# To ban all spiders from the entire site uncomment the next two lines: -# User-agent: * -# Disallow: / +User-Agent: * +Disallow: /users/*/followers +Disallow: /users/*/following +Disallow: /@*/media +Disallow: /@*/with_replies +Disallow: /@*/tagged/* +Disallow: /media_proxy/* +Disallow: /emoji/* +Disallow: /packs/* +Disallow: /sounds/* +Disallow: /system/* +Disallow: /avatars/* +Disallow: /headers/* From 45b2bb464b5ff5b5b5805004a5dc856b495dfc54 Mon Sep 17 00:00:00 2001 From: nightpool Date: Wed, 13 Feb 2019 21:11:47 -0500 Subject: [PATCH 161/274] Change robots.txt to exclude only media proxy URLs (#10038) * Revert "Change robots.txt to exclude some URLs (#10037)" This reverts commit 80161f43510ad9316c60c9b50dd5c09c2dae4d54. * Let's block media_proxy /media_proxy/ is a dynamic route used for requesting uncached media, so it's probably bad to let crawlers use it * misleading comment --- public/robots.txt | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/public/robots.txt b/public/robots.txt index 36afc85ef..d93648bee 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,13 +1,4 @@ -User-Agent: * -Disallow: /users/*/followers -Disallow: /users/*/following -Disallow: /@*/media -Disallow: /@*/with_replies -Disallow: /@*/tagged/* -Disallow: /media_proxy/* -Disallow: /emoji/* -Disallow: /packs/* -Disallow: /sounds/* -Disallow: /system/* -Disallow: /avatars/* -Disallow: /headers/* +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file + +User-agent: * +Disallow: /media_proxy/ From 1ad0d232b3ed1c2005d64f1746ecd2d476379852 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Wed, 13 Feb 2019 18:04:43 -0600 Subject: [PATCH 162/274] Improve image description user experience (#10036) * Add image descriptions to searchable post content. * Allow multi-line image descriptions. * Request image descriptions in the same query as posts when creating the search index. (see https://github.com/tootsuite/mastodon/pull/10036#discussion_r256551624) --- app/chewy/statuses_index.rb | 4 ++-- app/javascript/mastodon/features/compose/components/upload.js | 3 +-- app/javascript/styles/mastodon/components.scss | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb index d3104172c..eafc1818b 100644 --- a/app/chewy/statuses_index.rb +++ b/app/chewy/statuses_index.rb @@ -31,7 +31,7 @@ class StatusesIndex < Chewy::Index }, } - define_type ::Status.unscoped.without_reblogs do + define_type ::Status.unscoped.without_reblogs.includes(:media_attachments) do crutch :mentions do |collection| data = ::Mention.where(status_id: collection.map(&:id)).pluck(:status_id, :account_id) data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) } @@ -50,7 +50,7 @@ class StatusesIndex < Chewy::Index root date_detection: false do field :account_id, type: 'long' - field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].join("\n\n") } do + field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).join("\n\n") } do field :stemmed, type: 'text', analyzer: 'content' end diff --git a/app/javascript/mastodon/features/compose/components/upload.js b/app/javascript/mastodon/features/compose/components/upload.js index a1e99dcbb..947c3acc9 100644 --- a/app/javascript/mastodon/features/compose/components/upload.js +++ b/app/javascript/mastodon/features/compose/components/upload.js @@ -107,9 +107,8 @@ class Upload extends ImmutablePureComponent {