From 172eaeba3fd217228dead279712aecce8c3ac080 Mon Sep 17 00:00:00 2001
From: Yamagishi Kazutoshi
Date: Mon, 23 Sep 2019 22:37:45 +0900
Subject: [PATCH 01/41] Add config of multipart threshold for S3 (#11924)
---
.env.production.sample | 14 ++++++++++++++
config/initializers/paperclip.rb | 1 +
lib/tasks/mastodon.rake | 30 +++++++++++++++++++++++++++++-
3 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/.env.production.sample b/.env.production.sample
index b322aee1d..e4ea861e7 100644
--- a/.env.production.sample
+++ b/.env.production.sample
@@ -115,6 +115,20 @@ SMTP_FROM_ADDRESS=notifications@example.com
# S3_ENDPOINT=
# S3_SIGNATURE_VERSION=
+# Google Cloud Storage (optional)
+# Use S3 compatible API. Since GCS does not support Multipart Upload,
+# increase the value of S3_MULTIPART_THRESHOLD to disable Multipart Upload.
+# The attachment host must allow cross origin request - see the description
+# above.
+# S3_ENABLED=true
+# AWS_ACCESS_KEY_ID=
+# AWS_SECRET_ACCESS_KEY=
+# S3_REGION=
+# S3_PROTOCOL=https
+# S3_HOSTNAME=storage.googleapis.com
+# S3_ENDPOINT=https://storage.googleapis.com
+# S3_MULTIPART_THRESHOLD=52428801 # 50.megabytes
+
# Swift (optional)
# The attachment host must allow cross origin request - see the description
# above.
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index ce4185e02..cfc95330c 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -25,6 +25,7 @@ if ENV['S3_ENABLED'] == 'true'
s3_protocol: s3_protocol,
s3_host_name: s3_hostname,
s3_headers: {
+ 'X-Amz-Multipart-Threshold' => ENV.fetch('S3_MULTIPART_THRESHOLD') { 15.megabytes },
'Cache-Control' => 'public, max-age=315576000, immutable',
},
s3_permissions: ENV.fetch('S3_PERMISSION') { 'public-read' },
diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake
index ee9657b0e..2e92e8ded 100644
--- a/lib/tasks/mastodon.rake
+++ b/lib/tasks/mastodon.rake
@@ -135,7 +135,7 @@ namespace :mastodon do
prompt.say "\n"
if prompt.yes?('Do you want to store uploaded files on the cloud?', default: false)
- case prompt.select('Provider', ['Amazon S3', 'Wasabi', 'Minio'])
+ case prompt.select('Provider', ['Amazon S3', 'Wasabi', 'Minio', 'Google Cloud Storage'])
when 'Amazon S3'
env['S3_ENABLED'] = 'true'
env['S3_PROTOCOL'] = 'https'
@@ -217,6 +217,34 @@ namespace :mastodon do
q.required true
q.modify :strip
end
+ when 'Google Cloud Storage'
+ env['S3_ENABLED'] = 'true'
+ env['S3_PROTOCOL'] = 'https'
+ env['S3_HOSTNAME'] = 'storage.googleapis.com'
+ env['S3_ENDPOINT'] = 'https://storage.googleapis.com'
+ env['S3_MULTIPART_THRESHOLD'] = 50.megabytes
+
+ env['S3_BUCKET'] = prompt.ask('GCS bucket name:') do |q|
+ q.required true
+ q.default "files.#{env['LOCAL_DOMAIN']}"
+ q.modify :strip
+ end
+
+ env['S3_REGION'] = prompt.ask('GCS region:') do |q|
+ q.required true
+ q.default 'us-west1'
+ q.modify :strip
+ end
+
+ env['AWS_ACCESS_KEY_ID'] = prompt.ask('GCS access key:') do |q|
+ q.required true
+ q.modify :strip
+ end
+
+ env['AWS_SECRET_ACCESS_KEY'] = prompt.ask('GCS secret key:') do |q|
+ q.required true
+ q.modify :strip
+ end
end
if prompt.yes?('Do you want to access the uploaded files from your own domain?')
From 1051c5cffadeee8d37bffcd0b3de90ef65d7d9d9 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Mon, 23 Sep 2019 15:39:11 +0200
Subject: [PATCH 02/41] Bump puma from 4.1.1 to 4.2.0 (#11939)
Bumps [puma](https://github.com/puma/puma) from 4.1.1 to 4.2.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/v4.1.1...v4.2.0)
Signed-off-by: dependabot-preview[bot]
---
Gemfile | 2 +-
Gemfile.lock | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Gemfile b/Gemfile
index d9965e7da..2ab313754 100644
--- a/Gemfile
+++ b/Gemfile
@@ -5,7 +5,7 @@ ruby '>= 2.4.0', '< 2.7.0'
gem 'pkg-config', '~> 1.3'
-gem 'puma', '~> 4.1'
+gem 'puma', '~> 4.2'
gem 'rails', '~> 5.2.3'
gem 'thor', '~> 0.20'
diff --git a/Gemfile.lock b/Gemfile.lock
index 3af98a43d..a796d1aae 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -445,7 +445,7 @@ GEM
pry-rails (0.3.9)
pry (>= 0.10.4)
public_suffix (4.0.1)
- puma (4.1.1)
+ puma (4.2.0)
nio4r (~> 2.0)
pundit (2.1.0)
activesupport (>= 3.0.0)
@@ -752,7 +752,7 @@ DEPENDENCIES
private_address_check (~> 0.5)
pry-byebug (~> 3.7)
pry-rails (~> 0.3)
- puma (~> 4.1)
+ puma (~> 4.2)
pundit (~> 2.1)
rack-attack (~> 6.1)
rack-cors (~> 1.0)
From 67bef15e53a77b6f1557fdd0efa65f3e916c20df Mon Sep 17 00:00:00 2001
From: Yamagishi Kazutoshi
Date: Tue, 24 Sep 2019 00:25:10 +0900
Subject: [PATCH 03/41] Add fallback section ID with ToC (#11941)
---
app/lib/toc_generator.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/lib/toc_generator.rb b/app/lib/toc_generator.rb
index 351675a5c..0c8f766ca 100644
--- a/app/lib/toc_generator.rb
+++ b/app/lib/toc_generator.rb
@@ -45,7 +45,7 @@ class TOCGenerator
parsed_html.traverse do |node|
next unless TARGET_ELEMENTS.include?(node.name)
- anchor = node['id'] || node.text.parameterize
+ anchor = node['id'] || node.text.parameterize.presence || 'sec'
@slugs[anchor] += 1
anchor = "#{anchor}-#{@slugs[anchor]}" if @slugs[anchor] > 1
From a1f04c1e3497e9dff5970038461d9f454f2650df Mon Sep 17 00:00:00 2001
From: Eugen Rochko
Date: Tue, 24 Sep 2019 04:35:36 +0200
Subject: [PATCH 04/41] Fix authentication before 2FA challenge (#11943)
Regression from #11831
---
app/controllers/auth/sessions_controller.rb | 61 +++++++++++--------
app/models/concerns/ldap_authenticable.rb | 46 +++++++++++---
config/application.rb | 3 +-
config/initializers/devise.rb | 11 ++--
lib/devise/ldap_authenticatable.rb | 55 -----------------
lib/devise/two_factor_ldap_authenticatable.rb | 32 ++++++++++
lib/devise/two_factor_pam_authenticatable.rb | 31 ++++++++++
7 files changed, 140 insertions(+), 99 deletions(-)
delete mode 100644 lib/devise/ldap_authenticatable.rb
create mode 100644 lib/devise/two_factor_ldap_authenticatable.rb
create mode 100644 lib/devise/two_factor_pam_authenticatable.rb
diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb
index b3113bbef..f48b17c79 100644
--- a/app/controllers/auth/sessions_controller.rb
+++ b/app/controllers/auth/sessions_controller.rb
@@ -8,6 +8,8 @@ class Auth::SessionsController < Devise::SessionsController
skip_before_action :require_no_authentication, only: [:create]
skip_before_action :require_functional!
+ prepend_before_action :authenticate_with_two_factor, if: :two_factor_enabled?, only: [:create]
+
before_action :set_instance_presenter, only: [:new]
before_action :set_body_classes
@@ -20,22 +22,9 @@ class Auth::SessionsController < Devise::SessionsController
end
def create
- self.resource = begin
- if user_params[:email].blank? && session[:otp_user_id].present?
- User.find(session[:otp_user_id])
- else
- warden.authenticate!(auth_options)
- end
- end
-
- if resource.otp_required_for_login?
- if user_params[:otp_attempt].present? && session[:otp_user_id].present?
- authenticate_with_two_factor_via_otp(resource)
- else
- prompt_for_two_factor(resource)
- end
- else
- authenticate_and_respond(resource)
+ super do |resource|
+ remember_me(resource)
+ flash.delete(:notice)
end
end
@@ -49,6 +38,16 @@ class Auth::SessionsController < Devise::SessionsController
protected
+ def find_user
+ if session[:otp_user_id]
+ User.find(session[:otp_user_id])
+ else
+ user = User.authenticate_with_ldap(user_params) if Devise.ldap_authentication
+ user ||= User.authenticate_with_pam(user_params) if Devise.pam_authentication
+ user ||= User.find_for_authentication(email: user_params[:email])
+ end
+ end
+
def user_params
params.require(:user).permit(:email, :password, :otp_attempt)
end
@@ -71,6 +70,10 @@ class Auth::SessionsController < Devise::SessionsController
super
end
+ def two_factor_enabled?
+ find_user&.otp_required_for_login?
+ end
+
def valid_otp_attempt?(user)
user.validate_and_consume_otp!(user_params[:otp_attempt]) ||
user.invalidate_otp_backup_code!(user_params[:otp_attempt])
@@ -78,10 +81,24 @@ class Auth::SessionsController < Devise::SessionsController
false
end
+ def authenticate_with_two_factor
+ user = self.resource = find_user
+
+ if user_params[:otp_attempt].present? && session[:otp_user_id]
+ authenticate_with_two_factor_via_otp(user)
+ elsif user.present? && (user.encrypted_password.blank? || user.valid_password?(user_params[:password]))
+ # If encrypted_password is blank, we got the user from LDAP or PAM,
+ # so credentials are already valid
+
+ prompt_for_two_factor(user)
+ end
+ end
+
def authenticate_with_two_factor_via_otp(user)
if valid_otp_attempt?(user)
session.delete(:otp_user_id)
- authenticate_and_respond(user)
+ remember_me(user)
+ sign_in(user)
else
flash.now[:alert] = I18n.t('users.invalid_otp_token')
prompt_for_two_factor(user)
@@ -90,16 +107,10 @@ class Auth::SessionsController < Devise::SessionsController
def prompt_for_two_factor(user)
session[:otp_user_id] = user.id
+ @body_classes = 'lighter'
render :two_factor
end
- def authenticate_and_respond(user)
- sign_in(user)
- remember_me(user)
-
- respond_with user, location: after_sign_in_path_for(user)
- end
-
private
def set_instance_presenter
@@ -112,11 +123,9 @@ class Auth::SessionsController < Devise::SessionsController
def home_paths(resource)
paths = [about_path]
-
if single_user_mode? && resource.is_a?(User)
paths << short_account_path(username: resource.account)
end
-
paths
end
diff --git a/app/models/concerns/ldap_authenticable.rb b/app/models/concerns/ldap_authenticable.rb
index 84ff84c4b..117993947 100644
--- a/app/models/concerns/ldap_authenticable.rb
+++ b/app/models/concerns/ldap_authenticable.rb
@@ -3,24 +3,50 @@
module LdapAuthenticable
extend ActiveSupport::Concern
- def ldap_setup(_attributes)
- self.confirmed_at = Time.now.utc
- self.admin = false
- self.external = true
-
- save!
- end
-
class_methods do
+ def authenticate_with_ldap(params = {})
+ ldap = Net::LDAP.new(ldap_options)
+ filter = format(Devise.ldap_search_filter, uid: Devise.ldap_uid, email: params[:email])
+
+ if (user_info = ldap.bind_as(base: Devise.ldap_base, filter: filter, password: params[:password]))
+ ldap_get_user(user_info.first)
+ end
+ end
+
def ldap_get_user(attributes = {})
resource = joins(:account).find_by(accounts: { username: attributes[Devise.ldap_uid.to_sym].first })
if resource.blank?
- resource = new(email: attributes[:mail].first, agreement: true, account_attributes: { username: attributes[Devise.ldap_uid.to_sym].first })
- resource.ldap_setup(attributes)
+ resource = new(email: attributes[:mail].first, agreement: true, account_attributes: { username: attributes[Devise.ldap_uid.to_sym].first }, admin: false, external: true, confirmed_at: Time.now.utc)
+ resource.save!
end
resource
end
+
+ def ldap_options
+ opts = {
+ host: Devise.ldap_host,
+ port: Devise.ldap_port,
+ base: Devise.ldap_base,
+
+ auth: {
+ method: :simple,
+ username: Devise.ldap_bind_dn,
+ password: Devise.ldap_password,
+ },
+
+ connect_timeout: 10,
+ }
+
+ if [:simple_tls, :start_tls].include?(Devise.ldap_method)
+ opts[:encryption] = {
+ method: Devise.ldap_method,
+ tls_options: OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.tap { |options| options[:verify_mode] = OpenSSL::SSL::VERIFY_NONE if Devise.ldap_tls_no_verify },
+ }
+ end
+
+ opts
+ end
end
end
diff --git a/config/application.rb b/config/application.rb
index 5fd37120d..3ced81b8f 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -13,7 +13,8 @@ require_relative '../lib/paperclip/video_transcoder'
require_relative '../lib/paperclip/type_corrector'
require_relative '../lib/mastodon/snowflake'
require_relative '../lib/mastodon/version'
-require_relative '../lib/devise/ldap_authenticatable'
+require_relative '../lib/devise/two_factor_ldap_authenticatable'
+require_relative '../lib/devise/two_factor_pam_authenticatable'
Dotenv::Railtie.load
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb
index 311583820..fd9a5a8b9 100644
--- a/config/initializers/devise.rb
+++ b/config/initializers/devise.rb
@@ -71,13 +71,10 @@ end
Devise.setup do |config|
config.warden do |manager|
- manager.default_strategies(scope: :user).unshift :database_authenticatable
- manager.default_strategies(scope: :user).unshift :ldap_authenticatable if Devise.ldap_authentication
- manager.default_strategies(scope: :user).unshift :pam_authenticatable if Devise.pam_authentication
-
- # We handle 2FA in our own sessions controller so this gets in the way
- manager.default_strategies(scope: :user).delete :two_factor_backupable
- manager.default_strategies(scope: :user).delete :two_factor_authenticatable
+ manager.default_strategies(scope: :user).unshift :two_factor_ldap_authenticatable if Devise.ldap_authentication
+ manager.default_strategies(scope: :user).unshift :two_factor_pam_authenticatable if Devise.pam_authentication
+ manager.default_strategies(scope: :user).unshift :two_factor_authenticatable
+ manager.default_strategies(scope: :user).unshift :two_factor_backupable
end
# The secret key used by Devise. Devise uses this key to generate
diff --git a/lib/devise/ldap_authenticatable.rb b/lib/devise/ldap_authenticatable.rb
deleted file mode 100644
index 6903d468d..000000000
--- a/lib/devise/ldap_authenticatable.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-# frozen_string_literal: true
-
-require 'net/ldap'
-require 'devise/strategies/authenticatable'
-
-module Devise
- module Strategies
- class LdapAuthenticatable < Authenticatable
- def authenticate!
- if params[:user]
- ldap = Net::LDAP.new(
- host: Devise.ldap_host,
- port: Devise.ldap_port,
- base: Devise.ldap_base,
- encryption: {
- method: Devise.ldap_method,
- tls_options: tls_options,
- },
- auth: {
- method: :simple,
- username: Devise.ldap_bind_dn,
- password: Devise.ldap_password,
- },
- connect_timeout: 10
- )
-
- filter = format(Devise.ldap_search_filter, uid: Devise.ldap_uid, email: email)
-
- if (user_info = ldap.bind_as(base: Devise.ldap_base, filter: filter, password: password))
- user = User.ldap_get_user(user_info.first)
- success!(user)
- else
- return fail(:invalid)
- end
- end
- end
-
- def email
- params[:user][:email]
- end
-
- def password
- params[:user][:password]
- end
-
- def tls_options
- OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.tap do |options|
- options[:verify_mode] = OpenSSL::SSL::VERIFY_NONE if Devise.ldap_tls_no_verify
- end
- end
- end
- end
-end
-
-Warden::Strategies.add(:ldap_authenticatable, Devise::Strategies::LdapAuthenticatable)
diff --git a/lib/devise/two_factor_ldap_authenticatable.rb b/lib/devise/two_factor_ldap_authenticatable.rb
new file mode 100644
index 000000000..065aa2de8
--- /dev/null
+++ b/lib/devise/two_factor_ldap_authenticatable.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'net/ldap'
+require 'devise/strategies/base'
+
+module Devise
+ module Strategies
+ class TwoFactorLdapAuthenticatable < Base
+ def valid?
+ valid_params? && mapping.to.respond_to?(:authenticate_with_ldap)
+ end
+
+ def authenticate!
+ resource = mapping.to.authenticate_with_ldap(params[scope])
+
+ if resource && !resource.otp_required_for_login?
+ success!(resource)
+ else
+ fail(:invalid)
+ end
+ end
+
+ protected
+
+ def valid_params?
+ params[scope] && params[scope][:password].present?
+ end
+ end
+ end
+end
+
+Warden::Strategies.add(:two_factor_ldap_authenticatable, Devise::Strategies::TwoFactorLdapAuthenticatable)
diff --git a/lib/devise/two_factor_pam_authenticatable.rb b/lib/devise/two_factor_pam_authenticatable.rb
new file mode 100644
index 000000000..5ce723b33
--- /dev/null
+++ b/lib/devise/two_factor_pam_authenticatable.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'devise/strategies/base'
+
+module Devise
+ module Strategies
+ class TwoFactorPamAuthenticatable < Base
+ def valid?
+ valid_params? && mapping.to.respond_to?(:authenticate_with_pam)
+ end
+
+ def authenticate!
+ resource = mapping.to.authenticate_with_pam(params[scope])
+
+ if resource && !resource.otp_required_for_login?
+ success!(resource)
+ else
+ fail(:invalid)
+ end
+ end
+
+ protected
+
+ def valid_params?
+ params[scope] && params[scope][:password].present?
+ end
+ end
+ end
+end
+
+Warden::Strategies.add(:two_factor_pam_authenticatable, Devise::Strategies::TwoFactorPamAuthenticatable)
From b02169f124b8efefa33c10a14a5b45d5f9806e3d Mon Sep 17 00:00:00 2001
From: Yamagishi Kazutoshi
Date: Wed, 25 Sep 2019 00:32:12 +0900
Subject: [PATCH 05/41] Cast multipart threshold to integer (#11944)
---
config/initializers/paperclip.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index cfc95330c..f308c2841 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -25,7 +25,7 @@ if ENV['S3_ENABLED'] == 'true'
s3_protocol: s3_protocol,
s3_host_name: s3_hostname,
s3_headers: {
- 'X-Amz-Multipart-Threshold' => ENV.fetch('S3_MULTIPART_THRESHOLD') { 15.megabytes },
+ 'X-Amz-Multipart-Threshold' => ENV.fetch('S3_MULTIPART_THRESHOLD') { 15.megabytes }.to_i,
'Cache-Control' => 'public, max-age=315576000, immutable',
},
s3_permissions: ENV.fetch('S3_PERMISSION') { 'public-read' },
From a5c558f0525a6ddcdddf6b7e61b554c3446fe2d5 Mon Sep 17 00:00:00 2001
From: Yamagishi Kazutoshi
Date: Wed, 25 Sep 2019 03:28:25 +0900
Subject: [PATCH 06/41] Hide error message on /heath (#11947)
* Hide error message on /heath
* update health_check
---
Gemfile | 4 ++--
Gemfile.lock | 16 +++++++++++-----
config/initializers/health_check.rb | 2 ++
3 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/Gemfile b/Gemfile
index 2ab313754..7ed1a4e6b 100644
--- a/Gemfile
+++ b/Gemfile
@@ -29,7 +29,7 @@ gem 'bootsnap', '~> 1.4', require: false
gem 'browser'
gem 'charlock_holmes', '~> 0.7.6'
gem 'iso-639'
-gem 'chewy', '~> 5.0'
+gem 'chewy', '~> 5.1'
gem 'cld3', '~> 3.2.4'
gem 'devise', '~> 4.7'
gem 'devise-two-factor', '~> 3.1'
@@ -50,7 +50,7 @@ gem 'fastimage'
gem 'goldfinger', '~> 2.1'
gem 'hiredis', '~> 0.6'
gem 'redis-namespace', '~> 1.5'
-gem 'health_check', '~> 3.0'
+gem 'health_check', git: 'https://github.com/ianheggie/health_check', ref: '0b799ead604f900ed50685e9b2d469cd2befba5b'
gem 'htmlentities', '~> 4.3'
gem 'http', '~> 3.3'
gem 'http_accept_language', '~> 2.1'
diff --git a/Gemfile.lock b/Gemfile.lock
index a796d1aae..900f05ab3 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,3 +1,11 @@
+GIT
+ remote: https://github.com/ianheggie/health_check
+ revision: 0b799ead604f900ed50685e9b2d469cd2befba5b
+ ref: 0b799ead604f900ed50685e9b2d469cd2befba5b
+ specs:
+ health_check (4.0.0.pre)
+ rails (>= 4.0)
+
GIT
remote: https://github.com/rtomayko/posix-spawn
revision: 58465d2e213991f8afb13b984854a49fcdcc980c
@@ -161,7 +169,7 @@ GEM
case_transform (0.2)
activesupport
charlock_holmes (0.7.6)
- chewy (5.0.1)
+ chewy (5.1.0)
activesupport (>= 4.0)
elasticsearch (>= 2.0.0)
elasticsearch-dsl
@@ -278,8 +286,6 @@ GEM
concurrent-ruby (~> 1.0)
hashdiff (1.0.0)
hashie (3.6.0)
- health_check (3.0.0)
- railties (>= 5.0)
heapy (0.1.4)
highline (2.0.1)
hiredis (0.6.3)
@@ -687,7 +693,7 @@ DEPENDENCIES
capistrano-yarn (~> 2.0)
capybara (~> 3.29)
charlock_holmes (~> 0.7.6)
- chewy (~> 5.0)
+ chewy (~> 5.1)
cld3 (~> 3.2.4)
climate_control (~> 0.2)
concurrent-ruby
@@ -708,7 +714,7 @@ DEPENDENCIES
fuubar (~> 2.4)
goldfinger (~> 2.1)
hamlit-rails (~> 0.2)
- health_check (~> 3.0)
+ health_check!
hiredis (~> 0.6)
htmlentities (~> 4.3)
http (~> 3.3)
diff --git a/config/initializers/health_check.rb b/config/initializers/health_check.rb
index eece67b10..6f1e78fed 100644
--- a/config/initializers/health_check.rb
+++ b/config/initializers/health_check.rb
@@ -3,4 +3,6 @@ HealthCheck.setup do |config|
config.standard_checks = %w(database migrations cache)
config.full_checks = %w(database migrations cache)
+
+ config.include_error_in_response_body = false
end
From 541b9cd15b3dc9d59ee71f20ec05b53f80f08ec9 Mon Sep 17 00:00:00 2001
From: Daigo 3 Dango
Date: Tue, 24 Sep 2019 14:07:11 -1000
Subject: [PATCH 07/41] Use Ruby-2.6.4 (#11942)
---
.ruby-version | 2 +-
Gemfile.lock | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.ruby-version b/.ruby-version
index 6a6a3d8e3..2714f5313 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
-2.6.1
+2.6.4
diff --git a/Gemfile.lock b/Gemfile.lock
index 900f05ab3..fdf28bd10 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -799,7 +799,7 @@ DEPENDENCIES
webpush
RUBY VERSION
- ruby 2.6.1p33
+ ruby 2.6.4p104
BUNDLED WITH
1.17.3
From 5034418e2c41fbd51fc85458dd3fdba72a672625 Mon Sep 17 00:00:00 2001
From: Eugen Rochko
Date: Wed, 25 Sep 2019 02:19:48 +0200
Subject: [PATCH 08/41] Update changelog for 3.0.0rc1 (#11950)
---
CHANGELOG.md | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 167 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d8f7c77d3..a170c3ecd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,173 @@ All notable changes to this project will be documented in this file.
## Unreleased
-TODO
+### Added
+
+- Add "not available" label to unloaded media attachments in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11715), [Gargron](https://github.com/tootsuite/mastodon/pull/11745))
+- **Add profile directory to web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11688), [mayaeh](https://github.com/tootsuite/mastodon/pull/11872))
+ - Add profile directory opt-in federation
+ - Add profile directory REST API
+- Add special alert for throttled requests in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11677))
+- Add confirmation modal when logging out from the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11671))
+- **Add audio player in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11644), [Gargron](https://github.com/tootsuite/mastodon/pull/11652), [Gargron](https://github.com/tootsuite/mastodon/pull/11654), [ThibG](https://github.com/tootsuite/mastodon/pull/11629))
+- **Add autosuggestions for hashtags in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11422), [ThibG](https://github.com/tootsuite/mastodon/pull/11632), [Gargron](https://github.com/tootsuite/mastodon/pull/11764), [Gargron](https://github.com/tootsuite/mastodon/pull/11588), [Gargron](https://github.com/tootsuite/mastodon/pull/11442))
+- **Add media editing modal with OCR tool in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11563), [Gargron](https://github.com/tootsuite/mastodon/pull/11566), [ThibG](https://github.com/tootsuite/mastodon/pull/11575), [ThibG](https://github.com/tootsuite/mastodon/pull/11576), [Gargron](https://github.com/tootsuite/mastodon/pull/11577), [Gargron](https://github.com/tootsuite/mastodon/pull/11573), [Gargron](https://github.com/tootsuite/mastodon/pull/11571))
+- Add indicator of unread notifications to window title when web UI is out of focus ([Gargron](https://github.com/tootsuite/mastodon/pull/11560), [Gargron](https://github.com/tootsuite/mastodon/pull/11572))
+- Add indicator for which options you voted for in a poll in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11195))
+- **Add search results pagination to web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11409), [ThibG](https://github.com/tootsuite/mastodon/pull/11447))
+- **Add option to disable real-time updates in web UI ("slow mode")** ([Gargron](https://github.com/tootsuite/mastodon/pull/9984), [ykzts](https://github.com/tootsuite/mastodon/pull/11880), [ThibG](https://github.com/tootsuite/mastodon/pull/11883), [Gargron](https://github.com/tootsuite/mastodon/pull/11898), [ThibG](https://github.com/tootsuite/mastodon/pull/11859))
+- Add option to disable blurhash previews in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11188))
+- Add native smooth scrolling when supported in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11207))
+- Add search and sort functions to hashtag admin UI ([mayaeh](https://github.com/tootsuite/mastodon/pull/11829), [Gargron](https://github.com/tootsuite/mastodon/pull/11897), [mayaeh](https://github.com/tootsuite/mastodon/pull/11875))
+- Add setting for default search engine indexing in admin UI ([brortao](https://github.com/tootsuite/mastodon/pull/11804))
+- Add account bio to account view in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11473))
+- **Add option to include reported statuses in warning e-mail from admin UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11639), [Gargron](https://github.com/tootsuite/mastodon/pull/11812), [Gargron](https://github.com/tootsuite/mastodon/pull/11741), [Gargron](https://github.com/tootsuite/mastodon/pull/11698), [mayaeh](https://github.com/tootsuite/mastodon/pull/11765))
+- Add number of pending accounts and pending hashtags to dashboard in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11514))
+- **Add account migration UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11846), [noellabo](https://github.com/tootsuite/mastodon/pull/11905), [noellabo](https://github.com/tootsuite/mastodon/pull/11907), [noellabo](https://github.com/tootsuite/mastodon/pull/11906), [noellabo](https://github.com/tootsuite/mastodon/pull/11902))
+- **Add table of contents to about page** ([Gargron](https://github.com/tootsuite/mastodon/pull/11885), [ykzts](https://github.com/tootsuite/mastodon/pull/11941), [ykzts](https://github.com/tootsuite/mastodon/pull/11895), [Kjwon15](https://github.com/tootsuite/mastodon/pull/11916))
+- **Add password challenge to 2FA settings, e-mail notifications** ([Gargron](https://github.com/tootsuite/mastodon/pull/11878))
+- Add optional invite comments ([ThibG](https://github.com/tootsuite/mastodon/pull/10465))
+- **Add optional public list of domain blocks with comments** ([ThibG](https://github.com/tootsuite/mastodon/pull/11298), [ThibG](https://github.com/tootsuite/mastodon/pull/11515), [Gargron](https://github.com/tootsuite/mastodon/pull/11908))
+- Add an RSS feed for featured hashtags ([noellabo](https://github.com/tootsuite/mastodon/pull/10502))
+- Add explanations to featured hashtags UI and profile ([Gargron](https://github.com/tootsuite/mastodon/pull/11586))
+- **Add hashtag trends with admin and user settings** ([Gargron](https://github.com/tootsuite/mastodon/pull/11490), [Gargron](https://github.com/tootsuite/mastodon/pull/11502), [Gargron](https://github.com/tootsuite/mastodon/pull/11641), [Gargron](https://github.com/tootsuite/mastodon/pull/11594), [Gargron](https://github.com/tootsuite/mastodon/pull/11517), [mayaeh](https://github.com/tootsuite/mastodon/pull/11845), [Gargron](https://github.com/tootsuite/mastodon/pull/11774), [Gargron](https://github.com/tootsuite/mastodon/pull/11712), [Gargron](https://github.com/tootsuite/mastodon/pull/11791), [Gargron](https://github.com/tootsuite/mastodon/pull/11743), [Gargron](https://github.com/tootsuite/mastodon/pull/11740), [Gargron](https://github.com/tootsuite/mastodon/pull/11714), [ThibG](https://github.com/tootsuite/mastodon/pull/11631), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/11569), [Gargron](https://github.com/tootsuite/mastodon/pull/11524), [Gargron](https://github.com/tootsuite/mastodon/pull/11513))
+ - Add hashtag usage breakdown to admin UI
+ - Add batch actions for hashtags to admin UI
+ - Add trends to web UI
+ - Add trends to public pages
+ - Add user preference to hide trends
+ - Add admin setting to disable trends
+- **Add categories for custom emojis** ([Gargron](https://github.com/tootsuite/mastodon/pull/11196), [Gargron](https://github.com/tootsuite/mastodon/pull/11793), [Gargron](https://github.com/tootsuite/mastodon/pull/11920), [highemerly](https://github.com/tootsuite/mastodon/pull/11876))
+ - Add custom emoji categories to emoji picker in web UI
+ - Add `category` to custom emojis in REST API
+ - Add batch actions for custom emojis in admin UI
+- Add max image dimensions to error message ([raboof](https://github.com/tootsuite/mastodon/pull/11552))
+- Add aac, m4a, 3gp, amr, wma to allowed audio formats ([Gargron](https://github.com/tootsuite/mastodon/pull/11342), [umonaca](https://github.com/tootsuite/mastodon/pull/11687))
+- **Add search syntax for operators and phrases** ([Gargron](https://github.com/tootsuite/mastodon/pull/11411))
+- **Add REST API for managing featured hashtags** ([noellabo](https://github.com/tootsuite/mastodon/pull/11778))
+- **Add REST API for managing timeline read markers** ([Gargron](https://github.com/tootsuite/mastodon/pull/11762))
+- **Add ActivityPub secure mode** ([Gargron](https://github.com/tootsuite/mastodon/pull/11269), [ThibG](https://github.com/tootsuite/mastodon/pull/11332), [ThibG](https://github.com/tootsuite/mastodon/pull/11295))
+- Add HTTP signatures to all outgoing ActivityPub GET requests ([Gargron](https://github.com/tootsuite/mastodon/pull/11284), [ThibG](https://github.com/tootsuite/mastodon/pull/11300))
+- Add support for ActivityPub Audio activities ([ThibG](https://github.com/tootsuite/mastodon/pull/11189))
+- Add ActivityPub actor representing the entire server ([ThibG](https://github.com/tootsuite/mastodon/pull/11321), [rtucker](https://github.com/tootsuite/mastodon/pull/11400), [ThibG](https://github.com/tootsuite/mastodon/pull/11561), [Gargron](https://github.com/tootsuite/mastodon/pull/11798))
+- **Add whitelist mode** ([Gargron](https://github.com/tootsuite/mastodon/pull/11291), [mayaeh](https://github.com/tootsuite/mastodon/pull/11634))
+- Add config of multipart threshold for S3 ([ykzts](https://github.com/tootsuite/mastodon/pull/11924), [ykzts](https://github.com/tootsuite/mastodon/pull/11944))
+- Add health check endpoint for web ([ykzts](https://github.com/tootsuite/mastodon/pull/11770), [ykzts](https://github.com/tootsuite/mastodon/pull/11947))
+- Add HTTP signature keyId to request log ([Gargron](https://github.com/tootsuite/mastodon/pull/11591))
+- Add `SMTP_REPLY_TO` environment variable ([hugogameiro](https://github.com/tootsuite/mastodon/pull/11718))
+- Add `tootctl preview_cards remove` command ([mayaeh](https://github.com/tootsuite/mastodon/pull/11320))
+- Add `tootctl media refresh` command ([Gargron](https://github.com/tootsuite/mastodon/pull/11775))
+- Add `tootctl cache recount` command ([Gargron](https://github.com/tootsuite/mastodon/pull/11597))
+- Add option to exclude suspended domains from `tootctl domains crawl` ([dariusk](https://github.com/tootsuite/mastodon/pull/11454))
+- Add soft delete for statuses for instant deletes through API ([Gargron](https://github.com/tootsuite/mastodon/pull/11623), [Gargron](https://github.com/tootsuite/mastodon/pull/11648))
+- Add rails-level JSON caching ([Gargron](https://github.com/tootsuite/mastodon/pull/11333), [Gargron](https://github.com/tootsuite/mastodon/pull/11271))
+- **Add request pool to improve delivery performance** ([Gargron](https://github.com/tootsuite/mastodon/pull/10353), [ykzts](https://github.com/tootsuite/mastodon/pull/11756))
+- Add concurrent connection attempts to resolved IP addresses ([ThibG](https://github.com/tootsuite/mastodon/pull/11757))
+- Add index for remember_token to improve login performance ([abcang](https://github.com/tootsuite/mastodon/pull/11881))
+- **Add more accurate hashtag search** ([Gargron](https://github.com/tootsuite/mastodon/pull/11579), [Gargron](https://github.com/tootsuite/mastodon/pull/11427), [Gargron](https://github.com/tootsuite/mastodon/pull/11448))
+- **Add more accurate account search** ([Gargron](https://github.com/tootsuite/mastodon/pull/11537), [Gargron](https://github.com/tootsuite/mastodon/pull/11580))
+- **Add a spam check** ([Gargron](https://github.com/tootsuite/mastodon/pull/11217), [Gargron](https://github.com/tootsuite/mastodon/pull/11806), [ThibG](https://github.com/tootsuite/mastodon/pull/11296))
+
+### Changed
+
+- **Change conversations UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11896))
+- Change dashboard to short number notation ([noellabo](https://github.com/tootsuite/mastodon/pull/11847), [noellabo](https://github.com/tootsuite/mastodon/pull/11911))
+- Change REST API `GET /api/v1/timelines/public` to require authentication when public preview is off ([ThibG](https://github.com/tootsuite/mastodon/pull/11802))
+- Change REST API `POST /api/v1/follow_requests/:id/(approve|reject)` to return relationship ([ThibG](https://github.com/tootsuite/mastodon/pull/11800))
+- Change rate limit for media proxy ([ykzts](https://github.com/tootsuite/mastodon/pull/11814))
+- Change unlisted custom emoji to not appear in autosuggestions ([Gargron](https://github.com/tootsuite/mastodon/pull/11818))
+- Change max length of media descriptions from 420 to 1500 characters ([Gargron](https://github.com/tootsuite/mastodon/pull/11819), [ThibG](https://github.com/tootsuite/mastodon/pull/11836))
+- **Change deletes to preserve soft-deleted statuses in unresolved reports** ([Gargron](https://github.com/tootsuite/mastodon/pull/11805))
+- **Change tootctl to use inline parallelization instead of Sidekiq** ([Gargron](https://github.com/tootsuite/mastodon/pull/11776))
+- **Change account deletion page to have better explanations** ([Gargron](https://github.com/tootsuite/mastodon/pull/11753), [Gargron](https://github.com/tootsuite/mastodon/pull/11763))
+- Change hashtag component in web UI to show numbers for 2 last days ([Gargron](https://github.com/tootsuite/mastodon/pull/11742), [Gargron](https://github.com/tootsuite/mastodon/pull/11755), [Gargron](https://github.com/tootsuite/mastodon/pull/11754))
+- Change OpenGraph description on sign-up page to reflect invite ([Gargron](https://github.com/tootsuite/mastodon/pull/11744))
+- Change layout of public profile directory to be the same as in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11705))
+- Change detailed status child ordering to sort self-replies on top ([ThibG](https://github.com/tootsuite/mastodon/pull/11686))
+- Change window resize handler to switch to/from mobile layout as soon as needed ([ThibG](https://github.com/tootsuite/mastodon/pull/11656))
+- Change icon button styles to make hover/focus states more obvious ([ThibG](https://github.com/tootsuite/mastodon/pull/11474))
+- Change contrast of status links that are not mentions or hashtags ([ThibG](https://github.com/tootsuite/mastodon/pull/11406))
+- **Change hashtags to preserve first-used casing** ([Gargron](https://github.com/tootsuite/mastodon/pull/11416), [Gargron](https://github.com/tootsuite/mastodon/pull/11508), [Gargron](https://github.com/tootsuite/mastodon/pull/11504), [Gargron](https://github.com/tootsuite/mastodon/pull/11507), [Gargron](https://github.com/tootsuite/mastodon/pull/11441))
+- **Change unconfirmed user login behaviour** ([Gargron](https://github.com/tootsuite/mastodon/pull/11375), [ThibG](https://github.com/tootsuite/mastodon/pull/11394), [Gargron](https://github.com/tootsuite/mastodon/pull/11860))
+- **Change single-column mode to scroll the whole page** ([Gargron](https://github.com/tootsuite/mastodon/pull/11359), [Gargron](https://github.com/tootsuite/mastodon/pull/11894), [Gargron](https://github.com/tootsuite/mastodon/pull/11891), [ThibG](https://github.com/tootsuite/mastodon/pull/11655), [Gargron](https://github.com/tootsuite/mastodon/pull/11463), [Gargron](https://github.com/tootsuite/mastodon/pull/11458), [ThibG](https://github.com/tootsuite/mastodon/pull/11395), [Gargron](https://github.com/tootsuite/mastodon/pull/11418))
+- Change `tootctl accounts follow` to only work with local accounts ([angristan](https://github.com/tootsuite/mastodon/pull/11592))
+- Change Dockerfile ([Shleeble](https://github.com/tootsuite/mastodon/pull/11710), [ykzts](https://github.com/tootsuite/mastodon/pull/11768), [Shleeble](https://github.com/tootsuite/mastodon/pull/11707))
+- Change supported Node versions to include v12 ([abcang](https://github.com/tootsuite/mastodon/pull/11706))
+- Change Portuguese language from `pt` to `pt-PT` ([Gargron](https://github.com/tootsuite/mastodon/pull/11820))
+
+### Removed
+
+- **Remove OStatus support** ([Gargron](https://github.com/tootsuite/mastodon/pull/11205), [Gargron](https://github.com/tootsuite/mastodon/pull/11303), [Gargron](https://github.com/tootsuite/mastodon/pull/11460), [ThibG](https://github.com/tootsuite/mastodon/pull/11280), [ThibG](https://github.com/tootsuite/mastodon/pull/11278))
+- Remove Atom feeds and old URLs in the form of `GET /:username/updates/:id` ([Gargron](https://github.com/tootsuite/mastodon/pull/11247))
+- Remove WebP support ([angristan](https://github.com/tootsuite/mastodon/pull/11589))
+- Remove deprecated config options from Heroku and Scalingo ([ykzts](https://github.com/tootsuite/mastodon/pull/11925))
+- Remove deprecated REST API `GET /api/v1/search` API ([Gargron](https://github.com/tootsuite/mastodon/pull/11823))
+- Remove deprecated REST API `GET /api/v1/statuses/:id/card` ([Gargron](https://github.com/tootsuite/mastodon/pull/11213))
+- Remove deprecated REST API `POST /api/v1/notifications/dismiss?id=:id` ([Gargron](https://github.com/tootsuite/mastodon/pull/11214))
+- Remove deprecated REST API `GET /api/v1/timelines/direct` ([Gargron](https://github.com/tootsuite/mastodon/pull/11212))
+
+### Fixed
+
+- Fix manifest warning ([ykzts](https://github.com/tootsuite/mastodon/pull/11767))
+- Fix admin UI for custom emoji not respecting GIF autoplay preference ([ThibG](https://github.com/tootsuite/mastodon/pull/11801))
+- Fix page body not being scrollable in admin/settings layout ([Gargron](https://github.com/tootsuite/mastodon/pull/11893))
+- Fix placeholder colors for inputs not being explicitly defined ([Gargron](https://github.com/tootsuite/mastodon/pull/11890))
+- Fix incorrect enclosure length in RSS ([tsia](https://github.com/tootsuite/mastodon/pull/11889))
+- Fix TOTP codes not being filtered from logs during enabling/disabling ([Gargron](https://github.com/tootsuite/mastodon/pull/11877))
+- Fix webfinger response not returning 410 when account is suspended ([Gargron](https://github.com/tootsuite/mastodon/pull/11869))
+- Fix ActivityPub Move handler queuing jobs that will fail if account is suspended ([Gargron](https://github.com/tootsuite/mastodon/pull/11864))
+- Fix SSO login not using existing account when e-mail is verified ([Gargron](https://github.com/tootsuite/mastodon/pull/11862))
+- Fix web UI allowing uploads past status limit via drag & drop ([Gargron](https://github.com/tootsuite/mastodon/pull/11863))
+- Fix expiring polls not being displayed as such in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11835))
+- Fix 2FA challenge and password challenge for non-database users ([Gargron](https://github.com/tootsuite/mastodon/pull/11831), [Gargron](https://github.com/tootsuite/mastodon/pull/11943))
+- Fix profile fields overflowing page width in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11828))
+- Fix web push subscriptions being deleted on rate limit or timeout ([Gargron](https://github.com/tootsuite/mastodon/pull/11826))
+- Fix display of long poll options in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11717), [ThibG](https://github.com/tootsuite/mastodon/pull/11833))
+- Fix search API not resolving URL when `type` is given ([Gargron](https://github.com/tootsuite/mastodon/pull/11822))
+- Fix hashtags being split by ZWNJ character ([Gargron](https://github.com/tootsuite/mastodon/pull/11821))
+- Fix scroll position resetting when opening media modals in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11815))
+- Fix duplicate HTML IDs on about page ([ThibG](https://github.com/tootsuite/mastodon/pull/11803))
+- Fix admin UI showing superfluous reject media/reports on suspended domain blocks ([ThibG](https://github.com/tootsuite/mastodon/pull/11749))
+- Fix ActivityPub context not being dynamically computed ([ThibG](https://github.com/tootsuite/mastodon/pull/11746))
+- Fix Mastodon logo style on hover on public pages' footer ([ThibG](https://github.com/tootsuite/mastodon/pull/11735))
+- Fix height of dashboard counters ([ThibG](https://github.com/tootsuite/mastodon/pull/11736))
+- Fix custom emoji animation on hover in web UI directory bios ([ThibG](https://github.com/tootsuite/mastodon/pull/11716))
+- Fix non-numbers being passed to Redis and causing an error ([Gargron](https://github.com/tootsuite/mastodon/pull/11697))
+- Fix error in REST API for an account's statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/11700))
+- Fix uncaught error when resource param is missing in Webfinger request ([Gargron](https://github.com/tootsuite/mastodon/pull/11701))
+- Fix uncaught domain normalization error in remote follow ([Gargron](https://github.com/tootsuite/mastodon/pull/11703))
+- Fix uncaught 422 and 500 errors ([Gargron](https://github.com/tootsuite/mastodon/pull/11590), [Gargron](https://github.com/tootsuite/mastodon/pull/11811))
+- Fix uncaught parameter missing exceptions and missing error templates ([Gargron](https://github.com/tootsuite/mastodon/pull/11702))
+- Fix encoding error when checking e-mail MX records ([Gargron](https://github.com/tootsuite/mastodon/pull/11696))
+- Fix items in StatusContent render list not all having a key ([ThibG](https://github.com/tootsuite/mastodon/pull/11645))
+- Fix remote and staff-removed statuses leaving media behind for a day ([Gargron](https://github.com/tootsuite/mastodon/pull/11638))
+- Fix CSP needlessly allowing blob URLs in script-src ([ThibG](https://github.com/tootsuite/mastodon/pull/11620))
+- Fix ignoring whole status because of one invalid hashtag ([Gargron](https://github.com/tootsuite/mastodon/pull/11621))
+- Fix hidden statuses losing focus ([ThibG](https://github.com/tootsuite/mastodon/pull/11208))
+- Fix loading bar being obscured by other elements in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11598))
+- Fix multiple issues with replies collection for pages further than self-replies ([ThibG](https://github.com/tootsuite/mastodon/pull/11582))
+- Fix blurhash and autoplay not working on public pages ([Gargron](https://github.com/tootsuite/mastodon/pull/11585))
+- Fix 422 being returned instead of 404 when POSTing to unmatched routes ([Gargron](https://github.com/tootsuite/mastodon/pull/11574), [Gargron](https://github.com/tootsuite/mastodon/pull/11704))
+- Fix client-side resizing of image uploads ([ThibG](https://github.com/tootsuite/mastodon/pull/11570))
+- Fix short number formatting for numbers above million in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11559))
+- Fix ActivityPub and REST API queries setting cookies and preventing caching ([ThibG](https://github.com/tootsuite/mastodon/pull/11539), [ThibG](https://github.com/tootsuite/mastodon/pull/11557), [ThibG](https://github.com/tootsuite/mastodon/pull/11336), [ThibG](https://github.com/tootsuite/mastodon/pull/11331))
+- Fix some emojis in profile metadata labels are not emojified. ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/11534))
+- Fix account search always returning exact match on paginated results ([Gargron](https://github.com/tootsuite/mastodon/pull/11525))
+- Fix acct URIs with IDN domains not being resolved ([Gargron](https://github.com/tootsuite/mastodon/pull/11520))
+- Fix admin dashboard missing latest features ([Gargron](https://github.com/tootsuite/mastodon/pull/11505))
+- Fix jumping of toot date when clicking spoiler button ([ariasuni](https://github.com/tootsuite/mastodon/pull/11449))
+- Fix boost to original audience not working on mobile in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11371))
+- Fix handling of webfinger redirects in ResolveAccountService ([ThibG](https://github.com/tootsuite/mastodon/pull/11279))
+- Fix URLs appearing twice in errors of ActivityPub::DeliveryWorker ([Gargron](https://github.com/tootsuite/mastodon/pull/11231))
+- Fix support for HTTP proxies ([ThibG](https://github.com/tootsuite/mastodon/pull/11245))
+- Fix HTTP requests to IPv6 hosts ([ThibG](https://github.com/tootsuite/mastodon/pull/11240))
+- Fix error in ElasticSearch index import ([mayaeh](https://github.com/tootsuite/mastodon/pull/11192))
+- Fix duplicate account error when seeding development database ([ysksn](https://github.com/tootsuite/mastodon/pull/11366))
+- Fix performance of session clean-up scheduler ([abcang](https://github.com/tootsuite/mastodon/pull/11871))
+- Fix older migrations not running ([zunda](https://github.com/tootsuite/mastodon/pull/11377))
+- Fix URLs counting towards RTL detection ([ahangarha](https://github.com/tootsuite/mastodon/pull/11759))
+- Fix unnecessary status re-rendering in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11211))
+- Fix http_parser.rb gem not being compiled when no network available ([petabyteboy](https://github.com/tootsuite/mastodon/pull/11444))
## [2.9.3] - 2019-08-10
### Added
From 00d7bdcc2adcc15fe1a95862478cb9b43065a4b0 Mon Sep 17 00:00:00 2001
From: Jeong Arm
Date: Fri, 27 Sep 2019 01:06:08 +0900
Subject: [PATCH 09/41] Fix search error when ElasticSearch is enabled but not
available (#11954)
* Fallback to Database search when ES not available
* Prevent double work if ES gives 0 result
* Apply suggestion from code review
---
app/services/account_search_service.rb | 10 +++++-----
app/services/tag_search_service.rb | 11 ++++++-----
2 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb
index 01caaefa9..40c5f8590 100644
--- a/app/services/account_search_service.rb
+++ b/app/services/account_search_service.rb
@@ -42,11 +42,9 @@ class AccountSearchService < BaseService
return [] if limit_for_non_exact_results.zero?
@search_results ||= begin
- if Chewy.enabled?
- from_elasticsearch
- else
- from_database
- end
+ results = from_elasticsearch if Chewy.enabled?
+ results ||= from_database
+ results
end
end
@@ -92,6 +90,8 @@ class AccountSearchService < BaseService
ActiveRecord::Associations::Preloader.new.preload(records, :account_stat)
records
+ rescue Faraday::ConnectionFailed, Parslet::ParseFailed
+ nil
end
def reputation_score_function
diff --git a/app/services/tag_search_service.rb b/app/services/tag_search_service.rb
index 64dd76bb7..5cb0eea7a 100644
--- a/app/services/tag_search_service.rb
+++ b/app/services/tag_search_service.rb
@@ -6,11 +6,10 @@ class TagSearchService < BaseService
@offset = options[:offset].to_i
@limit = options[:limit].to_i
- if Chewy.enabled?
- from_elasticsearch
- else
- from_database
- end
+ results = from_elasticsearch if Chewy.enabled?
+ results ||= from_database
+
+ results
end
private
@@ -74,6 +73,8 @@ class TagSearchService < BaseService
}
TagsIndex.query(query).filter(filter).limit(@limit).offset(@offset).objects.compact
+ rescue Faraday::ConnectionFailed, Parslet::ParseFailed
+ nil
end
def from_database
From add4d4118c33562cf196f2045d6ce3aa309a40a0 Mon Sep 17 00:00:00 2001
From: Eugen Rochko
Date: Fri, 27 Sep 2019 02:13:34 +0200
Subject: [PATCH 10/41] Fix relays UI being available in whitelist/secure mode
(#11963)
Fix relays UI referencing relay that is not functional
---
app/controllers/admin/relays_controller.rb | 7 ++++++-
app/models/relay.rb | 5 +----
config/locales/en.yml | 3 ++-
config/navigation.rb | 2 +-
4 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/app/controllers/admin/relays_controller.rb b/app/controllers/admin/relays_controller.rb
index 1b02d3c36..6fbb6e063 100644
--- a/app/controllers/admin/relays_controller.rb
+++ b/app/controllers/admin/relays_controller.rb
@@ -3,6 +3,7 @@
module Admin
class RelaysController < BaseController
before_action :set_relay, except: [:index, :new, :create]
+ before_action :require_signatures_enabled!, only: [:new, :create, :enable]
def index
authorize :relay, :update?
@@ -11,7 +12,7 @@ module Admin
def new
authorize :relay, :update?
- @relay = Relay.new(inbox_url: Relay::PRESET_RELAY)
+ @relay = Relay.new
end
def create
@@ -54,5 +55,9 @@ module Admin
def resource_params
params.require(:relay).permit(:inbox_url)
end
+
+ def require_signatures_enabled!
+ redirect_to admin_relays_path, alert: I18n.t('admin.relays.signatures_not_enabled') if authorized_fetch_mode?
+ end
end
end
diff --git a/app/models/relay.rb b/app/models/relay.rb
index 6934a5c62..8c8a97db3 100644
--- a/app/models/relay.rb
+++ b/app/models/relay.rb
@@ -12,8 +12,6 @@
#
class Relay < ApplicationRecord
- PRESET_RELAY = 'https://relay.joinmastodon.org/inbox'
-
validates :inbox_url, presence: true, uniqueness: true, url: true, if: :will_save_change_to_inbox_url?
enum state: [:idle, :pending, :accepted, :rejected]
@@ -74,7 +72,6 @@ class Relay < ApplicationRecord
end
def ensure_disabled
- return unless enabled?
- disable!
+ disable! if enabled?
end
end
diff --git a/config/locales/en.yml b/config/locales/en.yml
index c29c7f871..c580c5ed5 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -257,7 +257,7 @@ en:
updated_msg: Emoji successfully updated!
upload: Upload
dashboard:
- authorized_fetch_mode: Authorized fetch mode
+ authorized_fetch_mode: Secure mode
backlog: backlogged jobs
config: Configuration
feature_deletions: Account deletions
@@ -383,6 +383,7 @@ en:
pending: Waiting for relay's approval
save_and_enable: Save and enable
setup: Setup a relay connection
+ signatures_not_enabled: Relays will not work correctly while secure mode or whitelist mode is enabled
status: Status
title: Relays
report_notes:
diff --git a/config/navigation.rb b/config/navigation.rb
index 32c299143..eebd4f75e 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -47,7 +47,7 @@ SimpleNavigation::Configuration.run do |navigation|
s.item :dashboard, safe_join([fa_icon('tachometer fw'), t('admin.dashboard.title')]), admin_dashboard_url
s.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), edit_admin_settings_url, if: -> { current_user.admin? }, highlights_on: %r{/admin/settings}
s.item :custom_emojis, safe_join([fa_icon('smile-o fw'), t('admin.custom_emojis.title')]), admin_custom_emojis_url, highlights_on: %r{/admin/custom_emojis}
- s.item :relays, safe_join([fa_icon('exchange fw'), t('admin.relays.title')]), admin_relays_url, if: -> { current_user.admin? }, highlights_on: %r{/admin/relays}
+ s.item :relays, safe_join([fa_icon('exchange fw'), t('admin.relays.title')]), admin_relays_url, if: -> { current_user.admin? && !whitelist_mode? }, highlights_on: %r{/admin/relays}
s.item :sidekiq, safe_join([fa_icon('diamond fw'), 'Sidekiq']), sidekiq_url, link_html: { target: 'sidekiq' }, if: -> { current_user.admin? }
s.item :pghero, safe_join([fa_icon('database fw'), 'PgHero']), pghero_url, link_html: { target: 'pghero' }, if: -> { current_user.admin? }
end
From 7a39671d4654917849f2f2eecffa12573f24f361 Mon Sep 17 00:00:00 2001
From: Eugen Rochko
Date: Fri, 27 Sep 2019 02:13:51 +0200
Subject: [PATCH 11/41] Fix hashtag batch actions not redirecting back with
right filters (#11962)
Regression from #11829
---
app/views/admin/tags/index.html.haml | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/app/views/admin/tags/index.html.haml b/app/views/admin/tags/index.html.haml
index 498b93083..8b1182dbb 100644
--- a/app/views/admin/tags/index.html.haml
+++ b/app/views/admin/tags/index.html.haml
@@ -43,8 +43,10 @@
= form_for(@form, url: batch_admin_tags_path) do |f|
= hidden_field_tag :page, params[:page] || 1
- = hidden_field_tag :context, params[:context]
- = hidden_field_tag :review, params[:review]
+ = hidden_field_tag :name, params[:name] if params[:name].present?
+
+ - Admin::FilterHelper::TAGS_FILTERS.each do |key|
+ = hidden_field_tag key, params[key] if params[key].present?
.batch-table
.batch-table__toolbar
From f31530b74d0f2ab77845db26babc25f5de337bd4 Mon Sep 17 00:00:00 2001
From: Cutls
Date: Fri, 27 Sep 2019 09:14:49 +0900
Subject: [PATCH 12/41] Fix overflow on conversations (#11965)
* Fix: overflow on conversations
* Fix: overflow on conversations
---
app/javascript/styles/mastodon/components.scss | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index f4f26203e..7562cc709 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -6418,13 +6418,17 @@ noscript {
flex: 1 1 auto;
padding: 10px 5px;
padding-right: 15px;
+ word-break: break-all;
+ overflow: hidden;
&__info {
overflow: hidden;
+ display: flex;
+ flex-direction: row-reverse;
+ justify-content: space-between;
}
&__relative-time {
- float: right;
font-size: 15px;
color: $darker-text-color;
padding-left: 15px;
@@ -6437,6 +6441,8 @@ noscript {
overflow: hidden;
text-overflow: ellipsis;
margin-bottom: 4px;
+ flex-basis: 170px;
+ flex-shrink: 1000;
a {
color: $primary-text-color;
From 7baedcb61e15200478f3ad6deb96d452cd63499a Mon Sep 17 00:00:00 2001
From: ThibG
Date: Fri, 27 Sep 2019 02:16:11 +0200
Subject: [PATCH 13/41] Use blob URL for Tesseract to avoid CORS issues
(#11964)
---
app/javascript/mastodon/actions/compose.js | 5 +++--
.../features/ui/components/focal_point_modal.js | 12 +++++++++++-
app/javascript/mastodon/reducers/compose.js | 6 +++---
3 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index 061a36bb8..79d64dc3e 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -234,7 +234,7 @@ export function uploadCompose(files) {
progress[i] = loaded;
dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total));
},
- }).then(({ data }) => dispatch(uploadComposeSuccess(data)));
+ }).then(({ data }) => dispatch(uploadComposeSuccess(data, f)));
}).catch(error => dispatch(uploadComposeFail(error)));
};
};
@@ -289,10 +289,11 @@ export function uploadComposeProgress(loaded, total) {
};
};
-export function uploadComposeSuccess(media) {
+export function uploadComposeSuccess(media, file) {
return {
type: COMPOSE_UPLOAD_SUCCESS,
media: media,
+ file: file,
skipLoading: true,
};
};
diff --git a/app/javascript/mastodon/features/ui/components/focal_point_modal.js b/app/javascript/mastodon/features/ui/components/focal_point_modal.js
index 7891d6690..1ab79a21d 100644
--- a/app/javascript/mastodon/features/ui/components/focal_point_modal.js
+++ b/app/javascript/mastodon/features/ui/components/focal_point_modal.js
@@ -173,7 +173,17 @@ class FocalPointModal extends ImmutablePureComponent {
langPath: `${assetHost}/ocr/lang-data`,
});
- worker.recognize(media.get('url'))
+ let media_url = media.get('file');
+
+ if (window.URL && URL.createObjectURL) {
+ try {
+ media_url = URL.createObjectURL(media.get('file'));
+ } catch (error) {
+ console.error(error);
+ }
+ }
+
+ worker.recognize(media_url)
.progress(({ progress }) => this.setState({ progress }))
.finally(() => worker.terminate())
.then(({ text }) => this.setState({ description: removeExtraLineBreaks(text), dirty: true, detecting: false }))
diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js
index 268237846..5798f529d 100644
--- a/app/javascript/mastodon/reducers/compose.js
+++ b/app/javascript/mastodon/reducers/compose.js
@@ -103,11 +103,11 @@ function clearAll(state) {
});
};
-function appendMedia(state, media) {
+function appendMedia(state, media, file) {
const prevSize = state.get('media_attachments').size;
return state.withMutations(map => {
- map.update('media_attachments', list => list.push(media));
+ map.update('media_attachments', list => list.push(media.set('file', file)));
map.set('is_uploading', false);
map.set('resetFileKey', Math.floor((Math.random() * 0x10000)));
map.set('idempotencyKey', uuid());
@@ -321,7 +321,7 @@ export default function compose(state = initialState, action) {
case COMPOSE_UPLOAD_REQUEST:
return state.set('is_uploading', true);
case COMPOSE_UPLOAD_SUCCESS:
- return appendMedia(state, fromJS(action.media));
+ return appendMedia(state, fromJS(action.media), action.file);
case COMPOSE_UPLOAD_FAIL:
return state.set('is_uploading', false);
case COMPOSE_UPLOAD_UNDO:
From 05ad7d606ca46afaa723745abba063e5d934b507 Mon Sep 17 00:00:00 2001
From: mayaeh
Date: Fri, 27 Sep 2019 10:07:19 +0900
Subject: [PATCH 14/41] Add translation strings for AdminUI custom emojis
(#11970)
---
config/locales/en.yml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/config/locales/en.yml b/config/locales/en.yml
index c580c5ed5..ee798e87f 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -242,8 +242,10 @@ en:
disabled_msg: Successfully disabled that emoji
emoji: Emoji
enable: Enable
+ enabled: Enabled
enabled_msg: Successfully enabled that emoji
image_hint: PNG up to 50KB
+ list: List
listed: Listed
new:
title: Add new custom emoji
@@ -252,6 +254,7 @@ en:
shortcode_hint: At least 2 characters, only alphanumeric characters and underscores
title: Custom emojis
uncategorized: Uncategorized
+ unlist: Unlist
unlisted: Unlisted
update_failed_msg: Could not update that emoji
updated_msg: Emoji successfully updated!
From 860a77d45ee9d17117364868f0932b4fcbe07d3d Mon Sep 17 00:00:00 2001
From: ThibG
Date: Fri, 27 Sep 2019 15:22:11 +0200
Subject: [PATCH 15/41] Avoid storing audio and video file data in memory
(#11974)
---
app/javascript/mastodon/reducers/compose.js | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js
index 5798f529d..b5dc81703 100644
--- a/app/javascript/mastodon/reducers/compose.js
+++ b/app/javascript/mastodon/reducers/compose.js
@@ -107,7 +107,10 @@ function appendMedia(state, media, file) {
const prevSize = state.get('media_attachments').size;
return state.withMutations(map => {
- map.update('media_attachments', list => list.push(media.set('file', file)));
+ if (media.get('type') === 'image') {
+ media = media.set('file', file);
+ }
+ map.update('media_attachments', list => list.push(media));
map.set('is_uploading', false);
map.set('resetFileKey', Math.floor((Math.random() * 0x10000)));
map.set('idempotencyKey', uuid());
From 059945c97cb9a9f3cbddda729f499b44800bdc68 Mon Sep 17 00:00:00 2001
From: abcang
Date: Fri, 27 Sep 2019 22:23:30 +0900
Subject: [PATCH 16/41] Improve status pin query (#11972)
---
app/controllers/activitypub/collections_controller.rb | 6 +++---
app/controllers/api/v1/accounts/statuses_controller.rb | 2 ++
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/app/controllers/activitypub/collections_controller.rb b/app/controllers/activitypub/collections_controller.rb
index 989fee385..910fefb1c 100644
--- a/app/controllers/activitypub/collections_controller.rb
+++ b/app/controllers/activitypub/collections_controller.rb
@@ -33,9 +33,9 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
def scope_for_collection
case params[:id]
when 'featured'
- @account.statuses.permitted_for(@account, signed_request_account).tap do |scope|
- scope.merge!(@account.pinned_statuses)
- end
+ return Status.none if @account.blocking?(signed_request_account)
+
+ @account.pinned_statuses
else
raise ActiveRecord::RecordNotFound
end
diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb
index 0787cd636..333db9618 100644
--- a/app/controllers/api/v1/accounts/statuses_controller.rb
+++ b/app/controllers/api/v1/accounts/statuses_controller.rb
@@ -57,6 +57,8 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
end
def pinned_scope
+ return Status.none if @account.blocking?(current_account)
+
@account.pinned_statuses
end
From 07b057eabb9cc923aa7fc6bb851084af048ed5d2 Mon Sep 17 00:00:00 2001
From: abcang
Date: Fri, 27 Sep 2019 22:24:13 +0900
Subject: [PATCH 17/41] Validate Web::PushSubscription (#11971)
---
app/models/web/push_subscription.rb | 4 ++++
...642_remove_invalid_web_push_subscription.rb | 18 ++++++++++++++++++
db/schema.rb | 2 +-
3 files changed, 23 insertions(+), 1 deletion(-)
create mode 100644 db/post_migrate/20190927124642_remove_invalid_web_push_subscription.rb
diff --git a/app/models/web/push_subscription.rb b/app/models/web/push_subscription.rb
index b57807d1c..c5dbb58ba 100644
--- a/app/models/web/push_subscription.rb
+++ b/app/models/web/push_subscription.rb
@@ -20,6 +20,10 @@ class Web::PushSubscription < ApplicationRecord
has_one :session_activation, foreign_key: 'web_push_subscription_id', inverse_of: :web_push_subscription
+ validates :endpoint, presence: true
+ validates :key_p256dh, presence: true
+ validates :key_auth, presence: true
+
def push(notification)
I18n.with_locale(associated_user&.locale || I18n.default_locale) do
push_payload(payload_for_notification(notification), 48.hours.seconds)
diff --git a/db/post_migrate/20190927124642_remove_invalid_web_push_subscription.rb b/db/post_migrate/20190927124642_remove_invalid_web_push_subscription.rb
new file mode 100644
index 000000000..c2397476a
--- /dev/null
+++ b/db/post_migrate/20190927124642_remove_invalid_web_push_subscription.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class RemoveInvalidWebPushSubscription < ActiveRecord::Migration[5.2]
+ disable_ddl_transaction!
+
+ def up
+ invalid_web_push_subscriptions = Web::PushSubscription.where(endpoint: '')
+ .or(Web::PushSubscription.where(key_p256dh: ''))
+ .or(Web::PushSubscription.where(key_auth: ''))
+ .preload(:session_activation)
+ invalid_web_push_subscriptions.find_each do |web_push_subscription|
+ web_push_subscription.session_activation&.update!(web_push_subscription_id: nil)
+ web_push_subscription.destroy!
+ end
+ end
+
+ def down; end
+end
diff --git a/db/schema.rb b/db/schema.rb
index fabeb16f3..8eeaf48a0 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: 2019_09_17_213523) do
+ActiveRecord::Schema.define(version: 2019_09_27_124642) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
From 2f90a38f44c9c414a2020b2a0031835f3335fea0 Mon Sep 17 00:00:00 2001
From: Eugen Rochko
Date: Fri, 27 Sep 2019 19:40:26 +0200
Subject: [PATCH 18/41] Fix unreviewed hashtag not being found by exact
case-insensitive match (#11976)
---
app/services/tag_search_service.rb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/services/tag_search_service.rb b/app/services/tag_search_service.rb
index 5cb0eea7a..47b0e876e 100644
--- a/app/services/tag_search_service.rb
+++ b/app/services/tag_search_service.rb
@@ -62,9 +62,9 @@ class TagSearchService < BaseService
},
{
- term: {
+ match: {
name: {
- value: @query,
+ query: @query,
},
},
},
From 18b451c0e6cf6a927a22084f94b423982de0ee8b Mon Sep 17 00:00:00 2001
From: ThibG
Date: Fri, 27 Sep 2019 21:13:51 +0200
Subject: [PATCH 19/41] Change silences to always require approval on follow
(#11975)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Change silenced accounts to require approval on follow
* Also require approval for follows by people explicitly muted by target accounts
* Do not auto-accept silenced or muted accounts when switching from locked to unlocked
* Add `follow_requests_count` to verify_credentials
* Show “Follow requests” menu item if needed even if account is locked
* Add tests
* Correctly reflect that follow requests weren't auto-accepted when local account is silenced
* Accept follow requests from user-muted accounts to avoid leaking mutes
---
app/controllers/api/v1/accounts_controller.rb | 2 +-
.../features/getting_started/index.js | 8 ++--
app/lib/activitypub/activity/follow.rb | 2 +-
.../rest/credential_account_serializer.rb | 1 +
app/services/follow_service.rb | 2 +-
app/services/update_account_service.rb | 4 +-
spec/lib/activitypub/activity/follow_spec.rb | 30 +++++++++++++++
spec/services/follow_service_spec.rb | 27 +++++++++++++
spec/services/update_account_service_spec.rb | 38 +++++++++++++++++++
9 files changed, 105 insertions(+), 9 deletions(-)
create mode 100644 spec/services/update_account_service_spec.rb
diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index b306e8e8c..c12e1c12e 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -33,7 +33,7 @@ class Api::V1::AccountsController < Api::BaseController
def follow
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 } }
+ options = @account.locked? || current_user.account.silenced? ? {} : { following_map: { @account.id => { reblogs: truthy_param?(:reblogs) } }, requested_map: { @account.id => false } }
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships(options)
end
diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js
index f6d90580b..67ec7665b 100644
--- a/app/javascript/mastodon/features/getting_started/index.js
+++ b/app/javascript/mastodon/features/getting_started/index.js
@@ -77,16 +77,14 @@ class GettingStarted extends ImmutablePureComponent {
};
componentDidMount () {
- const { myAccount, fetchFollowRequests, multiColumn } = this.props;
+ const { fetchFollowRequests, multiColumn } = this.props;
if (!multiColumn && window.innerWidth >= NAVIGATION_PANEL_BREAKPOINT) {
this.context.router.history.replace('/timelines/home');
return;
}
- if (myAccount.get('locked')) {
- fetchFollowRequests();
- }
+ fetchFollowRequests();
}
render () {
@@ -134,7 +132,7 @@ class GettingStarted extends ImmutablePureComponent {
height += 48*3;
- if (myAccount.get('locked')) {
+ if (myAccount.get('locked') || unreadFollowRequests > 0) {
navItems.push();
height += 48;
}
diff --git a/app/lib/activitypub/activity/follow.rb b/app/lib/activitypub/activity/follow.rb
index 28f1da19f..ec92f4255 100644
--- a/app/lib/activitypub/activity/follow.rb
+++ b/app/lib/activitypub/activity/follow.rb
@@ -21,7 +21,7 @@ class ActivityPub::Activity::Follow < ActivityPub::Activity
follow_request = FollowRequest.create!(account: @account, target_account: target_account, uri: @json['id'])
- if target_account.locked?
+ if target_account.locked? || @account.silenced?
NotifyService.new.call(target_account, follow_request)
else
AuthorizeFollowService.new.call(@account, target_account)
diff --git a/app/serializers/rest/credential_account_serializer.rb b/app/serializers/rest/credential_account_serializer.rb
index fb195eb07..be0d763dc 100644
--- a/app/serializers/rest/credential_account_serializer.rb
+++ b/app/serializers/rest/credential_account_serializer.rb
@@ -12,6 +12,7 @@ class REST::CredentialAccountSerializer < REST::AccountSerializer
language: user.setting_default_language,
note: object.note,
fields: object.fields.map(&:to_h),
+ follow_requests_count: FollowRequest.where(target_account: object).limit(40).count,
}
end
end
diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb
index 101acdaf9..1941c2e2d 100644
--- a/app/services/follow_service.rb
+++ b/app/services/follow_service.rb
@@ -30,7 +30,7 @@ class FollowService < BaseService
ActivityTracker.increment('activity:interactions')
- if target_account.locked? || target_account.activitypub?
+ if target_account.locked? || source_account.silenced? || target_account.activitypub?
request_follow(source_account, target_account, reblogs: reblogs)
elsif target_account.local?
direct_follow(source_account, target_account, reblogs: reblogs)
diff --git a/app/services/update_account_service.rb b/app/services/update_account_service.rb
index 01756a73d..ebf24be37 100644
--- a/app/services/update_account_service.rb
+++ b/app/services/update_account_service.rb
@@ -20,7 +20,9 @@ class UpdateAccountService < BaseService
private
def authorize_all_follow_requests(account)
- AuthorizeFollowWorker.push_bulk(FollowRequest.where(target_account: account).select(:account_id, :target_account_id)) do |req|
+ follow_requests = FollowRequest.where(target_account: account)
+ follow_requests = follow_requests.select { |req| !req.account.silenced? }
+ AuthorizeFollowWorker.push_bulk(follow_requests) do |req|
[req.account_id, req.target_account_id]
end
end
diff --git a/spec/lib/activitypub/activity/follow_spec.rb b/spec/lib/activitypub/activity/follow_spec.rb
index 6bbacdbe6..05112cc18 100644
--- a/spec/lib/activitypub/activity/follow_spec.rb
+++ b/spec/lib/activitypub/activity/follow_spec.rb
@@ -31,6 +31,36 @@ RSpec.describe ActivityPub::Activity::Follow do
end
end
+ context 'silenced account following an unlocked account' do
+ before do
+ sender.touch(:silenced_at)
+ subject.perform
+ end
+
+ it 'does not create a follow from sender to recipient' do
+ expect(sender.following?(recipient)).to be false
+ end
+
+ it 'creates a follow request' do
+ expect(sender.requested?(recipient)).to be true
+ end
+ end
+
+ context 'unlocked account muting the sender' do
+ before do
+ recipient.mute!(sender)
+ subject.perform
+ end
+
+ it 'creates a follow from sender to recipient' do
+ expect(sender.following?(recipient)).to be true
+ end
+
+ it 'does not create a follow request' do
+ expect(sender.requested?(recipient)).to be false
+ end
+ end
+
context 'locked account' do
before do
recipient.update(locked: true)
diff --git a/spec/services/follow_service_spec.rb b/spec/services/follow_service_spec.rb
index 86c85293e..ae863a9f0 100644
--- a/spec/services/follow_service_spec.rb
+++ b/spec/services/follow_service_spec.rb
@@ -30,6 +30,33 @@ RSpec.describe FollowService, type: :service do
end
end
+ describe 'unlocked account, from silenced account' do
+ let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
+
+ before do
+ sender.touch(:silenced_at)
+ subject.call(sender, bob.acct)
+ end
+
+ it 'creates a follow request with reblogs' do
+ expect(FollowRequest.find_by(account: sender, target_account: bob, show_reblogs: true)).to_not be_nil
+ end
+ end
+
+ describe 'unlocked account, from a muted account' do
+ let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
+
+ before do
+ bob.mute!(sender)
+ subject.call(sender, bob.acct)
+ end
+
+ it 'creates a following relation with reblogs' do
+ expect(sender.following?(bob)).to be true
+ expect(sender.muting_reblogs?(bob)).to be false
+ end
+ end
+
describe 'unlocked account' do
let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
diff --git a/spec/services/update_account_service_spec.rb b/spec/services/update_account_service_spec.rb
new file mode 100644
index 000000000..960b26891
--- /dev/null
+++ b/spec/services/update_account_service_spec.rb
@@ -0,0 +1,38 @@
+require 'rails_helper'
+
+RSpec.describe UpdateAccountService, type: :service do
+ subject { UpdateAccountService.new }
+
+ describe 'switching form locked to unlocked accounts' do
+ let(:account) { Fabricate(:account, locked: true) }
+ let(:alice) { Fabricate(:user, email: 'alice@example.com', account: Fabricate(:account, username: 'alice')).account }
+ let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
+ let(:eve) { Fabricate(:user, email: 'eve@example.com', account: Fabricate(:account, username: 'eve')).account }
+
+ before do
+ bob.touch(:silenced_at)
+ account.mute!(eve)
+
+ FollowService.new.call(alice, account)
+ FollowService.new.call(bob, account)
+ FollowService.new.call(eve, account)
+
+ subject.call(account, { locked: false })
+ end
+
+ it 'auto-accepts pending follow requests' do
+ expect(alice.following?(account)).to be true
+ expect(alice.requested?(account)).to be false
+ end
+
+ it 'does not auto-accept pending follow requests from silenced users' do
+ expect(bob.following?(account)).to be false
+ expect(bob.requested?(account)).to be true
+ end
+
+ it 'auto-accepts pending follow requests from muted users so as to not leak mute' do
+ expect(eve.following?(account)).to be true
+ expect(eve.requested?(account)).to be false
+ end
+ end
+end
From 234c729c5244160c89070960fd06de23ae31e13a Mon Sep 17 00:00:00 2001
From: Eugen Rochko
Date: Sat, 28 Sep 2019 00:55:59 +0200
Subject: [PATCH 20/41] New Crowdin translations (#11909)
* New translations en.json (Corsican)
[ci skip]
* New translations en.yml (Corsican)
[ci skip]
* New translations en.json (Spanish, Argentina)
[ci skip]
* New translations en.yml (Spanish, Argentina)
[ci skip]
* New translations simple_form.en.yml (Spanish, Argentina)
[ci skip]
* New translations activerecord.en.yml (Spanish, Argentina)
[ci skip]
* New translations devise.en.yml (Spanish, Argentina)
[ci skip]
* New translations doorkeeper.en.yml (Spanish, Argentina)
[ci skip]
* New translations en.yml (Persian)
[ci skip]
* New translations en.json (Dutch)
[ci skip]
* New translations en.yml (Dutch)
[ci skip]
* New translations en.yml (Dutch)
[ci skip]
* New translations en.yml (Dutch)
[ci skip]
* New translations en.yml (Greek)
[ci skip]
* New translations en.yml (Dutch)
[ci skip]
* New translations en.yml (Dutch)
[ci skip]
* New translations en.yml (Dutch)
[ci skip]
* New translations devise.en.yml (Hungarian)
[ci skip]
* New translations en.yml (Hungarian)
[ci skip]
* New translations devise.en.yml (Hungarian)
[ci skip]
* New translations en.yml (Hungarian)
[ci skip]
* New translations simple_form.en.yml (Ukrainian)
[ci skip]
* New translations en.json (Hungarian)
[ci skip]
* New translations simple_form.en.yml (Hungarian)
[ci skip]
* New translations en.json (Hungarian)
[ci skip]
* New translations en.yml (Occitan)
[ci skip]
* New translations en.yml (Esperanto)
[ci skip]
* New translations en.yml (Esperanto)
[ci skip]
* New translations activerecord.en.yml (Spanish, Argentina)
[ci skip]
* New translations en.json (Spanish, Argentina)
[ci skip]
* New translations en.json (Spanish, Argentina)
[ci skip]
* New translations simple_form.en.yml (Portuguese)
[ci skip]
* New translations en.yml (Slovak)
[ci skip]
* New translations en.json (Hungarian)
[ci skip]
* New translations en.json (Hungarian)
[ci skip]
* New translations en.yml (Hungarian)
[ci skip]
* New translations en.yml (Hungarian)
[ci skip]
* New translations en.yml (Hungarian)
[ci skip]
* New translations en.yml (Hungarian)
[ci skip]
* New translations en.yml (Hungarian)
[ci skip]
* New translations simple_form.en.yml (Hungarian)
[ci skip]
* New translations en.json (Spanish, Argentina)
[ci skip]
* New translations en.json (Arabic)
[ci skip]
* New translations en.yml (Arabic)
[ci skip]
* New translations en.json (Spanish, Argentina)
[ci skip]
* New translations en.yml (Arabic)
[ci skip]
* New translations devise.en.yml (Arabic)
[ci skip]
* New translations en.json (Arabic)
[ci skip]
* New translations en.yml (Arabic)
[ci skip]
* New translations simple_form.en.yml (Arabic)
[ci skip]
* New translations en.yml (Arabic)
[ci skip]
* New translations simple_form.en.yml (Arabic)
[ci skip]
* New translations simple_form.en.yml (Arabic)
[ci skip]
* New translations doorkeeper.en.yml (Arabic)
[ci skip]
* New translations en.yml (Slovak)
[ci skip]
* New translations en.yml (Dutch)
[ci skip]
* New translations en.yml (Dutch)
[ci skip]
* New translations en.yml (Dutch)
[ci skip]
* New translations en.yml (Arabic)
[ci skip]
* New translations en.yml (Korean)
[ci skip]
* New translations en.json (Spanish, Argentina)
[ci skip]
* New translations en.json (Spanish, Argentina)
[ci skip]
* New translations en.json (Arabic)
[ci skip]
* New translations en.yml (Arabic)
[ci skip]
* New translations simple_form.en.yml (Arabic)
[ci skip]
* New translations en.yml (Esperanto)
[ci skip]
* New translations en.json (Armenian)
[ci skip]
* New translations doorkeeper.en.yml (Greek)
[ci skip]
* New translations doorkeeper.en.yml (Hungarian)
[ci skip]
* New translations en.json (Italian)
[ci skip]
* New translations en.yml (Italian)
[ci skip]
* New translations simple_form.en.yml (Italian)
[ci skip]
* New translations doorkeeper.en.yml (Italian)
[ci skip]
* New translations doorkeeper.en.yml (Japanese)
[ci skip]
* New translations en.json (Kazakh)
[ci skip]
* New translations en.yml (Kazakh)
[ci skip]
* New translations doorkeeper.en.yml (Kazakh)
[ci skip]
* New translations doorkeeper.en.yml (Korean)
[ci skip]
* New translations en.yml (Norwegian Nynorsk)
[ci skip]
* New translations simple_form.en.yml (Greek)
[ci skip]
* New translations en.json (Greek)
[ci skip]
* New translations en.json (Finnish)
[ci skip]
* New translations simple_form.en.yml (Dutch)
[ci skip]
* New translations doorkeeper.en.yml (Dutch)
[ci skip]
* New translations simple_form.en.yml (Esperanto)
[ci skip]
* New translations doorkeeper.en.yml (Esperanto)
[ci skip]
* New translations en.json (Estonian)
[ci skip]
* New translations en.yml (Estonian)
[ci skip]
* New translations simple_form.en.yml (Estonian)
[ci skip]
* New translations doorkeeper.en.yml (Estonian)
[ci skip]
* New translations en.yml (Finnish)
[ci skip]
* New translations doorkeeper.en.yml (German)
[ci skip]
* New translations simple_form.en.yml (Finnish)
[ci skip]
* New translations doorkeeper.en.yml (Finnish)
[ci skip]
* New translations simple_form.en.yml (French)
[ci skip]
* New translations doorkeeper.en.yml (French)
[ci skip]
* New translations en.json (Galician)
[ci skip]
* New translations en.yml (Galician)
[ci skip]
* New translations simple_form.en.yml (Galician)
[ci skip]
* New translations doorkeeper.en.yml (Galician)
[ci skip]
* New translations en.yml (German)
[ci skip]
* New translations simple_form.en.yml (German)
[ci skip]
* New translations doorkeeper.en.yml (Occitan)
[ci skip]
* New translations doorkeeper.en.yml (Danish)
[ci skip]
* New translations simple_form.en.yml (Swedish)
[ci skip]
* New translations doorkeeper.en.yml (Swedish)
[ci skip]
* New translations en.json (Tamil)
[ci skip]
* New translations en.yml (Tamil)
[ci skip]
* New translations en.json (Telugu)
[ci skip]
* New translations en.yml (Telugu)
[ci skip]
* New translations en.json (Swedish)
[ci skip]
* New translations doorkeeper.en.yml (Thai)
[ci skip]
* New translations en.json (Turkish)
[ci skip]
* New translations en.yml (Turkish)
[ci skip]
* New translations simple_form.en.yml (Turkish)
[ci skip]
* New translations doorkeeper.en.yml (Turkish)
[ci skip]
* New translations doorkeeper.en.yml (Welsh)
[ci skip]
* New translations en.yml (Swedish)
[ci skip]
* New translations doorkeeper.en.yml (Spanish)
[ci skip]
* New translations doorkeeper.en.yml (Persian)
[ci skip]
* New translations en.json (Polish)
[ci skip]
* New translations en.yml (Polish)
[ci skip]
* New translations simple_form.en.yml (Polish)
[ci skip]
* New translations doorkeeper.en.yml (Polish)
[ci skip]
* New translations en.json (Portuguese)
[ci skip]
* New translations en.yml (Portuguese)
[ci skip]
* New translations doorkeeper.en.yml (Portuguese)
[ci skip]
* New translations en.yml (Portuguese, Brazilian)
[ci skip]
* New translations simple_form.en.yml (Spanish)
[ci skip]
* New translations doorkeeper.en.yml (Portuguese, Brazilian)
[ci skip]
* New translations en.json (Romanian)
[ci skip]
* New translations en.yml (Romanian)
[ci skip]
* New translations simple_form.en.yml (Romanian)
[ci skip]
* New translations en.json (Slovenian)
[ci skip]
* New translations en.yml (Slovenian)
[ci skip]
* New translations simple_form.en.yml (Slovenian)
[ci skip]
* New translations doorkeeper.en.yml (Slovenian)
[ci skip]
* New translations en.json (Spanish)
[ci skip]
* New translations en.yml (Spanish)
[ci skip]
* New translations simple_form.en.yml (Danish)
[ci skip]
* New translations en.yml (Armenian)
[ci skip]
* New translations doorkeeper.en.yml (Hebrew)
[ci skip]
* New translations en.json (Ido)
[ci skip]
* New translations en.yml (Ido)
[ci skip]
* New translations simple_form.en.yml (Ido)
[ci skip]
* New translations doorkeeper.en.yml (Ido)
[ci skip]
* New translations en.json (Indonesian)
[ci skip]
* New translations en.yml (Indonesian)
[ci skip]
* New translations simple_form.en.yml (Indonesian)
[ci skip]
* New translations doorkeeper.en.yml (Indonesian)
[ci skip]
* New translations en.json (Latvian)
[ci skip]
* New translations en.yml (Latvian)
[ci skip]
* New translations en.yml (Hebrew)
[ci skip]
* New translations en.json (Lithuanian)
[ci skip]
* New translations en.yml (Lithuanian)
[ci skip]
* New translations en.json (Malay)
[ci skip]
* New translations en.yml (Malay)
[ci skip]
* New translations en.json (Norwegian)
[ci skip]
* New translations en.yml (Norwegian)
[ci skip]
* New translations simple_form.en.yml (Norwegian)
[ci skip]
* New translations doorkeeper.en.yml (Norwegian)
[ci skip]
* New translations simple_form.en.yml (Hebrew)
[ci skip]
* New translations en.json (Hebrew)
[ci skip]
* New translations en.yml (Russian)
[ci skip]
* New translations en.yml (Bulgarian)
[ci skip]
* New translations en.json (Asturian)
[ci skip]
* New translations en.yml (Asturian)
[ci skip]
* New translations simple_form.en.yml (Asturian)
[ci skip]
* New translations doorkeeper.en.yml (Asturian)
[ci skip]
* New translations en.json (Breton)
[ci skip]
* New translations en.yml (Breton)
[ci skip]
* New translations en.json (Bulgarian)
[ci skip]
* New translations simple_form.en.yml (Bulgarian)
[ci skip]
* New translations doorkeeper.en.yml (Georgian)
[ci skip]
* New translations doorkeeper.en.yml (Bulgarian)
[ci skip]
* New translations en.json (Chinese Traditional, Hong Kong)
[ci skip]
* New translations en.yml (Chinese Traditional, Hong Kong)
[ci skip]
* New translations simple_form.en.yml (Chinese Traditional, Hong Kong)
[ci skip]
* New translations doorkeeper.en.yml (Chinese Traditional, Hong Kong)
[ci skip]
* New translations en.json (Croatian)
[ci skip]
* New translations en.yml (Croatian)
[ci skip]
* New translations simple_form.en.yml (Croatian)
[ci skip]
* New translations doorkeeper.en.yml (Croatian)
[ci skip]
* New translations en.json (Georgian)
[ci skip]
* New translations en.yml (Georgian)
[ci skip]
* New translations simple_form.en.yml (Georgian)
[ci skip]
* New translations en.json (Russian)
[ci skip]
* New translations simple_form.en.yml (Russian)
[ci skip]
* New translations en.yml (Danish)
[ci skip]
* New translations doorkeeper.en.yml (Chinese Simplified)
[ci skip]
* New translations en.json (Bengali)
[ci skip]
* New translations en.yml (Bengali)
[ci skip]
* New translations en.json (Catalan)
[ci skip]
* New translations en.yml (Catalan)
[ci skip]
* New translations simple_form.en.yml (Catalan)
[ci skip]
* New translations doorkeeper.en.yml (Catalan)
[ci skip]
* New translations en.json (Chinese Simplified)
[ci skip]
* New translations en.yml (Chinese Simplified)
[ci skip]
* New translations simple_form.en.yml (Chinese Simplified)
[ci skip]
* New translations en.json (Chinese Traditional)
[ci skip]
* New translations simple_form.en.yml (Basque)
[ci skip]
* New translations en.yml (Chinese Traditional)
[ci skip]
* New translations simple_form.en.yml (Chinese Traditional)
[ci skip]
* New translations doorkeeper.en.yml (Chinese Traditional)
[ci skip]
* New translations doorkeeper.en.yml (Corsican)
[ci skip]
* New translations en.yml (Czech)
[ci skip]
* New translations simple_form.en.yml (Czech)
[ci skip]
* New translations doorkeeper.en.yml (Czech)
[ci skip]
* New translations en.json (Danish)
[ci skip]
* New translations doorkeeper.en.yml (Basque)
[ci skip]
* New translations en.yml (Basque)
[ci skip]
* New translations doorkeeper.en.yml (Russian)
[ci skip]
* New translations en.json (Ukrainian)
[ci skip]
* New translations en.json (Serbian (Cyrillic))
[ci skip]
* New translations en.yml (Serbian (Cyrillic))
[ci skip]
* New translations simple_form.en.yml (Serbian (Cyrillic))
[ci skip]
* New translations doorkeeper.en.yml (Serbian (Cyrillic))
[ci skip]
* New translations en.json (Serbian (Latin))
[ci skip]
* New translations en.yml (Serbian (Latin))
[ci skip]
* New translations simple_form.en.yml (Serbian (Latin))
[ci skip]
* New translations doorkeeper.en.yml (Serbian (Latin))
[ci skip]
* New translations simple_form.en.yml (Slovak)
[ci skip]
* New translations doorkeeper.en.yml (Slovak)
[ci skip]
* New translations en.yml (Ukrainian)
[ci skip]
* New translations en.json (Basque)
[ci skip]
* New translations doorkeeper.en.yml (Ukrainian)
[ci skip]
* New translations en.yml (French)
[ci skip]
* New translations en.json (Norwegian Nynorsk)
[ci skip]
* New translations en.json (Albanian)
[ci skip]
* New translations en.yml (Albanian)
[ci skip]
* New translations simple_form.en.yml (Albanian)
[ci skip]
* New translations doorkeeper.en.yml (Albanian)
[ci skip]
* New translations en.json (Spanish, Argentina)
[ci skip]
* New translations en.yml (Spanish, Argentina)
[ci skip]
* New translations simple_form.en.yml (Spanish, Argentina)
[ci skip]
* New translations doorkeeper.en.yml (Spanish, Argentina)
[ci skip]
* New translations en.yml (Japanese)
[ci skip]
* New translations en.yml (French)
[ci skip]
* New translations en.yml (Slovak)
[ci skip]
* New translations en.yml (Czech)
[ci skip]
* New translations en.json (Greek)
[ci skip]
* New translations en.json (Greek)
[ci skip]
* New translations en.yml (Greek)
[ci skip]
* New translations en.yml (Japanese)
[ci skip]
* New translations en.yml (Greek)
[ci skip]
* New translations en.yml (Japanese)
[ci skip]
* New translations en.json (Greek)
[ci skip]
* New translations en.yml (Greek)
[ci skip]
* i18n-tasks normalize
* yarn manage:translations
---
app/javascript/mastodon/locales/ar.json | 36 +-
app/javascript/mastodon/locales/co.json | 8 +-
app/javascript/mastodon/locales/cy.json | 54 +-
app/javascript/mastodon/locales/el.json | 14 +-
app/javascript/mastodon/locales/es.json | 650 +++++------
app/javascript/mastodon/locales/fr.json | 22 +-
app/javascript/mastodon/locales/hu.json | 60 +-
app/javascript/mastodon/locales/ja.json | 6 +-
app/javascript/mastodon/locales/nl.json | 8 +-
app/javascript/mastodon/locales/pt-BR.json | 32 +-
app/javascript/mastodon/locales/sk.json | 8 +-
app/javascript/mastodon/locales/th.json | 16 +-
config/locales/activerecord.es.yml | 18 +-
config/locales/ar.yml | 62 +-
config/locales/co.yml | 40 +
config/locales/cs.yml | 4 +
config/locales/cy.yml | 51 +
config/locales/devise.ar.yml | 4 +
config/locales/devise.es.yml | 99 +-
config/locales/devise.hu.yml | 12 +
config/locales/devise.ja.yml | 12 +
config/locales/doorkeeper.ar.yml | 2 +-
config/locales/doorkeeper.es.yml | 149 +--
config/locales/el.yml | 14 +-
config/locales/eo.yml | 10 +
config/locales/es.yml | 1135 +-------------------
config/locales/fa.yml | 2 +-
config/locales/fr.yml | 4 +
config/locales/hu.yml | 94 +-
config/locales/ja.yml | 46 +-
config/locales/ko.yml | 26 +-
config/locales/nl.yml | 27 +-
config/locales/oc.yml | 17 +
config/locales/simple_form.ar.yml | 15 +-
config/locales/simple_form.co.yml | 10 +
config/locales/simple_form.cy.yml | 9 +
config/locales/simple_form.es.yml | 171 +--
config/locales/simple_form.fa.yml | 20 +
config/locales/simple_form.hu.yml | 18 +
config/locales/simple_form.ja.yml | 14 +
config/locales/simple_form.ko.yml | 8 +
config/locales/simple_form.oc.yml | 18 +
config/locales/simple_form.pt-BR.yml | 27 +
config/locales/simple_form.pt-PT.yml | 6 +
config/locales/simple_form.th.yml | 2 +
config/locales/simple_form.uk.yml | 1 +
config/locales/sk.yml | 15 +
config/locales/th.yml | 14 +
48 files changed, 1037 insertions(+), 2053 deletions(-)
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 01c56b4a0..3b0adb20a 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -7,7 +7,7 @@
"account.cancel_follow_request": "إلغاء طلب المتابَعة",
"account.direct": "رسالة خاصة إلى @{name}",
"account.domain_blocked": "النطاق مخفي",
- "account.edit_profile": "تعديل الملف الشخصي",
+ "account.edit_profile": "تعديل الملف التعريفي",
"account.endorse": "أوصِ به على صفحتك",
"account.follow": "تابِع",
"account.followers": "متابعون",
@@ -30,11 +30,11 @@
"account.posts_with_replies": "التبويقات و الردود",
"account.report": "ابلِغ عن @{name}",
"account.requested": "في انتظار الموافقة. اضْغَطْ/ي لإلغاء طلب المتابعة",
- "account.share": "مشاركة حساب @{name}",
+ "account.share": "شارك ملف تعريف @{name}",
"account.show_reblogs": "اعرض ترقيات @{name}",
"account.unblock": "إلغاء الحظر عن @{name}",
"account.unblock_domain": "فك الخْفى عن {domain}",
- "account.unendorse": "أزل ترويجه مِن الملف الشخصي",
+ "account.unendorse": "أزل ترويجه مِن الملف التعريفي",
"account.unfollow": "إلغاء المتابعة",
"account.unmute": "إلغاء الكتم عن @{name}",
"account.unmute_notifications": "إلغاء كتم إخطارات @{name}",
@@ -53,7 +53,7 @@
"column.blocks": "الحسابات المحجوبة",
"column.community": "الخيط العام المحلي",
"column.direct": "الرسائل المباشرة",
- "column.directory": "Browse profiles",
+ "column.directory": "استعرض الملفات التعريفية",
"column.domain_blocks": "النطاقات المخفية",
"column.favourites": "المفضلة",
"column.follow_requests": "طلبات المتابعة",
@@ -63,7 +63,7 @@
"column.notifications": "الإخطارات",
"column.pins": "التبويقات المثبتة",
"column.public": "الخيط العام الموحد",
- "column.status": "Toot",
+ "column.status": "تبويق",
"column_back_button.label": "العودة",
"column_header.hide_settings": "إخفاء الإعدادات",
"column_header.moveLeft_settings": "نقل القائمة إلى اليسار",
@@ -111,10 +111,10 @@
"confirmations.reply.message": "الرد في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد كتابتها. متأكد من أنك تريد المواصلة؟",
"confirmations.unfollow.confirm": "إلغاء المتابعة",
"confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟",
- "conversation.delete": "Delete conversation",
- "conversation.mark_as_read": "Mark as read",
- "conversation.open": "View conversation",
- "conversation.with": "With {names}",
+ "conversation.delete": "احذف المحادثة",
+ "conversation.mark_as_read": "اعتبرها كمقروءة",
+ "conversation.open": "اعرض المحادثة",
+ "conversation.with": "بـ {names}",
"directory.federated": "From known fediverse",
"directory.local": "From {domain} only",
"directory.new_arrivals": "الوافدون الجُدد",
@@ -136,7 +136,7 @@
"emoji_button.symbols": "رموز",
"emoji_button.travel": "الأماكن والسفر",
"empty_column.account_timeline": "ليس هناك تبويقات!",
- "empty_column.account_unavailable": "الملف الشخصي غير متوفر",
+ "empty_column.account_unavailable": "الملف التعريفي غير متوفر",
"empty_column.blocks": "لم تقم بحظر أي مستخدِم بعد.",
"empty_column.community": "الخط العام المحلي فارغ. أكتب شيئا ما للعامة كبداية!",
"empty_column.direct": "لم تتلق أية رسالة خاصة مباشِرة بعد. سوف يتم عرض الرسائل المباشرة هنا إن قمت بإرسال واحدة أو تلقيت البعض منها.",
@@ -155,7 +155,7 @@
"follow_request.authorize": "ترخيص",
"follow_request.reject": "رفض",
"getting_started.developers": "المُطوِّرون",
- "getting_started.directory": "دليل المستخدِمين والمستخدِمات",
+ "getting_started.directory": "دليل الصفحات التعريفية",
"getting_started.documentation": "الدليل",
"getting_started.heading": "استعدّ للبدء",
"getting_started.invite": "دعوة أشخاص",
@@ -194,7 +194,7 @@
"introduction.interactions.reply.text": "يمكنكم الرد على تبويقاتكم و تبويقات الآخرين على شكل سلسلة محادثة.",
"introduction.welcome.action": "هيا بنا!",
"introduction.welcome.headline": "الخطوات الأولى",
- "introduction.welcome.text": "مرحبا بكم على الفديفرس! بعد لحظات قليلة ، سيكون بمقدوركم بث رسائل والتحدث إلى أصدقائكم عبر تشكيلة واسعة من الخوادم المختلفة. هذا الخادم ، {domain} ، يستضيف ملفكم الشخصي ، لذا يجب تذكر اسمه جيدا.",
+ "introduction.welcome.text": "مرحبا بكم على الفديفرس! بعد لحظات قليلة ، سيكون بمقدوركم بث رسائل والتحدث إلى أصدقائكم عبر تشكيلة واسعة من الخوادم المختلفة. هذا الخادم ، {domain} ، يستضيف صفحتكم التعريفية ، لذا يجب تذكر اسمه جيدا.",
"keyboard_shortcuts.back": "للعودة",
"keyboard_shortcuts.blocked": "لفتح قائمة المستخدمين المحظورين",
"keyboard_shortcuts.boost": "للترقية",
@@ -214,10 +214,10 @@
"keyboard_shortcuts.local": "لفتح الخيط العام المحلي",
"keyboard_shortcuts.mention": "لذِكر الناشر",
"keyboard_shortcuts.muted": "لفتح قائمة المستخدِمين المكتومين",
- "keyboard_shortcuts.my_profile": "لفتح ملفك الشخصي",
+ "keyboard_shortcuts.my_profile": "لفتح ملفك التعريفي",
"keyboard_shortcuts.notifications": "لفتح عمود الإشعارات",
"keyboard_shortcuts.pinned": "لفتح قائمة التبويقات المدبسة",
- "keyboard_shortcuts.profile": "لفتح رابط الناشر",
+ "keyboard_shortcuts.profile": "لفتح الملف التعريفي للناشر",
"keyboard_shortcuts.reply": "للردّ",
"keyboard_shortcuts.requests": "لفتح قائمة طلبات المتابعة",
"keyboard_shortcuts.search": "للتركيز على البحث",
@@ -253,7 +253,7 @@
"navigation_bar.direct": "الرسائل المباشِرة",
"navigation_bar.discover": "اكتشف",
"navigation_bar.domain_blocks": "النطاقات المخفية",
- "navigation_bar.edit_profile": "تعديل الملف الشخصي",
+ "navigation_bar.edit_profile": "عدّل الملف التعريفي",
"navigation_bar.favourites": "المفضلة",
"navigation_bar.filters": "الكلمات المكتومة",
"navigation_bar.follow_requests": "طلبات المتابعة",
@@ -355,7 +355,7 @@
"status.mute": "أكتم @{name}",
"status.mute_conversation": "كتم المحادثة",
"status.open": "وسع هذه المشاركة",
- "status.pin": "تدبيس على الملف الشخصي",
+ "status.pin": "دبّسه على الصفحة التعريفية",
"status.pinned": "تبويق مثبَّت",
"status.read_more": "اقرأ المزيد",
"status.reblog": "رَقِّي",
@@ -375,7 +375,7 @@
"status.show_thread": "الكشف عن المحادثة",
"status.uncached_media_warning": "غير متوفر",
"status.unmute_conversation": "فك الكتم عن المحادثة",
- "status.unpin": "فك التدبيس من الملف الشخصي",
+ "status.unpin": "فك التدبيس من الصفحة التعريفية",
"suggestions.dismiss": "إلغاء الاقتراح",
"suggestions.header": "يمكن أن يهمك…",
"tabs_bar.federated_timeline": "الموحَّد",
@@ -404,7 +404,7 @@
"upload_modal.detect_text": "Detect text from picture",
"upload_modal.edit_media": "تعديل الوسائط",
"upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
- "upload_modal.preview_label": "Preview ({ratio})",
+ "upload_modal.preview_label": "معاينة ({ratio})",
"upload_progress.label": "يرفع...",
"video.close": "إغلاق الفيديو",
"video.exit_fullscreen": "الخروج من وضع الشاشة المليئة",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 85685dccd..aba3f59c7 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -111,10 +111,10 @@
"confirmations.reply.message": "Risponde avà sguasserà u missaghju chì scrivite. Site sicuru·a chì vulete cuntinuà?",
"confirmations.unfollow.confirm": "Disabbunassi",
"confirmations.unfollow.message": "Site sicuru·a ch'ùn vulete più siguità @{name}?",
- "conversation.delete": "Delete conversation",
- "conversation.mark_as_read": "Mark as read",
- "conversation.open": "View conversation",
- "conversation.with": "With {names}",
+ "conversation.delete": "Sguassà a cunversazione",
+ "conversation.mark_as_read": "Marcà cum'è lettu",
+ "conversation.open": "Vede a cunversazione",
+ "conversation.with": "Cù {names}",
"directory.federated": "Da u fediverse cunisciutu",
"directory.local": "Solu da {domain}",
"directory.new_arrivals": "Ultimi arrivi",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index eecb43b59..69205d90e 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -4,7 +4,7 @@
"account.block": "Blocio @{name}",
"account.block_domain": "Cuddio popeth rhag {domain}",
"account.blocked": "Blociwyd",
- "account.cancel_follow_request": "Cancel follow request",
+ "account.cancel_follow_request": "Canslo cais dilyn",
"account.direct": "Neges breifat @{name}",
"account.domain_blocked": "Parth wedi ei guddio",
"account.edit_profile": "Golygu proffil",
@@ -16,7 +16,7 @@
"account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.",
"account.follows_you": "Yn eich dilyn chi",
"account.hide_reblogs": "Cuddio bwstiau o @{name}",
- "account.last_status": "Last active",
+ "account.last_status": "Gweithredol olaf",
"account.link_verified_on": "Gwiriwyd perchnogaeth y ddolen yma ar {date}",
"account.locked_info": "Mae'r statws preifatrwydd cyfrif hwn wedi'i osod i gloi. Mae'r perchennog yn adolygu'r sawl sy'n gallu eu dilyn.",
"account.media": "Cyfryngau",
@@ -38,11 +38,11 @@
"account.unfollow": "Dad-ddilyn",
"account.unmute": "Dad-dawelu @{name}",
"account.unmute_notifications": "Dad-dawelu hysbysiadau o @{name}",
- "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
- "alert.rate_limited.title": "Rate limited",
+ "alert.rate_limited.message": "Ceisiwch eto ar ôl {retry_time, time, medium}.",
+ "alert.rate_limited.title": "Cyfradd gyfyngedig",
"alert.unexpected.message": "Digwyddodd gwall annisgwyl.",
"alert.unexpected.title": "Wps!",
- "autosuggest_hashtag.per_week": "{count} per week",
+ "autosuggest_hashtag.per_week": "{count} yr wythnos",
"boost_modal.combo": "Mae modd gwasgu {combo} er mwyn sgipio hyn tro nesa",
"bundle_column_error.body": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.",
"bundle_column_error.retry": "Ceisiwch eto",
@@ -53,7 +53,7 @@
"column.blocks": "Defnyddwyr a flociwyd",
"column.community": "Ffrwd lleol",
"column.direct": "Negeseuon preifat",
- "column.directory": "Browse profiles",
+ "column.directory": "Pori proffiliau",
"column.domain_blocks": "Parthau cuddiedig",
"column.favourites": "Ffefrynnau",
"column.follow_requests": "Ceisiadau dilyn",
@@ -102,7 +102,7 @@
"confirmations.domain_block.confirm": "Cuddio parth cyfan",
"confirmations.domain_block.message": "A ydych yn hollol, hollol sicr eich bod am flocio y {domain} cyfan? Yn y nifer helaeth o achosion mae blocio neu tawelu ambell gyfrif yn ddigonol ac yn well. Ni fyddwch yn gweld cynnwys o'r parth hwnnw mewn unrhyw ffrydiau cyhoeddus na chwaith yn eich hysbysiadau. Bydd hyn yn cael gwared o'ch dilynwyr o'r parth hwnnw.",
"confirmations.logout.confirm": "Allgofnodi",
- "confirmations.logout.message": "Are you sure you want to log out?",
+ "confirmations.logout.message": "Ydych chi'n siŵr eich bod am allgofnodi?",
"confirmations.mute.confirm": "Tawelu",
"confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?",
"confirmations.redraft.confirm": "Dileu & ailddrafftio",
@@ -111,14 +111,14 @@
"confirmations.reply.message": "Bydd ateb nawr yn cymryd lle y neges yr ydych yn cyfansoddi ar hyn o bryd. Ydych chi'n sicr yr ydych am barhau?",
"confirmations.unfollow.confirm": "Dad-ddilynwch",
"confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?",
- "conversation.delete": "Delete conversation",
+ "conversation.delete": "Dileu sgwrs",
"conversation.mark_as_read": "Nodi fel wedi'i ddarllen",
- "conversation.open": "View conversation",
- "conversation.with": "With {names}",
- "directory.federated": "From known fediverse",
- "directory.local": "From {domain} only",
- "directory.new_arrivals": "New arrivals",
- "directory.recently_active": "Recently active",
+ "conversation.open": "Gweld sgwrs",
+ "conversation.with": "Gyda {names}",
+ "directory.federated": "O ffedysawd hysbys",
+ "directory.local": "O {domain} yn unig",
+ "directory.new_arrivals": "Newydd-ddyfodiaid",
+ "directory.recently_active": "Yn weithredol yn ddiweddar",
"embed.instructions": "Mewnblannwch y tŵt hwn ar eich gwefan drwy gopïo'r côd isod.",
"embed.preview": "Dyma sut olwg fydd arno:",
"emoji_button.activity": "Gweithgarwch",
@@ -174,7 +174,7 @@
"home.column_settings.basic": "Syml",
"home.column_settings.show_reblogs": "Dangos bŵstiau",
"home.column_settings.show_replies": "Dangos ymatebion",
- "home.column_settings.update_live": "Update in real-time",
+ "home.column_settings.update_live": "Diweddariad mewn amser real",
"intervals.full.days": "{number, plural, one {# ddydd} other {# o ddyddiau}}",
"intervals.full.hours": "{number, plural, one {# awr} other {# o oriau}}",
"intervals.full.minutes": "{number, plural, one {# funud} other {# o funudau}}",
@@ -240,7 +240,7 @@
"lists.new.title_placeholder": "Teitl rhestr newydd",
"lists.search": "Chwilio ymysg pobl yr ydych yn ei ddilyn",
"lists.subheading": "Eich rhestrau",
- "load_pending": "{count, plural, one {# new item} other {# new items}}",
+ "load_pending": "{count, plural, one {# eitem newydd} other {# eitemau newydd}}",
"loading_indicator.label": "Llwytho...",
"media_gallery.toggle_visible": "Toglo gwelededd",
"missing_indicator.label": "Heb ei ganfod",
@@ -268,7 +268,7 @@
"navigation_bar.preferences": "Dewisiadau",
"navigation_bar.public_timeline": "Ffrwd y ffederasiwn",
"navigation_bar.security": "Diogelwch",
- "notification.and_n_others": "and {count, plural, one {# other} other {# others}}",
+ "notification.and_n_others": "a {count, plural, one {# arall} other {# eraill}}",
"notification.favourite": "hoffodd {name} eich tŵt",
"notification.follow": "dilynodd {name} chi",
"notification.mention": "Soniodd {name} amdanoch chi",
@@ -334,7 +334,7 @@
"search_results.accounts": "Pobl",
"search_results.hashtags": "Hanshnodau",
"search_results.statuses": "Tŵtiau",
- "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+ "search_results.statuses_fts_disabled": "Nid yw chwilio Tŵtiau yn ôl eu cynnwys wedi'i alluogi ar y gweinydd Mastodon hwn.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
"status.admin_account": "Agor rhyngwyneb goruwchwylio ar gyfer @{name}",
"status.admin_status": "Agor y tŵt yn y rhyngwyneb goruwchwylio",
@@ -373,7 +373,7 @@
"status.show_more": "Dangos mwy",
"status.show_more_all": "Dangos mwy i bawb",
"status.show_thread": "Dangos edefyn",
- "status.uncached_media_warning": "Not available",
+ "status.uncached_media_warning": "Dim ar gael",
"status.unmute_conversation": "Dad-dawelu sgwrs",
"status.unpin": "Dadbinio o'r proffil",
"suggestions.dismiss": "Diswyddo",
@@ -389,7 +389,7 @@
"time_remaining.moments": "Munudau ar ôl",
"time_remaining.seconds": "{number, plural, one {# eiliad} other {# o eiliadau}} ar ôl",
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} yn siarad",
- "trends.trending_now": "Trending now",
+ "trends.trending_now": "Yn tueddu nawr",
"ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.",
"upload_area.title": "Llusgwch & gollwing i uwchlwytho",
"upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)",
@@ -398,13 +398,13 @@
"upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg",
"upload_form.edit": "Golygu",
"upload_form.undo": "Dileu",
- "upload_modal.analyzing_picture": "Analyzing picture…",
- "upload_modal.apply": "Apply",
- "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
- "upload_modal.detect_text": "Detect text from picture",
- "upload_modal.edit_media": "Edit media",
- "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
- "upload_modal.preview_label": "Preview ({ratio})",
+ "upload_modal.analyzing_picture": "Dadansoddi llun…",
+ "upload_modal.apply": "Gweithredu",
+ "upload_modal.description_placeholder": "Mae ei phen bach llawn jocs, 'run peth a fy nghot golff, rhai dyddiau",
+ "upload_modal.detect_text": "Canfod testun o'r llun",
+ "upload_modal.edit_media": "Golygu cyfryngau",
+ "upload_modal.hint": "Cliciwch neu llusgwch y cylch ar y rhagolwg i ddewis y canolbwynt a fydd bob amser i'w weld ar bob mân-lunau.",
+ "upload_modal.preview_label": "Rhagolwg ({ratio})",
"upload_progress.label": "Uwchlwytho...",
"video.close": "Cau fideo",
"video.exit_fullscreen": "Gadael sgrîn llawn",
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index ffbdefaeb..d083dbdc8 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -1,7 +1,7 @@
{
"account.add_or_remove_from_list": "Προσθήκη ή Αφαίρεση από λίστες",
"account.badges.bot": "Μποτ",
- "account.block": "Αποκλισμός @{name}",
+ "account.block": "Αποκλεισμός @{name}",
"account.block_domain": "Απόκρυψε τα πάντα από το {domain}",
"account.blocked": "Αποκλεισμένος/η",
"account.cancel_follow_request": "Ακύρωση αιτήματος παρακολούθησης",
@@ -111,10 +111,10 @@
"confirmations.reply.message": "Απαντώντας τώρα θα αντικαταστήσεις το κείμενο που ήδη γράφεις. Σίγουρα θέλεις να συνεχίσεις;",
"confirmations.unfollow.confirm": "Διακοπή παρακολούθησης",
"confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};",
- "conversation.delete": "Delete conversation",
- "conversation.mark_as_read": "Mark as read",
- "conversation.open": "View conversation",
- "conversation.with": "With {names}",
+ "conversation.delete": "Διαγραφή συζήτησης",
+ "conversation.mark_as_read": "Σήμανση ως αναγνωσμένο",
+ "conversation.open": "Προβολή συνομιλίας",
+ "conversation.with": "Με {names}",
"directory.federated": "Από το γνωστό fediverse",
"directory.local": "Μόνο από {domain}",
"directory.new_arrivals": "Νέες αφίξεις",
@@ -131,7 +131,7 @@
"emoji_button.objects": "Αντικείμενα",
"emoji_button.people": "Άνθρωποι",
"emoji_button.recent": "Δημοφιλή",
- "emoji_button.search": "Αναζήτηση…",
+ "emoji_button.search": "Αναζήτηση...",
"emoji_button.search_results": "Αποτελέσματα αναζήτησης",
"emoji_button.symbols": "Σύμβολα",
"emoji_button.travel": "Ταξίδια & Τοποθεσίες",
@@ -392,7 +392,7 @@
"trends.trending_now": "Δημοφιλή τώρα",
"ui.beforeunload": "Το προσχέδιό σου θα χαθεί αν φύγεις από το Mastodon.",
"upload_area.title": "Drag & drop για να ανεβάσεις",
- "upload_button.label": "Πρόσθεσε πολυμέσα (JPEG, PNG, GIF, WebM, MP4, MOV)",
+ "upload_button.label": "Πρόσθεσε πολυμέσα ({formats})",
"upload_error.limit": "Υπέρβαση ορίου μεγέθους ανεβασμένων αρχείων.",
"upload_error.poll": "Στις δημοσκοπήσεις δεν επιτρέπεται η μεταφόρτωση αρχείου.",
"upload_form.description": "Περιέγραψε για όσους & όσες έχουν προβλήματα όρασης",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 54466f1ac..101be4b1d 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -1,5 +1,5 @@
{
- "account.add_or_remove_from_list": "Agregar o eliminar de listas",
+ "account.add_or_remove_from_list": "Agregar o quitar de las listas",
"account.badges.bot": "Bot",
"account.block": "Bloquear a @{name}",
"account.block_domain": "Ocultar todo de {domain}",
@@ -8,126 +8,126 @@
"account.direct": "Mensaje directo a @{name}",
"account.domain_blocked": "Dominio oculto",
"account.edit_profile": "Editar perfil",
- "account.endorse": "Mostrar en perfil",
+ "account.endorse": "Destacar en el perfil",
"account.follow": "Seguir",
"account.followers": "Seguidores",
"account.followers.empty": "Todavía nadie sigue a este usuario.",
"account.follows": "Sigue",
- "account.follows.empty": "Este usuario todavía no sigue a nadie.",
+ "account.follows.empty": "Todavía este usuario no sigue a nadie.",
"account.follows_you": "Te sigue",
"account.hide_reblogs": "Ocultar retoots de @{name}",
"account.last_status": "Última actividad",
- "account.link_verified_on": "El proprietario de este link fue comprobado el {date}",
- "account.locked_info": "El estado de privacidad de esta cuenta està configurado como bloqueado. El proprietario debe revisar manualmente quien puede seguirle.",
- "account.media": "Multimedia",
+ "account.link_verified_on": "La propiedad de este enlace fue verificada el {date}",
+ "account.locked_info": "El estado de privacidad de esta cuenta está establecido como bloqueado. El propietario manualmente revisa quién puede seguirle.",
+ "account.media": "Medios",
"account.mention": "Mencionar a @{name}",
- "account.moved_to": "{name} se ha mudado a:",
+ "account.moved_to": "{name} se ha muó a:",
"account.mute": "Silenciar a @{name}",
"account.mute_notifications": "Silenciar notificaciones de @{name}",
"account.muted": "Silenciado",
"account.never_active": "Nunca",
"account.posts": "Toots",
"account.posts_with_replies": "Toots con respuestas",
- "account.report": "Reportar a @{name}",
- "account.requested": "Esperando aprobación",
+ "account.report": "Denunciar a @{name}",
+ "account.requested": "Esperando aprobación. Hacé clic para cancelar la solicitud de seguimiento.",
"account.share": "Compartir el perfil de @{name}",
"account.show_reblogs": "Mostrar retoots de @{name}",
"account.unblock": "Desbloquear a @{name}",
- "account.unblock_domain": "Mostrar a {domain}",
- "account.unendorse": "No mostrar en el perfil",
+ "account.unblock_domain": "Mostrar {domain}",
+ "account.unendorse": "No destacar en el perfil",
"account.unfollow": "Dejar de seguir",
"account.unmute": "Dejar de silenciar a @{name}",
"account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
- "alert.rate_limited.message": "Por favor reintente después de {retry_time, time, medium}.",
+ "alert.rate_limited.message": "Por favor, reintentá después de las {retry_time, time, medium}.",
"alert.rate_limited.title": "Tarifa limitada",
- "alert.unexpected.message": "Hubo un error inesperado.",
- "alert.unexpected.title": "¡Ups!",
+ "alert.unexpected.message": "Ocurrió un error inesperado.",
+ "alert.unexpected.title": "¡Epa!",
"autosuggest_hashtag.per_week": "{count} por semana",
- "boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez",
+ "boost_modal.combo": "Podés hacer clic en {combo} para saltar esto la próxima vez",
"bundle_column_error.body": "Algo salió mal al cargar este componente.",
- "bundle_column_error.retry": "Inténtalo de nuevo",
+ "bundle_column_error.retry": "Intentá de nuevo",
"bundle_column_error.title": "Error de red",
"bundle_modal_error.close": "Cerrar",
"bundle_modal_error.message": "Algo salió mal al cargar este componente.",
- "bundle_modal_error.retry": "Inténtalo de nuevo",
+ "bundle_modal_error.retry": "Intentá de nuevo",
"column.blocks": "Usuarios bloqueados",
- "column.community": "Línea de tiempo local",
+ "column.community": "Línea temporal local",
"column.direct": "Mensajes directos",
- "column.directory": "Buscar perfiles",
- "column.domain_blocks": "Dominios ocultados",
+ "column.directory": "Explorar perfiles",
+ "column.domain_blocks": "Dominios ocultos",
"column.favourites": "Favoritos",
"column.follow_requests": "Solicitudes de seguimiento",
- "column.home": "Inicio",
+ "column.home": "Principal",
"column.lists": "Listas",
"column.mutes": "Usuarios silenciados",
"column.notifications": "Notificaciones",
"column.pins": "Toots fijados",
- "column.public": "Línea de tiempo federada",
+ "column.public": "Línea temporal federada",
"column.status": "Toot",
- "column_back_button.label": "Atrás",
+ "column_back_button.label": "Volver",
"column_header.hide_settings": "Ocultar configuración",
"column_header.moveLeft_settings": "Mover columna a la izquierda",
"column_header.moveRight_settings": "Mover columna a la derecha",
"column_header.pin": "Fijar",
- "column_header.show_settings": "Mostrar ajustes",
+ "column_header.show_settings": "Mostrar configuración",
"column_header.unpin": "Dejar de fijar",
- "column_subheading.settings": "Ajustes",
- "community.column_settings.media_only": "Solo media",
- "compose_form.direct_message_warning": "Este toot solo será enviado a los usuarios mencionados.",
- "compose_form.direct_message_warning_learn_more": "Aprender mas",
+ "column_subheading.settings": "Configuración",
+ "community.column_settings.media_only": "Sólo medios",
+ "compose_form.direct_message_warning": "Este toot sólo será enviado a los usuarios mencionados.",
+ "compose_form.direct_message_warning_learn_more": "Aprendé más",
"compose_form.hashtag_warning": "Este toot no se mostrará bajo hashtags porque no es público. Sólo los toots públicos se pueden buscar por hashtag.",
- "compose_form.lock_disclaimer": "Tu cuenta no está bloqueada. Todos pueden seguirte para ver tus toots solo para seguidores.",
- "compose_form.lock_disclaimer.lock": "bloqueado",
- "compose_form.placeholder": "¿En qué estás pensando?",
- "compose_form.poll.add_option": "Añadir una opción",
+ "compose_form.lock_disclaimer": "Tu cuenta no está {locked}. Todos pueden seguirte para ver tus toots marcados como \"sólo para seguidores\".",
+ "compose_form.lock_disclaimer.lock": "bloqueada",
+ "compose_form.placeholder": "¿Qué onda?",
+ "compose_form.poll.add_option": "Agregá una opción",
"compose_form.poll.duration": "Duración de la encuesta",
- "compose_form.poll.option_placeholder": "Elección {number}",
- "compose_form.poll.remove_option": "Eliminar esta opción",
+ "compose_form.poll.option_placeholder": "Opción {number}",
+ "compose_form.poll.remove_option": "Quitá esta opción",
"compose_form.publish": "Tootear",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.sensitive.hide": "Marcar multimedia como sensible",
- "compose_form.sensitive.marked": "Material marcado como sensible",
- "compose_form.sensitive.unmarked": "Material no marcado como sensible",
- "compose_form.spoiler.marked": "Texto oculto tras la advertencia",
- "compose_form.spoiler.unmarked": "Texto no oculto",
- "compose_form.spoiler_placeholder": "Advertencia de contenido",
+ "compose_form.publish_loud": "¡{publish}!",
+ "compose_form.sensitive.hide": "Marcar medio como sensible",
+ "compose_form.sensitive.marked": "El medio se marcó como sensible",
+ "compose_form.sensitive.unmarked": "El medio no está marcado como sensible",
+ "compose_form.spoiler.marked": "El texto está oculto detrás de la advertencia",
+ "compose_form.spoiler.unmarked": "El texto no está oculto",
+ "compose_form.spoiler_placeholder": "Escribí tu advertencia acá",
"confirmation_modal.cancel": "Cancelar",
- "confirmations.block.block_and_report": "Bloquear y Reportar",
+ "confirmations.block.block_and_report": "Bloquear y denunciar",
"confirmations.block.confirm": "Bloquear",
- "confirmations.block.message": "¿Estás seguro de que quieres bloquear a {name}?",
+ "confirmations.block.message": "¿Estás seguro que querés bloquear a {name}?",
"confirmations.delete.confirm": "Eliminar",
- "confirmations.delete.message": "¿Estás seguro de que quieres borrar este toot?",
+ "confirmations.delete.message": "¿Estás seguro que querés eliminar este estado?",
"confirmations.delete_list.confirm": "Eliminar",
- "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?",
+ "confirmations.delete_list.message": "¿Estás seguro que querés eliminar permanentemente esta lista?",
"confirmations.domain_block.confirm": "Ocultar dominio entero",
- "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.",
+ "confirmations.domain_block.message": "¿Estás completamente seguro que querés bloquear el {domain} entero? En la mayoría de los casos, unos cuantos bloqueos y silenciados puntuales son suficientes y preferibles. No vas a ver contenido de ese dominio en ninguna de tus líneas temporales o en tus notificaciones. Tus seguidores de ese dominio serán quitados.",
"confirmations.logout.confirm": "Cerrar sesión",
- "confirmations.logout.message": "¿Estás seguro de querer cerrar la sesión?",
+ "confirmations.logout.message": "¿Estás seguro que querés cerrar la sesión?",
"confirmations.mute.confirm": "Silenciar",
- "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?",
- "confirmations.redraft.confirm": "Borrar y volver a borrador",
- "confirmations.redraft.message": "Estás seguro de que quieres borrar este estado y volverlo a borrador? Perderás todas las respuestas, impulsos y favoritos asociados a él, y las respuestas a la publicación original quedarán huérfanos.",
+ "confirmations.mute.message": "¿Estás seguro que querés silenciar a {name}?",
+ "confirmations.redraft.confirm": "Eliminar toot original y editarlo",
+ "confirmations.redraft.message": "¿Estás seguro que querés eliminar este estado y volverlo a editarlo? Se perderán las veces marcadas como favoritos y los retoots, y las respuestas a la publicación original quedarán huérfanas.",
"confirmations.reply.confirm": "Responder",
- "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?",
+ "confirmations.reply.message": "Responder ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?",
"confirmations.unfollow.confirm": "Dejar de seguir",
- "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?",
- "conversation.delete": "Borrar conversación",
+ "confirmations.unfollow.message": "¿Estás seguro que querés dejar de seguir a {name}?",
+ "conversation.delete": "Eliminar conversación",
"conversation.mark_as_read": "Marcar como leído",
"conversation.open": "Ver conversación",
"conversation.with": "Con {names}",
- "directory.federated": "Desde el fediverso conocido",
+ "directory.federated": "Desde fediverso conocido",
"directory.local": "Sólo de {domain}",
"directory.new_arrivals": "Recién llegados",
"directory.recently_active": "Recientemente activo",
- "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.",
- "embed.preview": "Así es como se verá:",
+ "embed.instructions": "Insertá este toot a tu sitio web copiando el código de abajo.",
+ "embed.preview": "Así es cómo se verá:",
"emoji_button.activity": "Actividad",
"emoji_button.custom": "Personalizado",
- "emoji_button.flags": "Marcas",
+ "emoji_button.flags": "Banderas",
"emoji_button.food": "Comida y bebida",
"emoji_button.label": "Insertar emoji",
"emoji_button.nature": "Naturaleza",
- "emoji_button.not_found": "No hay emojos!! (╯°□°)╯︵ ┻━┻",
+ "emoji_button.not_found": "¡¡No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objetos",
"emoji_button.people": "Gente",
"emoji_button.recent": "Usados frecuentemente",
@@ -137,282 +137,282 @@
"emoji_button.travel": "Viajes y lugares",
"empty_column.account_timeline": "¡No hay toots aquí!",
"empty_column.account_unavailable": "Perfil no disponible",
- "empty_column.blocks": "Aún no has bloqueado a ningún usuario.",
- "empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!",
- "empty_column.direct": "Aún no tienes ningún mensaje directo. Cuando envíes o recibas uno, se mostrará aquí.",
+ "empty_column.blocks": "Todavía no bloqueaste a ningún usuario.",
+ "empty_column.community": "La línea temporal local está vacía. ¡Escribí algo en modo público para que se empiece a correr la bola!",
+ "empty_column.direct": "Todavía no tenés ningún mensaje directo. Cuando enviés o recibás uno, se mostrará acá.",
"empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
- "empty_column.favourited_statuses": "Aún no tienes toots preferidos. Cuando marques uno como favorito, aparecerá aquí.",
- "empty_column.favourites": "Nadie ha marcado este toot como preferido. Cuando alguien lo haga, aparecerá aquí.",
- "empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.",
- "empty_column.hashtag": "No hay nada en este hashtag aún.",
- "empty_column.home": "No estás siguiendo a nadie aún. Visita {public} o haz búsquedas para empezar y conocer gente nueva.",
- "empty_column.home.public_timeline": "la línea de tiempo pública",
- "empty_column.list": "No hay nada en esta lista aún. Cuando miembros de esta lista publiquen nuevos estatus, estos aparecerán qui.",
- "empty_column.lists": "No tienes ninguna lista. cuando crees una, se mostrará aquí.",
- "empty_column.mutes": "Aún no has silenciado a ningún usuario.",
- "empty_column.notifications": "No tienes ninguna notificación aún. Interactúa con otros para empezar una conversación.",
- "empty_column.public": "¡No hay nada aquí! Escribe algo públicamente, o sigue usuarios de otras instancias manualmente para llenarlo",
- "follow_request.authorize": "Autorizar",
- "follow_request.reject": "Rechazar",
- "getting_started.developers": "Desarrolladores",
- "getting_started.directory": "Directorio de perfil",
- "getting_started.documentation": "Documentación",
- "getting_started.heading": "Primeros pasos",
- "getting_started.invite": "Invitar usuarios",
- "getting_started.open_source_notice": "Mastodon es software libre. Puedes contribuir o reportar errores en {github}.",
- "getting_started.security": "Seguridad",
- "getting_started.terms": "Términos de servicio",
- "hashtag.column_header.tag_mode.all": "y {additional}",
- "hashtag.column_header.tag_mode.any": "o {additional}",
- "hashtag.column_header.tag_mode.none": "sin {additional}",
- "hashtag.column_settings.select.no_options_message": "No se encontraron sugerencias",
- "hashtag.column_settings.select.placeholder": "Introduzca hashtags…",
- "hashtag.column_settings.tag_mode.all": "Cualquiera de estos",
- "hashtag.column_settings.tag_mode.any": "Cualquiera de estos",
- "hashtag.column_settings.tag_mode.none": "Ninguno de estos",
+ "empty_column.favourited_statuses": "Todavía no tenés toots favoritos. Cuando marqués uno como favorito, se mostrará acá.",
+ "empty_column.favourites": "Todavía nadie marcó este toot como favorito. Cuando alguien lo haga, se mostrará acá.",
+ "empty_column.follow_requests": "Todavía no tenés ninguna solicitud de seguimiento. Cuando recibás una, se mostrará acá.",
+ "empty_column.hashtag": "Todavía no hay nada con esta etiqueta.",
+ "empty_column.home": "¡Tu línea temporal principal está vacía! Visitá {public} o usá la búsqueda para comenzar y encontrar a otros usuarios.",
+ "empty_column.home.public_timeline": "la línea temporal pública",
+ "empty_column.list": "Todavía no hay nada en esta lista. Cuando miembros de esta lista envíen nuevos toots, se mostrarán acá.",
+ "empty_column.lists": "Todavía no tienes ninguna lista. Cuando creés una, se mostrará acá.",
+ "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 servers to fill it up",
+ "follow_request.authorize": "Authorize",
+ "follow_request.reject": "Reject",
+ "getting_started.developers": "Developers",
+ "getting_started.directory": "Profile directory",
+ "getting_started.documentation": "Documentation",
+ "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.select.no_options_message": "No suggestions found",
+ "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+ "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 in this column",
- "home.column_settings.basic": "Básico",
- "home.column_settings.show_reblogs": "Mostrar retoots",
- "home.column_settings.show_replies": "Mostrar respuestas",
- "home.column_settings.update_live": "Actualizar en tiempo real",
- "intervals.full.days": "{number, plural, one {# día} other {# días}}",
- "intervals.full.hours": "{number, plural, one {# hora} other {# horas}}",
- "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}",
- "introduction.federation.action": "Siguiente",
- "introduction.federation.federated.headline": "Federado",
- "introduction.federation.federated.text": "Los mensajes públicos de otros servidores del fediverso aparecerán en la cronología federada.",
- "introduction.federation.home.headline": "Inicio",
- "introduction.federation.home.text": "Los posts de personas que sigues aparecerán en tu cronología. ¡Puedes seguir a cualquiera en cualquier servidor!",
+ "home.column_settings.basic": "Basic",
+ "home.column_settings.show_reblogs": "Show boosts",
+ "home.column_settings.show_replies": "Show replies",
+ "home.column_settings.update_live": "Update in real-time",
+ "intervals.full.days": "{number, plural, one {# day} other {# days}}",
+ "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
+ "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+ "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": "Los posts públicos de personas en el mismo servidor que aparecerán en la cronología local.",
- "introduction.interactions.action": "¡Terminar tutorial!",
- "introduction.interactions.favourite.headline": "Favorito",
- "introduction.interactions.favourite.text": "Puedes guardar un toot para más tarde, y hacer saber al autor que te gustó, dándole a favorito.",
- "introduction.interactions.reblog.headline": "Retootear",
- "introduction.interactions.reblog.text": "Puedes compartir los toots de otras personas con tus seguidores retooteando los mismos.",
- "introduction.interactions.reply.headline": "Responder",
- "introduction.interactions.reply.text": "Puedes responder a tus propios toots y los de otras personas, que se encadenarán juntos en una conversación.",
- "introduction.welcome.action": "¡Vamos!",
- "introduction.welcome.headline": "Primeros pasos",
- "introduction.welcome.text": "¡Bienvenido al fediverso! En unos momentos, podrás transmitir mensajes y hablar con tus amigos a través de una amplia variedad de servidores. Pero este servidor, {domain}, es especial, alberga tu perfil, así que recuerda su nombre.",
- "keyboard_shortcuts.back": "volver atrás",
- "keyboard_shortcuts.blocked": "abrir una lista de usuarios bloqueados",
- "keyboard_shortcuts.boost": "retootear",
- "keyboard_shortcuts.column": "enfocar un estado en una de las columnas",
- "keyboard_shortcuts.compose": "enfocar el área de texto de redacción",
- "keyboard_shortcuts.description": "Descripción",
- "keyboard_shortcuts.direct": "abrir la columna de mensajes directos",
- "keyboard_shortcuts.down": "mover hacia abajo en la lista",
- "keyboard_shortcuts.enter": "abrir estado",
- "keyboard_shortcuts.favourite": "añadir a favoritos",
- "keyboard_shortcuts.favourites": "abrir la lista de favoritos",
- "keyboard_shortcuts.federated": "abrir el timeline federado",
+ "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+ "introduction.interactions.action": "Finish toot-orial!",
+ "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 people's toots with your followers by boosting 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 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 favourites list",
+ "keyboard_shortcuts.federated": "to open federated timeline",
"keyboard_shortcuts.heading": "Keyboard Shortcuts",
- "keyboard_shortcuts.home": "abrir el timeline propio",
- "keyboard_shortcuts.hotkey": "Tecla caliente",
- "keyboard_shortcuts.legend": "para mostrar esta leyenda",
- "keyboard_shortcuts.local": "abrir el timeline local",
- "keyboard_shortcuts.mention": "para mencionar al autor",
- "keyboard_shortcuts.muted": "abrir la lista de usuarios silenciados",
- "keyboard_shortcuts.my_profile": "abrir tu perfil",
- "keyboard_shortcuts.notifications": "abrir la columna de notificaciones",
- "keyboard_shortcuts.pinned": "abrir la lista de toots destacados",
- "keyboard_shortcuts.profile": "abrir el perfil del autor",
- "keyboard_shortcuts.reply": "para responder",
- "keyboard_shortcuts.requests": "abrir la lista de peticiones de seguidores",
- "keyboard_shortcuts.search": "para poner el foco en la búsqueda",
- "keyboard_shortcuts.start": "abrir la columna \"comenzar\"",
- "keyboard_shortcuts.toggle_hidden": "mostrar/ocultar texto tras aviso de contenido (CW)",
- "keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar medios",
- "keyboard_shortcuts.toot": "para comenzar un nuevo toot",
- "keyboard_shortcuts.unfocus": "para retirar el foco de la caja de redacción/búsqueda",
- "keyboard_shortcuts.up": "para ir hacia arriba en la lista",
- "lightbox.close": "Cerrar",
- "lightbox.next": "Siguiente",
- "lightbox.previous": "Anterior",
- "lightbox.view_context": "Ver contexto",
- "lists.account.add": "Añadir a lista",
- "lists.account.remove": "Quitar de lista",
- "lists.delete": "Borrar lista",
- "lists.edit": "Editar lista",
- "lists.edit.submit": "Cambiar título",
- "lists.new.create": "Añadir lista",
- "lists.new.title_placeholder": "Título de la nueva lista",
- "lists.search": "Buscar entre la gente a la que sigues",
- "lists.subheading": "Tus listas",
- "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}",
- "loading_indicator.label": "Cargando…",
- "media_gallery.toggle_visible": "Cambiar visibilidad",
- "missing_indicator.label": "No encontrado",
- "missing_indicator.sublabel": "No se encontró este recurso",
- "mute_modal.hide_notifications": "Ocultar notificaciones de este usuario?",
- "navigation_bar.apps": "Aplicaciones móviles",
- "navigation_bar.blocks": "Usuarios bloqueados",
- "navigation_bar.community_timeline": "Historia local",
- "navigation_bar.compose": "Escribir un nuevo toot",
- "navigation_bar.direct": "Mensajes directos",
- "navigation_bar.discover": "Descubrir",
- "navigation_bar.domain_blocks": "Dominios ocultos",
- "navigation_bar.edit_profile": "Editar perfil",
- "navigation_bar.favourites": "Favoritos",
- "navigation_bar.filters": "Palabras silenciadas",
- "navigation_bar.follow_requests": "Solicitudes para seguirte",
- "navigation_bar.follows_and_followers": "Siguiendo y seguidores",
- "navigation_bar.info": "Información adicional",
- "navigation_bar.keyboard_shortcuts": "Atajos",
- "navigation_bar.lists": "Listas",
- "navigation_bar.logout": "Cerrar sesión",
- "navigation_bar.mutes": "Usuarios silenciados",
+ "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.toggle_sensitivity": "to show/hide media",
+ "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",
+ "lightbox.view_context": "View context",
+ "lists.account.add": "Add to list",
+ "lists.account.remove": "Remove from list",
+ "lists.delete": "Delete list",
+ "lists.edit": "Edit list",
+ "lists.edit.submit": "Change title",
+ "lists.new.create": "Add list",
+ "lists.new.title_placeholder": "New list title",
+ "lists.search": "Search among people you follow",
+ "lists.subheading": "Your lists",
+ "load_pending": "{count, plural, one {# new item} other {# new items}}",
+ "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.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",
+ "navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.favourites": "Favourites",
+ "navigation_bar.filters": "Muted words",
+ "navigation_bar.follow_requests": "Follow requests",
+ "navigation_bar.follows_and_followers": "Follows and followers",
+ "navigation_bar.info": "About this server",
+ "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": "Toots fijados",
- "navigation_bar.preferences": "Preferencias",
- "navigation_bar.public_timeline": "Historia federada",
- "navigation_bar.security": "Seguridad",
- "notification.and_n_others": "y {count, plural, one {# otro} other {# otros}}",
- "notification.favourite": "{name} marcó tu estado como favorito",
- "notification.follow": "{name} te empezó a seguir",
- "notification.mention": "{name} te ha mencionado",
- "notification.poll": "Una encuesta en la que has votado ha terminado",
- "notification.reblog": "{name} ha retooteado tu estado",
- "notifications.clear": "Limpiar notificaciones",
- "notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?",
- "notifications.column_settings.alert": "Notificaciones de escritorio",
- "notifications.column_settings.favourite": "Favoritos:",
- "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
- "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
- "notifications.column_settings.filter_bar.show": "Mostrar",
- "notifications.column_settings.follow": "Nuevos seguidores:",
- "notifications.column_settings.mention": "Menciones:",
- "notifications.column_settings.poll": "Resultados de la votación:",
- "notifications.column_settings.push": "Notificaciones push",
- "notifications.column_settings.reblog": "Retoots:",
- "notifications.column_settings.show": "Mostrar en columna",
- "notifications.column_settings.sound": "Reproducir sonido",
- "notifications.filter.all": "Todos",
- "notifications.filter.boosts": "Retoots",
- "notifications.filter.favourites": "Favoritos",
- "notifications.filter.follows": "Seguidores",
- "notifications.filter.mentions": "Menciones",
- "notifications.filter.polls": "Resultados de la votación",
- "notifications.group": "{count} notificaciones",
- "poll.closed": "Cerrada",
- "poll.refresh": "Actualizar",
- "poll.total_votes": "{count, plural, one {# voto} other {# votos}}",
- "poll.vote": "Votar",
- "poll_button.add_poll": "Añadir una encuesta",
- "poll_button.remove_poll": "Eliminar encuesta",
- "privacy.change": "Ajustar privacidad",
- "privacy.direct.long": "Sólo mostrar a los usuarios mencionados",
- "privacy.direct.short": "Directo",
- "privacy.private.long": "Sólo mostrar a seguidores",
- "privacy.private.short": "Privado",
- "privacy.public.long": "Mostrar en la historia federada",
- "privacy.public.short": "Público",
- "privacy.unlisted.long": "No mostrar en la historia federada",
- "privacy.unlisted.short": "No listado",
- "regeneration_indicator.label": "Cargando…",
- "regeneration_indicator.sublabel": "¡Tu historia de inicio se está preparando!",
+ "navigation_bar.pins": "Pinned toots",
+ "navigation_bar.preferences": "Preferences",
+ "navigation_bar.public_timeline": "Federated timeline",
+ "navigation_bar.security": "Security",
+ "notification.and_n_others": "and {count, plural, one {# other} other {# others}}",
+ "notification.favourite": "{name} favourited your status",
+ "notification.follow": "{name} followed you",
+ "notification.mention": "{name} mentioned you",
+ "notification.poll": "A poll you have voted in has ended",
+ "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": "Favourites:",
+ "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.poll": "Poll results:",
+ "notifications.column_settings.push": "Push notifications",
+ "notifications.column_settings.reblog": "Boosts:",
+ "notifications.column_settings.show": "Show in column",
+ "notifications.column_settings.sound": "Play sound",
+ "notifications.filter.all": "All",
+ "notifications.filter.boosts": "Boosts",
+ "notifications.filter.favourites": "Favourites",
+ "notifications.filter.follows": "Follows",
+ "notifications.filter.mentions": "Mentions",
+ "notifications.filter.polls": "Poll results",
+ "notifications.group": "{count} notifications",
+ "poll.closed": "Closed",
+ "poll.refresh": "Refresh",
+ "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
+ "poll.vote": "Vote",
+ "poll_button.add_poll": "Add a poll",
+ "poll_button.remove_poll": "Remove poll",
+ "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 show in 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": "ahora",
+ "relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
- "reply_indicator.cancel": "Cancelar",
- "report.forward": "Reenviar a {target}",
- "report.forward_hint": "Esta cuenta es de otro servidor. ¿Enviar una copia anonimizada del informe allí también?",
- "report.hint": "El informe se enviará a los moderadores de tu instancia. Puedes proporcionar una explicación de por qué informas sobre esta cuenta a continuación:",
- "report.placeholder": "Comentarios adicionales",
- "report.submit": "Publicar",
- "report.target": "Reportando",
- "search.placeholder": "Buscar",
- "search_popout.search_format": "Formato de búsqueda avanzada",
- "search_popout.tips.full_text": "Búsquedas de texto recuperan posts que has escrito, marcado como favoritos, retooteado o en los que has sido mencionado, así como usuarios, nombres y hashtags.",
- "search_popout.tips.hashtag": "etiqueta",
- "search_popout.tips.status": "estado",
- "search_popout.tips.text": "El texto simple devuelve correspondencias de nombre, usuario y hashtag",
- "search_popout.tips.user": "usuario",
- "search_results.accounts": "Gente",
- "search_results.hashtags": "Etiquetas",
+ "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 server moderators. You can provide an explanation of why you are reporting this account below:",
+ "report.placeholder": "Additional comments",
+ "report.submit": "Submit",
+ "report.target": "Report {target}",
+ "search.placeholder": "Search",
+ "search_popout.search_format": "Advanced search format",
+ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+ "search_popout.tips.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.statuses_fts_disabled": "Buscar toots por su contenido no está disponible en este servidor de Mastodon.",
- "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
- "status.admin_account": "Abrir interfaz de moderación para @{name}",
- "status.admin_status": "Abrir este estado en la interfaz de moderación",
- "status.block": "Bloquear a @{name}",
- "status.cancel_reblog_private": "Des-impulsar",
- "status.cannot_reblog": "Este toot no puede retootearse",
- "status.copy": "Copiar enlace al estado",
- "status.delete": "Borrar",
- "status.detailed_status": "Vista de conversación detallada",
- "status.direct": "Mensaje directo a @{name}",
- "status.embed": "Incrustado",
- "status.favourite": "Favorito",
- "status.filtered": "Filtrado",
- "status.load_more": "Cargar más",
- "status.media_hidden": "Contenido multimedia oculto",
- "status.mention": "Mencionar",
- "status.more": "Más",
- "status.mute": "Silenciar @{name}",
- "status.mute_conversation": "Silenciar conversación",
- "status.open": "Expandir estado",
- "status.pin": "Fijar",
- "status.pinned": "Toot fijado",
- "status.read_more": "Leer más",
- "status.reblog": "Retootear",
- "status.reblog_private": "Implusar a la audiencia original",
- "status.reblogged_by": "Retooteado por {name}",
- "status.reblogs.empty": "Nadie impulsó este toot todavía. Cuando alguien lo haga, aparecerá aqui.",
- "status.redraft": "Borrar y volver a borrador",
- "status.reply": "Responder",
- "status.replyAll": "Responder al hilo",
- "status.report": "Reportar",
- "status.sensitive_warning": "Contenido sensible",
- "status.share": "Compartir",
- "status.show_less": "Mostrar menos",
- "status.show_less_all": "Mostrar menos para todo",
- "status.show_more": "Mostrar más",
- "status.show_more_all": "Mostrar más para todo",
- "status.show_thread": "Ver hilo",
- "status.uncached_media_warning": "No disponible",
- "status.unmute_conversation": "Dejar de silenciar conversación",
- "status.unpin": "Dejar de fijar",
- "suggestions.dismiss": "Descartar sugerencia",
- "suggestions.header": "Es posible que te interese…",
- "tabs_bar.federated_timeline": "Federado",
- "tabs_bar.home": "Inicio",
+ "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+ "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+ "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": "Unboost",
+ "status.cannot_reblog": "This post cannot be boosted",
+ "status.copy": "Copy link to status",
+ "status.delete": "Delete",
+ "status.detailed_status": "Detailed conversation view",
+ "status.direct": "Direct message @{name}",
+ "status.embed": "Embed",
+ "status.favourite": "Favourite",
+ "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.read_more": "Read more",
+ "status.reblog": "Boost",
+ "status.reblog_private": "Boost to original audience",
+ "status.reblogged_by": "{name} boosted",
+ "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
+ "status.redraft": "Delete & re-draft",
+ "status.reply": "Reply",
+ "status.replyAll": "Reply to thread",
+ "status.report": "Report @{name}",
+ "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.show_thread": "Show thread",
+ "status.uncached_media_warning": "Not available",
+ "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",
- "tabs_bar.notifications": "Notificaciones",
- "tabs_bar.search": "Buscar",
- "time_remaining.days": "{number, plural, one {# día restante} other {# días restantes}}",
- "time_remaining.hours": "{number, plural, one {# hora restante} other {# horas restantes}}",
- "time_remaining.minutes": "{number, plural, one {# minuto restante} other {# minutos restantes}}",
- "time_remaining.moments": "Momentos restantes",
- "time_remaining.seconds": "{number, plural, one {# segundo restante} other {# segundos restantes}}",
- "trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {personas}} hablando",
- "trends.trending_now": "Tendencia ahora",
- "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.",
- "upload_area.title": "Arrastra y suelta para subir",
- "upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)",
- "upload_error.limit": "Límite de subida de archivos excedido.",
- "upload_error.poll": "Subida de archivos no permitida con encuestas.",
- "upload_form.description": "Describir para los usuarios con dificultad visual",
- "upload_form.edit": "Editar",
- "upload_form.undo": "Borrar",
- "upload_modal.analyzing_picture": "Analizando imagen…",
- "upload_modal.apply": "Aplicar",
- "upload_modal.description_placeholder": "Un rápido zorro marrón salta sobre el perro perezoso",
- "upload_modal.detect_text": "Detectar texto de la imagen",
- "upload_modal.edit_media": "Editar multimedia",
- "upload_modal.hint": "Haga clic o arrastre el círculo en la vista previa para elegir el punto focal que siempre estará a la vista en todas las miniaturas.",
- "upload_modal.preview_label": "Vista previa ({ratio})",
- "upload_progress.label": "Subiendo…",
- "video.close": "Cerrar video",
- "video.exit_fullscreen": "Salir de pantalla completa",
- "video.expand": "Expandir vídeo",
- "video.fullscreen": "Pantalla completa",
- "video.hide": "Ocultar vídeo",
- "video.mute": "Silenciar sonido",
- "video.pause": "Pausar",
- "video.play": "Reproducir",
- "video.unmute": "Dejar de silenciar sonido"
+ "tabs_bar.notifications": "Notifications",
+ "tabs_bar.search": "Search",
+ "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
+ "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
+ "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
+ "time_remaining.moments": "Moments remaining",
+ "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+ "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
+ "trends.trending_now": "Trending now",
+ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+ "upload_area.title": "Drag & drop to upload",
+ "upload_button.label": "Add media ({formats})",
+ "upload_error.limit": "File upload limit exceeded.",
+ "upload_error.poll": "File upload not allowed with polls.",
+ "upload_form.description": "Describe for the visually impaired",
+ "upload_form.edit": "Edit",
+ "upload_form.undo": "Delete",
+ "upload_modal.analyzing_picture": "Analyzing picture…",
+ "upload_modal.apply": "Apply",
+ "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+ "upload_modal.detect_text": "Detect text from picture",
+ "upload_modal.edit_media": "Edit media",
+ "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+ "upload_modal.preview_label": "Preview ({ratio})",
+ "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/fr.json b/app/javascript/mastodon/locales/fr.json
index a3b0bb3f5..9a516859c 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -39,7 +39,7 @@
"account.unmute": "Ne plus masquer @{name}",
"account.unmute_notifications": "Réactiver les notifications de @{name}",
"alert.rate_limited.message": "Veuillez réessayer après {retry_time, time, medium}.",
- "alert.rate_limited.title": "Taux limité",
+ "alert.rate_limited.title": "Débit limité",
"alert.unexpected.message": "Une erreur inattendue s’est produite.",
"alert.unexpected.title": "Oups !",
"autosuggest_hashtag.per_week": "{count} par semaine",
@@ -70,12 +70,12 @@
"column_header.moveRight_settings": "Déplacer la colonne vers la droite",
"column_header.pin": "Épingler",
"column_header.show_settings": "Afficher les paramètres",
- "column_header.unpin": "Retirer",
+ "column_header.unpin": "Désépingler",
"column_subheading.settings": "Paramètres",
"community.column_settings.media_only": "Média uniquement",
"compose_form.direct_message_warning": "Ce pouet sera uniquement envoyé aux personnes mentionnées. Cependant, l’administration de votre instance et des instances réceptrices pourront inspecter ce message.",
- "compose_form.direct_message_warning_learn_more": "En savoir plus",
- "compose_form.hashtag_warning": "Ce pouet ne sera pas listé dans les recherches par hashtag car sa visibilité est réglée sur \"non listé\". Seuls les pouets avec une visibilité \"publique\" peuvent être recherchés par hashtag.",
+ "compose_form.direct_message_warning_learn_more": "Plus d'informations",
+ "compose_form.hashtag_warning": "Ce pouet ne sera pas listé dans les recherches par mot-clé car sa visibilité est réglée sur \"non listé\". Seuls les pouets avec une visibilité \"publique\" peuvent être recherchés par mot-clé.",
"compose_form.lock_disclaimer": "Votre compte n’est pas {locked}. Tout le monde peut vous suivre et voir vos pouets privés.",
"compose_form.lock_disclaimer.lock": "verrouillé",
"compose_form.placeholder": "Qu’avez-vous en tête ?",
@@ -87,7 +87,7 @@
"compose_form.publish_loud": "{publish} !",
"compose_form.sensitive.hide": "Marquer le média comme sensible",
"compose_form.sensitive.marked": "Média marqué comme sensible",
- "compose_form.sensitive.unmarked": "Média non marqué comme sensible",
+ "compose_form.sensitive.unmarked": "Le média n'est pas marqué comme sensible",
"compose_form.spoiler.marked": "Le texte est caché derrière un avertissement",
"compose_form.spoiler.unmarked": "Le texte n’est pas caché",
"compose_form.spoiler_placeholder": "Écrivez ici votre avertissement",
@@ -104,7 +104,7 @@
"confirmations.logout.confirm": "Déconnexion",
"confirmations.logout.message": "Êtes-vous sûr de vouloir vous déconnecter ?",
"confirmations.mute.confirm": "Masquer",
- "confirmations.mute.message": "Confirmez-vous le masquage de {name} ?",
+ "confirmations.mute.message": "Êtes-vous sûr·e de vouloir masquer {name} ?",
"confirmations.redraft.confirm": "Effacer et ré-écrire",
"confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer ce statut pour le ré-écrire ? Ses partages ainsi que ses mises en favori seront perdu·e·s et ses réponses seront orphelines.",
"confirmations.reply.confirm": "Répondre",
@@ -151,7 +151,7 @@
"empty_column.lists": "Vous n’avez pas encore de liste. Lorsque vous en créerez une, elle apparaîtra ici.",
"empty_column.mutes": "Vous n’avez pas encore mis d'utilisateur·rice·s en silence.",
"empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres personnes pour débuter la conversation.",
- "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres instances pour remplir le fil public",
+ "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres instances pour le remplir",
"follow_request.authorize": "Accepter",
"follow_request.reject": "Rejeter",
"getting_started.developers": "Développeur·euse·s",
@@ -166,12 +166,12 @@
"hashtag.column_header.tag_mode.any": "ou {additional}",
"hashtag.column_header.tag_mode.none": "sans {additional}",
"hashtag.column_settings.select.no_options_message": "Aucune suggestion trouvée",
- "hashtag.column_settings.select.placeholder": "Ajouter des hashtags…",
+ "hashtag.column_settings.select.placeholder": "Ajouter des mots-clés…",
"hashtag.column_settings.tag_mode.all": "Tous ces éléments",
"hashtag.column_settings.tag_mode.any": "Au moins un de ces éléments",
"hashtag.column_settings.tag_mode.none": "Aucun de ces éléments",
- "hashtag.column_settings.tag_toggle": "Inclure des tags additionnels dans cette colonne",
- "home.column_settings.basic": "Basique",
+ "hashtag.column_settings.tag_toggle": "Inclure des mots-clés additionnels dans cette colonne",
+ "home.column_settings.basic": "Base",
"home.column_settings.show_reblogs": "Afficher les partages",
"home.column_settings.show_replies": "Afficher les réponses",
"home.column_settings.update_live": "Mettre à jour en temps réel",
@@ -199,7 +199,7 @@
"keyboard_shortcuts.blocked": "pour ouvrir une liste d’utilisateur·rice·s bloqué·e·s",
"keyboard_shortcuts.boost": "pour partager",
"keyboard_shortcuts.column": "pour focaliser un statut dans l’une des colonnes",
- "keyboard_shortcuts.compose": "pour centrer la zone de rédaction",
+ "keyboard_shortcuts.compose": "pour focaliser la zone de rédaction",
"keyboard_shortcuts.description": "Description",
"keyboard_shortcuts.direct": "pour ouvrir une colonne des messages directs",
"keyboard_shortcuts.down": "pour descendre dans la liste",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 2ab06c6e7..9069597a5 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -4,7 +4,7 @@
"account.block": "@{name} letiltása",
"account.block_domain": "Minden elrejtése innen: {domain}",
"account.blocked": "Letiltva",
- "account.cancel_follow_request": "Cancel follow request",
+ "account.cancel_follow_request": "Követési kérelem törlése",
"account.direct": "Közvetlen üzenet @{name} számára",
"account.domain_blocked": "Rejtett domain",
"account.edit_profile": "Profil szerkesztése",
@@ -16,7 +16,7 @@
"account.follows.empty": "Ez a felhasználó még senkit sem követ.",
"account.follows_you": "Követ téged",
"account.hide_reblogs": "@{name} megtolásainak némítása",
- "account.last_status": "Last active",
+ "account.last_status": "Utoljára aktív",
"account.link_verified_on": "A linket ellenőriztük: {date}",
"account.locked_info": "Ez a fiók zárt. A tulaj engedélyezi, ki követheti őt.",
"account.media": "Média",
@@ -25,7 +25,7 @@
"account.mute": "@{name} némítása",
"account.mute_notifications": "@{name} értesítéseinek némítása",
"account.muted": "Némítva",
- "account.never_active": "Never",
+ "account.never_active": "Soha",
"account.posts": "Tülkölés",
"account.posts_with_replies": "Tülkölés válaszokkal",
"account.report": "@{name} jelentése",
@@ -38,11 +38,11 @@
"account.unfollow": "Követés vége",
"account.unmute": "@{name} némítás feloldása",
"account.unmute_notifications": "@{name} némított értesítéseinek feloldása",
- "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
- "alert.rate_limited.title": "Rate limited",
+ "alert.rate_limited.message": "Kérlek, próbáld újra {retry_time, time, medium}.",
+ "alert.rate_limited.title": "Forgalomkorlátozás",
"alert.unexpected.message": "Váratlan hiba történt.",
"alert.unexpected.title": "Hoppá!",
- "autosuggest_hashtag.per_week": "{count} per week",
+ "autosuggest_hashtag.per_week": "{count}/hét",
"boost_modal.combo": "Hogy átugord ezt következő alkalommal, használd {combo}",
"bundle_column_error.body": "Hiba történt a komponens betöltése közben.",
"bundle_column_error.retry": "Próbáld újra",
@@ -53,7 +53,7 @@
"column.blocks": "Letiltott felhasználók",
"column.community": "Helyi idővonal",
"column.direct": "Közvetlen üzenetek",
- "column.directory": "Browse profiles",
+ "column.directory": "Profilok böngészése",
"column.domain_blocks": "Rejtett domainek",
"column.favourites": "Kedvencek",
"column.follow_requests": "Követési kérelmek",
@@ -63,7 +63,7 @@
"column.notifications": "Értesítések",
"column.pins": "Kitűzött tülkök",
"column.public": "Nyilvános idővonal",
- "column.status": "Toot",
+ "column.status": "Tülk",
"column_back_button.label": "Vissza",
"column_header.hide_settings": "Beállítások elrejtése",
"column_header.moveLeft_settings": "Oszlop elmozdítása balra",
@@ -101,8 +101,8 @@
"confirmations.delete_list.message": "Biztos, hogy véglegesen törölni szeretnéd ezt a listát?",
"confirmations.domain_block.confirm": "Teljes domain elrejtése",
"confirmations.domain_block.message": "Egészen biztos, hogy le szeretnéd tiltani a teljes {domain}-t? A legtöbb esetben néhány célzott tiltás vagy némítás elegendő és kívánatosabb megoldás. Semmilyen tartalmat nem fogsz látni ebből a domainből se idővonalakon, se értesítésekben. Az ebben a domainben lévő követőidet is eltávolítjuk.",
- "confirmations.logout.confirm": "Log out",
- "confirmations.logout.message": "Are you sure you want to log out?",
+ "confirmations.logout.confirm": "Kijelentkezés",
+ "confirmations.logout.message": "Biztosan ki akar jelentkezni?",
"confirmations.mute.confirm": "Némítás",
"confirmations.mute.message": "Biztos, hogy némítani szeretnéd {name}?",
"confirmations.redraft.confirm": "Törlés és újraírás",
@@ -111,14 +111,14 @@
"confirmations.reply.message": "Ha most válaszolsz, ez felülírja a most szerkesztés alatt álló üzenetet. Mégis ezt szeretnéd?",
"confirmations.unfollow.confirm": "Követés visszavonása",
"confirmations.unfollow.message": "Biztos, hogy vissza szeretnéd vonni {name} követését?",
- "conversation.delete": "Delete conversation",
- "conversation.mark_as_read": "Mark as read",
- "conversation.open": "View conversation",
- "conversation.with": "With {names}",
- "directory.federated": "From known fediverse",
- "directory.local": "From {domain} only",
- "directory.new_arrivals": "New arrivals",
- "directory.recently_active": "Recently active",
+ "conversation.delete": "Beszélgetés törlése",
+ "conversation.mark_as_read": "Megjelölés olvasottként",
+ "conversation.open": "Beszélgetés megtekintése",
+ "conversation.with": "{names}-el/al",
+ "directory.federated": "Az ismert fediverzumból",
+ "directory.local": "Csak {domain}-ból/ből",
+ "directory.new_arrivals": "Új csatlakozók",
+ "directory.recently_active": "Nemrég aktív",
"embed.instructions": "Ágyazd be ezt a tülköt a weboldaladba az alábbi kód kimásolásával.",
"embed.preview": "Így fog kinézni:",
"emoji_button.activity": "Aktivitás",
@@ -174,7 +174,7 @@
"home.column_settings.basic": "Alapértelmezések",
"home.column_settings.show_reblogs": "Megtolások mutatása",
"home.column_settings.show_replies": "Válaszok mutatása",
- "home.column_settings.update_live": "Update in real-time",
+ "home.column_settings.update_live": "Frissítés valós időben",
"intervals.full.days": "{number, plural, one {# nap} other {# nap}}",
"intervals.full.hours": "{number, plural, one {# óra} other {# óra}}",
"intervals.full.minutes": "{number, plural, one {# perc} other {# perc}}",
@@ -268,7 +268,7 @@
"navigation_bar.preferences": "Beállítások",
"navigation_bar.public_timeline": "Föderációs idővonal",
"navigation_bar.security": "Biztonság",
- "notification.and_n_others": "and {count, plural, one {# other} other {# others}}",
+ "notification.and_n_others": "és {count, plural, one {# másik} other {# másik}}",
"notification.favourite": "{name} kedvencnek jelölte egy tülködet",
"notification.follow": "{name} követ téged",
"notification.mention": "{name} megemlített",
@@ -373,7 +373,7 @@
"status.show_more": "Többet",
"status.show_more_all": "Többet mindenhol",
"status.show_thread": "Szál mutatása",
- "status.uncached_media_warning": "Not available",
+ "status.uncached_media_warning": "Nem elérhető",
"status.unmute_conversation": "Beszélgetés némításának kikapcsolása",
"status.unpin": "Kitűzés eltávolítása a profilodról",
"suggestions.dismiss": "Javaslat elvetése",
@@ -389,22 +389,22 @@
"time_remaining.moments": "Pillanatok vannak hátra",
"time_remaining.seconds": "{number, plural, one {# másodperc} other {# másodperc}} van hátra",
"trends.count_by_accounts": "{count} {rawCount, plural, one {résztvevő} other {résztvevő}} beszélget",
- "trends.trending_now": "Trending now",
+ "trends.trending_now": "Most trendi",
"ui.beforeunload": "A piszkozatod el fog veszni, ha elhagyod a Mastodon-t.",
"upload_area.title": "Húzd ide a feltöltéshez",
"upload_button.label": "Média hozzáadása (JPEG, PNG, GIF, WebM, MP4, MOV)",
"upload_error.limit": "Túllépted a fájl feltöltési limitet.",
"upload_error.poll": "Szavazásnál nem lehet fájlt feltölteni.",
"upload_form.description": "Leírás látáskorlátozottak számára",
- "upload_form.edit": "Edit",
+ "upload_form.edit": "Szerkesztés",
"upload_form.undo": "Mégsem",
- "upload_modal.analyzing_picture": "Analyzing picture…",
- "upload_modal.apply": "Apply",
- "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
- "upload_modal.detect_text": "Detect text from picture",
- "upload_modal.edit_media": "Edit media",
- "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
- "upload_modal.preview_label": "Preview ({ratio})",
+ "upload_modal.analyzing_picture": "Kép elemzése…",
+ "upload_modal.apply": "Alkalmazás",
+ "upload_modal.description_placeholder": "A gyors, barna róka átugrik a lusta kutya fölött",
+ "upload_modal.detect_text": "Szöveg felismerése a képről",
+ "upload_modal.edit_media": "Média szerkesztése",
+ "upload_modal.hint": "Kattints vagy húzd a kört az előnézetben arra a fókuszpontra, mely minden megjelenített bélyegképen látható kell, legyen.",
+ "upload_modal.preview_label": "Előnézet ({ratio})",
"upload_progress.label": "Feltöltés...",
"video.close": "Videó bezárása",
"video.exit_fullscreen": "Kilépés teljes képernyőből",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 27fa7e93f..40c88d694 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -53,7 +53,7 @@
"column.blocks": "ブロックしたユーザー",
"column.community": "ローカルタイムライン",
"column.direct": "ダイレクトメッセージ",
- "column.directory": "プロフィールを見る",
+ "column.directory": "ディレクトリ",
"column.domain_blocks": "非表示にしたドメイン",
"column.favourites": "お気に入り",
"column.follow_requests": "フォローリクエスト",
@@ -114,7 +114,7 @@
"conversation.delete": "このやりとりを削除",
"conversation.mark_as_read": "既読にする",
"conversation.open": "会話を表示する",
- "conversation.with": "{names} を付ける",
+ "conversation.with": "{names}",
"directory.federated": "既知の連合より",
"directory.local": "{domain} のみ",
"directory.new_arrivals": "新着順",
@@ -268,7 +268,7 @@
"navigation_bar.preferences": "ユーザー設定",
"navigation_bar.public_timeline": "連合タイムライン",
"navigation_bar.security": "セキュリティ",
- "notification.and_n_others": "と、その他 {count, plural, one {#} other {#}}",
+ "notification.and_n_others": "と、他 {count} 件",
"notification.favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました",
"notification.follow": "{name}さんにフォローされました",
"notification.mention": "{name}さんがあなたに返信しました",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index cd09acfb4..83dba6bd3 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -111,10 +111,10 @@
"confirmations.reply.message": "Door nu te reageren overschrijf je de toot die je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?",
"confirmations.unfollow.confirm": "Ontvolgen",
"confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?",
- "conversation.delete": "Delete conversation",
- "conversation.mark_as_read": "Mark as read",
- "conversation.open": "View conversation",
- "conversation.with": "With {names}",
+ "conversation.delete": "Gesprek verwijderen",
+ "conversation.mark_as_read": "Als gelezen markeren",
+ "conversation.open": "Gesprek tonen",
+ "conversation.with": "Met {names}",
"directory.federated": "Fediverse (wat bekend is)",
"directory.local": "Alleen {domain}",
"directory.new_arrivals": "Nieuwe accounts",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index e1e7e2cd1..b35d19dee 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -16,7 +16,7 @@
"account.follows.empty": "Esse usuário não segue ninguém no momento.",
"account.follows_you": "Segue você",
"account.hide_reblogs": "Esconder compartilhamentos de @{name}",
- "account.last_status": "Last active",
+ "account.last_status": "Última atividade",
"account.link_verified_on": "A posse desse link foi verificada em {date}",
"account.locked_info": "Essa conta está trancada. Se você a seguir sua solicitação será revisada manualmente.",
"account.media": "Mídia",
@@ -53,7 +53,7 @@
"column.blocks": "Usuários bloqueados",
"column.community": "Local",
"column.direct": "Mensagens diretas",
- "column.directory": "Browse profiles",
+ "column.directory": "Explorar perfis",
"column.domain_blocks": "Domínios escondidos",
"column.favourites": "Favoritos",
"column.follow_requests": "Seguidores pendentes",
@@ -63,7 +63,7 @@
"column.notifications": "Notificações",
"column.pins": "Postagens fixadas",
"column.public": "Global",
- "column.status": "Toot",
+ "column.status": "Publicar",
"column_back_button.label": "Voltar",
"column_header.hide_settings": "Esconder configurações",
"column_header.moveLeft_settings": "Mover coluna para a esquerda",
@@ -101,8 +101,8 @@
"confirmations.delete_list.message": "Você tem certeza que quer deletar permanentemente a lista?",
"confirmations.domain_block.confirm": "Esconder o domínio inteiro",
"confirmations.domain_block.message": "Você quer mesmo bloquear {domain} inteiro? Na maioria dos casos, silenciar ou bloquear alguns usuários é o suficiente e o recomendado. Você não vai ver conteúdo desse domínio em nenhuma das timelines públicas ou nas suas notificações. Seus seguidores desse domínio serão removidos.",
- "confirmations.logout.confirm": "Log out",
- "confirmations.logout.message": "Are you sure you want to log out?",
+ "confirmations.logout.confirm": "Sair",
+ "confirmations.logout.message": "Tem certeza que deseja encerrar a sessão?",
"confirmations.mute.confirm": "Silenciar",
"confirmations.mute.message": "Você tem certeza de que quer silenciar {name}?",
"confirmations.redraft.confirm": "Apagar & usar como rascunho",
@@ -113,11 +113,11 @@
"confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {name}?",
"conversation.delete": "Excluir conversa",
"conversation.mark_as_read": "Marcar como lida",
- "conversation.open": "View conversation",
- "conversation.with": "With {names}",
+ "conversation.open": "Ver conversa",
+ "conversation.with": "Com {names}",
"directory.federated": "De fediverso conhecido",
"directory.local": "From {domain} only",
- "directory.new_arrivals": "New arrivals",
+ "directory.new_arrivals": "Acabaram de chegar",
"directory.recently_active": "Reverta esta propriedade para seu valor padrão",
"embed.instructions": "Incorpore esta postagem em seu site copiando o código abaixo.",
"embed.preview": "Aqui está uma previsão de como ficará:",
@@ -174,7 +174,7 @@
"home.column_settings.basic": "Básico",
"home.column_settings.show_reblogs": "Mostrar compartilhamentos",
"home.column_settings.show_replies": "Mostrar as respostas",
- "home.column_settings.update_live": "Update in real-time",
+ "home.column_settings.update_live": "Atualizar em tempo real",
"intervals.full.days": "{number, plural, one {# dia} other {# dias}}",
"intervals.full.hours": "{number, plural, one {# hora} other {# horas}}",
"intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}",
@@ -240,7 +240,7 @@
"lists.new.title_placeholder": "Novo título da lista",
"lists.search": "Procurar entre as pessoas que você segue",
"lists.subheading": "Suas listas",
- "load_pending": "{count, plural, one {# new item} other {# new items}}",
+ "load_pending": "{count, plural, one {# novo item} other {# novos items}}",
"loading_indicator.label": "Carregando...",
"media_gallery.toggle_visible": "Esconder/Mostrar",
"missing_indicator.label": "Não encontrado",
@@ -268,7 +268,7 @@
"navigation_bar.preferences": "Preferências",
"navigation_bar.public_timeline": "Global",
"navigation_bar.security": "Segurança",
- "notification.and_n_others": "and {count, plural, one {# other} other {# others}}",
+ "notification.and_n_others": "and {count, plural, one {# outro} other {# outros}}",
"notification.favourite": "{name} adicionou a sua postagem aos favoritos",
"notification.follow": "{name} te seguiu",
"notification.mention": "{name} te mencionou",
@@ -334,7 +334,7 @@
"search_results.accounts": "Pessoas",
"search_results.hashtags": "Hashtags",
"search_results.statuses": "Toots",
- "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+ "search_results.statuses_fts_disabled": "Pesquisar toots por seu conteúdo não está habilitado neste servidor Mastodon.",
"search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
"status.admin_account": "Abrir interface de moderação para @{name}",
"status.admin_status": "Abrir esse status na interface de moderação",
@@ -389,18 +389,18 @@
"time_remaining.moments": "Momentos restantes",
"time_remaining.seconds": "{number, plural, one {# segundo restante} other {# segundos restantes}}",
"trends.count_by_accounts": "{count} {rawCount, plural, one {pessoa} other {pessoas}} falando sobre",
- "trends.trending_now": "Trending now",
+ "trends.trending_now": "Em alta no momento",
"ui.beforeunload": "Seu rascunho será perdido se você sair do Mastodon.",
"upload_area.title": "Arraste e solte para enviar",
"upload_button.label": "Adicionar mídia (JPEG, PNG, GIF, WebM, MP4, MOV)",
"upload_error.limit": "Limite de envio de arquivos excedido.",
"upload_error.poll": "Envio de arquivos não é permitido com enquetes.",
"upload_form.description": "Descreva a imagem para deficientes visuais",
- "upload_form.edit": "Edit",
+ "upload_form.edit": "Editar",
"upload_form.undo": "Remover",
"upload_modal.analyzing_picture": "Analisando imagem…",
- "upload_modal.apply": "Apply",
- "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+ "upload_modal.apply": "Aplicar",
+ "upload_modal.description_placeholder": "Grave e cabisbaixo, o filho justo zelava pela querida mãe doente",
"upload_modal.detect_text": "Detectar texto da imagem",
"upload_modal.edit_media": "Edit media",
"upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 1e944768f..04968e59a 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -111,10 +111,10 @@
"confirmations.reply.message": "Odpovedaním akurát teraz prepíšeš správu, ktorú máš práve rozpísanú. Si si istý/á, že chceš pokračovať?",
"confirmations.unfollow.confirm": "Nesleduj",
"confirmations.unfollow.message": "Naozaj chceš prestať sledovať {name}?",
- "conversation.delete": "Delete conversation",
- "conversation.mark_as_read": "Mark as read",
- "conversation.open": "View conversation",
- "conversation.with": "With {names}",
+ "conversation.delete": "Vymaž konverzáciu",
+ "conversation.mark_as_read": "Označ za prečítané",
+ "conversation.open": "Ukáž konverzáciu",
+ "conversation.with": "S {names}",
"directory.federated": "Zo známého fedivesmíru",
"directory.local": "Iba z {domain}",
"directory.new_arrivals": "Nové príchody",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index d7a4da197..fcd2d3016 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -63,7 +63,7 @@
"column.notifications": "การแจ้งเตือน",
"column.pins": "โพสต์ที่ปักหมุด",
"column.public": "เส้นเวลาที่ติดต่อกับภายนอก",
- "column.status": "Toot",
+ "column.status": "โพสต์",
"column_back_button.label": "ย้อนกลับ",
"column_header.hide_settings": "ซ่อนการตั้งค่า",
"column_header.moveLeft_settings": "ย้ายคอลัมน์ไปทางซ้าย",
@@ -111,12 +111,12 @@
"confirmations.reply.message": "การตอบกลับตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
"confirmations.unfollow.confirm": "เลิกติดตาม",
"confirmations.unfollow.message": "คุณแน่ใจหรือไม่ว่าต้องการเลิกติดตาม {name}?",
- "conversation.delete": "Delete conversation",
- "conversation.mark_as_read": "Mark as read",
- "conversation.open": "View conversation",
- "conversation.with": "With {names}",
- "directory.federated": "From known fediverse",
- "directory.local": "From {domain} only",
+ "conversation.delete": "ลบการสนทนา",
+ "conversation.mark_as_read": "ทำเครื่องหมายว่าอ่านแล้ว",
+ "conversation.open": "ดูการสนทนา",
+ "conversation.with": "กับ {names}",
+ "directory.federated": "จากเฟดิเวิร์สที่รู้จัก",
+ "directory.local": "จาก {domain} เท่านั้น",
"directory.new_arrivals": "New arrivals",
"directory.recently_active": "Recently active",
"embed.instructions": "ฝังสถานะนี้ในเว็บไซต์ของคุณโดยคัดลอกโค้ดด้านล่าง",
@@ -174,7 +174,7 @@
"home.column_settings.basic": "พื้นฐาน",
"home.column_settings.show_reblogs": "แสดงการดัน",
"home.column_settings.show_replies": "แสดงการตอบกลับ",
- "home.column_settings.update_live": "Update in real-time",
+ "home.column_settings.update_live": "อัปเดตตามเวลาจริง",
"intervals.full.days": "{number, plural, other {# วัน}}",
"intervals.full.hours": "{number, plural, other {# ชั่วโมง}}",
"intervals.full.minutes": "{number, plural, other {# นาที}}",
diff --git a/config/locales/activerecord.es.yml b/config/locales/activerecord.es.yml
index f40e6c361..2fbf0ffd7 100644
--- a/config/locales/activerecord.es.yml
+++ b/config/locales/activerecord.es.yml
@@ -1,17 +1 @@
----
-es:
- activerecord:
- attributes:
- poll:
- expires_at: Vencimiento
- options: Opciones
- errors:
- models:
- account:
- attributes:
- username:
- invalid: sólo letras, números y guiones bajos
- status:
- attributes:
- reblog:
- taken: del estado ya existe
+--- {}
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index e47bc6871..a725fa349 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -10,7 +10,7 @@ ar:
api: واجهة برمجة التطبيقات
apps: تطبيقات الأجهزة المحمولة
apps_platforms: إستخدم ماستودون في iOS، أندرويد وأنظمة أخرى
- browse_directory: تصفح دليل المستخدمين وافرز بالمصالح
+ browse_directory: تصفح دليل الصفحات التعريفية وصفّي بحسب الإهتمام
browse_public_posts: تصفح تيارًا مباشرًا مِن منشورات عامة على ماستدون
contact: للتواصل معنا
contact_missing: لم يتم تعيينه
@@ -36,6 +36,9 @@ ar:
status_count_before: نشروا
tagline: اتبع أصدقائك وصديقاتك واكتشف آخرين وأخريات
terms: شروط الخدمة
+ unavailable_content: محتوى غير متوفر
+ unavailable_content_description:
+ reason: 'السبب:'
user_count_after:
few: مستخدمين
many: مستخدمين
@@ -82,7 +85,7 @@ ar:
admin: المدير
bot: روبوت
moderator: مُشرِف
- unavailable: الحساب غير متوفر
+ unavailable: الصفحة التعريفية غير متوفرة
unfollow: إلغاء المتابعة
admin:
account_actions:
@@ -154,12 +157,12 @@ ar:
outbox_url: رابط صندوق الصادر
pending: في انتظار المراجعة
perform_full_suspension: تعليق الحساب
- profile_url: رابط الملف الشخصي
+ profile_url: رابط الصفحة التعريفية
promote: ترقية
protocol: البروتوكول
public: عمومي
push_subscription_expires: انتهاء الاشتراك ”PuSH“
- redownload: تحديث الصفحة الشخصية
+ redownload: انعش الصفحة التعريفية
reject: ارفض
reject_all: ارفض الكل
remove_avatar: حذف الصورة الرمزية
@@ -264,7 +267,7 @@ ar:
config: الإعداد
feature_deletions: الحسابات المحذوفة
feature_invites: روابط الدعوات
- feature_profile_directory: دليل الحسابات
+ feature_profile_directory: دليل الملفات التعريفية
feature_registrations: التسجيلات
feature_relay: المُرحّل الفديرالي
feature_spam_check: مكافح البريد المزعج
@@ -294,7 +297,7 @@ ar:
create: إنشاء حظر
hint: لن تمنع كتلة المجال إنشاء إدخالات حساب في قاعدة البيانات ، ولكنها ستطبق طرق الإشراف المحددة بأثر رجعي وتلقائي على هذه الحسابات.
severity:
- desc_html: "Silence سيجعل مشاركات الحساب غير مرئية لأي شخص لا يتبعها. Suspend سيزيل كل محتوى الحساب ووسائطه وبيانات ملفه الشخصي. Use None إذا كنت تريد فقط رفض ملفات الوسائط."
+ desc_html: "Silence سيجعل مشاركات الحساب غير مرئية لأي شخص لا يتبعها. Suspend سيزيل كل محتوى الحساب ووسائطه وبيانات ملفه التعريفي. Use None إذا كنت تريد فقط رفض ملفات الوسائط."
noop: لا شيء
silence: كتم
suspend: تعليق
@@ -437,7 +440,7 @@ ar:
title: إظهار الصور الحساسة في مُعاينات أوبن غراف
profile_directory:
desc_html: السماح للمستخدمين الكشف عن حساباتهم
- title: تفعيل سجل الملفات الشخصية
+ title: تفعيل دليل الصفحات التعريفية
registrations:
closed_message:
desc_html: يتم عرضه على الصفحة الرئيسية عندما يتم غلق تسجيل الحسابات الجديدة. يمكنكم إستخدام علامات الأيتش تي أم أل HTML
@@ -497,7 +500,14 @@ ar:
with_media: تحتوي على وسائط
tags:
context: السياق
+ directory: في دليل حسابات المستخدمين
in_directory: "%{count} في سجل حسابات المستخدمين"
+ last_active: آخر نشاط
+ most_popular: الأكثر شعبية
+ most_recent: الأحدث
+ name: الوسم
+ review: حالة المراجعة
+ reviewed: مُراجَع
title: الوسوم
trending_right_now: متداول اللحظة
unique_uses_today: "%{count} منشورات اليوم"
@@ -527,7 +537,7 @@ ar:
notification_preferences: تعديل خيارات البريد الإلكتروني
salutation: "%{name}،"
settings: 'تغيير تفضيلات البريد الإلكتروني: %{link}'
- view_profile: عرض الملف الشخصي
+ view_profile: اعرض الصفحة التعريفية
view_status: عرض المنشور
applications:
created: تم إنشاء التطبيق بنجاح
@@ -577,9 +587,13 @@ ar:
following: 'مرحى! أنت الآن تتبع:'
post_follow:
close: أو يمكنك إغلاق هذه النافذة.
- return: عرض الملف الشخصي للمستخدم
+ return: اظهر الملف التعريفي للمستخدم
web: واصل إلى الويب
title: إتباع %{acct}
+ challenge:
+ confirm: واصل
+ invalid_password: الكلمة السرية خاطئة
+ prompt: أكِّد الكلمة السرية للمواصلة
datetime:
distance_in_words:
about_x_hours: "%{count}سا"
@@ -598,8 +612,10 @@ ar:
confirm_password: قم بإدخال كلمتك السرية الحالية للتحقق من هويتك
proceed: حذف حساب
success_msg: تم حذف حسابك بنجاح
+ warning:
+ username_unavailable: سيبقى اسم المستخدم الخاص بك غير متوفر
directories:
- directory: سِجلّ الحسابات
+ directory: سِجلّ الصفحات التعريفية
explanation: استكشف مستخدِمين آخرين حسب المواضيع التي تهمهم
explore_mastodon: استكشف %{title}
domain_validator:
@@ -637,7 +653,7 @@ ar:
mutes: قُمتَ بكتم
storage: ذاكرة التخزين
featured_tags:
- add_new: إضافة واحد
+ add_new: أضف واحدًا جديدا
filters:
contexts:
home: الخيط الزمني الرئيسي
@@ -733,6 +749,15 @@ ar:
too_many: لا يمكن إرفاق أكثر من 4 ملفات
migrations:
acct: username@domain للحساب الجديد
+ cancel: ألغِ التوجيه
+ cancelled_msg: تم إلغاء التوجيه بنجاح.
+ errors:
+ not_found: تعذر العثور عليه
+ followers_count: المتابِعين عند الإنتقال
+ incoming_migrations: الانتقال مِن حساب آخر
+ past_migrations: التهجيرات السابقة
+ proceed_with_move: انقل مشارِكيك
+ redirecting_to: حسابك موجَّه إلى %{acct}.
moderation:
title: الإشراف
notification_mailer:
@@ -882,7 +907,7 @@ ar:
back: عودة إلى ماستدون
delete: حذف الحسابات
development: التطوير
- edit_profile: تعديل الملف الشخصي
+ edit_profile: عدّل الصفحة التعريفية
export: تصدير البيانات
featured_tags: الوسوم الشائعة
identity_proofs: دلائل الهوية
@@ -891,7 +916,7 @@ ar:
migrate: تهجير الحساب
notifications: الإخطارات
preferences: التفضيلات
- profile: الملف الشخصي
+ profile: الملف التعريفي
relationships: المتابِعون والمتابَعون
two_factor_authentication: المُصادقة بخُطوَتَيْن
statuses:
@@ -929,6 +954,13 @@ ar:
private: لا يمكن تدبيس تبويق لم يُنشر للعامة
reblog: لا يمكن تثبيت ترقية
poll:
+ total_votes:
+ few: "%{count} أصوات"
+ many: "%{count} أصوات"
+ one: صوت واحد %{count}
+ other: "%{count} صوتا"
+ two: صوتين %{count}
+ zero: بدون صوت %{count}
vote: صوّت
show_more: أظهر المزيد
sign_in_to_participate: قم بتسجيل الدخول للمشاركة في هذه المحادثة
@@ -983,8 +1015,8 @@ ar:
silence: الحساب محدود
suspend: الحساب مُعلَّق
welcome:
- edit_profile_action: تهيئة الملف الشخصي
- edit_profile_step: يُمكنك·كي تخصيص ملفك الشخصي عن طريق تحميل صورة رمزية ورأسية و بتعديل اسمك·كي العلني وأكثر. و إن أردت·تي معاينة المتابِعين و المتابعات الجُدد قبيل السماح لهم·ن بمتابَعتك فيمكنك·كي تأمين حسابك·كي.
+ edit_profile_action: تهيئة الملف التعريفي
+ edit_profile_step: يُمكنك·كي تخصيص صفحتك التعريفية عن طريق تحميل صورة رمزية ورأسية و بتعديل اسمك·كي العلني وأكثر. و إن أردت·تي معاينة المتابِعين و المتابعات الجُدد قبيل السماح لهم·ن بمتابَعتك فيمكنك·كي تأمين حسابك·كي.
explanation: ها هي بعض النصائح قبل بداية الاستخدام
final_action: اشرَع في النشر
final_step: |-
diff --git a/config/locales/co.yml b/config/locales/co.yml
index ac558e64e..f1733ad2b 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -35,6 +35,13 @@ co:
status_count_before: chì anu pubblicatu
tagline: Siguità amichi è scopre ancu di più altri
terms: Cundizione di u serviziu
+ unavailable_content: Cuntinutu micca dispunibule
+ unavailable_content_description:
+ reason: 'Ragione:'
+ rejecting_media: I fugliali media da stu servore ùn saranu micca arregistrati è e vignette ùn saranu micca affissate, duverete cliccà manualmente per accede à l'altru servore è vedeli.
+ silenced: I statuti da stu servore ùn saranu mai visti tranne nant'a vostra pagina d'accolta s'e voi siguitate l'autore.
+ suspended: Ùn puderete micca siguità qualsiasi nant'à stu servore, i dati versu o da quallà ùn saranu mai accessi, scambiati o arregistrati.
+ unavailable_content_html: Mastodon vi parmette in generale di vede u cuntinutu è interagisce cù l'utilizatori di tutti l'altri servori di u fediversu. Quessi sò l'eccezzione fatte nant'à stu servore in particulare.
user_count_after:
one: utilizatore
other: utilizatori
@@ -547,6 +554,12 @@ co:
new_trending_tag:
body: 'U hashtag #%{name} hè in e tendenze oghji, mà ùn hè micca verificatu. Ùn sarà micca mustratu à u pubblicu eccettu s''ellu hè auturizatu, o pudete ancu salvà u furmulariu cusì per ùn mai più avè à ne sente parlà.'
subject: Novu hashtag in attesa di rivista nant'à %{instance} (#%{name})
+ aliases:
+ add_new: Creà un pseudonimu
+ created_msg: Novu pseudonimu creatu. Pudete avà inizià u trasferimentu da u vechju contu.
+ deleted_msg: U pseudonimu hè statu sguassatu. Ùn si puderà più migrà da questu contu à quellu.
+ hint_html: Per traslucà da un altru contu à questu, quì pudete creà un pseudonimu o "alias", riquisitu per trasferì l'abbunati da u vechju contu à u novu. St'azzione sola ùn face nunda è pò esse annullata senza prublemi. A migrazione hè principiata dapoi u vechju contu.
+ remove: Sguassà u pseudonimu
appearance:
advanced_web_interface: Interfaccia web avanzata
advanced_web_interface_hint: 'S''è voi vulete fà usu di a larghezza sana di u vostru screnu, l''interfaccia web avanzata vi permette di cunfigurà parechje culonne sfarente per vede tutta l''infurmazione chì vulete vede in listessu tempu: Accolta, nutificazione, linea pubblica, è tutti l''hashtag è liste chì vulete.'
@@ -606,6 +619,7 @@ co:
confirming: In attesa di a cumplezzione di a cunfirmazione di l'e-mail.
functional: U vostru contu hè uperaziunale.
pending: A vostra dumanda hè in attesa di rivista da a squadra di muderazione. Quessa pò piglià un certu tempu. Avete da riceve un'e-mail s'ella hè appruvata.
+ redirecting_to: U vostru contu hè inattivu perchè riindirizza versu %{acct}.
trouble_logging_in: Difficultà per cunnettavi?
authorize_follow:
already_following: Site digià abbunatu·a à stu contu
@@ -795,6 +809,31 @@ co:
too_many: Ùn si pò micca aghjunghje più di 4 fugliali
migrations:
acct: cugnome@duminiu di u novu contu
+ cancel: Annullà ridirezzione
+ cancel_explanation: L'annullazione di a ridirezzione hà da riattivà stu contu, mà ùn si puderà micca ricuperà l'abbunati chì sò digià stati trasferriti à l'altru contu.
+ cancelled_msg: Ridirezzione annullata.
+ errors:
+ already_moved: hè digià u contu induve avede traslucatu
+ missing_also_known_as: ùn fà micca riferenza à stu contu
+ move_to_self: ùn pò micca esse u contu attuale
+ not_found: ùn hè micca statu trovu
+ on_cooldown: Perioda di ricuperazione
+ followers_count: Abbunati à u mumentu di trasferimentu
+ incoming_migrations: Traslucà da un'altru contu
+ incoming_migrations_html: Per spustà da stu contu à un'altru, primu duvete creà un pseudonimu di contu.
+ moved_msg: Avà u vostru contu riindirizza versu %{acct} è i vostri abbunati sò in corsu di trasferimentu.
+ not_redirecting: U vostru contu ùn riindirizza micca ancu versu un'altru contu.
+ on_cooldown: Avede digià migratu u vostru contu. Sta funzionne sarà torna dispunibule in %{count} ghjorni.
+ past_migrations: Anziane migrazione
+ proceed_with_move: Trasferì l'abbunati
+ redirecting_to: U vostru contu riindirizza versu à %{acct}.
+ warning:
+ backreference_required: U novu contu deve prima esse cunfiguratu per fà rifirenza cù un pseudonimu à quessu contu
+ before: 'Nanz''à cuntinuà, leghjete ste note attentamente:'
+ cooldown: Dopu à a traslucazione, c'hè una perioda di ricuperazione in quella ùn puderete micca cambià torna di contu
+ disabled_account: U contu attuale ùn puderà più esse utilizatu dop'à st'azzione. Però, puderete accede à a spurtazione di dati o riattivà u contu.
+ followers: St'azzione hà da spiazzà tutti l'abbunati di u contu attuale nant'à u novu contu
+ other_data: L'altri dati ùn saranu micca autumaticamente trasferiti
moderation:
title: Muderazione
notification_mailer:
@@ -939,6 +978,7 @@ co:
settings:
account: Contu
account_settings: Parametri di u contu
+ aliases: Pseudonimi di contu
appearance: Apparenza
authorized_apps: Applicazione auturizate
back: Ritornu nant’à Mastodon
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index add1c78d5..21b349799 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -250,8 +250,10 @@ cs:
disabled_msg: Emoji bylo úspěšně zakázáno
emoji: Emoji
enable: Povolit
+ enabled: Povoleno
enabled_msg: Emoji bylo úspěšně povoleno
image_hint: PNG až do 50 KB
+ list: Uvést
listed: Uvedeno
new:
title: Přidat nové vlastní emoji
@@ -260,6 +262,7 @@ cs:
shortcode_hint: Alespoň 2 znaky, pouze alfanumerické znaky a podtržítka
title: Vlastní emoji
uncategorized: Nezařazená
+ unlist: Neuvést
unlisted: Neuvedeno
update_failed_msg: Nebylo možné aktualizovat toto emoji
updated_msg: Emoji úspěšně aktualizováno!
@@ -395,6 +398,7 @@ cs:
pending: Čekám na souhlas mostu
save_and_enable: Uložit a povolit
setup: Nastavit připojení k mostu
+ signatures_not_enabled: Mosty nebudou fungovat správně, dokud je povolen bezpečný režim nebo režim bílé listiny
status: Stav
title: Mosty
report_notes:
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index 2027a7316..24bed1060 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -21,6 +21,9 @@ cy:
generic_description: Mae %{domain} yn un gweinydd yn y rhwydwaith
get_apps: Rhowch gynnig ar ap dyfeis symudol
hosted_on: Mastodon wedi ei weinyddu ar %{domain}
+ instance_actor_flash: |
+ Mae'r cyfrif hwn yn actor rhithwir a ddefnyddir i gynrychioli'r gweinydd ei hun ac nid unrhyw ddefnyddiwr unigol.
+ Fe'i defnyddir at ddibenion ffederasiwn ac ni ddylid ei rwystro oni bai eich bod am rwystro'r achos cyfan, ac os felly dylech ddefnyddio bloc parth.
learn_more: Dysu mwy
privacy_policy: Polisi preifatrwydd
see_whats_happening: Gweld beth sy'n digwydd
@@ -41,6 +44,7 @@ cy:
reason: 'Rheswm:'
rejecting_media: Ni fydd ffeiliau cyfryngau o'r gweinydd hwn yn cael eu prosesu ac ni fydd unrhyw fawd yn cael eu harddangos, sy'n gofyn am glicio â llaw i'r gweinydd arall.
silenced: Ni fydd swyddi o'r gweinydd hwn yn ymddangos yn unman heblaw eich porthiant cartref os dilynwch yr awdur.
+ suspended: Ni fyddwch yn gallu dilyn unrhyw un o'r gweinydd hwn, ac ni fydd unrhyw ddata ohono'n cael ei brosesu na'i storio, ac ni chyfnewidir unrhyw ddata.
unavailable_content_html: Yn gyffredinol, mae Mastodon yn caniatáu ichi weld cynnwys gan unrhyw weinyddwr arall yn y ffederasiwn a rhyngweithio â hi. Dyma'r eithriadau a wnaed ar y gweinydd penodol hwn.
user_count_after:
few: defnyddwyr
@@ -53,6 +57,8 @@ cy:
what_is_mastodon: Beth yw Mastodon?
accounts:
choices_html: 'Dewisiadau %{name}:'
+ endorsements_hint: Gallwch gymeradwyo pobl rydych chi'n eu dilyn o'r rhyngwyneb gwe, a byddan nhw'n ymddangos yma.
+ featured_tags_hint: Gallwch ychwanegu hashnodau penodol a fydd yn cael eu harddangos yma.
follow: Dilynwch
followers:
few: Dilynwyr
@@ -203,6 +209,7 @@ cy:
username: Enw defnyddiwr
warn: Rhybuddio
web: Gwe
+ whitelisted: Rhestredig wen
action_logs:
actions:
assigned_to_self_report: Aseiniodd %{name} adroddiad %{target} i'w hunan
@@ -238,6 +245,7 @@ cy:
deleted_status: "(statws wedi ei ddileu)"
title: Log archwilio
custom_emojis:
+ assign_category: Neilltuo categori
by_domain: Parth
copied_msg: Llwyddwyd i greu copi lleol o'r emoji
copy: Copïo
@@ -265,6 +273,7 @@ cy:
updated_msg: Llwyddwyd i ddiweddaru'r emoji!
upload: Uwchlwytho
dashboard:
+ authorized_fetch_mode: Modd nôl awdurdodedig
backlog: tasgau heb eu cwblhau
config: Cyfluniad
feature_deletions: Dileadau cyfrif
@@ -290,11 +299,18 @@ cy:
week_interactions: ymadweithiau yr wythnos hon
week_users_active: gweithredol yr wythnos hon
week_users_new: defnyddwyr yr wythnos hon
+ whitelist_mode: Modd rhestr wen
+ domain_allows:
+ add_new: Rhestrwch parth
+ created_msg: Rhestrwyd wen parth yn llwyddiannus
+ destroyed_msg: Mae parth wedi'i dynnu o'r rhestr wen
+ undo: Tynnwch o'r rhestr wen
domain_blocks:
add_new: Ychwanegu bloc parth newydd
created_msg: Mae'r bloc parth nawr yn cael ei brosesu
destroyed_msg: Mae'r bloc parth wedi ei ddadwneud
domain: Parth
+ edit: Golygu bloc parth
existing_domain_block_html: Rydych yn barod wedi gosod cyfyngau fwy llym ar %{name}, mae rhaid i chi ei ddadblocio yn gyntaf.
new:
create: Creu bloc
@@ -330,6 +346,7 @@ cy:
title: Dadwneud blocio parth ar gyfer %{domain}
undo: Dadwneud
undo: Dadwneud bloc parth
+ view: Gweld bloc parth
email_domain_blocks:
add_new: Ychwanegu
created_msg: Llwyddwyd i ychwanegu parth e-bost i'r gosbrestr
@@ -501,6 +518,7 @@ cy:
delete: Dileu
nsfw_off: Marcio fel nad yw'n sensitif
nsfw_on: Marcio'n sensitif
+ deleted: Dilëwyd
failed_to_execute: Methwyd a gweithredu
media:
title: Cyfryngau
@@ -514,6 +532,7 @@ cy:
name: Hashnod
reviewed: Wedi'i adolygu
title: Hashnodau
+ trending_right_now: Yn tueddu nawr
unreviewed: Heb ei adolygu
title: Gweinyddiaeth
warning_presets:
@@ -574,6 +593,14 @@ cy:
reset_password: Ailosod cyfrinair
security: Diogelwch
set_new_password: Gosod cyfrinair newydd
+ setup:
+ title: Gosodiad
+ status:
+ account_status: Statws cyfrif
+ confirming: Aros i gadarnhad e-bost gael ei gwblhau.
+ functional: Mae eich cyfrif yn gwbl weithredol.
+ pending: Mae'ch cais yn aros i gael ei adolygu gan ein staff. Gall hyn gymryd cryn amser. Byddwch yn derbyn e-bost os caiff eich cais ei gymeradwyo.
+ redirecting_to: Mae eich cyfrif yn anactif oherwydd ei fod ar hyn o bryd yn ailgyfeirio i %{acct}.
trouble_logging_in: Trafferdd mewngofnodi?
authorize_follow:
already_following: Yr ydych yn dilyn y cyfrif hwn yn barod
@@ -586,6 +613,11 @@ cy:
return: Dangos proffil y defnyddiwr
web: I'r wê
title: Dilyn %{acct}
+ challenge:
+ confirm: Parhau
+ hint_html: "Awgrym: Ni fyddwn yn gofyn i chi am eich cyfrinair eto am yr awr nesaf."
+ invalid_password: Cyfrinair annilys
+ prompt: Cadarnhewch gyfrinair i barhau
datetime:
distance_in_words:
about_x_hours: "%{count}awr"
@@ -601,13 +633,22 @@ cy:
x_months: "%{count}mis"
x_seconds: "%{count}eiliad"
deletes:
+ challenge_not_passed: Nid oedd y wybodaeth a nodoch yn gywir
confirm_password: Mewnbynnwch eich cyfrinair presennol i gadarnhau mai chi sydd yno
+ confirm_username: Rhowch eich enw defnyddiwr i gadarnhau'r weithdrefn
proceed: Dileu cyfrif
success_msg: Llwyddwyd i ddileu eich cyfrif
+ warning:
+ before: 'Cyn bwrw ymlaen, darllenwch y nodiadau hyn yn ofalus:'
+ irreversible: Ni fyddwch yn gallu adfer nac ail-greu eich cyfrif
+ username_available: Bydd eich enw defnyddiwr ar gael eto
+ username_unavailable: Ni fydd eich enw defnyddiwr ar gael
directories:
directory: Cyfeiriadur proffil
explanation: Darganfod defnyddwyr yn seiliedig ar eu diddordebau
explore_mastodon: Archwilio %{title}
+ domain_validator:
+ invalid_domain: ddim yn enw parth dilys
errors:
'400': The request you submitted was invalid or malformed.
'403': Nid oes gennych ganiatad i weld y dudalen hon.
@@ -665,6 +706,7 @@ cy:
developers: Datblygwyr
more: Mwy…
resources: Adnoddau
+ trending_now: Yn tueddu nawr
generic:
all: Popeth
changes_saved_msg: Llwyddwyd i gadw y newidiadau!
@@ -748,8 +790,12 @@ cy:
too_many: Ni ellir ychwanegu mwy na 4 dogfen
migrations:
acct: enwdefnyddiwr@parth y cyfrif newydd
+ cancel: Canslo ailgyfeirio
errors:
not_found: ni ellid dod o hyd iddo
+ past_migrations: Ymfudiadau yn y gorffennol
+ warning:
+ before: 'Cyn bwrw ymlaen, darllenwch y nodiadau hyn yn ofalus:'
moderation:
title: Goruwchwyliad
notification_mailer:
@@ -904,6 +950,7 @@ cy:
settings:
account: Cyfrif
account_settings: Gosodiadau'r cyfrif
+ aliases: Aliasau cyfrif
appearance: Arddangosiad
authorized_apps: Apiau awdurdodedig
back: Yn ôl i Mastodon
@@ -978,6 +1025,8 @@ cy:
pinned: Tŵt wedi'i binio
reblogged: hybwyd
sensitive_content: Cynnwys sensitif
+ tags:
+ does_not_match_previous_name: ddim yn cyfateb i'r enw blaenorol
terms:
body_html: |
Polisi Preifatrwydd
@@ -1095,7 +1144,9 @@ cy:
disable: Er bod eich cyfrif wedi'i rewi, mae eich data cyfrif yn parhau i fod yn gyfan, ond ni allwch chi berfformio unrhyw gamau nes ei ddatgloi.
silence: Pan mae eich cyfrif yn gyfyngiedig, dim ond pobl sydd yn barod yn eich dilyn yn gweld eich tŵtiau ar y gweinydd hon, a efallai byddwch yn cael eich tynnu o restrau cyhoeddus. Er hyn, gall eraill eich dilyn chi wrth law.
suspend: Mae eich cyfrif wedi cael ei wahardd, a mae gyd o'ch tŵtiau a'ch ffeiliau cyfrwng uwchlwythadwy wedi cael eu tynnu or gweinydd yn barhaol, ac o weinyddau ble yr oedd eich dilynwyr.
+ get_in_touch: Gallwch ymateb i'r e-bost hwn i gysylltu â staff %{instance}.
review_server_policies: Adolygu polisïau'r gweinydd
+ statuses: 'Yn benodol, ar gyfer:'
subject:
disable: Mae'ch cyfrif %{acct} wedi'i rewi
none: Rhybudd am %{acct}
diff --git a/config/locales/devise.ar.yml b/config/locales/devise.ar.yml
index 366bd81b9..90f026e10 100644
--- a/config/locales/devise.ar.yml
+++ b/config/locales/devise.ar.yml
@@ -45,6 +45,10 @@ ar:
extra: إن لم تكن صاحب هذا الطلب ، يُرجى عدم إعارة الاهتمام لهذه الرسالة. فكلِمَتُك السرية تبقى هي مِن غير أي تعديل إلّا و فقط إن قمت بالنقر على الرابط أعلاه قصد إنشاء كلمة سرية جديدة.
subject: 'ماستدون: تعليمات استعادة كلمة المرور'
title: إعادة تعيين كلمة السر
+ two_factor_disabled:
+ title: إنّ 2FA معطّل
+ two_factor_enabled:
+ title: إنّ 2FA نشِط
unlock_instructions:
subject: 'ماستدون: تعليمات فك القفل'
omniauth_callbacks:
diff --git a/config/locales/devise.es.yml b/config/locales/devise.es.yml
index 80d438092..515d5c1ed 100644
--- a/config/locales/devise.es.yml
+++ b/config/locales/devise.es.yml
@@ -1,98 +1 @@
----
-es:
- devise:
- confirmations:
- confirmed: Su direccion de email ha sido confirmada con exito.
- send_instructions: Recibirá un correo electrónico con instrucciones sobre cómo confirmar su dirección de correo en pocos minutos.
- send_paranoid_instructions: Si su dirección de correo electrónico existe en nuestra base de datos, recibirá un correo electrónico con instrucciones sobre cómo confirmar su dirección de correo en pocos minutos.
- failure:
- already_authenticated: Usted ya está registrado.
- inactive: Su cuenta todavía no está activa.
- invalid: Inválido %{authentication_keys} o contraseña.
- last_attempt: Tiene un intento más antes de que su cuenta sea bloqueada.
- locked: Su cuenta está bloqueada.
- not_found_in_database: Inválido %{authentication_keys} o contraseña.
- pending: Su cuenta aun se encuentra bajo revisión.
- timeout: Su sesión ha expirado. Por favor inicie sesión de nuevo para continuar.
- unauthenticated: Necesita iniciar sesión o registrarse antes de continuar.
- unconfirmed: Tiene que confirmar su dirección de correo electrónico antes de continuar.
- mailer:
- confirmation_instructions:
- action: Verificar dirección de correo electrónico
- action_with_app: Confirmar y regresar a %{app}
- explanation: Has creado una cuenta en %{host} con esta dirección de correo electrónico. Estas a un clic de activarla. Si no fue usted, por favor ignore este correo electrónico.
- explanation_when_pending: Usted ha solicitado una invitación a %{host} con esta dirección de correo electrónico. Una vez que confirme su dirección de correo electrónico, revisaremos su aplicación. No puede iniciar sesión hasta que su aplicación sea revisada. Si su solicitud está rechazada, sus datos serán eliminados, así que no será necesaria ninguna acción adicional por ti. Si no fuera usted, por favor ignore este correo electrónico.
- extra_html: Por favor revise las reglas de la instancia y nuestros términos de servicio.
- subject: 'Mastodon: Instrucciones de confirmación para %{instance}'
- title: Verificar dirección de correo electrónico
- email_changed:
- explanation: 'El correo electrónico para su cuenta esta siendo cambiada a:'
- extra: Si usted no ha cambiado su correo electrónico, es probable que alguien haya conseguido acceso a su cuenta. Por favor cambie su contraseña inmediatamente o contacte al administrador de la instancia si usted no puede iniciar sesión.
- subject: 'Mastodon: Correo electrónico cambiado'
- title: Nueva dirección de correo electrónico
- password_change:
- explanation: La contraseña de su cuenta a sido cambiada.
- extra: Si usted no a cambiado su contraseña. es probable que alguien a conseguido acceso a su cuenta. Por favor cambie su contraseña inmediatamente o contacte a el administrador de la instancia si usted esta bloqueado de su cuenta.
- subject: 'Mastodon: Contraseña cambiada'
- title: Contraseña cambiada
- reconfirmation_instructions:
- explanation: Confirme la nueva dirección para cambiar su coreo electrónico.
- extra: Si no iniciaste este cambio, por favor ignora este correo. Esta dirección de correo para la cuenta de Mastodon no cambiará hasta que accedas al vinculo arriba.
- subject: 'Mastodon: Confirme correo electrónico para %{instance}'
- title: Verifique dirección de correo electrónico
- reset_password_instructions:
- action: Cambiar contraseña
- explanation: Solicitaste una nueva contraseña para tu cuenta.
- extra: Si no solicitaste esto, por favor ignora este correo. Tu contraseña no cambiará hasta que tu accedas al vinculo arriba y crees una nueva.
- subject: 'Mastodon: Instrucciones para reiniciar contraseña'
- title: Reiniciar contraseña
- two_factor_disabled:
- explanation: La autenticación de dos factores para tu cuenta ha sido deshabilitada. Ahora puedes conectarte solamente usando la dirección de correo electrónico y la contraseña.
- subject: 'Mastodon: La autenticación de dos factores está deshabilitada'
- title: 2FA desactivada
- two_factor_enabled:
- explanation: La autenticación de dos factores para tu cuenta ha sido habilitada. Se requiere un token generado por la aplicación TOTP emparejada para ingresar.
- subject: 'Mastodon: La autenticación de dos factores está habilitada'
- title: 2FA activada
- two_factor_recovery_codes_changed:
- explanation: Los códigos de recuperación previos han sido invalidados y se generaron códigos nuevos.
- subject: 'Mastodon: Los códigos de recuperación de dos factores fueron regenerados'
- title: Códigos de recuperación 2FA cambiados
- unlock_instructions:
- subject: 'Mastodon: Instrucciones para desbloquear'
- omniauth_callbacks:
- failure: No podemos autentificarle desde %{kind} debido a "%{reason}".
- success: Autentificado con éxito desde la cuenta %{kind} .
- passwords:
- no_token: No puede acceder a esta página sin provenir desde el correo de reinicio de contraseña. Si viene desde el correo de reinicio de contraseña, por favor asegúrese que está utilizando la dirección completa proporcionada.
- send_instructions: Recibirá un correo electrónico con instrucciones sobre cómo reiniciar su contraseña en pocos minutos.
- send_paranoid_instructions: Si su correo electrónico existe en nuestra base de datos, recibirá un enlace de recuperación de contraseña en su dirección de correo en pocos minutos.
- updated: Su contraseña ha sido cambiada con éxito. Ahora ya está registrado.
- updated_not_active: Su contraseña ha sido cambiada con éxito.
- registrations:
- destroyed: "¡Adios! Su cuenta ha sido cancelada con éxito. Esperamos verle pronto de nuevo."
- signed_up: "¡Bienvenido! Se ha registrado con éxito."
- signed_up_but_inactive: Se ha registrado con éxito. Sin embargo, no podemos identificarle porque su cuenta no ha sido activada todavía.
- signed_up_but_locked: Se ha registrado con éxito. Sin embargo, no podemos identificarle porque su cuenta está bloqueada.
- signed_up_but_pending: Un mensaje con un enlace de confirmacion ha sido enviado a su direccion de email. Luego de clickear el link revisaremos su aplicacion. Seras notificado si es aprovada.
- signed_up_but_unconfirmed: Un mensaje con un enlace de confirmación ha sido enviado a su correo electrónico. Por favor siga el enlace para activar su cuenta.
- update_needs_confirmation: Ha actualizado su cuenta con éxito, pero necesitamos verificar su nueva dirección de correo. Por favor compruebe su correo y siga el enlace para confirmar su nueva dirección de correo.
- updated: su cuenta ha sido actualizada con éxito.
- sessions:
- already_signed_out: Cerró sesión con éxito.
- signed_in: Se registró con éxito.
- signed_out: Cerró sesión con éxito.
- unlocks:
- send_instructions: Recibirá un correo electrónico con instrucciones sobre cómo desbloquear su cuenta en pocos minutos.
- send_paranoid_instructions: Si su cuenta existe, recibirá un correo electrónico con instrucciones sobre cómo desbloquearla en pocos minutos.
- unlocked: Su cuenta ha sido desbloqueada con éxito. Por favor inicie sesión para continuar.
- errors:
- messages:
- already_confirmed: ya fue confirmado, por favor intente iniciar sesión
- confirmation_period_expired: necesita ser confirmado dentro de %{period}, por favor pida una nueva
- expired: ha expirado, por favor pida una nueva
- not_found: no encontrado
- not_locked: no fue bloqueada
- not_saved:
- one: '1 error prohibió este %{resource} de ser guardado:'
- other: "%{count} errores prohibieron este %{resource} de ser guardado:"
+es-AR:
diff --git a/config/locales/devise.hu.yml b/config/locales/devise.hu.yml
index e495cb5f0..62888be74 100644
--- a/config/locales/devise.hu.yml
+++ b/config/locales/devise.hu.yml
@@ -46,6 +46,18 @@ hu:
extra: Amennyiben nem te kezdeményezted a módosítást, kérjük tekintsd ezt az e-mailt tárgytalannak. A Mastodon fiókodhoz tartozó jelszavad változatlan marad mindaddig, amíg újat nem hozol létre a fenti linkre kattintva.
subject: 'Mastodon: Jelszó visszaállítási lépések'
title: Jelszó visszaállítása
+ two_factor_disabled:
+ explanation: A fiókod kétlépcsős hitelesítését letiltottuk. A bejelentkezés most már csak e-mail címmel és jelszóval lehetséges.
+ subject: Kétlépcsős azonosítás letiltva
+ title: Kétlépcsős hitelesítés engedélyezve
+ two_factor_enabled:
+ explanation: Kétlépcsős hitelesítés engedélyezve van a fiókodban. Bejelentkezéshez a párosított TOTP alkalmazás által létrehozott tokenre lesz szükség.
+ subject: Kétlépcsős azonosítás engedélyezve
+ title: Kétlépcsős hitelesítés engedélyezve
+ two_factor_recovery_codes_changed:
+ explanation: A korábbi helyreállítási kódokat letiltottuk, és újakat generáltunk.
+ subject: Kétlépcsős helyreállítási kódok újra létrejöttek
+ title: A kétlépcsős kódok megváltozott
unlock_instructions:
subject: 'Mastodon: Feloldási lépések'
omniauth_callbacks:
diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml
index dc147be62..ffdbd1b60 100644
--- a/config/locales/devise.ja.yml
+++ b/config/locales/devise.ja.yml
@@ -46,6 +46,18 @@ ja:
extra: この要求に心当たりがない場合、このメールを無視してください。上記リンク先にアクセスし新しいものを作成するまでパスワードは変更されません。
subject: 'Mastodon: パスワード再発行'
title: パスワード再発行
+ two_factor_disabled:
+ explanation: あなたのアカウントの二段階認証が無効化されました。メールとパスワードのみでログインできます。
+ subject: 'Mastodon: 二段階認証が無効になりました'
+ title: 二段階認証が無効化されました
+ two_factor_enabled:
+ explanation: あなたのアカウントの二段階認証が有効化されました。ログインするには TOTP アプリで生成されたコードが必要です。
+ subject: 'Mastodon: 二段階認証が有効になりました'
+ title: 二段階認証が有効化されました
+ two_factor_recovery_codes_changed:
+ explanation: 以前のリカバリーコードが無効化され、新しいコードが生成されました。
+ subject: 'Mastodon: 二段階認証のリカバリーコードが再生成されました'
+ title: 二段階認証のリカバリーコードが変更されました
unlock_instructions:
subject: 'Mastodon: アカウントのロックの解除'
omniauth_callbacks:
diff --git a/config/locales/doorkeeper.ar.yml b/config/locales/doorkeeper.ar.yml
index f443d0dd3..51d8b76b4 100644
--- a/config/locales/doorkeeper.ar.yml
+++ b/config/locales/doorkeeper.ar.yml
@@ -133,7 +133,7 @@ ar:
read:search: البحث مكانك
read:statuses: رؤية كافة المنشورات
write: تغيير كافة بيانات حسابك
- write:accounts: تعديل ملفك الشخصي
+ write:accounts: تعديل صفحتك التعريفية
write:blocks: حجب الحسابات و النطاقات
write:favourites: الإعجاب بمنشورات
write:filters: إنشاء عوامل تصفية
diff --git a/config/locales/doorkeeper.es.yml b/config/locales/doorkeeper.es.yml
index 1b03e33f2..515d5c1ed 100644
--- a/config/locales/doorkeeper.es.yml
+++ b/config/locales/doorkeeper.es.yml
@@ -1,148 +1 @@
----
-es:
- activerecord:
- attributes:
- doorkeeper/application:
- name: Nombre de aplicación
- redirect_uri: URI para redirección
- scopes: Ámbitos
- website: Sitio web
- errors:
- models:
- doorkeeper/application:
- attributes:
- redirect_uri:
- fragment_present: no puede contener un fragmento.
- invalid_uri: debe ser un URI válido.
- relative_uri: debe ser una URI absoluta.
- secured_uri: debe ser un URI HTTPS/SSL.
- doorkeeper:
- applications:
- buttons:
- authorize: Autorizar
- cancel: Cancelar
- destroy: Destruir
- edit: Editar
- submit: Enviar
- confirmations:
- destroy: "¿Está seguro?"
- edit:
- title: Editar aplicación
- form:
- error: "¡Uuups! Compruebe su formulario"
- help:
- native_redirect_uri: Utilice %{native_redirect_uri} para pruebas locales
- redirect_uri: Utilice una línea por URI
- scopes: Separe los ámbitos con espacios. Déjelo en blanco para utilizar los ámbitos por defecto.
- index:
- application: Aplicación
- callback_url: URL de callback
- delete: Eliminar
- name: Nombre
- new: Nueva aplicación
- scopes: Ámbitos
- show: Mostrar
- title: Sus aplicaciones
- new:
- title: Nueva aplicación
- show:
- actions: Acciones
- application_id: Id de la aplicación
- callback_urls: URLs de callback
- scopes: Ámbitos
- secret: Secreto
- title: 'Aplicación: %{name}'
- authorizations:
- buttons:
- authorize: Autorizar
- deny: Desautorizar
- error:
- title: Ha ocurrido un error
- new:
- able_to: Será capaz de
- prompt: La aplicación %{client_name} solicita tener acceso a su cuenta
- title: Se requiere autorización
- show:
- title: Copia este código de autorización y pégalo en la aplicación.
- authorized_applications:
- buttons:
- revoke: Revocar
- confirmations:
- revoke: "¿Está seguro?"
- index:
- application: Aplicación
- created_at: Creado el
- date_format: "%A-%m-%d %H:%M:%S"
- scopes: Ámbitos
- title: Sus aplicaciones autorizadas
- errors:
- messages:
- access_denied: El propietario del recurso o servidor de autorización denegó la petición.
- credential_flow_not_configured: Las credenciales de contraseña del propietario del recurso falló debido a que Doorkeeper.configure.resource_owner_from_credentials está sin configurar.
- invalid_client: La autentificación del cliente falló debido o a que es un cliente desconocido o no está incluída la autentificación del cliente o el método de autentificación no está confirmado.
- invalid_grant: La concesión de autorización ofrecida es inválida, venció, se revocó, no coincide con la URI de redirección utilizada en la petición de autorización, o fue emitida para otro cliente.
- invalid_redirect_uri: La URI de redirección incluida no es válida.
- invalid_request: En la petición falta un parámetro necesario o incluye un valor de parámetro no soportado o tiene otro tipo de formato incorrecto.
- invalid_resource_owner: Las credenciales proporcionadas del propietario del recurso no son válidas, o el propietario del recurso no puede ser encontrado
- invalid_scope: El ámbito pedido es inválido, desconocido o erróneo.
- invalid_token:
- expired: El autentificador de acceso expiró
- revoked: El autentificador de acceso fue revocado
- unknown: El autentificador de acceso es inválido
- resource_owner_authenticator_not_configured: El propietario del recurso falló debido a que Doorkeeper.configure.resource_owner_authenticator está sin configurar.
- server_error: El servidor de la autorización entontró una condición inesperada que le impidió cumplir con la solicitud.
- temporarily_unavailable: El servidor de la autorización es actualmente incapaz de manejar la petición debido a una sobrecarga temporal o un trabajo de mantenimiento del servidor.
- unauthorized_client: El cliente no está autorizado a realizar esta petición utilizando este método.
- unsupported_grant_type: El tipo de concesión de autorización no está soportado por el servidor de autorización.
- unsupported_response_type: El servidor de autorización no soporta este tipo de respuesta.
- flash:
- applications:
- create:
- notice: Aplicación creada.
- destroy:
- notice: Aplicación eliminada.
- update:
- notice: Aplicación actualizada.
- authorized_applications:
- destroy:
- notice: Aplicación revocada.
- layouts:
- admin:
- nav:
- applications: Aplicaciones
- oauth2_provider: Proveedor OAuth2
- application:
- title: OAuth autorización requerida
- scopes:
- admin:read: leer todos los datos en el servidor
- admin:read:accounts: leer información sensible de todas las cuentas
- admin:read:reports: leer información sensible de todos los informes y cuentas reportadas
- admin:write: modificar todos los datos en el servidor
- admin:write:accounts: realizar acciones de moderación en cuentas
- admin:write:reports: realizar acciones de moderación en informes
- follow: seguir, bloquear, desbloquear y dejar de seguir cuentas
- push: recibir tus notificaciones push
- read: leer los datos de tu cuenta
- read:accounts: ver información de cuentas
- read:blocks: ver a quién has bloqueado
- read:favourites: ver tus favoritos
- read:filters: ver tus filtros
- read:follows: ver a quién sigues
- read:lists: ver tus listas
- read:mutes: ver a quién has silenciado
- read:notifications: ver tus notificaciones
- read:reports: ver tus informes
- read:search: buscar en su nombre
- read:statuses: ver todos los estados
- write: publicar en tu nombre
- write:accounts: modifica tu perfil
- write:blocks: bloquear cuentas y dominios
- write:favourites: toots favoritos
- write:filters: crear filtros
- write:follows: seguir usuarios
- write:lists: crear listas
- write:media: subir archivos multimedia
- write:mutes: silenciar usuarios y conversaciones
- write:notifications: limpia tus notificaciones
- write:reports: reportar a otras personas
- write:statuses: publicar estados
+es-AR:
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 03974fa17..5975e1b53 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -35,6 +35,9 @@ el:
status_count_before: Που έγραψαν
tagline: Ακολούθησε τους γνωστούς σου και ανακάλυψε νέους ανθρώπους
terms: Όροι χρήσης
+ unavailable_content: Μη διαθέσιμο
+ unavailable_content_description:
+ reason: 'Αιτία:'
user_count_after:
one: χρήστης
other: χρήστες
@@ -235,6 +238,7 @@ el:
disabled_msg: Επιτυχής απενεργοποίηση αυτού του emoji
emoji: Emoji
enable: Ενεργοποίηση
+ enabled: Ενεργοποιημένα
enabled_msg: Επιτυχής ενεργοποίηση αυτού του emoji
image_hint: PNG έως 50KB
listed: Αναφερθέντα
@@ -618,6 +622,10 @@ el:
return: Δείξε το προφίλ του χρήστη
web: Πήγαινε στο δίκτυο
title: Ακολούθησε %{acct}
+ challenge:
+ confirm: Συνέχεια
+ invalid_password: Μη έγκυρο συνθηματικό
+ prompt: Επιβεβαίωση συνθηματικού για συνέχεια
datetime:
distance_in_words:
about_x_hours: "%{count}ω"
@@ -686,7 +694,7 @@ el:
domain_blocks: Μπλοκαρίσματα κόμβων
follows: Ακολουθείς
lists: Λίστες
- mutes: Αποσιωπάς
+ mutes: Αποσιωπήσεις
storage: Αποθήκευση πολυμέσων
featured_tags:
add_new: Προσθήκη νέας
@@ -790,6 +798,10 @@ el:
too_many: Δεν γίνεται να προσθέσεις περισσότερα από 4 αρχεία
migrations:
acct: ΌνομαΧρήστη@Τομέας του νέου λογαριασμού
+ cancel: Ακύρωση ανακατεύθυνσης
+ errors:
+ not_found: δεν βρέθηκε
+ proceed_with_move: Μετακίνηση ακολούθων
moderation:
title: Συντονισμός
notification_mailer:
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index ae8ea3256..6a9dff66b 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -502,6 +502,9 @@ eo:
context: Kunteksto
directory: En la adresaro
in_directory: "%{count} en adresaro"
+ last_active: Lasta aktiva
+ most_recent: Plej lasta
+ name: Kradvorto
review: La statuso de la recenzo
reviewed: Recenzis
title: Kradvortoj
@@ -530,6 +533,7 @@ eo:
advanced_web_interface_hint: 'Se vi volas uzi la tutan larĝecon de via ekrano, la kompleksa reta interfaco permesas al vi agordi multajn malsamajn kolumnojn por vidi tiom da informoj kiom vi volas samtempe: Hejmo, sciigoj, fratara tempolinio, kaj ajna kvanto de listoj kaj kradvortoj.'
animations_and_accessibility: Animacioj kaj alirebleco
confirmation_dialogs: Konfirmaj fenestroj
+ discovery: Eltrovo
sensitive_content: Tikla enhavo
application_mailer:
notification_preferences: Ŝanĝi retmesaĝajn preferojn
@@ -552,6 +556,8 @@ eo:
checkbox_agreement_html: Mi samopinii al la Servo reguloj kaj kondiĉo al servadon
delete_account: Forigi konton
delete_account_html: Se vi deziras forigi vian konton, vi povas fari tion ĉi tie. Vi bezonos konfirmi vian peton.
+ description:
+ prefix_sign_up: Registriĝi ĉe Mastodon hodiaŭ!
didnt_get_confirmation: Ĉu vi ne ricevis la instrukciojn por konfirmi?
forgot_password: Pasvorto forgesita?
invalid_reset_password_token: Ĵetono por restarigi pasvorton nevalida aŭ eksvalida. Bonvolu peti novan.
@@ -586,6 +592,10 @@ eo:
return: Montri la profilon de la uzanto
web: Iri al reto
title: Sekvi %{acct}
+ challenge:
+ confirm: Daŭrigi
+ invalid_password: Nevalida pasvorto
+ prompt: Konfirmi pasvorton por daŭrigi
datetime:
distance_in_words:
about_x_hours: "%{count}h"
diff --git a/config/locales/es.yml b/config/locales/es.yml
index ef22c7b82..2fbf0ffd7 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -1,1134 +1 @@
----
-es:
- about:
- about_hashtag_html: Estos son toots públicos etiquetados con #%{hashtag}. Puedes interactuar con ellos si tienes una cuenta en el fediverso.
- about_mastodon_html: Mastodon es una red social basada en protocolos web abiertos y software libre y de código abierto. Está descentralizado como correo electrónico.
- about_this: Información
- active_count_after: activo
- active_footnote: Usuarios Activos Mensuales (UAM)
- administered_by: 'Administrado por:'
- api: API
- apps: Aplicaciones móviles
- apps_platforms: Utiliza Mastodon desde iOS, Android y otras plataformas
- browse_directory: Navega por el directorio de perfiles y filtra por intereses
- browse_public_posts: Navega por un transmisión en vivo de publicaciones públicas en Mastodon
- contact: Contacto
- contact_missing: No especificado
- contact_unavailable: N/A
- discover_users: Descubrir usuarios
- documentation: Documentación
- federation_hint_html: Con una cuenta en %{instance} usted podrá seguir a las personas en cualquier servidor de Mastodon y más allá.
- generic_description: "%{domain} es un servidor en la red"
- get_apps: Probar una aplicación móvil
- hosted_on: Mastodon hosteado en %{domain}
- instance_actor_flash: |
- Esta cuenta es un actor virtual usado para representar al servidor y no a ningún usuario individual.
- Se usa para fines federativos y no debe ser bloqueado a menos que usted quiera bloquear toda la instancia, en cuyo caso se debe utilizar un bloque de dominio.
- learn_more: Aprende más
- privacy_policy: Política de privacidad
- see_whats_happening: Ver lo que está pasando
- server_stats: 'Datos del servidor:'
- source_code: Código fuente
- status_count_after:
- one: estado
- other: estados
- status_count_before: Qué han escrito
- tagline: Seguir a amigos existentes y descubre nuevos
- terms: Condiciones de servicio
- unavailable_content: Contenido no disponible
- unavailable_content_description:
- reason: 'Motivo:'
- rejecting_media: Los archivos multimedia de este servidor no serán procesados y no se mostrarán miniaturas, lo que requiere un clic manual en el otro servidor.
- silenced: Las publicaciones de este servidor no se mostrarán en ningún lugar salvo en el Inicio si sigues al autor.
- suspended: No podrás seguir a nadie de este servidor, y ningún dato de este será procesado o almacenado, y no se intercambiarán datos.
- unavailable_content_html: Mastodon generalmente le permite ver contenido e interactuar con usuarios de cualquier otro servidor en el fediverso. Estas son las excepciones que se han hecho en este servidor en particular.
- user_count_after:
- one: usuario
- other: usuarios
- user_count_before: Tenemos
- what_is_mastodon: "¿Qué es Mastodon?"
- accounts:
- choices_html: 'Elecciones de %{name}:'
- endorsements_hint: Puedes recomendar a gente que sigues desde la interfaz web, y aparecerán allí.
- featured_tags_hint: Puede presentar hashtags específicos que se mostrarán aquí.
- follow: Seguir
- followers:
- one: Seguidor
- other: Seguidores
- following: Siguiendo
- joined: Se unió el %{date}
- last_active: última conexión
- link_verified_on: La propiedad de este vínculo fue verificada el %{date}
- media: Multimedia
- moved_html: "%{name} se ha trasladado a %{new_profile_link}:"
- network_hidden: Esta información no está disponible
- never_active: Nunca
- nothing_here: "¡No hay nada aquí!"
- people_followed_by: Usuarios a quien %{name} sigue
- people_who_follow: Usuarios que siguen a %{name}
- pin_errors:
- following: Debes estar siguiendo a la persona a la que quieres aprobar
- posts:
- one: Toot
- other: Toots
- posts_tab_heading: Toots
- posts_with_replies: Toots con respuestas
- reserved_username: El nombre de usuario está reservado
- roles:
- admin: Administrador
- bot: Bot
- moderator: Moderador
- unavailable: Perfil no disponible
- unfollow: Dejar de seguir
- admin:
- account_actions:
- action: Realizar acción
- title: Moderar %{acct}
- account_moderation_notes:
- create: Crear
- created_msg: "¡Nota de moderación creada con éxito!"
- delete: Borrar
- destroyed_msg: "¡Nota de moderación destruida con éxito!"
- accounts:
- approve: Aprobar
- approve_all: Aprobar todos
- are_you_sure: "¿Estás seguro?"
- avatar: Avatar
- by_domain: Dominio
- change_email:
- changed_msg: "¡El correo electrónico se ha actualizado correctamente!"
- current_email: Correo electrónico actual
- label: Cambiar el correo electrónico
- new_email: Nuevo correo electrónico
- submit: Cambiar el correo electrónico
- title: Cambiar el correo electrónico de %{username}
- confirm: Confirmar
- confirmed: Confirmado
- confirming: Confirmando
- deleted: Borrado
- demote: Degradar
- disable: Deshabilitar
- disable_two_factor_authentication: Desactivar autenticación de dos factores
- disabled: Deshabilitada
- display_name: Nombre
- domain: Dominio
- edit: Editar
- email: E-mail
- email_status: E-mail Status
- enable: Habilitar
- enabled: Habilitada
- feed_url: URL de notificaciones
- followers: Seguidores
- followers_url: URL de los seguidores
- follows: Sigue
- header: Cabecera
- inbox_url: URL de la bandeja de entrada
- invited_by: Invitado por
- ip: IP
- joined: Unido
- location:
- all: Todos
- local: Local
- remote: Remoto
- title: Localización
- login_status: Estado del login
- media_attachments: Multimedia
- memorialize: Convertir en memorial
- moderation:
- active: Activo
- all: Todos
- pending: Pendiente
- silenced: Silenciados
- suspended: Suspendidos
- title: Moderación
- moderation_notes: Notas de moderación
- most_recent_activity: Actividad más reciente
- most_recent_ip: IP más reciente
- no_account_selected: Ninguna cuenta se cambió como ninguna fue seleccionada
- no_limits_imposed: Sin límites impuestos
- not_subscribed: No se está suscrito
- outbox_url: URL de bandeja de salida
- pending: Revisión pendiente
- perform_full_suspension: Suspender
- profile_url: URL del perfil
- promote: Promocionar
- protocol: Protocolo
- public: Público
- push_subscription_expires: Expiración de la suscripción PuSH
- redownload: Refrescar avatar
- reject: Rechazar
- reject_all: Rechazar todos
- remove_avatar: Eliminar el avatar
- remove_header: Eliminar cabecera
- resend_confirmation:
- already_confirmed: Este usuario ya está confirmado
- send: Reenviar el correo electrónico de confirmación
- success: "¡Correo electrónico de confirmación enviado con éxito!"
- reset: Reiniciar
- reset_password: Reiniciar contraseña
- resubscribe: Re-suscribir
- role: Permisos
- roles:
- admin: Administrador
- moderator: Moderador
- staff: Personal
- user: Usuario
- salmon_url: URL de salmón
- search: Buscar
- shared_inbox_url: URL de bandeja compartida
- show:
- created_reports: Reportes hechos por esta cuenta
- targeted_reports: Reportes hechos sobre esta cuenta
- silence: Silenciar
- silenced: Silenciado
- statuses: Estados
- subscribe: Suscribir
- suspended: Susependido
- time_in_queue: Esperando en cola %{time}
- title: Cuentas
- unconfirmed_email: Correo electrónico sin confirmar
- undo_silenced: Des-silenciar
- undo_suspension: Des-suspender
- unsubscribe: Desuscribir
- username: Nombre de usuario
- warn: Adevertir
- web: Web
- whitelisted: Añadido a la lista blanca
- action_logs:
- actions:
- assigned_to_self_report: "%{name} se ha asignado la denuncia %{target} a sí mismo"
- change_email_user: "%{name} ha cambiado la dirección de correo del usuario %{target}"
- confirm_user: "%{name} confirmó la dirección de correo del usuario %{target}"
- create_account_warning: "%{name} envió una advertencia a %{target}"
- create_custom_emoji: "%{name} subió un nuevo emoji %{target}"
- create_domain_block: "%{name} bloqueó el dominio %{target}"
- create_email_domain_block: "%{name} puso en lista negra el dominio de correos %{target}"
- demote_user: "%{name} degradó al usuario %{target}"
- destroy_custom_emoji: "%{name} destruyó el emoji %{target}"
- destroy_domain_block: "%{name} desbloqueó el dominio %{target}"
- destroy_email_domain_block: "%{name} puso en lista blanca el dominio de correos %{target}"
- destroy_status: "%{name} eliminó el estado de %{target}"
- disable_2fa_user: "%{name} deshabilitó el requerimiento de dos factores para el usuario %{target}"
- disable_custom_emoji: "%{name} deshabilitó el emoji %{target}"
- disable_user: "%{name} deshabilitó el acceso del usuario %{target}"
- enable_custom_emoji: "%{name} habilitó el emoji %{target}"
- enable_user: "%{name} habilitó el acceso del usuario %{target}"
- memorialize_account: "%{name} convirtió la cuenta de %{target} en una página de memorial"
- promote_user: "%{name} promoción al usuario %{target}"
- remove_avatar_user: "%{name} ha eliminado el avatar de %{target}"
- reopen_report: "%{name} ha reabierto la denuncia %{target}"
- reset_password_user: "%{name} restauró la contraseña del usuario %{target}"
- resolve_report: "%{name} ha resuelto la denuncia %{target}"
- silence_account: "%{name} silenció la cuenta de %{target}"
- suspend_account: "%{name} suspendió la cuenta de %{target}"
- unassigned_report: "%{name} ha desasignado la denuncia %{target}"
- unsilence_account: "%{name} desactivó el silenciado de la cuenta de %{target}"
- unsuspend_account: "%{name} desactivó la suspensión de la cuenta de %{target}"
- update_custom_emoji: "%{name} actualizó el emoji %{target}"
- update_status: "%{name} actualizó el estado de %{target}"
- deleted_status: "(estado borrado)"
- title: Log de auditoría
- custom_emojis:
- assign_category: Asignar categoría
- by_domain: Dominio
- copied_msg: Copia local del emoji creada con éxito
- copy: Copiar
- copy_failed_msg: No se pudo realizar una copia local de ese emoji
- create_new_category: Crear una nueva categoría
- created_msg: "¡Emoji creado con éxito!"
- delete: Borrar
- destroyed_msg: "¡Emojo destruido con éxito!"
- disable: Deshabilitar
- disabled_msg: Se deshabilitó con éxito ese emoji
- emoji: Emoji
- enable: Habilitar
- enabled_msg: Se habilitó con éxito ese emoji
- image_hint: PNG de hasta 50KB
- listed: Listados
- new:
- title: Añadir nuevo emoji personalizado
- overwrite: Sobrescribir
- shortcode: Código de atajo
- shortcode_hint: Al menos 2 caracteres, solo caracteres alfanuméricos y guiones bajos
- title: Emojis personalizados
- uncategorized: Sin clasificar
- unlisted: Sin listar
- update_failed_msg: No se pudo actualizar ese emoji
- updated_msg: "¡Emoji actualizado con éxito!"
- upload: Subir
- dashboard:
- backlog: trabajos de backlog
- config: Configuración
- feature_deletions: Borrados de cuenta
- feature_invites: Enlaces de invitación
- feature_profile_directory: Directorio de perfil
- feature_registrations: Registros
- feature_relay: Relés de federación
- feature_spam_check: Contra-spam
- feature_timeline_preview: Vista previa de la línea de tiempo
- features: Características
- hidden_service: Federación con servicios ocultos
- open_reports: informes abiertos
- pending_tags: hashtags esperando revisión
- pending_users: usuarios esperando por revisión
- recent_users: Usuarios recientes
- search: Búsqueda por texto completo
- single_user_mode: Modo único usuario
- software: Software
- space: Uso de almacenamiento
- title: Tablero
- total_users: usuarios en total
- trends: Tendencias
- week_interactions: interacciones esta semana
- week_users_active: activo esta semana
- week_users_new: usuarios esta semana
- whitelist_mode: En la lista blanca
- domain_allows:
- add_new: Añadir dominio a la lista blanca
- created_msg: Dominio añadido a la lista blanca con éxito
- destroyed_msg: Dominio quitado de la lista blanca con éxito
- undo: Quitar de la lista blanca
- domain_blocks:
- add_new: Añadir nuevo
- created_msg: El bloque de dominio está siendo procesado
- destroyed_msg: El bloque de dominio se deshizo
- domain: Dominio
- edit: Editar nuevo dominio bloqueado
- existing_domain_block_html: Ya ha impuesto límites más estrictos a %{name}, necesita desbloquearlo primero.
- new:
- create: Crear bloque
- hint: El bloque de dominio no prevendrá la creación de entradas de cuenta en la base de datos, pero aplicará retroactiva y automáticamente métodos de moderación específica en dichas cuentas.
- severity:
- desc_html: "Silenciar hará los posts de la cuenta invisibles a cualquiera que no lo esté siguiendo. Suspender eliminará todo el contenido, media, y datos del perfil. Usa Ninguno si solo quieres rechazar archivos multimedia."
- noop: Ninguno
- silence: Silenciar
- suspend: Suspender
- title: Nuevo bloque de dominio
- private_comment: Comentario privado
- private_comment_hint: Comentario sobre esta limitación de dominio para el uso interno por parte de los moderadores.
- public_comment: Comentario público
- public_comment_hint: Comentario sobre esta limitación de dominio para el público en general, si la publicidad de la lista de limitaciones de dominio está habilitada.
- reject_media: Rechazar archivos multimedia
- reject_media_hint: Remueve localmente archivos multimedia almacenados para descargar cualquiera en el futuro. Irrelevante para suspensiones
- reject_reports: Rechazar informes
- reject_reports_hint: Ignore todos los reportes de este dominio. Irrelevante para suspensiones
- rejecting_media: rechazar archivos multimedia
- rejecting_reports: rechazando informes
- severity:
- silence: silenciado
- suspend: susependido
- show:
- affected_accounts:
- one: Una cuenta en la base de datos afectada
- other: "%{count} cuentas en la base de datos afectadas"
- retroactive:
- silence: Des-silenciar todas las cuentas existentes de este dominio
- suspend: Des-suspender todas las cuentas existentes de este dominio
- title: Deshacer bloque de dominio para %{domain}
- undo: Deshacer
- undo: Deshacer
- view: Ver dominio bloqueado
- email_domain_blocks:
- add_new: Añadir nuevo
- created_msg: Dominio de correo añadido a la lista negra con éxito
- delete: Borrar
- destroyed_msg: Dominio de correo borrado de la lista negra con éxito
- domain: Dominio
- new:
- create: Añadir dominio
- title: Nueva entrada en la lista negra de correo
- title: Lista negra de correo
- followers:
- back_to_account: Volver a la cuenta
- title: Seguidores de %{acct}
- instances:
- by_domain: Dominio
- delivery_available: Entrega disponible
- known_accounts:
- one: "%{count} cuenta conocida"
- other: "%{count} cuentas conocidas"
- moderation:
- all: Todos
- limited: Limitado
- title: Moderación
- private_comment: Comentario privado
- public_comment: Comentario público
- title: Instancias conocidas
- total_blocked_by_us: Bloqueado por nosotros
- total_followed_by_them: Seguidos por ellos
- total_followed_by_us: Seguido por nosotros
- total_reported: Informes sobre ellas
- total_storage: Archivos multimedia
- invites:
- deactivate_all: Desactivar todos
- filter:
- all: Todas
- available: Disponibles
- expired: Expiradas
- title: Filtrar
- title: Invitaciones
- pending_accounts:
- title: Cuentas pendientes (%{count})
- relays:
- add_new: Añadir un nuevo relés
- delete: Borrar
- description_html: Un relés de federation es un servidor intermedio que intercambia grandes volúmenes de toots públicos entre servidores que se suscriben y publican en él. Puede ayudar a servidores pequeños y medianos a descubir contenido del fediverso, que de otra manera requeriría que los usuarios locales siguiesen manialmente a personas de servidores remotos.
- disable: Deshabilitar
- disabled: Deshabilitado
- enable: Hablitar
- enable_hint: Una vez conectado, tu servidor se suscribirá a todos los toots públicos de este relés, y comenzará a enviar los toots públicos de este servidor hacia él.
- enabled: Habilitado
- inbox_url: URL del relés
- pending: Esperando la aprobación del relés
- save_and_enable: Guardar y conectar
- setup: Preparar una conexión de relés
- status: Estado
- title: Releses
- report_notes:
- created_msg: "¡El registro de la denuncia se ha creado correctamente!"
- destroyed_msg: "¡El registro de la denuncia se ha borrado correctamente!"
- reports:
- account:
- note: nota
- report: denuncia
- action_taken_by: Acción tomada por
- are_you_sure: "¿Estás seguro?"
- assign_to_self: Asignármela a mí
- assigned: Moderador asignado
- comment:
- none: Ninguno
- created_at: Denunciado
- mark_as_resolved: Marcar como resuelto
- mark_as_unresolved: Marcar como no resuelto
- notes:
- create: Añadir una nota
- create_and_resolve: Resolver con una nota
- create_and_unresolve: Reabrir con una nota
- delete: Eliminar
- placeholder: Especificar qué acciones se han tomado o cualquier otra novedad respecto a esta denuncia…
- reopen: Reabrir denuncia
- report: 'Reportar #%{id}'
- reported_account: Cuenta reportada
- reported_by: Reportado por
- resolved: Resuelto
- resolved_msg: "¡La denuncia se ha resuelto correctamente!"
- status: Estado
- title: Reportes
- unassign: Desasignar
- unresolved: No resuelto
- updated_at: Actualizado
- settings:
- activity_api_enabled:
- desc_html: Conteo de estados publicados localmente, usuarios activos, y nuevos registros en periodos semanales
- title: Publicar estadísticas locales acerca de actividad de usuario
- bootstrap_timeline_accounts:
- desc_html: Separa con comas los nombres de usuario. Solo funcionará para cuentas locales desbloqueadas. Si se deja vacío, se tomará como valor por defecto a todos los administradores locales.
- title: Seguimientos predeterminados para usuarios nuevos
- contact_information:
- email: Correo de trabajo
- username: Nombre de usuario
- custom_css:
- desc_html: Modificar el aspecto con CSS cargado en cada página
- title: CSS personalizado
- domain_blocks:
- all: A todos
- disabled: A nadie
- hero:
- desc_html: Mostrado en la página principal. Recomendable al menos 600x100px. Por defecto se establece a la miniatura de la instancia
- title: Imagen de portada
- mascot:
- desc_html: Mostrado en múltiples páginas. Se recomienda un tamaño mínimo de 293x205px. Cuando no se especifica, se muestra la mascota por defecto
- title: Imagen de la mascota
- peers_api_enabled:
- desc_html: Nombres de dominio que esta instancia ha encontrado en el fediverso
- title: Publicar lista de instancias descubiertas
- preview_sensitive_media:
- desc_html: Los enlaces de vistas previas en otras web mostrarán una miniatura incluso si el medio está marcado como contenido sensible
- title: Mostrar contenido sensible en previews de OpenGraph
- profile_directory:
- desc_html: Permitir que los usuarios puedan ser descubiertos
- title: Habilitar directorio de perfiles
- registrations:
- closed_message:
- desc_html: Se muestra en la portada cuando los registros están cerrados. Puedes usar tags HTML
- title: Mensaje de registro cerrado
- deletion:
- desc_html: Permite a cualquiera a eliminar su cuenta
- title: Eliminación de cuenta abierta
- min_invite_role:
- disabled: Nadie
- title: Permitir invitaciones de
- registrations_mode:
- modes:
- approved: Se requiere aprobación para registrarse
- none: Nadie puede registrarse
- open: Cualquiera puede registrarse
- title: Modo de registros
- show_known_fediverse_at_about_page:
- desc_html: Cuando esté activado, se mostrarán toots de todo el fediverso conocido en la vista previa. En otro caso, se mostrarán solamente toots locales.
- title: Mostrar fediverso conocido en la vista previa de la historia
- show_staff_badge:
- desc_html: Mostrar un parche de staff en la página de un usuario
- title: Mostrar parche de staff
- site_description:
- desc_html: Párrafo introductorio en la portada y en meta tags. Puedes usar tags HTML, en particular <a> y <em>.
- title: Descripción de instancia
- site_description_extended:
- desc_html: Un buen lugar para tu código de conducta, reglas, guías y otras cosas que estén impuestas aparte en tu instancia. Puedes usar tags HTML
- title: Información extendida personalizada
- site_short_description:
- desc_html: Mostrado en la barra lateral y las etiquetas de metadatos. Describe lo que es Mastodon y qué hace especial a este servidor en un solo párrafo. si está vacío, pone por defecto la descripción de la instancia.
- title: Descripción corta de la instancia
- site_terms:
- desc_html: Puedes escribir tus propias políticas de privacidad, términos de servicio u otras legalidades. Puedes usar tags HTML
- title: Términos de servicio personalizados
- site_title: Nombre de instancia
- spam_check_enabled:
- desc_html: Mastodon puede silenciar y reportar cuentas automáticamente usando medidas como detectar cuentas que envían mensajes no solicitados repetidos. Puede que haya falsos positivos.
- title: Contra-spam
- thumbnail:
- desc_html: Se usa para muestras con OpenGraph y APIs. Se recomienda 1200x630px
- title: Portada de instancia
- timeline_preview:
- desc_html: Mostrar línea de tiempo pública en la portada
- title: Previsualización
- title: Ajustes del sitio
- trends:
- desc_html: Mostrar públicamente hashtags previamente revisados que son tendencia
- title: Hashtags de tendencia
- statuses:
- back_to_account: Volver a la cuenta
- batch:
- delete: Eliminar
- nsfw_off: Marcar contenido como no sensible
- nsfw_on: Marcar contenido como sensible
- deleted: Eliminado
- failed_to_execute: Falló al ejecutar
- media:
- title: Multimedia
- no_media: No hay multimedia
- no_status_selected: No se cambió ningún estado al no seleccionar ninguno
- title: Estado de las cuentas
- with_media: Con multimedia
- tags:
- accounts_today: Usos únicos de hoy
- accounts_week: Usos únicos esta semana
- context: Contexto
- directory: En el directorio
- in_directory: "%{count} en el directorio"
- last_active: Última actividad
- most_popular: Más popular
- most_recent: Más reciente
- name: Hashtag
- review: Estado de revisión
- reviewed: Revisado
- title: Etiquetas
- trending_right_now: En tendencia ahora mismo
- unique_uses_today: "%{count} publicando hoy"
- unreviewed: No revisado
- updated_msg: Hashtags actualizados exitosamente
- title: Administración
- warning_presets:
- add_new: Añadir nuevo
- delete: Borrar
- edit: Editar
- edit_preset: Editar aviso predeterminado
- title: Editar configuración predeterminada de avisos
- admin_mailer:
- new_pending_account:
- body: Los detalles de la nueva cuenta están abajos. Puedes aprobar o rechazar esta aplicación.
- subject: Nueva cuenta para revisión en %{instance} (%{username})
- new_report:
- body: "%{reporter} ha reportado a %{target}"
- body_remote: Alguien de %{domain} a reportado a %{target}
- subject: Nuevo reporte para la %{instance} (#%{id})
- new_trending_tag:
- body: 'El hashtag #%{name} está en tendencia hoy, pero no ha sido revisado previamente. No se mostrará públicamente a menos que lo permita, o simplemente guarde el formulario como para no volver a ver esto.'
- subject: Nuevo hashtag para revisión en %{instance} (#%{name})
- appearance:
- advanced_web_interface: Interfaz web avanzada
- advanced_web_interface_hint: 'Si desea utilizar todo el ancho de pantalla, la interfaz web avanzada le permite configurar varias columnas diferentes para ver tanta información al mismo tiempo como quiera: Inicio, notificaciones, línea de tiempo federada, cualquier número de listas y etiquetas.'
- animations_and_accessibility: Animaciones y accesibilidad
- confirmation_dialogs: Diálogos de confirmación
- discovery: Descubrir
- sensitive_content: Contenido sensible
- application_mailer:
- notification_preferences: Cambiar preferencias de correo electrónico
- salutation: "%{name},"
- settings: 'Cambiar preferencias de correo: %{link}'
- view: 'Vista:'
- view_profile: Ver perfil
- view_status: Ver estado
- applications:
- created: Aplicación creada exitosamente
- destroyed: Apicación eliminada exitosamente
- invalid_url: La URL proporcionada es incorrecta
- regenerate_token: Regenerar token de acceso
- token_regenerated: Token de acceso regenerado exitosamente
- warning: Ten mucho cuidado con estos datos. ¡No los compartas con nadie!
- your_token: Tu token de acceso
- auth:
- apply_for_account: Solicitar una invitación
- change_password: Contraseña
- checkbox_agreement_html: Acepto las reglas del servidor y términos de servicio
- checkbox_agreement_without_rules_html: Acepto los términos de servicio
- delete_account: Borrar cuenta
- delete_account_html: Si desea eliminar su cuenta, puede proceder aquí. Será pedido de una confirmación.
- didnt_get_confirmation: "¿No recibió el correo de confirmación?"
- forgot_password: "¿Olvidaste tu contraseña?"
- invalid_reset_password_token: El token de reinicio de contraseña es inválido o expiró. Por favor pide uno nuevo.
- login: Iniciar sesión
- logout: Cerrar sesión
- migrate_account: Mudarse a otra cuenta
- migrate_account_html: Si deseas redireccionar esta cuenta a otra distinta, puedes configurarlo aquí.
- or_log_in_with: O inicia sesión con
- providers:
- cas: CAS
- saml: SAML
- register: Registrarse
- registration_closed: "%{instance} no está aceptando nuevos miembros"
- resend_confirmation: Volver a enviar el correo de confirmación
- reset_password: Restablecer contraseña
- security: Cambiar contraseña
- set_new_password: Establecer nueva contraseña
- setup:
- email_below_hint_html: Si la dirección de correo electrónico que aparece a continuación es incorrecta, se puede cambiarla aquí y recibir un nuevo correo electrónico de confirmación.
- email_settings_hint_html: El correo electrónico de confirmación fue enviado a %{email}. Si esa dirección de correo electrónico no sea correcta, se puede cambiarla en la configuración de la cuenta.
- title: Configuración
- status:
- account_status: Estado de la cuenta
- confirming: Esperando confirmación de correo electrónico.
- functional: Su cuenta está totalmente operativa.
- pending: Su solicitud está pendiente de revisión por nuestros administradores. Eso puede tardar algún tiempo. Usted recibirá un correo electrónico si el solicitud sea aprobada.
- trouble_logging_in: "¿Problemas para iniciar sesión?"
- authorize_follow:
- already_following: Ya estás siguiendo a esta cuenta
- error: Desafortunadamente, ha ocurrido un error buscando la cuenta remota
- follow: Seguir
- follow_request: 'Tienes una solicitud de seguimiento de:'
- following: "¡Éxito! Ahora estás siguiendo a:"
- post_follow:
- close: O, puedes simplemente cerrar esta ventana.
- return: Regresar al perfil del usuario
- web: Ir al sitio web
- title: Seguir a %{acct}
- challenge:
- confirm: Continuar
- datetime:
- distance_in_words:
- about_x_hours: "%{count}h"
- about_x_months: "%{count}m"
- about_x_years: "%{count}a"
- almost_x_years: "%{count}a"
- half_a_minute: Justo ahora
- less_than_x_minutes: "%{count}m"
- less_than_x_seconds: Justo ahora
- over_x_years: "%{count}a"
- x_days: "%{count}d"
- x_minutes: "%{count}m"
- x_months: "%{count}m"
- x_seconds: "%{count}s"
- deletes:
- confirm_password: Ingresa tu contraseña actual para demostrar tu identidad
- proceed: Eliminar cuenta
- success_msg: Tu cuenta se eliminó con éxito
- directories:
- directory: Directorio de perfiles
- explanation: Descubre usuarios según sus intereses
- explore_mastodon: Explorar %{title}
- domain_validator:
- invalid_domain: no es un nombre de dominio válido
- errors:
- '400': The request you submitted was invalid or malformed.
- '403': No tienes permiso para acceder a esta página.
- '404': La página que estabas buscando no existe.
- '406': This page is not available in the requested format.
- '410': La página que estabas buscando no existe más.
- '422':
- content: Verificación de seguridad fallida. ¿Estás bloqueando algunas cookies?
- title: Verificación de seguridad fallida
- '429': Asfixiado
- '500':
- content: Lo sentimos, algo ha funcionado mal por nuestra parte.
- title: Esta página no es correcta
- '503': The page could not be served due to a temporary server failure.
- noscript_html: Para usar la aplicación web de Mastodon, por favor activa Javascript. Alternativamente, prueba alguna de las aplicaciones nativas para Mastodon para tu plataforma.
- existing_username_validator:
- not_found: no pudo encontrar un usuario local con ese nombre de usuario
- not_found_multiple: no pudo encontrar %{usernames}
- exports:
- archive_takeout:
- date: Fecha
- download: Descargar tu archivo
- hint_html: Puedes solicitar un archivo de tus toots y materiales subidos. Los datos exportados estarán en formato ActivityPub, legibles por cualquier software compatible.
- in_progress: Recopilando tu archivo...
- request: Solicitar tu archivo
- size: Tamaño
- blocks: Personas que has bloqueado
- csv: CSV
- domain_blocks: Bloqueos de dominios
- follows: Personas que sigues
- lists: Listas
- mutes: Tienes en silencio
- storage: Almacenamiento
- featured_tags:
- add_new: Añadir nuevo
- errors:
- limit: Ya has alcanzado la cantidad máxima de hashtags
- filters:
- contexts:
- home: Timeline propio
- notifications: Notificaciones
- public: Timeline público
- thread: Conversaciones
- edit:
- title: Editar filtro
- errors:
- invalid_context: Se suminstró un contexto inválido o vacío
- invalid_irreversible: El filtrado irreversible solo funciona con los contextos propios o de notificaciones
- index:
- delete: Borrar
- title: Filtros
- new:
- title: Añadir un nuevo filtro
- footer:
- developers: Desarrolladores
- more: Mas…
- resources: Recursos
- trending_now: Tendencia ahora
- generic:
- all: Todos
- changes_saved_msg: "¡Cambios guardados con éxito!"
- copy: Copiar
- order_by: Ordenar por
- save_changes: Guardar cambios
- validation_errors:
- one: "¡Algo no está bien! Por favor, revisa el error"
- other: "¡Algo no está bien! Por favor, revise %{count} errores más abajo"
- html_validator:
- invalid_markup: 'contiene código HTML no válido: %{error}'
- identity_proofs:
- active: Activo
- authorize: Sí, autorizar
- authorize_connection_prompt: "¿Autorizar esta conexión criptográfica?"
- errors:
- failed: La conexión criptográfica falló. Por favor, inténtalo de nuevo desde %{provider}.
- keybase:
- invalid_token: Los tokens de Keybase son hashes de firmas y deben tener 66 caracteres hex
- verification_failed: Keybase no reconoce este token como una firma del usuario de Keybase %{kb_username}. Por favor, inténtelo de nuevo desde Keybase.
- wrong_user: No se puede crear una prueba para %{proving} mientras se inicia sesión como %{current}. Inicia sesión como %{proving} e inténtalo de nuevo.
- explanation_html: Aquí puedes conectar criptográficamente sus otras identidades, como un perfil de Keybase. Esto permite a otras personas enviarle mensajes encriptados y confiar en el contenido que les envías.
- i_am_html: Soy %{username} en %{service}.
- identity: Identidad
- inactive: Inactivo
- publicize_checkbox: 'Y tootee esto:'
- publicize_toot: "¡Comprobado! Soy %{username} en %{service}: %{url}"
- status: Estado de la verificación
- view_proof: Ver prueba
- imports:
- modes:
- merge: Unir
- merge_long: Mantener registros existentes y añadir nuevos
- overwrite: Sobrescribir
- overwrite_long: Reemplazar registros actuales con los nuevos
- preface: Puedes importar ciertos datos, como todas las personas que estás siguiendo o bloqueando en tu cuenta en esta instancia, desde archivos exportados de otra instancia.
- success: Sus datos se han cargado correctamente y serán procesados en brevedad
- types:
- blocking: Lista de bloqueados
- domain_blocking: Lista de dominios bloqueados
- following: Lista de seguidos
- muting: Lista de silenciados
- upload: Cargar
- in_memoriam_html: En memoria.
- invites:
- delete: Desactivar
- expired: Expiradas
- expires_in:
- '1800': 30 minutos
- '21600': 6 horas
- '3600': 1 hora
- '43200': 12 horas
- '604800': 1 semana
- '86400': 1 día
- expires_in_prompt: Nunca
- generate: Generar
- invited_by: 'Fuiste invitado por:'
- max_uses:
- one: 1 uso
- other: "%{count} usos"
- max_uses_prompt: Sin límite
- prompt: Generar y compartir enlaces con otros para conceder acceso a este nodo
- table:
- expires_at: Expira
- uses: Usos
- title: Invitar a gente
- lists:
- errors:
- limit: Has alcanzado la cantidad máxima de listas
- media_attachments:
- validations:
- images_and_video: No se puede adjuntar un video a un estado que ya contenga imágenes
- too_many: No se pueden adjuntar más de 4 archivos
- migrations:
- acct: username@domain de la nueva cuenta
- moderation:
- title: Moderación
- notification_mailer:
- digest:
- action: Ver todas las notificaciones
- body: Un resumen de los mensajes que perdiste en desde tu última visita, el %{since}
- mention: "%{name} te ha mencionado en:"
- new_followers_summary:
- one: "¡Ademas, has adquirido un nuevo seguidor mientras no estabas! ¡Hurra!"
- other: "¡Ademas, has adquirido %{count} nuevos seguidores mientras no estabas! ¡Genial!"
- subject:
- one: "1 nueva notificación desde tu última visita \U0001F418"
- other: "%{count} nuevas notificaciones desde tu última visita \U0001F418"
- title: En tu ausencia…
- favourite:
- body: 'Tu estado fue marcado como favorito por %{name}:'
- subject: "%{name} marcó como favorito tu estado"
- title: Nuevo favorito
- follow:
- body: "¡%{name} te está siguiendo!"
- subject: "%{name} te está siguiendo"
- title: Nuevo seguidor
- follow_request:
- action: Administrar solicitudes para seguir
- body: "%{name} ha solicitado seguirte"
- subject: 'Seguidor pendiente: %{name}'
- title: Nueva solicitud para seguir
- mention:
- action: Responder
- body: 'Fuiste mencionado por %{name} en:'
- subject: Fuiste mencionado por %{name}
- title: Nueva mención
- reblog:
- body: "%{name} ha retooteado tu estado:"
- subject: "%{name} ha retooteado tu estado"
- title: Nueva difusión
- number:
- human:
- decimal_units:
- format: "%n%u"
- units:
- billion: B
- million: M
- quadrillion: Q
- thousand: m
- trillion: T
- pagination:
- newer: Más nuevo
- next: Próximo
- older: Más antiguo
- prev: Anterior
- truncate: "…"
- polls:
- errors:
- already_voted: Ya has votado en esta encuesta
- duplicate_options: contiene elementos duplicados
- duration_too_long: está demasiado lejos en el futuro
- duration_too_short: es demasiado pronto
- expired: La encuesta ya ha terminado
- over_character_limit: no puede exceder %{max} caracteres cada uno
- too_few_options: debe tener más de un elemento
- too_many_options: no puede contener más de %{max} elementos
- preferences:
- other: Otros
- posting_defaults: Configuración por defecto de publicaciones
- public_timelines: Líneas de tiempo públicas
- relationships:
- activity: Actividad de la cuenta
- dormant: Inactivo
- last_active: Última actividad
- most_recent: Más reciente
- moved: Movido
- mutual: Mutuo
- primary: Principal
- relationship: Relación
- remove_selected_domains: Eliminar todos los seguidores de los dominios seleccionados
- remove_selected_followers: Eliminar los seguidores seleccionados
- remove_selected_follows: Dejar de seguir a los usuarios seleccionados
- status: Estado de la cuenta
- remote_follow:
- acct: Ingesa tu usuario@dominio desde el que quieres seguir
- missing_resource: No se pudo encontrar la URL de redirección requerida para tu cuenta
- no_account_html: "¿No tienes una cuenta? Puedes registrarte aqui"
- proceed: Proceder a seguir
- prompt: 'Vas a seguir a:'
- reason_html: "¿¿Por qué es necesario este paso?%{instance} puede que no sea el servidor donde estás registrado, así que necesitamos redirigirte primero a tu servidor de origen."
- remote_interaction:
- favourite:
- proceed: Proceder a marcar como favorito
- prompt: 'Quieres marcar como favorito este toot:'
- reblog:
- proceed: Proceder a retootear
- prompt: 'Quieres retootear este toot:'
- reply:
- proceed: Proceder a responder
- prompt: 'Quieres responder a este toot:'
- scheduled_statuses:
- over_daily_limit: Ha superado el límite de %{limit} toots programados para ese día
- over_total_limit: Ha superado el límite de %{limit} toots programados
- too_soon: La fecha programada debe estar en el futuro
- sessions:
- activity: Última actividad
- browser: Navegador
- browsers:
- alipay: Alipay
- blackberry: Blackberry
- chrome: Chrome
- edge: Microsoft Edge
- electron: Electron
- firefox: Firefox
- generic: Desconocido
- ie: Internet Explorer
- micro_messenger: MicroMessenger
- nokia: Navegador de Nokia S40 Ovi
- opera: Opera
- otter: Otter
- phantom_js: PhantomJS
- qq: Navegador QQ
- safari: Safari
- uc_browser: UCBrowser
- weibo: Weibo
- current_session: Sesión actual
- description: "%{browser} en %{platform}"
- explanation: Estos son los navegadores web conectados actualmente en tu cuenta de Mastodon.
- 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: Desconocido
- windows: Windows
- windows_mobile: Windows Mobile
- windows_phone: Windows Phone
- revoke: Revocar
- revoke_success: Sesión revocada exitosamente
- title: Sesiones
- settings:
- account: Cuenta
- account_settings: Ajustes de la cuenta
- appearance: Apariencia
- authorized_apps: Aplicaciones autorizadas
- back: Volver al inicio
- delete: Borrar cuenta
- development: Desarrollo
- edit_profile: Editar perfil
- export: Exportar información
- featured_tags: Hashtags destacados
- identity_proofs: Pruebas de identidad
- import: Importar
- import_and_export: Importar y exportar
- migrate: Migración de cuenta
- notifications: Notificaciones
- preferences: Preferencias
- profile: Perfil
- relationships: Siguiendo y seguidores
- two_factor_authentication: Autenticación de dos factores
- spam_check:
- spam_detected_and_silenced: Este es un informe automatizado. Se ha detectado spam y el remitente ha sido silenciado automáticamente. Si esto es un error, por favor, deja de silenciar la cuenta.
- statuses:
- attached:
- description: 'Adjunto: %{attached}'
- image:
- one: "%{count} imagen"
- other: "%{count} imágenes"
- video:
- one: "%{count} vídeo"
- other: "%{count} vídeos"
- boosted_from_html: Impulsado desde %{acct_link}
- content_warning: 'Alerta de contenido: %{warning}'
- disallowed_hashtags:
- one: 'contenía un hashtag no permitido: %{tags}'
- other: 'contenía los hashtags no permitidos: %{tags}'
- language_detection: Detección automática de idioma
- open_in_web: Abrir en web
- over_character_limit: Límite de caracteres de %{max} superado
- pin_errors:
- limit: Ya has fijado el número máximo de publicaciones
- ownership: El toot de alguien más no puede fijarse
- private: Los toots no-públicos no pueden fijarse
- reblog: Un boost no puede fijarse
- poll:
- total_votes:
- one: "%{count} voto"
- other: "%{count} votos"
- vote: Vota
- show_more: Mostrar más
- sign_in_to_participate: Regístrate para participar en la conversación
- title: '%{name}: "%{quote}"'
- visibilities:
- private: Sólo mostrar a seguidores
- private_long: Solo mostrar a tus seguidores
- public: Público
- public_long: Todos pueden ver
- unlisted: Público, pero no mostrar en la historia federada
- unlisted_long: Todos pueden ver, pero no está listado en las líneas de tiempo públicas
- stream_entries:
- pinned: Toot fijado
- reblogged: retooteado
- sensitive_content: Contenido sensible
- tags:
- does_not_match_previous_name: no coincide con el nombre anterior
- terms:
- body_html: |
-
Política de Privacidad
-
¿Qué información recogemos?
-
-
-
Información básica sobre su cuenta: Si se registra en este servidor, se le requerirá un nombre de usuario, una dirección de correo electrónico y una contraseña. Además puede incluir información adicional en el perfil como un nombre de perfil y una biografía, y subir una foto de perfil y una imagen de cabecera. El nombre de usuario, nombre de perfil, biografía, foto de perfil e imagen de cabecera siempre son visibles públicamente
-
Publicaciones, seguimiento y otra información pública: La lista de gente a la que sigue es mostrada públicamente, al igual que sus seguidores. Cuando publica un mensaje, la fecha y hora es almacenada, así como la aplicación desde la cual publicó el mensaje. Los mensajes pueden contener archivos adjuntos multimedia, como imágenes y vídeos. Las publicaciones públicas y no listadas están disponibles públicamente. Cuando destaca una entrada en su perfil, también es información disponible públicamente. Sus publicaciones son entregadas a sus seguidores, en algunos casos significa que son entregadas a diferentes servidores y las copias son almacenadas allí. Cuando elimina publicaciones, esto también se transfiere a sus seguidores. La acción de rebloguear o marcar como favorito otra publicación es siempre pública.
-
Publicaciones directas y sólo para seguidores: Todos los mensajes se almacenan y procesan en el servidor. Los mensajes sólo para seguidores se entregan a los seguidores y usuarios que se mencionan en ellos, y los mensajes directos se entregan sólo a los usuarios que se mencionan en ellos. En algunos casos significa que se entregan a diferentes servidores y que las copias se almacenan allí. Hacemos un esfuerzo de buena fe para limitar el acceso a esas publicaciones sólo a las personas autorizadas, pero otros servidores pueden no hacerlo. Por lo tanto, es importante revisar los servidores a los que pertenecen sus seguidores. Puede cambiar una opción para aprobar y rechazar nuevos seguidores manualmente en la configuración Por favor, tenga en cuenta que los operadores del servidor y de cualquier servidor receptor pueden ver dichos mensajes, y que los destinatarios pueden capturarlos, copiarlos o volver a compartirlos de alguna otra manera. No comparta ninguna información peligrosa en Mastodon.
-
Direcciones IP y otros metadatos: Al iniciar sesión, registramos la dirección IP desde la que se ha iniciado sesión, así como el nombre de la aplicación de su navegador. Todas las sesiones iniciadas están disponibles para su revisión y revocación en los ajustes. La última dirección IP utilizada se almacena hasta 12 meses. También podemos conservar los registros del servidor que incluyen la dirección IP de cada solicitud a nuestro servidor.
-
-
-
-
-
¿Para qué utilizamos su información?
-
-
Toda la información que obtenemos de usted puede ser utilizada de las siguientes maneras:
-
-
-
Para proporcionar la funcionalidad principal de Mastodon. Sólo puedes interactuar con el contenido de otras personas y publicar tu propio contenido cuando estés conectado. Por ejemplo, puedes seguir a otras personas para ver sus mensajes combinados en tu propia línea de tiempo personalizada.
-
Para ayudar a la moderación de la comunidad, por ejemplo, comparando su dirección IP con otras conocidas para determinar la evasión de prohibiciones u otras violaciones.
-
La dirección de correo electrónico que nos proporcione podrá utilizarse para enviarle información, notificaciones sobre otras personas que interactúen con su contenido o para enviarle mensajes, así como para responder a consultas y/u otras solicitudes o preguntas.
-
-
-
-
-
¿Cómo protegemos su información?
-
-
Implementamos una variedad de medidas de seguridad para mantener la seguridad de su información personal cuando usted ingresa, envía o accede a su información personal. Entre otras cosas, la sesión de su navegador, así como el tráfico entre sus aplicaciones y la API, están protegidos con SSL, y su contraseña está protegida mediante un algoritmo unidireccional fuerte. Puede habilitar la autenticación de dos factores para un acceso más seguro a su cuenta.
-
-
-
-
¿Cuál es nuestra política de retención de datos?
-
-
Haremos un esfuerzo de buena fe para:
-
-
-
Conservar los registros del servidor que contengan la dirección IP de todas las peticiones a este servidor, en la medida en que se mantengan dichos registros, no más de 90 días.
-
Conservar las direcciones IP asociadas a los usuarios registrados no más de 12 meses.
-
-
-
Puede solicitar y descargar un archivo de su contenido, incluidos sus mensajes, archivos adjuntos multimedia, foto de perfil e imagen de cabecera.
-
-
Usted puede borrar su cuenta de forma irreversible en cualquier momento.
-
-
-
-
¿Utilizamos cookies?
-
-
Sí. Las cookies son pequeños archivos que un sitio o su proveedor de servicios transfiere al disco duro de su ordenador a través de su navegador web (si usted lo permite). Estas cookies permiten al sitio reconocer su navegador y, si tiene una cuenta registrada, asociarla con su cuenta registrada.
-
-
Utilizamos cookies para entender y guardar sus preferencias para futuras visitas.
-
-
-
-
¿Revelamos alguna información a terceros?
-
-
No vendemos, comerciamos ni transferimos a terceros su información personal identificable. Esto no incluye a los terceros de confianza que nos asisten en la operación de nuestro sitio, en la realización de nuestros negocios o en la prestación de servicios, siempre y cuando dichas partes acuerden mantener la confidencialidad de esta información. También podemos divulgar su información cuando creamos que es apropiado para cumplir con la ley, hacer cumplir las políticas de nuestro sitio, o proteger nuestros u otros derechos, propiedad o seguridad.
-
-
Su contenido público puede ser descargado por otros servidores de la red. Tus mensajes públicos y sólo para seguidores se envían a los servidores donde residen tus seguidores, y los mensajes directos se envían a los servidores de los destinatarios, en la medida en que dichos seguidores o destinatarios residan en un servidor diferente.
-
-
Cuando usted autoriza a una aplicación a usar su cuenta, dependiendo del alcance de los permisos que usted apruebe, puede acceder a la información de su perfil público, su lista de seguimiento, sus seguidores, sus listas, todos sus mensajes y sus favoritos. Las aplicaciones nunca podrán acceder a su dirección de correo electrónico o contraseña.
-
-
-
-
Uso del sitio por parte de los niños
-
-
Si este servidor está en la UE o en el EEE: Nuestro sitio, productos y servicios están dirigidos a personas mayores de 16 años. Si es menor de 16 años, según los requisitos de la GDPR (General Data Protection Regulation) no utilice este sitio.
-
-
Si este servidor está en los EE.UU.: Nuestro sitio, productos y servicios están todos dirigidos a personas que tienen al menos 13 años de edad. Si usted es menor de 13 años, según los requisitos de COPPA (Children's Online Privacy Protection Act) no utilice este sitio.
-
-
Los requisitos legales pueden ser diferentes si este servidor está en otra jurisdicción.
-
-
-
-
Cambios en nuestra Política de Privacidad
-
-
Si decidimos cambiar nuestra política de privacidad, publicaremos esos cambios en esta página.
-
-
Este documento es CC-BY-SA. Fue actualizado por última vez el 7 de marzo de 2018.
Información básica sobre su cuenta: Si se registra en este servidor, se le requerirá un nombre de usuario, una dirección de correo electrónico y una contraseña. Además puede incluir información adicional en el perfil como un nombre de perfil y una biografía, y subir una foto de perfil y una imagen de cabecera. El nombre de usuario, nombre de perfil, biografía, foto de perfil e imagen de cabecera siempre son visibles públicamente
+
Publicaciones, seguimiento y otra información pública: La lista de gente a la que sigue es mostrada públicamente, al igual que sus seguidores. Cuando publica un mensaje, la fecha y hora es almacenada, así como la aplicación desde la cual publicó el mensaje. Los mensajes pueden contener archivos adjuntos multimedia, como imágenes y vídeos. Las publicaciones públicas y no listadas están disponibles públicamente. Cuando destaca una entrada en su perfil, también es información disponible públicamente. Sus publicaciones son entregadas a sus seguidores, en algunos casos significa que son entregadas a diferentes servidores y las copias son almacenadas allí. Cuando elimina publicaciones, esto también se transfiere a sus seguidores. La acción de rebloguear o marcar como favorito otra publicación es siempre pública.
+
Publicaciones directas y sólo para seguidores: Todos los mensajes se almacenan y procesan en el servidor. Los mensajes sólo para seguidores se entregan a los seguidores y usuarios que se mencionan en ellos, y los mensajes directos se entregan sólo a los usuarios que se mencionan en ellos. En algunos casos significa que se entregan a diferentes servidores y que las copias se almacenan allí. Hacemos un esfuerzo de buena fe para limitar el acceso a esas publicaciones sólo a las personas autorizadas, pero otros servidores pueden no hacerlo. Por lo tanto, es importante revisar los servidores a los que pertenecen sus seguidores. Puede cambiar una opción para aprobar y rechazar nuevos seguidores manualmente en la configuración Por favor, tenga en cuenta que los operadores del servidor y de cualquier servidor receptor pueden ver dichos mensajes, y que los destinatarios pueden capturarlos, copiarlos o volver a compartirlos de alguna otra manera. No comparta ninguna información peligrosa en Mastodon.
+
Direcciones IP y otros metadatos: Al iniciar sesión, registramos la dirección IP desde la que se ha iniciado sesión, así como el nombre de la aplicación de su navegador. Todas las sesiones iniciadas están disponibles para su revisión y revocación en los ajustes. La última dirección IP utilizada se almacena hasta 12 meses. También podemos conservar los registros del servidor que incluyen la dirección IP de cada solicitud a nuestro servidor.
+
+
+
+
+
¿Para qué utilizamos su información?
+
+
Toda la información que obtenemos de usted puede ser utilizada de las siguientes maneras:
+
+
+
Para proporcionar la funcionalidad principal de Mastodon. Sólo puedes interactuar con el contenido de otras personas y publicar tu propio contenido cuando estés conectado. Por ejemplo, puedes seguir a otras personas para ver sus mensajes combinados en tu propia línea de tiempo personalizada.
+
Para ayudar a la moderación de la comunidad, por ejemplo, comparando su dirección IP con otras conocidas para determinar la evasión de prohibiciones u otras violaciones.
+
La dirección de correo electrónico que nos proporcione podrá utilizarse para enviarle información, notificaciones sobre otras personas que interactúen con su contenido o para enviarle mensajes, así como para responder a consultas y/u otras solicitudes o preguntas.
+
+
+
+
+
¿Cómo protegemos su información?
+
+
Implementamos una variedad de medidas de seguridad para mantener la seguridad de su información personal cuando usted ingresa, envía o accede a su información personal. Entre otras cosas, la sesión de su navegador, así como el tráfico entre sus aplicaciones y la API, están protegidos con SSL, y su contraseña está protegida mediante un algoritmo unidireccional fuerte. Puede habilitar la autenticación de dos factores para un acceso más seguro a su cuenta.
+
+
+
+
¿Cuál es nuestra política de retención de datos?
+
+
Haremos un esfuerzo de buena fe para:
+
+
+
Conservar los registros del servidor que contengan la dirección IP de todas las peticiones a este servidor, en la medida en que se mantengan dichos registros, no más de 90 días.
+
Conservar las direcciones IP asociadas a los usuarios registrados no más de 12 meses.
+
+
+
Puede solicitar y descargar un archivo de su contenido, incluidos sus mensajes, archivos adjuntos multimedia, foto de perfil e imagen de cabecera.
+
+
Usted puede borrar su cuenta de forma irreversible en cualquier momento.
+
+
+
+
¿Utilizamos cookies?
+
+
Sí. Las cookies son pequeños archivos que un sitio o su proveedor de servicios transfiere al disco duro de su ordenador a través de su navegador web (si usted lo permite). Estas cookies permiten al sitio reconocer su navegador y, si tiene una cuenta registrada, asociarla con su cuenta registrada.
+
+
Utilizamos cookies para entender y guardar sus preferencias para futuras visitas.
+
+
+
+
¿Revelamos alguna información a terceros?
+
+
No vendemos, comerciamos ni transferimos a terceros su información personal identificable. Esto no incluye a los terceros de confianza que nos asisten en la operación de nuestro sitio, en la realización de nuestros negocios o en la prestación de servicios, siempre y cuando dichas partes acuerden mantener la confidencialidad de esta información. También podemos divulgar su información cuando creamos que es apropiado para cumplir con la ley, hacer cumplir las políticas de nuestro sitio, o proteger nuestros u otros derechos, propiedad o seguridad.
+
+
Su contenido público puede ser descargado por otros servidores de la red. Tus mensajes públicos y sólo para seguidores se envían a los servidores donde residen tus seguidores, y los mensajes directos se envían a los servidores de los destinatarios, en la medida en que dichos seguidores o destinatarios residan en un servidor diferente.
+
+
Cuando usted autoriza a una aplicación a usar su cuenta, dependiendo del alcance de los permisos que usted apruebe, puede acceder a la información de su perfil público, su lista de seguimiento, sus seguidores, sus listas, todos sus mensajes y sus favoritos. Las aplicaciones nunca podrán acceder a su dirección de correo electrónico o contraseña.
+
+
+
+
Uso del sitio por parte de los niños
+
+
Si este servidor está en la UE o en el EEE: Nuestro sitio, productos y servicios están dirigidos a personas mayores de 16 años. Si es menor de 16 años, según los requisitos de la GDPR (General Data Protection Regulation) no utilice este sitio.
+
+
Si este servidor está en los EE.UU.: Nuestro sitio, productos y servicios están todos dirigidos a personas que tienen al menos 13 años de edad. Si usted es menor de 13 años, según los requisitos de COPPA (Children's Online Privacy Protection Act) no utilice este sitio.
+
+
Los requisitos legales pueden ser diferentes si este servidor está en otra jurisdicción.
+
+
+
+
Cambios en nuestra Política de Privacidad
+
+
Si decidimos cambiar nuestra política de privacidad, publicaremos esos cambios en esta página.
+
+
Este documento es CC-BY-SA. Fue actualizado por última vez el 7 de marzo de 2018.
+ title: Términos del Servicio y Políticas de Privacidad de %{instance}
+ themes:
+ contrast: Alto contraste
+ default: Mastodon
+ mastodon-light: Mastodon (claro)
+ time:
+ formats:
+ default: "%d de %b del %Y, %H:%M"
+ month: "%b %Y"
+ two_factor_authentication:
+ code_hint: Ingresa el código generado por tu aplicación de autenticación para confirmar
+ description_html: Si habilitas la autenticación de dos factores, se requerirá estar en posesión de su teléfono, lo que generará tokens para que usted pueda iniciar sesión.
+ disable: Deshabilitar
+ enable: Habilitar
+ enabled: La autenticación de dos factores está activada
+ enabled_success: Verificación de dos factores activada exitosamente
+ generate_recovery_codes: generar códigos de recuperación
+ instructions_html: "Escanea este código QR desde Google Authenticator o una aplicación similar en su teléfono. Desde ahora, esta aplicación va a generar tokens que tienes que ingresar cuando quieras iniciar sesión."
+ lost_recovery_codes: Los códigos de recuperación te permiten obtener acceso a tu cuenta si pierdes tu teléfono. Si has perdido tus códigos de recuperación, puedes regenerarlos aquí. Tus viejos códigos de recuperación se harán inválidos.
+ manual_instructions: 'Si no puedes escanear el código QR y necesitas introducirlo manualmente, este es el secreto en texto plano:'
+ recovery_codes: Hacer copias de seguridad de tus códigos de recuperación
+ recovery_codes_regenerated: Códigos de recuperación regenerados con éxito
+ recovery_instructions_html: Si pierdes acceso a tu teléfono, puedes usar uno de los siguientes códigos de recuperación para obtener acceso a tu cuenta. Mantenlos a salvo. Por ejemplo, puedes imprimirlos y guardarlos con otros documentos importantes.
+ setup: Configurar
+ wrong_code: "¡El código ingresado es inválido! ¿El dispositivo y tiempo del servidor están correctos?"
+ user_mailer:
+ backup_ready:
+ explanation: Has solicitado una copia completa de tu cuenta de Mastodon. ¡Ya está preparada para descargar!
+ subject: Tu archivo está preparado para descargar
+ title: Descargar archivo
+ warning:
+ explanation:
+ disable: Mientras su cuenta esté congelada, la información de su cuenta permanecerá intacta, pero no puede realizar ninguna acción hasta que se desbloquee.
+ silence: Mientras su cuenta está limitada, sólo las personas que ya le están siguiendo verán sus toots en este servidor, y puede que se le excluya de varios listados públicos. Sin embargo, otros pueden seguirle manualmente.
+ suspend: Su cuenta ha sido suspendida, y todos tus toots y tus archivos multimedia subidos han sido irreversiblemente eliminados de este servidor, y de los servidores donde tenías seguidores.
+ review_server_policies: Revisar las políticas del servidor
+ subject:
+ disable: Su cuenta %{acct} ha sido congelada
+ none: Advertencia para %{acct}
+ silence: Su cuenta %{acct} ha sido limitada
+ suspend: Su cuenta %{acct} ha sido suspendida
+ title:
+ disable: Cuenta congelada
+ none: Advertencia
+ silence: Cuenta limitada
+ suspend: Cuenta suspendida
+ welcome:
+ edit_profile_action: Configurar el perfil
+ edit_profile_step: Puedes personalizar tu perfil subiendo un avatar, una cabecera, cambiando tu nombre de usuario y más cosas. Si quieres revisar a tus nuevos seguidores antes de que se les permita seguirte, puedes bloquear tu cuenta.
+ explanation: Aquí hay algunos consejos para empezar
+ final_action: Empezar a publicar
+ final_step: '¡Empieza a publicar! Incluso sin seguidores, tus mensajes públicos pueden ser vistos por otros, por ejemplo en la linea de tiempo local y con "hashtags". Podrías querer introducirte con el "hashtag" #introductions.'
+ full_handle: Su sobrenombre completo
+ full_handle_hint: Esto es lo que le dirías a tus amigos para que ellos puedan enviarte mensajes o seguirte desde otra instancia.
+ review_preferences_action: Cambiar preferencias
+ review_preferences_step: Asegúrate de poner tus preferencias, como que correos te gustaría recibir, o que nivel de privacidad te gustaría que tus publicaciones tengan por defecto. Si no tienes mareos, podrías elegir habilitar la reproducción automática de "GIFs".
+ subject: Bienvenido a Mastodon
+ tip_federated_timeline: La línea de tiempo federada es una vista de la red de Mastodon. Pero solo incluye gente que tus vecinos están siguiendo, así que no está completa.
+ tip_following: Sigues a tus administradores de servidor por defecto. Para encontrar más gente interesante, revisa las lineas de tiempo local y federada.
+ tip_local_timeline: La linea de tiempo local is una vista de la gente en %{instance}. Estos son tus vecinos inmediatos!
+ tip_mobile_webapp: Si el navegador de tu dispositivo móvil ofrece agregar Mastodon a tu página de inicio, puedes recibir notificaciones. Actúa como una aplicación nativa en muchas formas!
+ tips: Consejos
+ title: Te damos la bienvenida a bordo, %{name}!
+ users:
+ follow_limit_reached: No puedes seguir a más de %{limit} personas
+ invalid_email: La dirección de correo es incorrecta
+ invalid_otp_token: Código de dos factores incorrecto
+ otp_lost_help_html: Si perdiste al acceso a ambos, puedes ponerte en contancto con %{email}
+ seamless_external_login: Has iniciado sesión desde un servicio externo, así que los ajustes de contraseña y correo no están disponibles.
+ signed_in_as: 'Sesión iniciada como:'
+ verification:
+ explanation_html: 'Puedes verificarte a ti mismo como el dueño de los links en los metadatos de tu perfil . Para eso, el sitio vinculado debe contener un vínculo a tu perfil de Mastodon. El vínculo en tu sitio debe tener un atributo rel="me". El texto del vínculo no importa. Aquí un ejemplo:'
+ verification: Verificación
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 8dbeb3ade..0aa8b7a51 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -242,8 +242,10 @@ fa:
disabled_msg: این شکلک با موفقیت غیرفعال شد
emoji: شکلک
enable: فعالسازی
+ enabled: فعال
enabled_msg: این شکلک با موفقیت فعال شد
image_hint: پروندهٔ PNG حداکثر 50KB
+ list: فهرست
listed: فهرستشده
new:
title: افزودن شکلک سفارشی
@@ -252,6 +254,7 @@ fa:
shortcode_hint: دستکم ۲ نویسه و تنها شامل حروف، اعداد و زیرخط
title: شکلکهای سفارشی
uncategorized: دستهبندی نشده
+ unlist: نافهرست
unlisted: فهرستنشده
update_failed_msg: این شکلک نتوانست بهروز شود
updated_msg: شکلک با موفقیت بهروز شد!
@@ -383,6 +386,7 @@ fa:
pending: در انتظار پذیرش رله
save_and_enable: ذخیره و فعالسازی
setup: پیوستن به رلهها
+ signatures_not_enabled: وقتی حالت امن یا حالت فهرست سفید فعال باشد رلهها به درستی کار نخواهند کرد
status: وضعیت
title: رلهها
report_notes:
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 968160910..447ac4a1e 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -35,6 +35,10 @@ it:
status_count_before: Che hanno pubblicato
tagline: Segui amici e trovane di nuovi
terms: Termini di Servizio
+ unavailable_content: Contenuto non disponibile
+ unavailable_content_description:
+ reason: 'Motivo:'
+ rejecting_media: I file multimediali di questo server non saranno elaborati e non verranno visualizzate miniature, che richiedono clic manuale sull'altro server.
user_count_after:
one: utente
other: utenti
@@ -54,6 +58,7 @@ it:
media: Media
moved_html: "%{name} si è spostato su %{new_profile_link}:"
network_hidden: Questa informazione non e' disponibile
+ never_active: Mai
nothing_here: Qui non c'è nulla!
people_followed_by: Persone seguite da %{name}
people_who_follow: Persone che seguono %{name}
@@ -220,10 +225,12 @@ it:
deleted_status: "(stato cancellato)"
title: Registro di controllo
custom_emojis:
+ assign_category: Assegna categoria
by_domain: Dominio
copied_msg: Creata con successo una copia locale dell'emoji
copy: Copia
copy_failed_msg: Impossibile creare una copia locale di questo emoji
+ create_new_category: Crea nuova categoria
created_msg: Emoji creato con successo!
delete: Elimina
destroyed_msg: Emoji distrutto con successo!
@@ -231,6 +238,7 @@ it:
disabled_msg: Questa emoji è stata disabilitata con successo
emoji: Emoji
enable: Abilita
+ enabled: Abilitato
enabled_msg: Questa emoji è stata abilitata con successo
image_hint: PNG fino a 50 KB
listed: Elencato
@@ -240,11 +248,13 @@ it:
shortcode: Scorciatoia
shortcode_hint: Almeno due caratteri, solo caratteri alfanumerici e trattino basso
title: Emoji personalizzate
+ uncategorized: Nessuna categoria
unlisted: Non elencato
update_failed_msg: Impossibile aggiornare questa emojii
updated_msg: Emoji aggiornata con successo!
upload: Carica
dashboard:
+ authorized_fetch_mode: Modalità sicura
backlog: lavori arretrati
config: Configurazione
feature_deletions: Cancellazioni di account
@@ -509,6 +519,10 @@ it:
context: Contesto
directory: Nella directory
in_directory: "%{count} nella directory"
+ last_active: Ultima attività
+ most_popular: Più popolari
+ most_recent: Più recenti
+ name: Hashtag
reviewed: Controllato
title: Hashtag
trending_right_now: Di tendenza ora
@@ -532,6 +546,8 @@ it:
new_trending_tag:
body: 'L''hashtag #%{name} oggi è di tendenza, ma non è stato mai controllato. Non sarà visualizzato pubblicamente se non lo permetti; se salvi il form senza modifiche non lo vedrai mai più.'
subject: Nuovo hashtag pronto per essere controllato su %{instance} (%{name})
+ aliases:
+ add_new: Crea alias
appearance:
advanced_web_interface: Interfaccia web avanzata
advanced_web_interface_hint: |-
@@ -599,6 +615,11 @@ it:
return: Mostra il profilo dell'utente
web: Vai al web
title: Segui %{acct}
+ challenge:
+ confirm: Continua
+ hint_html: "Suggerimento: Non ti chiederemo di nuovo la tua password per la prossima ora."
+ invalid_password: Password non valida
+ prompt: Conferma la tua password per continuare
datetime:
distance_in_words:
about_x_hours: "%{count} ore"
@@ -614,9 +635,13 @@ it:
x_months: "%{count} mesi"
x_seconds: "%{count} secondi"
deletes:
+ challenge_not_passed: Le informazioni che hai inserito non sono corrette
confirm_password: Inserisci la tua password attuale per verificare la tua identità
+ confirm_username: Inserisci il tuo nome utente per confermare la procedura
proceed: Cancella l'account
success_msg: Il tuo account è stato cancellato
+ warning:
+ before: 'Prima di procedere, per favore leggi attentamente queste note:'
directories:
directory: Directory dei profili
explanation: Scopri utenti in base ai loro interessi
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 303c462fd..5e6d87869 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -238,8 +238,10 @@ ko:
disabled_msg: 성공적으로 비활성화하였습니다
emoji: 에모지
enable: 활성화
+ enabled: 활성됨
enabled_msg: 성공적으로 활성화하였습니다
image_hint: 50KB 이하의 PNG
+ list: 목록
listed: 목록에 실림
new:
title: 새 커스텀 에모지 추가
@@ -248,6 +250,7 @@ ko:
shortcode_hint: 최소 2글자, 영문자, 숫자, _만 사용 가능
title: 커스텀 에모지
uncategorized: 분류되지 않음
+ unlist: 목록에서 제거
unlisted: 목록에 없음
update_failed_msg: 에모지를 업데이트 할 수 없습니다
updated_msg: 에모지가 성공적으로 업데이트 되었습니다!
@@ -379,6 +382,7 @@ ko:
pending: 릴레이의 승인 대기중
save_and_enable: 저장하고 활성화
setup: 릴레이 연결 설정
+ signatures_not_enabled: 시큐어모드나 화이트리스트모드를 사용하고 있다면 릴레이는 제대로 동작하지 않을 것입니다
status: 상태
title: 릴레이
report_notes:
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index bbffde053..f4501a865 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -242,8 +242,10 @@ nl:
disabled_msg: Uitschakelen van deze emoji geslaagd
emoji: Emoji
enable: Inschakelen
+ enabled: Ingeschakeld
enabled_msg: Inschakelen van deze emoji geslaagd
image_hint: PNG van max. 50KB
+ list: In lijst
listed: Weergegeven
new:
title: Lokale emoji toevoegen
@@ -252,12 +254,13 @@ nl:
shortcode_hint: Tenminste 2 tekens (alleen alfanumeriek en underscores)
title: Lokale emoji’s
uncategorized: Niet gecategoriseerd
+ unlist: Niet in lijst
unlisted: Niet weergegeven
update_failed_msg: Deze emoji kon niet worden bijgewerkt
updated_msg: Bijwerken van emoji is geslaagd!
upload: Uploaden
dashboard:
- authorized_fetch_mode: Geautoriseerde ophaalmodus
+ authorized_fetch_mode: Veilige modus
backlog: achterstallige taken
config: Configuratie
feature_deletions: Verwijderen van account
@@ -383,6 +386,7 @@ nl:
pending: Aan het wachten op toestemming van de relayserver
save_and_enable: Opslaan en inschakelen
setup: Een verbinding met een relayserver maken
+ signatures_not_enabled: Federatierelays werken niet goed wanneer de veilige modus of de witte lijstmodus is ingeschakeld
status: Status
title: Relayservers
report_notes:
@@ -662,6 +666,10 @@ nl:
caches: Toots en media die op andere servers zijn opgeslagen kunnen daar achterblijven
data_removal: Jouw toots en andere gegevens worden permanent verwijderd
email_change_html: Je kunt je e-mailadres wijzigen zonder dat je jouw account hoeft te verwijderen
+ email_contact_html: Wanneer het nog steeds niet aankomt, kun je voor hulp e-mailen naar %{email}
+ email_reconfirmation_html: Wanneer je de bevestigingsmail niet hebt ontvangen, kun je deze opnieuw aanvragen
+ irreversible: Je zult niet in staat zijn om jouw account te herstellen of te deactiveren
+ more_details_html: Zie het privacybeleid voor meer informatie.
username_available: Jouw gebruikersnaam zal weer beschikbaar komen
username_unavailable: Jouw gebruikersnaam zal onbeschikbaar blijven
directories:
@@ -671,10 +679,10 @@ nl:
domain_validator:
invalid_domain: is een ongeldige domeinnaam
errors:
- '400': The request you submitted was invalid or malformed.
+ '400': De aanvraag die je hebt ingediend was ongeldig of foutief.
'403': Jij hebt geen toestemming om deze pagina te bekijken.
'404': De pagina waarnaar jij op zoek bent bestaat niet.
- '406': This page is not available in the requested format.
+ '406': Deze pagina is niet beschikbaar in het opgevraagde formaat.
'410': De pagina waarnaar jij op zoek bent bestaat niet meer.
'422':
content: Veiligheidsverificatie mislukt. Blokkeer je toevallig cookies?
@@ -683,7 +691,7 @@ nl:
'500':
content: Het spijt ons, er is aan onze kant iets fout gegaan.
title: Er is iets mis
- '503': The page could not be served due to a temporary server failure.
+ '503': De pagina kon door een tijdelijke serverstoring niet worden geladen.
noscript_html: Schakel JavaScript in om de webapp van Mastodon te kunnen gebruiken. Als alternatief kan je een Mastodon-app zoeken voor jouw platform.
existing_username_validator:
not_found: Kon geen lokale gebruiker met die gebruikersnaam vinden
@@ -707,6 +715,7 @@ nl:
add_new: Nieuwe toevoegen
errors:
limit: Je hebt al het maximaal aantal hashtags uitgelicht
+ hint_html: "Wat zijn uitgelichte hashtags? Deze worden prominent op jouw openbare profiel getoond en stelt mensen in staat om jouw openbare toots per hashtag te bekijken. Het zijn een goed hulpmiddel om creatieve werkzaamheden of langetermijnprojecten bij te houden."
filters:
contexts:
home: Starttijdlijn
@@ -732,6 +741,7 @@ nl:
all: Alles
changes_saved_msg: Wijzigingen succesvol opgeslagen!
copy: Kopiëren
+ no_batch_actions_available: Geen batchacties op deze pagina beschikbaar
order_by: Sorteer op
save_changes: Wijzigingen opslaan
validation_errors:
@@ -804,6 +814,7 @@ nl:
migrations:
acct: Verhuisd naar
cancel: Doorverwijzing annuleren
+ cancel_explanation: Het annuleren van de doorverwijzing zal jouw huidige account opnieuw activeren, maar brengt geen volgers terug die naar het andere account zijn verhuisd.
cancelled_msg: De doorverwijzing is succesvol geannuleerd.
errors:
already_moved: is hetzelfde account waarnaar je al naar toe bent verhuisd
@@ -989,6 +1000,8 @@ nl:
profile: Profiel
relationships: Volgers en gevolgden
two_factor_authentication: Tweestapsverificatie
+ spam_check:
+ spam_detected_and_silenced: Dit is een automatisch gegenereerde rapportage. Er is spam gedetecteerd en de verzender hiervan werd automatisch genegeerd. Wanneer dit een vergissing is, kun je het negeren van dit account beter weer ongedaan maken.
statuses:
attached:
description: 'Bijlagen: %{attached}'
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 793b75531..819ea3ef6 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -233,8 +233,10 @@ oc:
disabled_msg: Aqueste emoji es ben desactivat
emoji: Emoji
enable: Activar
+ enabled: Activat
enabled_msg: Aqueste emoji es ben activat
image_hint: PNG cap a 50Ko
+ list: Listar
listed: Listat
new:
title: Ajustar un nòu emoji personal
@@ -242,6 +244,8 @@ oc:
shortcode: Acorchi
shortcode_hint: Almens 2 caractèrs, solament alfanumerics e jonhent bas
title: Emojis personals
+ uncategorized: Sens categoria
+ unlist: Listar pas
unlisted: Pas listat
update_failed_msg: Mesa a jorn de l’emoji fracasada
updated_msg: Emoji ben mes a jorn !
@@ -260,6 +264,8 @@ oc:
features: Foncionalitats
hidden_service: Federacion amb servicis amagats
open_reports: Senhalaments dobèrts
+ pending_tags: etiquetas en espèra de validacion
+ pending_users: utilizaires en espèra de validacion
recent_users: Utilizaires recents
search: Recèrca tèxte complèt
single_user_mode: Mòde sol utilizaire
@@ -294,6 +300,7 @@ oc:
suspend: Suspendre
title: Nòu blocatge domeni
private_comment: Comentari privat
+ private_comment_hint: Comentari tocant la limitacion d’aqueste domeni per un usatge intèrn pels moderators.
public_comment: Comentari public
reject_media: Regetar los fichièrs mèdias
reject_media_hint: Lèva los fichièrs gardats localament e regèta las demandas de telecargament dins lo futur. Servís pas a res per las suspensions
@@ -369,6 +376,7 @@ oc:
pending: En espèra d’aprovacion del relai
save_and_enable: Salvar e activar
setup: Configurar una connexion relai
+ signatures_not_enabled: Los relais foncionaràn pas coma cal se lo mòde segur o lista blanca es activat
status: Estatut
title: Relais
report_notes:
@@ -417,6 +425,15 @@ oc:
custom_css:
desc_html: Modificar l’estil amb una fuèlha CSS cargada sus cada pagina
title: CSS personalizada
+ default_noindex:
+ desc_html: Tòca totes los utilizaires qu’an pas cambiat lo paramètre
+ domain_blocks:
+ all: A tot lo monde
+ disabled: A degun
+ title: Mostrar los blocatges de domeni
+ users: Als utilizaires locals connectats
+ domain_blocks_rationale:
+ title: Mostrar lo rasonament
hero:
desc_html: Mostrat en primièra pagina. Almens 600x100px recomandat. S’es pas configurat l’imatge del servidor serà mostrat
title: Imatge de l’eròi
@@ -493,6 +510,8 @@ oc:
title: Estatuts del compte
with_media: Amb mèdia
tags:
+ accounts_today: Utilizacions unicas uèi
+ accounts_week: Utilizacions unicas aquesta setmana
context: Contèxt
directory: A l’annuari
in_directory: "%{count} a l’annuari"
@@ -500,7 +519,13 @@ oc:
most_popular: Mai popularas
most_recent: Mai recentas
name: Etiqueta
+ review: Repassar l’estatut
+ reviewed: Repassadas
title: Etiquetas
+ trending_right_now: Actualament en tendéncia
+ unique_uses_today: "%{count} publicacions uèi"
+ unreviewed: Pas repassadas
+ updated_msg: Paramètres d’etiquetas corrèctament actualizats
title: Administracion
warning_presets:
add_new: N’ajustar un nòu
@@ -542,8 +567,12 @@ oc:
apply_for_account: Demandar una invitacion
change_password: Senhal
checkbox_agreement_html: Accepti las règlas del servidor e los tèrmes del servici
+ checkbox_agreement_without_rules_html: Soi d’acòrdi amb las condicions d’utilizacion
delete_account: Suprimir lo compte
delete_account_html: Se volètz suprimir vòstre compte, podètz o far aquí. Vos demandarem que confirmetz.
+ description:
+ prefix_invited_by_user: "@%{name} vos convida a rejónher aqueste servidor Mastodon !"
+ prefix_sign_up: Marcatz-vos a Mostodon uèi !
didnt_get_confirmation: Avètz pas recebut las instruccions de confirmacion ?
forgot_password: Senhal oblidat ?
invalid_reset_password_token: Lo geton de reïnicializacion es invalid o acabat. Tornatz demandar un geton se vos plai.
@@ -565,6 +594,7 @@ oc:
title: Configuracion
status:
account_status: Estat del compte
+ functional: Vòstre compte es complètament foncional.
trouble_logging_in: Problèmas de connexion ?
authorize_follow:
already_following: Seguètz ja aqueste compte
@@ -605,6 +635,9 @@ oc:
warning:
caches: Lo contengut en cache suls autres servidors pòt demorar
email_change_html: Podètz cambiar vòstra adreça electroniasens suprimir vòstre compte
+ irreversible: Poiretz pas restaurar o reactivar vòstre compte
+ more_details_html: Per mai d’informacion, vejatz la politica de confidencialitat.
+ username_available: Vòstre nom d’utilizaire serà disponible de nòu
username_unavailable: Vòstre nom d’utilizaire demorarà pas disponible
directories:
directory: Annuari de perfils
@@ -616,7 +649,7 @@ oc:
'400': The request you submitted was invalid or malformed.
'403': Avètz pas l’autorizacion de veire aquesta pagina.
'404': La pagina que cercatz existís pas aquí.
- '406': This page is not available in the requested format.
+ '406': La pagina es pas disponibla dins lo format demandat.
'410': La pagina que cercatz existís pas mai aquí.
'422':
content: Verificacion de seguretat fracassada. Blocatz los cookies ?
@@ -674,6 +707,7 @@ oc:
all: Tot
changes_saved_msg: Cambiaments ben realizats !
copy: Copiar
+ no_batch_actions_available: Cap d’accion de massa pas disponibla sus aquesta pagina
order_by: Triar per
save_changes: Salvar los cambiaments
validation_errors:
@@ -750,7 +784,15 @@ oc:
errors:
move_to_self: pòt pas èsser lo compte actual
not_found: impossible de trobar
+ incoming_migrations: Mudar d’un compte diferent
+ moved_msg: Vòstre compte manda ara a %{acct} e vòstres seguidors son desplaçats.
+ not_redirecting: Vòstre compte manda pas enlòc pel moment.
+ past_migrations: Migracions passadas
proceed_with_move: Desplaçar los seguidors
+ redirecting_to: Vòstre compte manda a %{acct}.
+ warning:
+ before: 'Abans de contunhar, volgatz legir aquestas nòtas amb atencion :'
+ other_data: Cap d’autra donada serà desplaçada automaticament
moderation:
title: Moderacion
notification_mailer:
@@ -953,6 +995,8 @@ oc:
pinned: Tut penjat
reblogged: a partejat
sensitive_content: Contengut sensible
+ tags:
+ does_not_match_previous_name: correspond pas al nom precedent
terms:
body_html: |
Politica de confidencialitat
diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml
index 7ff5fbf77..53ff05de1 100644
--- a/config/locales/simple_form.el.yml
+++ b/config/locales/simple_form.el.yml
@@ -137,12 +137,12 @@ el:
text: Γιατί θέλεις να συμμετάσχεις;
notification_emails:
digest: Στέλνε συνοπτικά email
- favourite: Στελνε email όταν κάποιος σημειώνει ως αγαπημένη τη δημοσίευσή σου
- follow: Στελνε email όταν κάποιος σε ακολουθεί
- follow_request: Στέλνε email όταν κάποιος ζητάει να σε ακολουθήσει
- mention: Στέλνε email όταν κάποιος σε αναφέρει
+ favourite: Αποστολή email όταν κάποιος σημειώνει ως αγαπημένη τη δημοσίευσή σου
+ follow: Αποστολή email όταν κάποιος σε ακολουθεί
+ follow_request: Αποστολή email όταν κάποιος ζητάει να σε ακολουθήσει
+ mention: Αποστολή email όταν κάποιος σε αναφέρει
pending_account: Αποστολή email όταν υπάρχει νέος λογαριασμός για επιθεώρηση
- reblog: Στέλνε email όταν κάποιος προωθεί τη δημοσίευση σου
+ reblog: Αποστολή email όταν κάποιος προωθεί τη δημοσίευση σου
report: Αποστολή email όταν υποβάλλεται νέα καταγγελία
trending_tag: Αποστολή email όταν μια μη-εγκεκριμένη ταμπέλα γίνεται δημοφιλής
tag:
diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml
new file mode 100644
index 000000000..515d5c1ed
--- /dev/null
+++ b/config/locales/simple_form.es-AR.yml
@@ -0,0 +1 @@
+es-AR:
diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml
index 515d5c1ed..2fb33dbc3 100644
--- a/config/locales/simple_form.es.yml
+++ b/config/locales/simple_form.es.yml
@@ -1 +1,170 @@
-es-AR:
+---
+es:
+ simple_form:
+ hints:
+ account_alias:
+ acct: Especifique el nombre de usuario@dominio de la cuenta desde la cual se desea migrar
+ account_migration:
+ acct: Especifique el nombre de usuario@dominio de la cuenta a la cual se desea migrar
+ account_warning_preset:
+ text: Puede usar sintaxis de toots, como URLs, hashtags y menciones
+ admin_account_action:
+ include_statuses: El usuario verá qué toots han causado la acción de moderación o advertencia
+ send_email_notification: El usuario recibirá una explicación de lo que sucedió con respecto a su cuenta
+ text_html: Opcional. Puede usar sintaxis de toots. Puede añadir configuraciones predefinidas de advertencia para ahorrar tiempo
+ type_html: Elige qué hacer con %{acct}
+ warning_preset_id: Opcional. Aún puede añadir texto personalizado al final de la configuración predefinida
+ defaults:
+ autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente
+ avatar: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px
+ bot: Esta cuenta ejecuta principalmente acciones automatizadas y podría no ser monitorizada
+ context: Uno o múltiples contextos en los que debe aplicarse el filtro
+ current_password: Por razones de seguridad por favor ingrese la contraseña de la cuenta actual
+ current_username: Para confirmar, por favor ingrese el nombre de usuario de la cuenta actual
+ digest: Solo enviado tras un largo periodo de inactividad y solo si has recibido mensajes personales durante tu ausencia
+ discoverable: El directorio del perfil es otra forma en la que su cuenta puede llegar a un público más amplio
+ email: Se le enviará un correo de confirmación
+ fields: Puedes tener hasta 4 elementos mostrándose como una tabla en tu perfil
+ header: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px
+ inbox_url: Copia la URL de la página principal del relés que quieres utilizar
+ irreversible: Los toots filtrados desaparecerán irreversiblemente, incluso si este filtro es eliminado más adelante
+ locale: El idioma de la interfaz de usuario, correos y notificaciones push
+ locked: Requiere que manualmente apruebes seguidores y las publicaciones serán mostradas solamente a tus seguidores
+ password: Utilice al menos 8 caracteres
+ phrase: Se aplicará sin importar las mayúsculas o los avisos de contenido de un toot
+ scopes: Qué APIs de la aplicación tendrán acceso. Si seleccionas el alcance de nivel mas alto, no necesitas seleccionar las individuales.
+ setting_aggregate_reblogs: No mostrar nuevos retoots para los toots que han sido recientemente retooteados (sólo afecta a los retoots recibidos recientemente)
+ setting_default_sensitive: El contenido multimedia sensible está oculto por defecto y puede ser mostrado con un click
+ setting_display_media_default: Ocultar contenido multimedia marcado como sensible
+ setting_display_media_hide_all: Siempre ocultar todo el contenido multimedia
+ setting_display_media_show_all: Mostrar siempre contenido multimedia marcado como sensible
+ setting_hide_network: A quién sigues y quién te sigue no será mostrado en tu perfil
+ setting_noindex: Afecta a tu perfil público y páginas de estado
+ setting_show_application: La aplicación que utiliza usted para publicar toots se mostrará en la vista detallada de sus toots
+ setting_use_blurhash: Los gradientes se basan en los colores de las imágenes ocultas pero haciendo borrosos los detalles
+ setting_use_pending_items: Ocultar nuevos estados detrás de un clic en lugar de desplazar automáticamente el feed
+ username: Tu nombre de usuario será único en %{domain}
+ whole_word: Cuando la palabra clave o frase es solo alfanumérica, solo será aplicado si concuerda con toda la palabra
+ domain_allow:
+ domain: Este dominio podrá obtener datos de este servidor y los datos entrantes serán procesados y archivados
+ featured_tag:
+ name: 'Puede que quieras usar uno de estos:'
+ form_challenge:
+ current_password: Estás entrando en un área segura
+ imports:
+ data: Archivo CSV exportado desde otra instancia de Mastodon
+ invite_request:
+ text: Esto nos ayudará a revisar su aplicación
+ sessions:
+ otp: 'Introduce el código de autenticación de dos factores geberado por tu aplicación de teléfono o usa uno de tus códigos de recuperación:'
+ tag:
+ name: Sólo se puede cambiar el cajón de las letras, por ejemplo, para que sea más legible
+ user:
+ chosen_languages: Cuando se marca, solo se mostrarán los toots en los idiomas seleccionados en los timelines públicos
+ labels:
+ account:
+ fields:
+ name: Etiqueta
+ value: Contenido
+ account_alias:
+ acct: Maneja la cuenta antigua
+ account_migration:
+ acct: Maneja la cuenta nueva
+ account_warning_preset:
+ text: Texto predefinido
+ admin_account_action:
+ include_statuses: Incluir en el correo electrónico a los toots denunciados
+ send_email_notification: Notificar al usuario por correo electrónico
+ text: Aviso personalizado
+ type: Acción
+ types:
+ disable: Deshabilitar
+ none: No hacer nada
+ silence: Silenciar
+ suspend: Suspender y eliminar de forma irreversible la información de la cuenta
+ warning_preset_id: Usar un aviso predeterminado
+ defaults:
+ autofollow: Invitar a seguir tu cuenta
+ avatar: Avatar
+ bot: Esta es una cuenta bot
+ chosen_languages: Filtrar idiomas
+ confirm_new_password: Confirmar nueva contraseña
+ confirm_password: Confirmar contraseña
+ context: Filtrar contextos
+ current_password: Contraseña actual
+ data: Información
+ discoverable: Listar esta cuenta en el directorio
+ display_name: Nombre para mostrar
+ email: Dirección de correo electrónico
+ expires_in: Expirar tras
+ fields: Metadatos de perfil
+ header: Img. cabecera
+ inbox_url: URL de la entrada de relés
+ irreversible: Dejar en lugar de ocultar
+ locale: Idioma
+ locked: Hacer privada esta cuenta
+ max_uses: Máx. número de usos
+ new_password: Nueva contraseña
+ note: Biografía
+ otp_attempt: Código de dos factores
+ password: Contraseña
+ phrase: Palabra clave o frase
+ setting_advanced_layout: Habilitar interfaz web avanzada
+ setting_aggregate_reblogs: Agrupar retoots en las líneas de tiempo
+ setting_auto_play_gif: Reproducir automáticamente los GIFs animados
+ setting_boost_modal: Mostrar ventana de confirmación antes de un Retoot
+ setting_default_language: Idioma de publicación
+ setting_default_privacy: Privacidad de publicaciones
+ setting_default_sensitive: Marcar siempre imágenes como sensibles
+ setting_delete_modal: Mostrar diálogo de confirmación antes de borrar un toot
+ setting_display_media: Visualización multimedia
+ setting_display_media_default: Por defecto
+ setting_display_media_hide_all: Ocultar todo
+ setting_display_media_show_all: Mostrar todo
+ setting_expand_spoilers: Siempre expandir los toots marcados con advertencias de contenido
+ setting_hide_network: Ocultar tu red
+ setting_noindex: Excluirse del indexado de motores de búsqueda
+ setting_reduce_motion: Reducir el movimiento de las animaciones
+ setting_show_application: Mostrar aplicación usada para publicar toots
+ setting_system_font_ui: Utilizar la tipografía por defecto del sistema
+ setting_theme: Tema del sitio
+ setting_trends: Mostrar las tendencias de hoy
+ setting_unfollow_modal: Mostrar diálogo de confirmación antes de dejar de seguir a alguien
+ setting_use_blurhash: Mostrar gradientes coloridos para contenido multimedia oculto
+ setting_use_pending_items: Modo lento
+ severity: Severidad
+ type: Importar tipo
+ username: Nombre de usuario
+ username_or_email: Usuario o Email
+ whole_word: Toda la palabra
+ featured_tag:
+ name: Etiqueta
+ interactions:
+ must_be_follower: Bloquear notificaciones de personas que no te siguen
+ must_be_following: Bloquear notificaciones de personas que no sigues
+ must_be_following_dm: Bloquear mensajes directos de la gente que no sigues
+ invite:
+ comment: Comentar
+ invite_request:
+ text: "¿Por qué quiere unirse usted?"
+ notification_emails:
+ digest: Enviar resumen de correos electrónicos
+ favourite: Enviar correo electrónico cuando alguien de a favorito en su publicación
+ follow: Enviar correo electrónico cuando alguien te siga
+ follow_request: Enviar correo electrónico cuando alguien solicita seguirte
+ mention: Enviar correo electrónico cuando alguien te mencione
+ pending_account: Enviar correo electrónico cuando una nueva cuenta necesita revisión
+ reblog: Enviar correo electrónico cuando alguien comparta su publicación
+ report: Enviar un correo cuando se envía un nuevo informe
+ trending_tag: Enviar correo electrónico cuando una etiqueta no revisada está de tendencia
+ tag:
+ listable: Permitir que esta etiqueta aparezca en las búsquedas y en el directorio del perfil
+ name: Etiqueta
+ trendable: Permitir que esta etiqueta aparezca bajo tendencias
+ usable: Permitir a los toots usar esta etiqueta
+ 'no': 'No'
+ recommended: Recomendado
+ required:
+ mark: "*"
+ text: necesario
+ 'yes': Sí
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index d96eafb8b..e89f9be00 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -16,7 +16,7 @@ ko:
warning_preset_id: 선택사항. 틀의 마지막에 임의의 텍스트를 추가 할 수 있습니다
defaults:
autofollow: 이 초대를 통해 가입하는 사람은 당신을 자동으로 팔로우 하게 됩니다
- avatar: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 다운스케일 될 것임
+ avatar: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 축소 됨
bot: 사람들에게 계정이 사람이 아님을 알립니다
context: 필터를 적용 할 한 개 이상의 컨텍스트
current_password: 보안을 위해 현재 계정의 비밀번호를 입력해주세요
@@ -25,7 +25,7 @@ ko:
discoverable: 프로필 디렉터리는 내 계정이 더 많은 관심을 갖게 할 수 있는 다른 방법입니다
email: 당신은 확인 메일을 받게 됩니다
fields: 당신의 프로파일에 최대 4개까지 표 형식으로 나타낼 수 있습니다
- header: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 다운스케일 됨
+ header: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 축소 됨
inbox_url: 사용 할 릴레이 서버의 프론트페이지에서 URL을 복사합니다
irreversible: 필터링 된 툿은 나중에 필터가 사라지더라도 돌아오지 않게 됩니다
locale: 유저 인터페이스, 이메일, 푸시 알림 언어
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index cda4e9ead..77445b0cb 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -2,9 +2,14 @@
nl:
simple_form:
hints:
+ account_alias:
+ acct: Vul de gebruikersnaam@domein van het account in, die je wilt verhuizen
+ account_migration:
+ acct: Vul de gebruikersnaam@domein van het account in, waarnaartoe je wilt verhuizen
account_warning_preset:
text: Je kunt voor toots specifieke tekst gebruiken, zoals URL's, hashtags en vermeldingen
admin_account_action:
+ include_statuses: De gebruiker ziet welke toots verantwoordelijk zijn voor de moderatieactie of waarschuwing
send_email_notification: De gebruiker ontvangt een uitleg over wat er met hun account is gebeurd
text_html: Optioneel. Je kunt voor toots specifieke tekst gebruiken. Om tijd te besparen kun je voorinstellingen van waarschuwingen toevoegen
type_html: Kies wat er met %{acct} moet gebeuren
@@ -14,7 +19,10 @@ nl:
avatar: PNG, GIF of JPG. Maximaal %{size}. Wordt teruggeschaald naar %{dimensions}px
bot: Dit is een geautomatiseerd account en wordt mogelijk niet gemonitord
context: Een of meerdere locaties waar de filter actief moet zijn
+ current_password: Voer voor veiligheidsredenen het wachtwoord van je huidige account in
+ current_username: Voer ter bevestiging de gebruikersnaam van je huidige account in
digest: Wordt alleen na een lange periode van inactiviteit verzonden en alleen wanneer je tijdens jouw afwezigheid persoonlijke berichten hebt ontvangen
+ discoverable: De gebruikersgids is een andere manier waarmee jouw account een groter publiek kan bereiken
email: Je krijgt een bevestigingsmail
fields: Je kan maximaal 4 items als een tabel op je profiel weergeven
header: PNG, GIF of JPG. Maximaal %{size}. Wordt teruggeschaald naar %{dimensions}px
@@ -33,16 +41,24 @@ nl:
setting_hide_network: Wie jij volgt en wie jou volgen wordt niet op jouw profiel getoond
setting_noindex: Heeft invloed op jouw openbare profiel en toots
setting_show_application: De toepassing de je gebruikt om te tooten wordt in de gedetailleerde weergave van de toot getoond
+ setting_use_blurhash: Wazige kleurovergangen zijn gebaseerd op de kleuren van de verborgen media, waarmee elk detail verdwijnt
+ setting_use_pending_items: De tijdlijn wordt bijgewerkt door op het aantal nieuwe items te klikken, in plaats van dat deze automatisch wordt bijgewerkt
username: Jouw gebruikersnaam is uniek op %{domain}
whole_word: Wanneer het trefwoord of zinsdeel alfanumeriek is, wordt het alleen gefilterd wanneer het hele woord overeenkomt
+ domain_allow:
+ domain: Dit domein is in staat om gegevens van deze server op te halen, en binnenkomende gegevens worden verwerkt en opgeslagen
featured_tag:
name: 'Je wilt misschien een van deze gebruiken:'
+ form_challenge:
+ current_password: Je betreedt een veilige omgeving
imports:
data: CSV-bestand dat op een andere Mastodonserver werd geëxporteerd
invite_request:
text: Dit helpt ons om jouw aanvraag te beoordelen
sessions:
otp: 'Voer de tweestaps-aanmeldcode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcodes:'
+ tag:
+ name: Je kunt elk woord met een hoofdletter beginnen, om zo bijvoorbeeld de tekst leesbaarder te maken
user:
chosen_languages: Alleen toots in de aangevinkte talen worden op de openbare tijdlijnen getoond
labels:
@@ -50,9 +66,14 @@ nl:
fields:
name: Label
value: Inhoud
+ account_alias:
+ acct: Mastodonadres van het oude account
+ account_migration:
+ acct: Mastodonadres van het nieuwe account
account_warning_preset:
text: Tekst van voorinstelling
admin_account_action:
+ include_statuses: Gerapporteerde toots aan de e-mail toevoegen
send_email_notification: Meld dit per e-mail aan de gebruiker
text: Aangepaste waarschuwing
type: Actie
@@ -107,7 +128,9 @@ nl:
setting_show_application: Toepassing onthullen die je voor het verzenden van toots gebruikt
setting_system_font_ui: Standaardlettertype van jouw systeem gebruiken
setting_theme: Thema website
+ setting_trends: Trends van vandaag tonen
setting_unfollow_modal: Vraag voor het ontvolgen van iemand een bevestiging
+ setting_use_blurhash: Wazige kleurovergangen voor verborgen media tonen
setting_use_pending_items: Langzame modus
severity: Zwaarte
type: Importtype
@@ -120,6 +143,8 @@ nl:
must_be_follower: Meldingen van mensen die jou niet volgen blokkeren
must_be_following: Meldingen van mensen die jij niet volgt blokkeren
must_be_following_dm: Directe berichten van mensen die jij niet volgt blokkeren
+ invite:
+ comment: Opmerking
invite_request:
text: Waarom wil jij je aanmelden?
notification_emails:
@@ -131,8 +156,12 @@ nl:
pending_account: Een e-mail verzenden wanneer een nieuw account moet worden beoordeeld
reblog: Een e-mail versturen wanneer iemand jouw toot heeft geboost
report: Verstuur een e-mail wanneer een nieuw rapportage is ingediend
+ trending_tag: Een e-mail versturen wanneer een nog niet beoordeelde hashtag trending is
tag:
+ listable: Toestaan dat deze hashtag in zoekopdrachten en in de gebruikersgids te zien valt
name: Hashtag
+ trendable: Toestaan dat deze hashtag onder trends te zien valt
+ usable: Toestaan dat deze hashtag in toots gebruikt mag worden
'no': Nee
recommended: Aanbevolen
required:
diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml
index 220f944ce..59651d9de 100644
--- a/config/locales/simple_form.oc.yml
+++ b/config/locales/simple_form.oc.yml
@@ -45,6 +45,8 @@ oc:
setting_use_pending_items: Rescondre las actualizacions del flux d’actualitat aprèp un clic allòc de desfilar lo flux automaticament
username: Vòstre nom d’utilizaire serà unic sus %{domain}
whole_word: Quand lo mot-clau o frasa es solament alfranumeric, serà pas qu’aplicat se correspond al mot complèt
+ domain_allow:
+ domain: Aqueste domeni poirà recuperar las donadas d’aqueste servidor estant e las donadas venent d’aqueste domeni seràn tractadas e gardadas
featured_tag:
name: 'Benlèu que volètz utilizar una d’aquestas causas :'
form_challenge:
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 729573d92..08f144c25 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -440,6 +440,8 @@ sk:
custom_css:
desc_html: Uprav vzhľad pomocou CSS, ktoré je načítané na každej stránke
title: Vlastné CSS
+ default_noindex:
+ desc_html: Ovplyvňuje všetkých užívateľov, ktorí si toto nasavenie nezmenili sami
domain_blocks:
all: Všetkým
disabled: Nikomu
From 13b06d4b3b705deb90d063f4903737b5609dfbc7 Mon Sep 17 00:00:00 2001
From: Eugen Rochko
Date: Sun, 29 Sep 2019 18:50:16 +0200
Subject: [PATCH 36/41] Bump version to 3.0.0rc2 (#11999)
---
CHANGELOG.md | 4 ++++
lib/mastodon/version.rb | 2 +-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a170c3ecd..4e9ccdc8c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -50,6 +50,7 @@ All notable changes to this project will be documented in this file.
- **Add search syntax for operators and phrases** ([Gargron](https://github.com/tootsuite/mastodon/pull/11411))
- **Add REST API for managing featured hashtags** ([noellabo](https://github.com/tootsuite/mastodon/pull/11778))
- **Add REST API for managing timeline read markers** ([Gargron](https://github.com/tootsuite/mastodon/pull/11762))
+- Add `exclude_unreviewed` param to `GET /api/v2/search` REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/11977))
- **Add ActivityPub secure mode** ([Gargron](https://github.com/tootsuite/mastodon/pull/11269), [ThibG](https://github.com/tootsuite/mastodon/pull/11332), [ThibG](https://github.com/tootsuite/mastodon/pull/11295))
- Add HTTP signatures to all outgoing ActivityPub GET requests ([Gargron](https://github.com/tootsuite/mastodon/pull/11284), [ThibG](https://github.com/tootsuite/mastodon/pull/11300))
- Add support for ActivityPub Audio activities ([ThibG](https://github.com/tootsuite/mastodon/pull/11189))
@@ -98,6 +99,7 @@ All notable changes to this project will be documented in this file.
- Change Dockerfile ([Shleeble](https://github.com/tootsuite/mastodon/pull/11710), [ykzts](https://github.com/tootsuite/mastodon/pull/11768), [Shleeble](https://github.com/tootsuite/mastodon/pull/11707))
- Change supported Node versions to include v12 ([abcang](https://github.com/tootsuite/mastodon/pull/11706))
- Change Portuguese language from `pt` to `pt-PT` ([Gargron](https://github.com/tootsuite/mastodon/pull/11820))
+- Change domain block silence to always require approval on follow ([ThibG](https://github.com/tootsuite/mastodon/pull/11975))
### Removed
@@ -172,6 +174,8 @@ All notable changes to this project will be documented in this file.
- Fix URLs counting towards RTL detection ([ahangarha](https://github.com/tootsuite/mastodon/pull/11759))
- Fix unnecessary status re-rendering in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11211))
- Fix http_parser.rb gem not being compiled when no network available ([petabyteboy](https://github.com/tootsuite/mastodon/pull/11444))
+- Fix muted text color not applying to all text ([trwnh](https://github.com/tootsuite/mastodon/pull/11996))
+- Fix follower/following lists resetting on back-navigation in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11986))
## [2.9.3] - 2019-08-10
### Added
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index bd49f0a17..9c5686ed2 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -17,7 +17,7 @@ module Mastodon
end
def flags
- 'rc1'
+ 'rc2'
end
def suffix
From 15b3eeb326d7e6a026235ece25c3be75250de92f Mon Sep 17 00:00:00 2001
From: ThibG
Date: Sun, 29 Sep 2019 21:23:40 +0200
Subject: [PATCH 37/41] Change vote results to display ex-aequo leading options
as leading (#12001)
---
app/javascript/mastodon/components/poll.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/javascript/mastodon/components/poll.js b/app/javascript/mastodon/components/poll.js
index dd7e2fcd3..f88d260f2 100644
--- a/app/javascript/mastodon/components/poll.js
+++ b/app/javascript/mastodon/components/poll.js
@@ -103,7 +103,7 @@ class Poll extends ImmutablePureComponent {
renderOption (option, optionIndex, showResults) {
const { poll, disabled, intl } = this.props;
const percent = poll.get('votes_count') === 0 ? 0 : (option.get('votes_count') / poll.get('votes_count')) * 100;
- const leading = poll.get('options').filterNot(other => other.get('title') === option.get('title')).every(other => option.get('votes_count') > other.get('votes_count'));
+ const leading = poll.get('options').filterNot(other => other.get('title') === option.get('title')).every(other => option.get('votes_count') >= other.get('votes_count'));
const active = !!this.state.selected[`${optionIndex}`];
const voted = option.get('voted') || (poll.get('own_votes') && poll.get('own_votes').includes(optionIndex));
From 5f69eb89e215fe7dc02cd0dc3f39b13f1945e88b Mon Sep 17 00:00:00 2001
From: Eugen Rochko
Date: Sun, 29 Sep 2019 21:31:51 +0200
Subject: [PATCH 38/41] Add a nodeinfo endpoint (#12002)
* Add nodeinfo endpoint
* dont commit stuff from my local dev
* consistant naming since we implimented 2.1 schema
* Add some additional node info stuff
* Add nodeinfo endpoint
* dont commit stuff from my local dev
* consistant naming since we implimented 2.1 schema
* expanding this to include federation info
* codeclimate feedback
* CC feedback
* using activeserializers seems like a good idea...
* get rid of draft 2.1 version
* Reimplement 2.1, also fix metaData -> metadata
* Fix metaData -> metadata here too
* Fix nodeinfo 2.1 tests
* Implement cache for monthly user aggregate
* Useless
* Remove ostatus from the list of supported protocols
* Fix nodeinfo's open_registration reading obsolete setting variable
* Only serialize domain blocks with user-facing limitations
* Do not needlessly list noop severity in nodeinfo
* Only serialize domain blocks info in nodeinfo when they are set to be displayed to everyone
* Enable caching for nodeinfo endpoints
* Fix rendering nodeinfo
* CodeClimate fixes
* Please CodeClimate
* Change InstancePresenter#active_user_count_months for clarity
* Refactor NodeInfoSerializer#metadata
* Remove nodeinfo 2.1 support as the schema doesn't exist
* Clean-up
---
.../well_known/nodeinfo_controller.rb | 19 +++++++++
app/lib/activity_tracker.rb | 2 +-
app/lib/nodeinfo/adapter.rb | 7 ++++
app/presenters/instance_presenter.rb | 4 +-
.../nodeinfo/discovery_serializer.rb | 11 +++++
app/serializers/nodeinfo/serializer.rb | 41 +++++++++++++++++++
config/initializers/inflections.rb | 1 +
config/routes.rb | 3 ++
.../well_known/nodeinfo_controller_spec.rb | 36 ++++++++++++++++
9 files changed, 121 insertions(+), 3 deletions(-)
create mode 100644 app/controllers/well_known/nodeinfo_controller.rb
create mode 100644 app/lib/nodeinfo/adapter.rb
create mode 100644 app/serializers/nodeinfo/discovery_serializer.rb
create mode 100644 app/serializers/nodeinfo/serializer.rb
create mode 100644 spec/controllers/well_known/nodeinfo_controller_spec.rb
diff --git a/app/controllers/well_known/nodeinfo_controller.rb b/app/controllers/well_known/nodeinfo_controller.rb
new file mode 100644
index 000000000..11a699ebc
--- /dev/null
+++ b/app/controllers/well_known/nodeinfo_controller.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module WellKnown
+ class NodeInfoController < ActionController::Base
+ include CacheConcern
+
+ before_action { response.headers['Vary'] = 'Accept' }
+
+ def index
+ expires_in 3.days, public: true
+ render_with_cache json: {}, serializer: NodeInfo::DiscoverySerializer, adapter: NodeInfo::Adapter, expires_in: 3.days, root: 'nodeinfo'
+ end
+
+ def show
+ expires_in 30.minutes, public: true
+ render_with_cache json: {}, serializer: NodeInfo::Serializer, adapter: NodeInfo::Adapter, expires_in: 30.minutes, root: 'nodeinfo'
+ end
+ end
+end
diff --git a/app/lib/activity_tracker.rb b/app/lib/activity_tracker.rb
index ae3c11b6a..81303b715 100644
--- a/app/lib/activity_tracker.rb
+++ b/app/lib/activity_tracker.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class ActivityTracker
- EXPIRE_AFTER = 90.days.seconds
+ EXPIRE_AFTER = 6.months.seconds
class << self
include Redisable
diff --git a/app/lib/nodeinfo/adapter.rb b/app/lib/nodeinfo/adapter.rb
new file mode 100644
index 000000000..1b48dcb98
--- /dev/null
+++ b/app/lib/nodeinfo/adapter.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class NodeInfo::Adapter < ActiveModelSerializers::Adapter::Attributes
+ def self.default_key_transform
+ :camel_lower
+ end
+end
diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb
index becc92c2d..c4caeaa8c 100644
--- a/app/presenters/instance_presenter.rb
+++ b/app/presenters/instance_presenter.rb
@@ -20,8 +20,8 @@ class InstancePresenter
Rails.cache.fetch('user_count') { User.confirmed.joins(:account).merge(Account.without_suspended).count }
end
- def active_user_count
- Rails.cache.fetch('active_user_count') { Redis.current.pfcount(*(0..3).map { |i| "activity:logins:#{i.weeks.ago.utc.to_date.cweek}" }) }
+ def active_user_count(weeks = 4)
+ Rails.cache.fetch('active_user_count') { Redis.current.pfcount(*(0...weeks).map { |i| "activity:logins:#{i.weeks.ago.utc.to_date.cweek}" }) }
end
def status_count
diff --git a/app/serializers/nodeinfo/discovery_serializer.rb b/app/serializers/nodeinfo/discovery_serializer.rb
new file mode 100644
index 000000000..07ab2a6ee
--- /dev/null
+++ b/app/serializers/nodeinfo/discovery_serializer.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class NodeInfo::DiscoverySerializer < ActiveModel::Serializer
+ include RoutingHelper
+
+ attribute :links
+
+ def links
+ [{ rel: 'http://nodeinfo.diaspora.software/ns/schema/2.0', href: nodeinfo_schema_url }]
+ end
+end
diff --git a/app/serializers/nodeinfo/serializer.rb b/app/serializers/nodeinfo/serializer.rb
new file mode 100644
index 000000000..1a7d7a911
--- /dev/null
+++ b/app/serializers/nodeinfo/serializer.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+class NodeInfo::Serializer < ActiveModel::Serializer
+ include RoutingHelper
+
+ attributes :version, :software, :protocols, :usage
+
+ def version
+ '2.0'
+ end
+
+ def software
+ { name: 'mastodon', version: Mastodon::Version.to_s }
+ end
+
+ def services
+ { outbound: [], inbound: [] }
+ end
+
+ def protocols
+ %w(activitypub)
+ end
+
+ def usage
+ {
+ users: {
+ total: instance_presenter.user_count,
+ active_month: instance_presenter.active_user_count(4),
+ active_halfyear: instance_presenter.active_user_count(24),
+ },
+
+ local_posts: instance_presenter.status_count,
+ }
+ end
+
+ private
+
+ def instance_presenter
+ @instance_presenter ||= InstancePresenter.new
+ end
+end
diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb
index bf0cb52a3..c65153b0a 100644
--- a/config/initializers/inflections.rb
+++ b/config/initializers/inflections.rb
@@ -18,4 +18,5 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.acronym 'PubSubHubbub'
inflect.acronym 'ActivityStreams'
inflect.acronym 'JsonLd'
+ inflect.acronym 'NodeInfo'
end
diff --git a/config/routes.rb b/config/routes.rb
index f1a69cf5c..e43e201a5 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -24,10 +24,13 @@ Rails.application.routes.draw do
end
get '.well-known/host-meta', to: 'well_known/host_meta#show', as: :host_meta, defaults: { format: 'xml' }
+ get '.well-known/nodeinfo', to: 'well_known/nodeinfo#index', as: :nodeinfo, defaults: { format: 'json' }
get '.well-known/webfinger', to: 'well_known/webfinger#show', as: :webfinger
get '.well-known/change-password', to: redirect('/auth/edit')
get '.well-known/keybase-proof-config', to: 'well_known/keybase_proof_config#show'
+ get '/nodeinfo/2.0', to: 'well_known/nodeinfo#show', as: :nodeinfo_schema
+
get 'manifest', to: 'manifests#show', defaults: { format: 'json' }
get 'intent', to: 'intents#show'
get 'custom.css', to: 'custom_css#show', as: :custom_css
diff --git a/spec/controllers/well_known/nodeinfo_controller_spec.rb b/spec/controllers/well_known/nodeinfo_controller_spec.rb
new file mode 100644
index 000000000..12e1fa415
--- /dev/null
+++ b/spec/controllers/well_known/nodeinfo_controller_spec.rb
@@ -0,0 +1,36 @@
+require 'rails_helper'
+
+describe WellKnown::NodeInfoController, type: :controller do
+ render_views
+
+ describe 'GET #index' do
+ it 'returns json document pointing to node info' do
+ get :index
+
+ expect(response).to have_http_status(200)
+ expect(response.content_type).to eq 'application/json'
+
+ json = body_as_json
+
+ expect(json[:links]).to be_an Array
+ expect(json[:links][0][:rel]).to eq 'http://nodeinfo.diaspora.software/ns/schema/2.0'
+ expect(json[:links][0][:href]).to include 'nodeinfo/2.0'
+ end
+ end
+
+ describe 'GET #show' do
+ it 'returns json document with node info properties' do
+ get :show
+
+ expect(response).to have_http_status(200)
+ expect(response.content_type).to eq 'application/json'
+
+ json = body_as_json
+
+ expect(json[:version]).to eq '2.0'
+ expect(json[:usage]).to be_a Hash
+ expect(json[:software]).to be_a Hash
+ expect(json[:protocols]).to be_an Array
+ end
+ end
+end
From 9027bfff0c25a6da1bcef7ce880e5d8211062d1d Mon Sep 17 00:00:00 2001
From: ThibG
Date: Sun, 29 Sep 2019 21:46:05 +0200
Subject: [PATCH 39/41] Add explanation to mute dialog, refactor and clean up
mute/block UI (#11992)
* Add some explanation to the mute modal dialog
* Remove `isSubmitting` from mute modal code, this wasn't used
* Refactor block modal
Signed-off-by: Thibaut Girka
* Refactor SCSS a bit
* Put mute modal toggle to the same side as in the report dialog for consistency
* Reword mute explanation
* Fix mute explanation styling
* Left-align all text in mute confirmation modal
---
app/javascript/mastodon/actions/blocks.js | 14 +++
.../mastodon/containers/status_container.js | 18 +--
.../containers/header_container.js | 15 +--
.../containers/detailed_status_container.js | 18 +--
.../mastodon/features/status/index.js | 20 +---
.../features/ui/components/block_modal.js | 103 ++++++++++++++++++
.../features/ui/components/modal_root.js | 2 +
.../features/ui/components/mute_modal.js | 15 ++-
.../features/ui/util/async-components.js | 4 +
app/javascript/mastodon/reducers/blocks.js | 22 ++++
app/javascript/mastodon/reducers/index.js | 2 +
app/javascript/mastodon/reducers/mutes.js | 2 -
.../styles/mastodon-light/diff.scss | 2 +
.../styles/mastodon/components.scss | 73 +++++++++----
14 files changed, 222 insertions(+), 88 deletions(-)
create mode 100644 app/javascript/mastodon/features/ui/components/block_modal.js
create mode 100644 app/javascript/mastodon/reducers/blocks.js
diff --git a/app/javascript/mastodon/actions/blocks.js b/app/javascript/mastodon/actions/blocks.js
index 7000f5a71..fd9881302 100644
--- a/app/javascript/mastodon/actions/blocks.js
+++ b/app/javascript/mastodon/actions/blocks.js
@@ -1,6 +1,7 @@
import api, { getLinks } from '../api';
import { fetchRelationships } from './accounts';
import { importFetchedAccounts } from './importer';
+import { openModal } from './modal';
export const BLOCKS_FETCH_REQUEST = 'BLOCKS_FETCH_REQUEST';
export const BLOCKS_FETCH_SUCCESS = 'BLOCKS_FETCH_SUCCESS';
@@ -10,6 +11,8 @@ export const BLOCKS_EXPAND_REQUEST = 'BLOCKS_EXPAND_REQUEST';
export const BLOCKS_EXPAND_SUCCESS = 'BLOCKS_EXPAND_SUCCESS';
export const BLOCKS_EXPAND_FAIL = 'BLOCKS_EXPAND_FAIL';
+export const BLOCKS_INIT_MODAL = 'BLOCKS_INIT_MODAL';
+
export function fetchBlocks() {
return (dispatch, getState) => {
dispatch(fetchBlocksRequest());
@@ -83,3 +86,14 @@ export function expandBlocksFail(error) {
error,
};
};
+
+export function initBlockModal(account) {
+ return dispatch => {
+ dispatch({
+ type: BLOCKS_INIT_MODAL,
+ account,
+ });
+
+ dispatch(openModal('BLOCK'));
+ };
+}
diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js
index 7b0906b39..fb22676e0 100644
--- a/app/javascript/mastodon/containers/status_container.js
+++ b/app/javascript/mastodon/containers/status_container.js
@@ -1,4 +1,3 @@
-import React from 'react';
import { connect } from 'react-redux';
import Status from '../components/status';
import { makeGetStatus } from '../selectors';
@@ -15,7 +14,6 @@ import {
pin,
unpin,
} from '../actions/interactions';
-import { blockAccount } from '../actions/accounts';
import {
muteStatus,
unmuteStatus,
@@ -24,9 +22,10 @@ import {
revealStatus,
} from '../actions/statuses';
import { initMuteModal } from '../actions/mutes';
+import { initBlockModal } from '../actions/blocks';
import { initReport } from '../actions/reports';
import { openModal } from '../actions/modal';
-import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import { defineMessages, injectIntl } from 'react-intl';
import { boostModal, deleteModal } from '../initial_state';
import { showAlertForError } from '../actions/alerts';
@@ -35,10 +34,8 @@ const messages = defineMessages({
deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' },
- blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
- blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },
});
const makeMapStateToProps = () => {
@@ -138,16 +135,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
onBlock (status) {
const account = status.get('account');
- dispatch(openModal('CONFIRM', {
- message: @{account.get('acct')} }} />,
- confirm: intl.formatMessage(messages.blockConfirm),
- onConfirm: () => dispatch(blockAccount(account.get('id'))),
- secondary: intl.formatMessage(messages.blockAndReport),
- onSecondary: () => {
- dispatch(blockAccount(account.get('id')));
- dispatch(initReport(account, status));
- },
- }));
+ dispatch(initBlockModal(account));
},
onReport (status) {
diff --git a/app/javascript/mastodon/features/account_timeline/containers/header_container.js b/app/javascript/mastodon/features/account_timeline/containers/header_container.js
index 4d4ae6e82..8728b4806 100644
--- a/app/javascript/mastodon/features/account_timeline/containers/header_container.js
+++ b/app/javascript/mastodon/features/account_timeline/containers/header_container.js
@@ -5,7 +5,6 @@ import Header from '../components/header';
import {
followAccount,
unfollowAccount,
- blockAccount,
unblockAccount,
unmuteAccount,
pinAccount,
@@ -16,6 +15,7 @@ import {
directCompose,
} from '../../../actions/compose';
import { initMuteModal } from '../../../actions/mutes';
+import { initBlockModal } from '../../../actions/blocks';
import { initReport } from '../../../actions/reports';
import { openModal } from '../../../actions/modal';
import { blockDomain, unblockDomain } from '../../../actions/domain_blocks';
@@ -25,9 +25,7 @@ import { List as ImmutableList } from 'immutable';
const messages = defineMessages({
unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
- blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Hide entire domain' },
- blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },
});
const makeMapStateToProps = () => {
@@ -64,16 +62,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
if (account.getIn(['relationship', 'blocking'])) {
dispatch(unblockAccount(account.get('id')));
} else {
- dispatch(openModal('CONFIRM', {
- message: @{account.get('acct')} }} />,
- confirm: intl.formatMessage(messages.blockConfirm),
- onConfirm: () => dispatch(blockAccount(account.get('id'))),
- secondary: intl.formatMessage(messages.blockAndReport),
- onSecondary: () => {
- dispatch(blockAccount(account.get('id')));
- dispatch(initReport(account));
- },
- }));
+ dispatch(initBlockModal(account));
}
},
diff --git a/app/javascript/mastodon/features/status/containers/detailed_status_container.js b/app/javascript/mastodon/features/status/containers/detailed_status_container.js
index 61e0c428a..333c295dc 100644
--- a/app/javascript/mastodon/features/status/containers/detailed_status_container.js
+++ b/app/javascript/mastodon/features/status/containers/detailed_status_container.js
@@ -1,4 +1,3 @@
-import React from 'react';
import { connect } from 'react-redux';
import DetailedStatus from '../components/detailed_status';
import { makeGetStatus } from '../../../selectors';
@@ -15,7 +14,6 @@ import {
pin,
unpin,
} from '../../../actions/interactions';
-import { blockAccount } from '../../../actions/accounts';
import {
muteStatus,
unmuteStatus,
@@ -24,9 +22,10 @@ import {
revealStatus,
} from '../../../actions/statuses';
import { initMuteModal } from '../../../actions/mutes';
+import { initBlockModal } from '../../../actions/blocks';
import { initReport } from '../../../actions/reports';
import { openModal } from '../../../actions/modal';
-import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import { defineMessages, injectIntl } from 'react-intl';
import { boostModal, deleteModal } from '../../../initial_state';
import { showAlertForError } from '../../../actions/alerts';
@@ -35,10 +34,8 @@ const messages = defineMessages({
deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' },
- blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
- blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },
});
const makeMapStateToProps = () => {
@@ -138,16 +135,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
onBlock (status) {
const account = status.get('account');
- dispatch(openModal('CONFIRM', {
- message: @{account.get('acct')} }} />,
- confirm: intl.formatMessage(messages.blockConfirm),
- onConfirm: () => dispatch(blockAccount(account.get('id'))),
- secondary: intl.formatMessage(messages.blockAndReport),
- onSecondary: () => {
- dispatch(blockAccount(account.get('id')));
- dispatch(initReport(account, status));
- },
- }));
+ dispatch(initBlockModal(account));
},
onReport (status) {
diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js
index f78a9489a..029057d40 100644
--- a/app/javascript/mastodon/features/status/index.js
+++ b/app/javascript/mastodon/features/status/index.js
@@ -23,7 +23,6 @@ import {
mentionCompose,
directCompose,
} from '../../actions/compose';
-import { blockAccount } from '../../actions/accounts';
import {
muteStatus,
unmuteStatus,
@@ -32,6 +31,7 @@ import {
revealStatus,
} from '../../actions/statuses';
import { initMuteModal } from '../../actions/mutes';
+import { initBlockModal } from '../../actions/blocks';
import { initReport } from '../../actions/reports';
import { makeGetStatus } from '../../selectors';
import { ScrollContainer } from 'react-router-scroll-4';
@@ -39,7 +39,7 @@ import ColumnBackButton from '../../components/column_back_button';
import ColumnHeader from '../../components/column_header';
import StatusContainer from '../../containers/status_container';
import { openModal } from '../../actions/modal';
-import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import { defineMessages, injectIntl } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { HotKeys } from 'react-hotkeys';
import { boostModal, deleteModal } from '../../initial_state';
@@ -52,13 +52,11 @@ const messages = defineMessages({
deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' },
- blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' },
hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' },
detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
- blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },
});
const makeMapStateToProps = () => {
@@ -296,19 +294,9 @@ class Status extends ImmutablePureComponent {
}
handleBlockClick = (status) => {
- const { dispatch, intl } = this.props;
+ const { dispatch } = this.props;
const account = status.get('account');
-
- dispatch(openModal('CONFIRM', {
- message: @{account.get('acct')} }} />,
- confirm: intl.formatMessage(messages.blockConfirm),
- onConfirm: () => dispatch(blockAccount(account.get('id'))),
- secondary: intl.formatMessage(messages.blockAndReport),
- onSecondary: () => {
- dispatch(blockAccount(account.get('id')));
- dispatch(initReport(account, status));
- },
- }));
+ dispatch(initBlockModal(account));
}
handleReport = (status) => {
diff --git a/app/javascript/mastodon/features/ui/components/block_modal.js b/app/javascript/mastodon/features/ui/components/block_modal.js
new file mode 100644
index 000000000..a07baeaa6
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/block_modal.js
@@ -0,0 +1,103 @@
+import React from 'react';
+import { connect } from 'react-redux';
+import PropTypes from 'prop-types';
+import { injectIntl, FormattedMessage } from 'react-intl';
+import { makeGetAccount } from '../../../selectors';
+import Button from '../../../components/button';
+import { closeModal } from '../../../actions/modal';
+import { blockAccount } from '../../../actions/accounts';
+import { initReport } from '../../../actions/reports';
+
+
+const makeMapStateToProps = () => {
+ const getAccount = makeGetAccount();
+
+ const mapStateToProps = state => ({
+ account: getAccount(state, state.getIn(['blocks', 'new', 'account_id'])),
+ });
+
+ return mapStateToProps;
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onConfirm(account) {
+ dispatch(blockAccount(account.get('id')));
+ },
+
+ onBlockAndReport(account) {
+ dispatch(blockAccount(account.get('id')));
+ dispatch(initReport(account));
+ },
+
+ onClose() {
+ dispatch(closeModal());
+ },
+ };
+};
+
+export default @connect(makeMapStateToProps, mapDispatchToProps)
+@injectIntl
+class BlockModal extends React.PureComponent {
+
+ static propTypes = {
+ account: PropTypes.object.isRequired,
+ onClose: PropTypes.func.isRequired,
+ onBlockAndReport: PropTypes.func.isRequired,
+ onConfirm: PropTypes.func.isRequired,
+ intl: PropTypes.object.isRequired,
+ };
+
+ componentDidMount() {
+ this.button.focus();
+ }
+
+ handleClick = () => {
+ this.props.onClose();
+ this.props.onConfirm(this.props.account);
+ }
+
+ handleSecondary = () => {
+ this.props.onClose();
+ this.props.onBlockAndReport(this.props.account);
+ }
+
+ handleCancel = () => {
+ this.props.onClose();
+ }
+
+ setRef = (c) => {
+ this.button = c;
+ }
+
+ render () {
+ const { account } = this.props;
+
+ return (
+