From e1066cd4319a220d5be16e51ffaf5236a2f6e866 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 18 Sep 2019 16:37:27 +0200 Subject: [PATCH 001/107] Add password challenge to 2FA settings, e-mail notifications (#11878) Fix #3961 --- .../two_factor_authentications_controller.rb | 1 + app/controllers/auth/challenges_controller.rb | 22 ++++ app/controllers/auth/sessions_controller.rb | 1 + .../concerns/challengable_concern.rb | 65 ++++++++++ .../confirmations_controller.rb | 5 + .../recovery_codes_controller.rb | 6 + .../two_factor_authentications_controller.rb | 4 + app/javascript/styles/mastodon/admin.scss | 43 ++++--- app/javascript/styles/mastodon/forms.scss | 4 + app/mailers/user_mailer.rb | 33 +++++ app/models/form/challenge.rb | 8 ++ app/models/user.rb | 9 +- app/views/auth/challenges/new.html.haml | 15 +++ app/views/auth/shared/_links.html.haml | 2 +- .../two_factor_authentications/show.html.haml | 38 +++--- .../user_mailer/two_factor_disabled.html.haml | 43 +++++++ .../user_mailer/two_factor_disabled.text.erb | 7 ++ .../user_mailer/two_factor_enabled.html.haml | 43 +++++++ .../user_mailer/two_factor_enabled.text.erb | 7 ++ ...wo_factor_recovery_codes_changed.html.haml | 43 +++++++ ...two_factor_recovery_codes_changed.text.erb | 7 ++ config/locales/devise.en.yml | 12 ++ config/locales/en.yml | 5 + config/locales/simple_form.en.yml | 2 + config/routes.rb | 1 + .../auth/challenges_controller_spec.rb | 46 +++++++ .../auth/sessions_controller_spec.rb | 2 +- .../concerns/challengable_concern_spec.rb | 114 ++++++++++++++++++ .../confirmations_controller_spec.rb | 10 +- .../recovery_codes_controller_spec.rb | 2 +- ..._factor_authentications_controller_spec.rb | 2 +- spec/mailers/previews/user_mailer_preview.rb | 15 +++ 32 files changed, 567 insertions(+), 50 deletions(-) create mode 100644 app/controllers/auth/challenges_controller.rb create mode 100644 app/controllers/concerns/challengable_concern.rb create mode 100644 app/models/form/challenge.rb create mode 100644 app/views/auth/challenges/new.html.haml create mode 100644 app/views/user_mailer/two_factor_disabled.html.haml create mode 100644 app/views/user_mailer/two_factor_disabled.text.erb create mode 100644 app/views/user_mailer/two_factor_enabled.html.haml create mode 100644 app/views/user_mailer/two_factor_enabled.text.erb create mode 100644 app/views/user_mailer/two_factor_recovery_codes_changed.html.haml create mode 100644 app/views/user_mailer/two_factor_recovery_codes_changed.text.erb create mode 100644 spec/controllers/auth/challenges_controller_spec.rb create mode 100644 spec/controllers/concerns/challengable_concern_spec.rb diff --git a/app/controllers/admin/two_factor_authentications_controller.rb b/app/controllers/admin/two_factor_authentications_controller.rb index 2577a4b17f..0652c3a7a4 100644 --- a/app/controllers/admin/two_factor_authentications_controller.rb +++ b/app/controllers/admin/two_factor_authentications_controller.rb @@ -8,6 +8,7 @@ module Admin authorize @user, :disable_2fa? @user.disable_two_factor! log_action :disable_2fa, @user + UserMailer.two_factor_disabled(@user).deliver_later! redirect_to admin_accounts_path end diff --git a/app/controllers/auth/challenges_controller.rb b/app/controllers/auth/challenges_controller.rb new file mode 100644 index 0000000000..060944240a --- /dev/null +++ b/app/controllers/auth/challenges_controller.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class Auth::ChallengesController < ApplicationController + include ChallengableConcern + + layout 'auth' + + before_action :authenticate_user! + + skip_before_action :require_functional! + + def create + if challenge_passed? + session[:challenge_passed_at] = Time.now.utc + redirect_to challenge_params[:return_to] + else + @challenge = Form::Challenge.new(return_to: challenge_params[:return_to]) + flash.now[:alert] = I18n.t('challenge.invalid_password') + render_challenge + end + end +end diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 3e93b2e68d..b3113bbefc 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -42,6 +42,7 @@ class Auth::SessionsController < Devise::SessionsController def destroy tmp_stored_location = stored_location_for(:user) super + session.delete(:challenge_passed_at) flash.delete(:notice) store_location_for(:user, tmp_stored_location) if continue_after? end diff --git a/app/controllers/concerns/challengable_concern.rb b/app/controllers/concerns/challengable_concern.rb new file mode 100644 index 0000000000..b29d90b3cc --- /dev/null +++ b/app/controllers/concerns/challengable_concern.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +# This concern is inspired by "sudo mode" on GitHub. It +# is a way to re-authenticate a user before allowing them +# to see or perform an action. +# +# Add `before_action :require_challenge!` to actions you +# want to protect. +# +# The user will be shown a page to enter the challenge (which +# is either the password, or just the username when no +# password exists). Upon passing, there is a grace period +# during which no challenge will be asked from the user. +# +# Accessing challenge-protected resources during the grace +# period will refresh the grace period. +module ChallengableConcern + extend ActiveSupport::Concern + + CHALLENGE_TIMEOUT = 1.hour.freeze + + def require_challenge! + return if skip_challenge? + + if challenge_passed_recently? + session[:challenge_passed_at] = Time.now.utc + return + end + + @challenge = Form::Challenge.new(return_to: request.url) + + if params.key?(:form_challenge) + if challenge_passed? + session[:challenge_passed_at] = Time.now.utc + return + else + flash.now[:alert] = I18n.t('challenge.invalid_password') + render_challenge + end + else + render_challenge + end + end + + def render_challenge + @body_classes = 'lighter' + render template: 'auth/challenges/new', layout: 'auth' + end + + def challenge_passed? + current_user.valid_password?(challenge_params[:current_password]) + end + + def skip_challenge? + current_user.encrypted_password.blank? + end + + def challenge_passed_recently? + session[:challenge_passed_at].present? && session[:challenge_passed_at] >= CHALLENGE_TIMEOUT.ago + end + + def challenge_params + params.require(:form_challenge).permit(:current_password, :return_to) + end +end diff --git a/app/controllers/settings/two_factor_authentication/confirmations_controller.rb b/app/controllers/settings/two_factor_authentication/confirmations_controller.rb index 46c90bf74a..ef4df33390 100644 --- a/app/controllers/settings/two_factor_authentication/confirmations_controller.rb +++ b/app/controllers/settings/two_factor_authentication/confirmations_controller.rb @@ -3,9 +3,12 @@ module Settings module TwoFactorAuthentication class ConfirmationsController < BaseController + include ChallengableConcern + layout 'admin' before_action :authenticate_user! + before_action :require_challenge! before_action :ensure_otp_secret skip_before_action :require_functional! @@ -22,6 +25,8 @@ module Settings @recovery_codes = current_user.generate_otp_backup_codes! current_user.save! + UserMailer.two_factor_enabled(current_user).deliver_later! + render 'settings/two_factor_authentication/recovery_codes/index' else flash.now[:alert] = I18n.t('two_factor_authentication.wrong_code') diff --git a/app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb b/app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb index 09a759860e..0c4f5bff76 100644 --- a/app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb +++ b/app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb @@ -3,16 +3,22 @@ module Settings module TwoFactorAuthentication class RecoveryCodesController < BaseController + include ChallengableConcern + layout 'admin' before_action :authenticate_user! + before_action :require_challenge!, on: :create skip_before_action :require_functional! def create @recovery_codes = current_user.generate_otp_backup_codes! current_user.save! + + UserMailer.two_factor_recovery_codes_changed(current_user).deliver_later! flash.now[:notice] = I18n.t('two_factor_authentication.recovery_codes_regenerated') + render :index end end diff --git a/app/controllers/settings/two_factor_authentications_controller.rb b/app/controllers/settings/two_factor_authentications_controller.rb index c93b175770..9118a79332 100644 --- a/app/controllers/settings/two_factor_authentications_controller.rb +++ b/app/controllers/settings/two_factor_authentications_controller.rb @@ -2,10 +2,13 @@ module Settings class TwoFactorAuthenticationsController < BaseController + include ChallengableConcern + layout 'admin' before_action :authenticate_user! before_action :verify_otp_required, only: [:create] + before_action :require_challenge!, only: [:create] skip_before_action :require_functional! @@ -23,6 +26,7 @@ module Settings if acceptable_code? current_user.otp_required_for_login = false current_user.save! + UserMailer.two_factor_disabled(current_user).deliver_later! redirect_to settings_two_factor_authentication_path else flash.now[:alert] = I18n.t('two_factor_authentication.wrong_code') diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 5d4fe4ef81..074eee2cd2 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -233,32 +233,35 @@ hr.spacer { height: 1px; } -.muted-hint { - color: $darker-text-color; +body, +.admin-wrapper .content { + .muted-hint { + color: $darker-text-color; - a { - color: $highlight-text-color; + a { + color: $highlight-text-color; + } } -} -.positive-hint { - color: $valid-value-color; - font-weight: 500; -} + .positive-hint { + color: $valid-value-color; + font-weight: 500; + } -.negative-hint { - color: $error-value-color; - font-weight: 500; -} + .negative-hint { + color: $error-value-color; + font-weight: 500; + } -.neutral-hint { - color: $dark-text-color; - font-weight: 500; -} + .neutral-hint { + color: $dark-text-color; + font-weight: 500; + } -.warning-hint { - color: $gold-star; - font-weight: 500; + .warning-hint { + color: $gold-star; + font-weight: 500; + } } .filters { diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 16352340bf..80ef8797d2 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -254,6 +254,10 @@ code { &-6 { max-width: 50%; } + + .actions { + margin-top: 27px; + } } .fields-group:last-child, diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index b41004acc6..6b81f68739 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -57,6 +57,39 @@ class UserMailer < Devise::Mailer end end + def two_factor_enabled(user, **) + @resource = user + @instance = Rails.configuration.x.local_domain + + return if @resource.disabled? + + I18n.with_locale(@resource.locale || I18n.default_locale) do + mail to: @resource.email, subject: I18n.t('devise.mailer.two_factor_enabled.subject') + end + end + + def two_factor_disabled(user, **) + @resource = user + @instance = Rails.configuration.x.local_domain + + return if @resource.disabled? + + I18n.with_locale(@resource.locale || I18n.default_locale) do + mail to: @resource.email, subject: I18n.t('devise.mailer.two_factor_disabled.subject') + end + end + + def two_factor_recovery_codes_changed(user, **) + @resource = user + @instance = Rails.configuration.x.local_domain + + return if @resource.disabled? + + I18n.with_locale(@resource.locale || I18n.default_locale) do + mail to: @resource.email, subject: I18n.t('devise.mailer.two_factor_recovery_codes_changed.subject') + end + end + def welcome(user) @resource = user @instance = Rails.configuration.x.local_domain diff --git a/app/models/form/challenge.rb b/app/models/form/challenge.rb new file mode 100644 index 0000000000..40c99649cc --- /dev/null +++ b/app/models/form/challenge.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class Form::Challenge + include ActiveModel::Model + + attr_accessor :current_password, :current_username, + :return_to +end diff --git a/app/models/user.rb b/app/models/user.rb index 78b82a68f9..b48455802d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -264,17 +264,20 @@ class User < ApplicationRecord end def password_required? - return false if Devise.pam_authentication || Devise.ldap_authentication + return false if external? + super end def send_reset_password_instructions - return false if encrypted_password.blank? && (Devise.pam_authentication || Devise.ldap_authentication) + return false if encrypted_password.blank? + super end def reset_password!(new_password, new_password_confirmation) - return false if encrypted_password.blank? && (Devise.pam_authentication || Devise.ldap_authentication) + return false if encrypted_password.blank? + super end diff --git a/app/views/auth/challenges/new.html.haml b/app/views/auth/challenges/new.html.haml new file mode 100644 index 0000000000..9aef2c35d6 --- /dev/null +++ b/app/views/auth/challenges/new.html.haml @@ -0,0 +1,15 @@ +- content_for :page_title do + = t('challenge.prompt') + += simple_form_for @challenge, url: request.get? ? auth_challenge_path : '' do |f| + = f.input :return_to, as: :hidden + + .field-group + = f.input :current_password, wrapper: :with_block_label, input_html: { :autocomplete => 'off', :autofocus => true }, label: t('challenge.prompt'), required: true + + .actions + = f.button :button, t('challenge.confirm'), type: :submit + + %p.hint.subtle-hint= t('challenge.hint_html') + +.form-footer= render 'auth/shared/links' diff --git a/app/views/auth/shared/_links.html.haml b/app/views/auth/shared/_links.html.haml index e6c3f7cca6..66ed5b93f3 100644 --- a/app/views/auth/shared/_links.html.haml +++ b/app/views/auth/shared/_links.html.haml @@ -11,7 +11,7 @@ - if controller_name != 'passwords' && controller_name != 'registrations' %li= link_to t('auth.forgot_password'), new_user_password_path - - if controller_name != 'confirmations' + - if controller_name != 'confirmations' && (!user_signed_in? || !current_user.confirmed? || current_user.unconfirmed_email.present?) %li= link_to t('auth.didnt_get_confirmation'), new_user_confirmation_path - if user_signed_in? && controller_name != 'setup' diff --git a/app/views/settings/two_factor_authentications/show.html.haml b/app/views/settings/two_factor_authentications/show.html.haml index 93509e022f..f1eecd0002 100644 --- a/app/views/settings/two_factor_authentications/show.html.haml +++ b/app/views/settings/two_factor_authentications/show.html.haml @@ -2,33 +2,35 @@ = t('settings.two_factor_authentication') - if current_user.otp_required_for_login - %p.positive-hint - = fa_icon 'check' - = ' ' - = t 'two_factor_authentication.enabled' + %p.hint + %span.positive-hint + = fa_icon 'check' + = ' ' + = t 'two_factor_authentication.enabled' - %hr/ + %hr.spacer/ = simple_form_for @confirmation, url: settings_two_factor_authentication_path, method: :delete do |f| - = f.input :otp_attempt, wrapper: :with_label, hint: t('two_factor_authentication.code_hint'), label: t('simple_form.labels.defaults.otp_attempt'), input_html: { :autocomplete => 'off' }, required: true + .fields-group + = f.input :otp_attempt, wrapper: :with_block_label, hint: t('two_factor_authentication.code_hint'), label: t('simple_form.labels.defaults.otp_attempt'), input_html: { :autocomplete => 'off' }, required: true .actions - = f.button :button, t('two_factor_authentication.disable'), type: :submit + = f.button :button, t('two_factor_authentication.disable'), type: :submit, class: 'negative' - %hr/ + %hr.spacer/ - %h6= t('two_factor_authentication.recovery_codes') - %p.muted-hint - = t('two_factor_authentication.lost_recovery_codes') - = link_to t('two_factor_authentication.generate_recovery_codes'), - settings_two_factor_authentication_recovery_codes_path, - data: { method: :post } + %h3= t('two_factor_authentication.recovery_codes') + %p.muted-hint= t('two_factor_authentication.lost_recovery_codes') + + %hr.spacer/ + + .simple_form + = link_to t('two_factor_authentication.generate_recovery_codes'), settings_two_factor_authentication_recovery_codes_path, data: { method: :post }, class: 'block-button' - else .simple_form %p.hint= t('two_factor_authentication.description_html') - = link_to t('two_factor_authentication.setup'), - settings_two_factor_authentication_path, - data: { method: :post }, - class: 'block-button' + %hr.spacer/ + + = link_to t('two_factor_authentication.setup'), settings_two_factor_authentication_path, data: { method: :post }, class: 'block-button' diff --git a/app/views/user_mailer/two_factor_disabled.html.haml b/app/views/user_mailer/two_factor_disabled.html.haml new file mode 100644 index 0000000000..651c6f940e --- /dev/null +++ b/app/views/user_mailer/two_factor_disabled.html.haml @@ -0,0 +1,43 @@ +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.hero + .email-row + .col-6 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.text-center.padded + %table.hero-icon.alert-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td + = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' + + %h1= t 'devise.mailer.two_factor_disabled.title' + %p.lead= t 'devise.mailer.two_factor_disabled.explanation' + +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.content-start + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.button-cell + %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.button-primary + = link_to edit_user_registration_url do + %span= t('settings.account_settings') diff --git a/app/views/user_mailer/two_factor_disabled.text.erb b/app/views/user_mailer/two_factor_disabled.text.erb new file mode 100644 index 0000000000..73be1ddc26 --- /dev/null +++ b/app/views/user_mailer/two_factor_disabled.text.erb @@ -0,0 +1,7 @@ +<%= t 'devise.mailer.two_factor_disabled.title' %> + +=== + +<%= t 'devise.mailer.two_factor_disabled.explanation' %> + +=> <%= edit_user_registration_url %> diff --git a/app/views/user_mailer/two_factor_enabled.html.haml b/app/views/user_mailer/two_factor_enabled.html.haml new file mode 100644 index 0000000000..fc31bd979f --- /dev/null +++ b/app/views/user_mailer/two_factor_enabled.html.haml @@ -0,0 +1,43 @@ +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.hero + .email-row + .col-6 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.text-center.padded + %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td + = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' + + %h1= t 'devise.mailer.two_factor_enabled.title' + %p.lead= t 'devise.mailer.two_factor_enabled.explanation' + +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.content-start + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.button-cell + %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.button-primary + = link_to edit_user_registration_url do + %span= t('settings.account_settings') diff --git a/app/views/user_mailer/two_factor_enabled.text.erb b/app/views/user_mailer/two_factor_enabled.text.erb new file mode 100644 index 0000000000..4319dddbfc --- /dev/null +++ b/app/views/user_mailer/two_factor_enabled.text.erb @@ -0,0 +1,7 @@ +<%= t 'devise.mailer.two_factor_enabled.title' %> + +=== + +<%= t 'devise.mailer.two_factor_enabled.explanation' %> + +=> <%= edit_user_registration_url %> diff --git a/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml b/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml new file mode 100644 index 0000000000..833708868b --- /dev/null +++ b/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml @@ -0,0 +1,43 @@ +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.hero + .email-row + .col-6 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.text-center.padded + %table.hero-icon.alert-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td + = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' + + %h1= t 'devise.mailer.two_factor_recovery_codes_changed.title' + %p.lead= t 'devise.mailer.two_factor_recovery_codes_changed.explanation' + +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.content-start + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.button-cell + %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.button-primary + = link_to edit_user_registration_url do + %span= t('settings.account_settings') diff --git a/app/views/user_mailer/two_factor_recovery_codes_changed.text.erb b/app/views/user_mailer/two_factor_recovery_codes_changed.text.erb new file mode 100644 index 0000000000..6ed12fc08a --- /dev/null +++ b/app/views/user_mailer/two_factor_recovery_codes_changed.text.erb @@ -0,0 +1,7 @@ +<%= t 'devise.mailer.two_factor_recovery_codes_changed.title' %> + +=== + +<%= t 'devise.mailer.two_factor_recovery_codes_changed.explanation' %> + +=> <%= edit_user_registration_url %> diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index 5defa66245..726d2426a7 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -46,6 +46,18 @@ en: extra: If you didn't request this, please ignore this email. Your password won't change until you access the link above and create a new one. subject: 'Mastodon: Reset password instructions' title: Password reset + two_factor_disabled: + explanation: Two-factor authentication for your account has been disabled. Login is now possible using only e-mail address and password. + subject: 'Mastodon: Two-factor authentication disabled' + title: 2FA disabled + two_factor_enabled: + explanation: Two-factor authentication has been enabled for your account. A token generated by the paired TOTP app will be required for login. + subject: 'Mastodon: Two-factor authentication enabled' + title: 2FA enabled + two_factor_recovery_codes_changed: + explanation: The previous recovery codes have been invalidated and new ones generated. + subject: 'Mastodon: Two-factor recovery codes re-generated' + title: 2FA recovery codes changed unlock_instructions: subject: 'Mastodon: Unlock instructions' omniauth_callbacks: diff --git a/config/locales/en.yml b/config/locales/en.yml index f05fdd48bb..da06b0e51d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -621,6 +621,11 @@ en: return: Show the user's profile web: Go to web title: Follow %{acct} + challenge: + confirm: Continue + hint_html: "Tip: We won't ask you for your password again for the next hour." + invalid_password: Invalid password + prompt: Confirm password to continue datetime: distance_in_words: about_x_hours: "%{count}h" diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index c542377a9f..c9ffcfc13f 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -43,6 +43,8 @@ en: domain: This domain will be able to fetch data from this server and incoming data from it will be processed and stored featured_tag: name: 'You might want to use one of these:' + form_challenge: + current_password: You are entering a secure area imports: data: CSV file exported from another Mastodon server invite_request: diff --git a/config/routes.rb b/config/routes.rb index a4dee28424..9ad1ea65de 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -41,6 +41,7 @@ Rails.application.routes.draw do namespace :auth do resource :setup, only: [:show, :update], controller: :setup + resource :challenge, only: [:create], controller: :challenges end end diff --git a/spec/controllers/auth/challenges_controller_spec.rb b/spec/controllers/auth/challenges_controller_spec.rb new file mode 100644 index 0000000000..2a6ca301ef --- /dev/null +++ b/spec/controllers/auth/challenges_controller_spec.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Auth::ChallengesController, type: :controller do + render_views + + let(:password) { 'foobar12345' } + let(:user) { Fabricate(:user, password: password) } + + before do + sign_in user + end + + describe 'POST #create' do + let(:return_to) { edit_user_registration_path } + + context 'with correct password' do + before { post :create, params: { form_challenge: { return_to: return_to, current_password: password } } } + + it 'redirects back' do + expect(response).to redirect_to(return_to) + end + + it 'sets session' do + expect(session[:challenge_passed_at]).to_not be_nil + end + end + + context 'with incorrect password' do + before { post :create, params: { form_challenge: { return_to: return_to, current_password: 'hhfggjjd562' } } } + + it 'renders challenge' do + expect(response).to render_template('auth/challenges/new') + end + + it 'displays error' do + expect(response.body).to include 'Invalid password' + end + + it 'does not set session' do + expect(session[:challenge_passed_at]).to be_nil + end + end + end +end diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index 7ed5edde0c..1950c173af 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -80,7 +80,7 @@ RSpec.describe Auth::SessionsController, type: :controller do let(:user) do account = Fabricate.build(:account, username: 'pam_user1') account.save!(validate: false) - user = Fabricate(:user, email: 'pam@example.com', password: nil, account: account) + user = Fabricate(:user, email: 'pam@example.com', password: nil, account: account, external: true) user end diff --git a/spec/controllers/concerns/challengable_concern_spec.rb b/spec/controllers/concerns/challengable_concern_spec.rb new file mode 100644 index 0000000000..4db3b740db --- /dev/null +++ b/spec/controllers/concerns/challengable_concern_spec.rb @@ -0,0 +1,114 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ChallengableConcern, type: :controller do + controller(ApplicationController) do + include ChallengableConcern + + before_action :require_challenge! + + def foo + render plain: 'foo' + end + + def bar + render plain: 'bar' + end + end + + before do + routes.draw do + get 'foo' => 'anonymous#foo' + post 'bar' => 'anonymous#bar' + end + end + + context 'with a no-password user' do + let(:user) { Fabricate(:user, external: true, password: nil) } + + before do + sign_in user + end + + context 'for GET requests' do + before { get :foo } + + it 'does not ask for password' do + expect(response.body).to eq 'foo' + end + end + + context 'for POST requests' do + before { post :bar } + + it 'does not ask for password' do + expect(response.body).to eq 'bar' + end + end + end + + context 'with recent challenge in session' do + let(:password) { 'foobar12345' } + let(:user) { Fabricate(:user, password: password) } + + before do + sign_in user + end + + context 'for GET requests' do + before { get :foo, session: { challenge_passed_at: Time.now.utc } } + + it 'does not ask for password' do + expect(response.body).to eq 'foo' + end + end + + context 'for POST requests' do + before { post :bar, session: { challenge_passed_at: Time.now.utc } } + + it 'does not ask for password' do + expect(response.body).to eq 'bar' + end + end + end + + context 'with a password user' do + let(:password) { 'foobar12345' } + let(:user) { Fabricate(:user, password: password) } + + before do + sign_in user + end + + context 'for GET requests' do + before { get :foo } + + it 'renders challenge' do + expect(response).to render_template('auth/challenges/new') + end + + # See Auth::ChallengesControllerSpec + end + + context 'for POST requests' do + before { post :bar } + + it 'renders challenge' do + expect(response).to render_template('auth/challenges/new') + end + + it 'accepts correct password' do + post :bar, params: { form_challenge: { current_password: password } } + expect(response.body).to eq 'bar' + expect(session[:challenge_passed_at]).to_not be_nil + end + + it 'rejects wrong password' do + post :bar, params: { form_challenge: { current_password: 'dddfff888123' } } + expect(response.body).to render_template('auth/challenges/new') + expect(session[:challenge_passed_at]).to be_nil + end + end + end +end diff --git a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb index 2e5a9325cf..336f131279 100644 --- a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb @@ -24,7 +24,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do context 'when signed in' do subject do sign_in user, scope: :user - get :new + get :new, session: { challenge_passed_at: Time.now.utc } end include_examples 'renders :new' @@ -37,7 +37,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do it 'redirects if user do not have otp_secret' do sign_in user_without_otp_secret, scope: :user - get :new + get :new, session: { challenge_passed_at: Time.now.utc } expect(response).to redirect_to('/settings/two_factor_authentication') end end @@ -50,7 +50,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do describe 'when form_two_factor_confirmation parameter is not provided' do it 'raises ActionController::ParameterMissing' do - post :create, params: {} + post :create, params: {}, session: { challenge_passed_at: Time.now.utc } expect(response).to have_http_status(400) end end @@ -68,7 +68,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do true end - post :create, params: { form_two_factor_confirmation: { otp_attempt: '123456' } } + post :create, params: { form_two_factor_confirmation: { otp_attempt: '123456' } }, session: { challenge_passed_at: Time.now.utc } expect(assigns(:recovery_codes)).to eq otp_backup_codes expect(flash[:notice]).to eq 'Two-factor authentication successfully enabled' @@ -85,7 +85,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do false end - post :create, params: { form_two_factor_confirmation: { otp_attempt: '123456' } } + post :create, params: { form_two_factor_confirmation: { otp_attempt: '123456' } }, session: { challenge_passed_at: Time.now.utc } end it 'renders the new view' do diff --git a/spec/controllers/settings/two_factor_authentication/recovery_codes_controller_spec.rb b/spec/controllers/settings/two_factor_authentication/recovery_codes_controller_spec.rb index c04760e535..630cec428e 100644 --- a/spec/controllers/settings/two_factor_authentication/recovery_codes_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentication/recovery_codes_controller_spec.rb @@ -15,7 +15,7 @@ describe Settings::TwoFactorAuthentication::RecoveryCodesController do end sign_in user, scope: :user - post :create + post :create, session: { challenge_passed_at: Time.now.utc } expect(assigns(:recovery_codes)).to eq otp_backup_codes expect(flash[:notice]).to eq 'Recovery codes successfully regenerated' diff --git a/spec/controllers/settings/two_factor_authentications_controller_spec.rb b/spec/controllers/settings/two_factor_authentications_controller_spec.rb index 922231ded6..9df9763fd3 100644 --- a/spec/controllers/settings/two_factor_authentications_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentications_controller_spec.rb @@ -58,7 +58,7 @@ describe Settings::TwoFactorAuthenticationsController do describe 'when creation succeeds' do it 'updates user secret' do before = user.otp_secret - post :create + post :create, session: { challenge_passed_at: Time.now.utc } expect(user.reload.otp_secret).not_to eq(before) expect(response).to redirect_to(new_settings_two_factor_authentication_confirmation_path) diff --git a/spec/mailers/previews/user_mailer_preview.rb b/spec/mailers/previews/user_mailer_preview.rb index ead3b3baa1..464f177d0e 100644 --- a/spec/mailers/previews/user_mailer_preview.rb +++ b/spec/mailers/previews/user_mailer_preview.rb @@ -18,6 +18,21 @@ class UserMailerPreview < ActionMailer::Preview UserMailer.password_change(User.first) end + # Preview this email at http://localhost:3000/rails/mailers/user_mailer/two_factor_disabled + def two_factor_disabled + UserMailer.two_factor_disabled(User.first) + end + + # Preview this email at http://localhost:3000/rails/mailers/user_mailer/two_factor_enabled + def two_factor_enabled + UserMailer.two_factor_enabled(User.first) + end + + # Preview this email at http://localhost:3000/rails/mailers/user_mailer/two_factor_recovery_codes_changed + def two_factor_recovery_codes_changed + UserMailer.two_factor_recovery_codes_changed(User.first) + end + # Preview this email at http://localhost:3000/rails/mailers/user_mailer/reconfirmation_instructions def reconfirmation_instructions user = User.first From d930eb88b671fa6e5573fe7342bcdda87501bdb7 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 19 Sep 2019 11:09:05 +0200 Subject: [PATCH 002/107] Add table of contents to about page (#11885) Move public domain blocks information to about page --- app/controllers/about_controller.rb | 43 ++--- app/javascript/styles/mastodon/about.scss | 150 ++++++++---------- .../styles/mastodon/containers.scss | 62 ++++++++ app/javascript/styles/mastodon/widgets.scss | 83 +++++++--- app/lib/toc_generator.rb | 69 ++++++++ app/models/domain_block.rb | 1 + app/views/about/blocks.html.haml | 48 ------ app/views/about/more.html.haml | 59 +++++-- config/locales/en.yml | 27 +--- config/routes.rb | 1 - 10 files changed, 328 insertions(+), 215 deletions(-) create mode 100644 app/lib/toc_generator.rb delete mode 100644 app/views/about/blocks.html.haml diff --git a/app/controllers/about_controller.rb b/app/controllers/about_controller.rb index 5e942e5c07..abd1ec0cb6 100644 --- a/app/controllers/about_controller.rb +++ b/app/controllers/about_controller.rb @@ -3,9 +3,7 @@ class AboutController < ApplicationController layout 'public' - before_action :require_open_federation!, only: [:show, :more, :blocks] - before_action :check_blocklist_enabled, only: [:blocks] - before_action :authenticate_user!, only: [:blocks], if: :blocklist_account_required? + before_action :require_open_federation!, only: [:show, :more] before_action :set_body_classes, only: :show before_action :set_instance_presenter before_action :set_expires_in, only: [:show, :more, :terms] @@ -16,15 +14,20 @@ class AboutController < ApplicationController def more flash.now[:notice] = I18n.t('about.instance_actor_flash') if params[:instance_actor] + + toc_generator = TOCGenerator.new(@instance_presenter.site_extended_description) + + @contents = toc_generator.html + @table_of_contents = toc_generator.toc + @blocks = DomainBlock.with_user_facing_limitations.by_severity if display_blocks? end def terms; end - def blocks - @show_rationale = Setting.show_domain_blocks_rationale == 'all' - @show_rationale |= Setting.show_domain_blocks_rationale == 'users' && !current_user.nil? && current_user.functional? - @blocks = DomainBlock.with_user_facing_limitations.order('(CASE severity WHEN 0 THEN 1 WHEN 1 THEN 2 WHEN 2 THEN 0 END), reject_media, domain').to_a - end + helper_method :display_blocks? + helper_method :display_blocks_rationale? + helper_method :public_fetch_mode? + helper_method :new_user private @@ -32,28 +35,14 @@ class AboutController < ApplicationController not_found if whitelist_mode? end - def check_blocklist_enabled - not_found if Setting.show_domain_blocks == 'disabled' + def display_blocks? + Setting.show_domain_blocks == 'all' || (Setting.show_domain_blocks == 'users' && user_signed_in?) end - def blocklist_account_required? - Setting.show_domain_blocks == 'users' + def display_blocks_rationale? + Setting.show_domain_blocks_rationale == 'all' || (Setting.show_domain_blocks_rationale == 'users' && user_signed_in?) end - def block_severity_text(block) - if block.severity == 'suspend' - I18n.t('domain_blocks.suspension') - else - limitations = [] - limitations << I18n.t('domain_blocks.media_block') if block.reject_media? - limitations << I18n.t('domain_blocks.silence') if block.severity == 'silence' - limitations.join(', ') - end - end - - helper_method :block_severity_text - helper_method :public_fetch_mode? - def new_user User.new.tap do |user| user.build_account @@ -61,8 +50,6 @@ class AboutController < ApplicationController end end - helper_method :new_user - def set_instance_presenter @instance_presenter = InstancePresenter.new end diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index 61637ce967..c056ef85dc 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -17,117 +17,86 @@ $small-breakpoint: 960px; .rich-formatting { font-family: $font-sans-serif, sans-serif; - font-size: 16px; + font-size: 14px; font-weight: 400; - font-size: 16px; - line-height: 30px; + line-height: 1.7; + word-wrap: break-word; color: $darker-text-color; - padding-right: 10px; a { color: $highlight-text-color; text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } } p, li { - font-family: $font-sans-serif, sans-serif; - font-size: 16px; - font-weight: 400; - font-size: 16px; - line-height: 30px; - margin-bottom: 12px; color: $darker-text-color; + } - a { - color: $highlight-text-color; - text-decoration: underline; - } + p { + margin-top: 0; + margin-bottom: .85em; &:last-child { margin-bottom: 0; } } - strong, - em { + strong { font-weight: 700; - color: lighten($darker-text-color, 10%); + color: $secondary-text-color; + } + + em { + font-style: italic; + color: $secondary-text-color; + } + + code { + font-size: 0.85em; + background: darken($ui-base-color, 8%); + border-radius: 4px; + padding: 0.2em 0.3em; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + font-family: $font-display, sans-serif; + margin-top: 1.275em; + margin-bottom: .85em; + font-weight: 500; + color: $secondary-text-color; } h1 { - font-family: $font-display, sans-serif; - font-size: 26px; - line-height: 30px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; - - small { - font-family: $font-sans-serif, sans-serif; - display: block; - font-size: 18px; - font-weight: 400; - color: lighten($darker-text-color, 10%); - } + font-size: 2em; } h2 { - font-family: $font-display, sans-serif; - font-size: 22px; - line-height: 26px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; + font-size: 1.75em; } h3 { - font-family: $font-display, sans-serif; - font-size: 18px; - line-height: 24px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; + font-size: 1.5em; } h4 { - font-family: $font-display, sans-serif; - font-size: 16px; - line-height: 24px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; - } - - h5 { - font-family: $font-display, sans-serif; - font-size: 14px; - line-height: 24px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; + font-size: 1.25em; } + h5, h6 { - font-family: $font-display, sans-serif; - font-size: 12px; - line-height: 24px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; - } - - ul, - ol { - margin-left: 20px; - - &[type='a'] { - list-style-type: lower-alpha; - } - - &[type='i'] { - list-style-type: lower-roman; - } + font-size: 1em; } ul { @@ -138,23 +107,38 @@ $small-breakpoint: 960px; list-style: decimal; } - li > ol, - li > ul { - margin-top: 6px; + ul, + ol { + margin: 0; + padding: 0; + padding-left: 2em; + margin-bottom: 0.85em; + + &[type='a'] { + list-style-type: lower-alpha; + } + + &[type='i'] { + list-style-type: lower-roman; + } } hr { width: 100%; height: 0; border: 0; - border-bottom: 1px solid rgba($ui-base-lighter-color, .6); - margin: 20px 0; + border-bottom: 1px solid lighten($ui-base-color, 4%); + margin: 1.7em 0; &.spacer { height: 1px; border: 0; } } + + & > :first-child { + margin-top: 0; + } } .information-board { @@ -416,7 +400,7 @@ $small-breakpoint: 960px; } &__call-to-action { - background: darken($ui-base-color, 4%); + background: $ui-base-color; border-radius: 4px; padding: 25px 40px; overflow: hidden; diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss index aa45c0174d..24bbf82119 100644 --- a/app/javascript/styles/mastodon/containers.scss +++ b/app/javascript/styles/mastodon/containers.scss @@ -141,6 +141,63 @@ grid-row: 3; } + @media screen and (max-width: $no-gap-breakpoint) { + grid-gap: 0; + grid-template-columns: minmax(0, 100%); + + .column-0 { + grid-column: 1; + } + + .column-1 { + grid-column: 1; + grid-row: 3; + } + + .column-2 { + grid-column: 1; + grid-row: 2; + } + + .column-3 { + grid-column: 1; + grid-row: 4; + } + } +} + +.grid-4 { + display: grid; + grid-gap: 10px; + grid-template-columns: 1fr 1fr 1fr 1fr; + grid-auto-columns: 25%; + grid-auto-rows: max-content; + + .column-0 { + grid-column: 1 / 5; + grid-row: 1; + } + + .column-1 { + grid-column: 1 / 4; + grid-row: 2; + } + + .column-2 { + grid-column: 4; + grid-row: 2; + } + + .column-3 { + grid-column: 2 / 5; + grid-row: 3; + } + + .column-4 { + grid-column: 1; + grid-row: 3; + } + .landing-page__call-to-action { min-height: 100%; } @@ -189,6 +246,11 @@ } .column-3 { + grid-column: 1; + grid-row: 5; + } + + .column-4 { grid-column: 1; grid-row: 4; } diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss index 04beb869ca..ca050a8d99 100644 --- a/app/javascript/styles/mastodon/widgets.scss +++ b/app/javascript/styles/mastodon/widgets.scss @@ -128,41 +128,43 @@ margin-bottom: 10px; } -.contact-widget, -.landing-page__information.contact-widget { - box-sizing: border-box; - padding: 20px; - min-height: 100%; - border-radius: 4px; - background: $ui-base-color; - box-shadow: 0 0 15px rgba($base-shadow-color, 0.2); -} - .contact-widget { + min-height: 100%; font-size: 15px; color: $darker-text-color; line-height: 20px; word-wrap: break-word; font-weight: 400; + padding: 0; - strong { - font-weight: 500; + h4 { + padding: 10px; + text-transform: uppercase; + font-weight: 700; + font-size: 13px; + color: $darker-text-color; } - p { - margin-bottom: 10px; - - &:last-child { - margin-bottom: 0; - } + .account { + border-bottom: 0; + padding: 10px 0; + padding-top: 5px; } - &__mail { - margin-top: 10px; + & > a { + display: inline-block; + padding: 10px; + padding-top: 0; + color: $darker-text-color; + text-decoration: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; - a { - color: $primary-text-color; - text-decoration: none; + &:hover, + &:focus, + &:active { + text-decoration: underline; } } } @@ -562,3 +564,38 @@ $fluid-breakpoint: $maximum-width + 20px; } } } + +.table-of-contents { + background: darken($ui-base-color, 4%); + min-height: 100%; + font-size: 14px; + border-radius: 4px; + + li a { + display: block; + font-weight: 500; + padding: 15px; + overflow: hidden; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-decoration: none; + color: $primary-text-color; + border-bottom: 1px solid lighten($ui-base-color, 4%); + + &:hover, + &:focus, + &:active { + text-decoration: underline; + } + } + + li:last-child a { + border-bottom: 0; + } + + li ul { + padding-left: 20px; + border-bottom: 1px solid lighten($ui-base-color, 4%); + } +} diff --git a/app/lib/toc_generator.rb b/app/lib/toc_generator.rb new file mode 100644 index 0000000000..c6e1795579 --- /dev/null +++ b/app/lib/toc_generator.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +class TOCGenerator + TARGET_ELEMENTS = %w(h1 h2 h3 h4 h5 h6).freeze + LISTED_ELEMENTS = %w(h2 h3).freeze + + class Section + attr_accessor :depth, :title, :children, :anchor + + def initialize(depth, title, anchor) + @depth = depth + @title = title + @children = [] + @anchor = anchor + end + + delegate :<<, to: :children + end + + def initialize(source_html) + @source_html = source_html + @processed = false + @target_html = '' + @headers = [] + @slugs = Hash.new { |h, k| h[k] = 0 } + end + + def html + parse_and_transform unless @processed + @target_html + end + + def toc + parse_and_transform unless @processed + @headers + end + + private + + def parse_and_transform + return if @source_html.blank? + + parsed_html = Nokogiri::HTML.fragment(@source_html) + + parsed_html.traverse do |node| + next unless TARGET_ELEMENTS.include?(node.name) + + anchor = node.text.parameterize + @slugs[anchor] += 1 + anchor = "#{anchor}-#{@slugs[anchor]}" if @slugs[anchor] > 1 + + node['id'] = anchor + + next unless LISTED_ELEMENTS.include?(node.name) + + depth = node.name[1..-1] + latest_section = @headers.last + + if latest_section.nil? || latest_section.depth >= depth + @headers << Section.new(depth, node.text, anchor) + else + latest_section << Section.new(depth, node.text, anchor) + end + end + + @target_html = parsed_html.to_s + @processed = true + end +end diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb index 4383cbd051..4e865b850a 100644 --- a/app/models/domain_block.rb +++ b/app/models/domain_block.rb @@ -26,6 +26,7 @@ class DomainBlock < ApplicationRecord scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) } scope :with_user_facing_limitations, -> { where(severity: [:silence, :suspend]).or(where(reject_media: true)) } + scope :by_severity, -> { order(Arel.sql('(CASE severity WHEN 0 THEN 1 WHEN 1 THEN 2 WHEN 2 THEN 0 END), reject_media, domain')) } class << self def suspend?(domain) diff --git a/app/views/about/blocks.html.haml b/app/views/about/blocks.html.haml deleted file mode 100644 index a81a4d1eba..0000000000 --- a/app/views/about/blocks.html.haml +++ /dev/null @@ -1,48 +0,0 @@ -- content_for :page_title do - = t('domain_blocks.title', instance: site_hostname) - -.grid - .column-0 - .box-widget.rich-formatting - %h2= t('domain_blocks.blocked_domains') - %p= t('domain_blocks.description', instance: site_hostname) - .table-wrapper - %table.blocks-table - %thead - %tr - %th= t('domain_blocks.domain') - %th.severity-column= t('domain_blocks.severity') - - if @show_rationale - %th.button-column - %tbody - - if @blocks.empty? - %tr - %td{ colspan: @show_rationale ? 3 : 2 }= t('domain_blocks.no_domain_blocks') - - else - - @blocks.each_with_index do |block, i| - %tr{ class: i % 2 == 0 ? 'even': nil } - %td{ title: block.domain }= block.domain - %td= block_severity_text(block) - - if @show_rationale - %td - - if block.public_comment.present? - %button.icon-button{ title: t('domain_blocks.show_rationale'), 'aria-label' => t('domain_blocks.show_rationale') } - = fa_icon 'chevron-down fw', 'aria-hidden' => true - - if @show_rationale - - if block.public_comment.present? - %tr.rationale.hidden - %td{ colspan: 3 }= block.public_comment.presence - %h2= t('domain_blocks.severity_legend.title') - - if @blocks.any? { |block| block.reject_media? } - %h3= t('domain_blocks.media_block') - %p= t('domain_blocks.severity_legend.media_block') - - if @blocks.any? { |block| block.severity == 'silence' } - %h3= t('domain_blocks.silence') - %p= t('domain_blocks.severity_legend.silence') - - if @blocks.any? { |block| block.severity == 'suspend' } - %h3= t('domain_blocks.suspension') - %p= t('domain_blocks.severity_legend.suspension') - - if public_fetch_mode? - %p= t('domain_blocks.severity_legend.suspension_disclaimer') - .column-1 - = render 'application/sidebar' diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index 21431ef8e5..4b3035ee82 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -5,7 +5,7 @@ = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' = render partial: 'shared/og' -.grid-3 +.grid-4 .column-0 .public-account-header.public-account-header--no-bar .public-account-header__image @@ -28,22 +28,57 @@ = image_tag @instance_presenter.mascot&.file&.url || asset_pack_path('media/images/elephant_ui_plane.svg'), alt: '' .column-2 - .landing-page__information.contact-widget - %p - %strong= t 'about.administered_by' + .contact-widget + %h4= t 'about.administered_by' = account_link_to(@instance_presenter.contact_account) - if @instance_presenter.site_contact_email.present? - %p.contact-widget__mail - %strong - = succeed ':' do - = t 'about.contact' - %br/ - = mail_to @instance_presenter.site_contact_email, nil, title: @instance_presenter.site_contact_email + %h4 + = succeed ':' do + = t 'about.contact' + + = mail_to @instance_presenter.site_contact_email, nil, title: @instance_presenter.site_contact_email .column-3 = render 'application/flashes' - .box-widget - .rich-formatting= @instance_presenter.site_extended_description.html_safe.presence || t('about.extended_description_html') + - if @contents.blank? && (!display_blocks? || @blocks&.empty?) + = nothing_here + - else + .box-widget + .rich-formatting + = @contents.html_safe + + - if display_blocks? && !@blocks.empty? + %h2#unavailable-content= t('about.unavailable_content') + + %p= t('about.unavailable_content_html') + + - @blocks.each do |domain_block| + %p + %strong= "#{domain_block.domain}:" + + - if domain_block.suspend? + = t('about.unavailable_content_description.suspended') + - else + = t('about.unavailable_content_description.silenced') if domain_block.silence? + = t('about.unavailable_content_description.rejecting_media') if domain_block.reject_media? + + - if display_blocks_rationale? + %strong= t('about.unavailable_content_description.reason') + = domain_block.public_comment + + .column-4 + %ul.table-of-contents + - @table_of_contents.each do |item| + %li + = link_to item.title, "##{item.anchor}" + + - unless item.children.empty? + %ul + - item.children.each do |sub_item| + %li= link_to sub_item.title, "##{sub_item.anchor}" + + - if display_blocks? && !@blocks.empty? + %li= link_to t('about.unavailable_content'), '#unavailable-content' diff --git a/config/locales/en.yml b/config/locales/en.yml index da06b0e51d..dabb679e76 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -17,9 +17,6 @@ en: contact_unavailable: N/A discover_users: Discover users documentation: Documentation - extended_description_html: | -

A good place for rules

-

The extended description has not been set up yet.

federation_hint_html: With an account on %{instance} you'll be able to follow people on any Mastodon server and beyond. generic_description: "%{domain} is one server in the network" get_apps: Try a mobile app @@ -38,6 +35,13 @@ en: status_count_before: Who authored tagline: Follow friends and discover new ones terms: Terms of service + unavailable_content: Unavailable content + unavailable_content_description: + reason: 'Reason:' + rejecting_media: Media files from this server will not be processed and and no thumbnails will be displayed, requiring manual click-through to the other server. + silenced: Posts from this server will not show up anywhere except your home feed if you follow the author. + suspended: You won't be able to follow anyone from this server, and no data from it will be processed or stored, and no data exchanged. + unavailable_content_html: Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server. user_count_after: one: user other: users @@ -661,23 +665,6 @@ en: directory: Profile directory explanation: Discover users based on their interests explore_mastodon: Explore %{title} - domain_blocks: - blocked_domains: List of limited and blocked domains - description: This is the list of servers that %{instance} limits or reject federation with. - domain: Domain - media_block: Media block - no_domain_blocks: "(No domain blocks)" - severity: Severity - severity_legend: - media_block: Media files coming from the server are neither fetched, stored, or displayed to the user. - silence: Accounts from silenced servers can be found, followed and interacted with, but their toots will not appear in the public timelines, and notifications from them will not reach local users who are not following them. - suspension: No content from suspended servers is stored or displayed, nor is any content sent to them. Interactions from suspended servers are ignored. - suspension_disclaimer: Suspended servers may occasionally retrieve public content from this server. - title: Severities - show_rationale: Show rationale - silence: Silence - suspension: Suspension - title: "%{instance} List of blocked instances" domain_validator: invalid_domain: is not a valid domain name errors: diff --git a/config/routes.rb b/config/routes.rb index 9ad1ea65de..dcfa079a0f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -441,7 +441,6 @@ Rails.application.routes.draw do get '/about', to: 'about#show' get '/about/more', to: 'about#more' - get '/about/blocks', to: 'about#blocks' get '/terms', to: 'about#terms' match '/', via: [:post, :put, :patch, :delete], to: 'application#raise_not_found', format: false From 5ded2de3a08d606057314cc094a4585fb0784e72 Mon Sep 17 00:00:00 2001 From: tsia Date: Thu, 19 Sep 2019 13:24:50 +0200 Subject: [PATCH 003/107] fix rss enclosure length (#11889) --- app/serializers/rss/account_serializer.rb | 2 +- app/serializers/rss/tag_serializer.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/serializers/rss/account_serializer.rb b/app/serializers/rss/account_serializer.rb index 680d9de6fc..e39b2b3720 100644 --- a/app/serializers/rss/account_serializer.rb +++ b/app/serializers/rss/account_serializer.rb @@ -25,7 +25,7 @@ class RSS::AccountSerializer .description(status.spoiler_text.presence || Formatter.instance.format(status, inline_poll_options: true).to_str) status.media_attachments.each do |media| - item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, length: media.file.size) + item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size) end end end diff --git a/app/serializers/rss/tag_serializer.rb b/app/serializers/rss/tag_serializer.rb index e8562ee87d..6737fb2c90 100644 --- a/app/serializers/rss/tag_serializer.rb +++ b/app/serializers/rss/tag_serializer.rb @@ -23,7 +23,7 @@ class RSS::TagSerializer .description(status.spoiler_text.presence || Formatter.instance.format(status).to_str) status.media_attachments.each do |media| - item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, length: media.file.size) + item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size) end end end From 92c2498554005e3811b790a88b2ff54cf294d678 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2019 02:19:12 +0900 Subject: [PATCH 004/107] Bump doorkeeper from 5.1.0 to 5.2.0 (#11856) Bumps [doorkeeper](https://github.com/doorkeeper-gem/doorkeeper) from 5.1.0 to 5.2.0. - [Release notes](https://github.com/doorkeeper-gem/doorkeeper/releases) - [Changelog](https://github.com/doorkeeper-gem/doorkeeper/blob/master/CHANGELOG.md) - [Commits](https://github.com/doorkeeper-gem/doorkeeper/compare/v5.1.0...v5.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 25cf52f735..081cdd04ec 100644 --- a/Gemfile +++ b/Gemfile @@ -44,7 +44,7 @@ gem 'omniauth-saml', '~> 1.10' gem 'omniauth', '~> 1.9' gem 'discard', '~> 1.1' -gem 'doorkeeper', '~> 5.1' +gem 'doorkeeper', '~> 5.2' gem 'fast_blank', '~> 1.0' gem 'fastimage' gem 'goldfinger', '~> 2.1' diff --git a/Gemfile.lock b/Gemfile.lock index 47bb5a28b8..4545872f06 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -209,7 +209,7 @@ GEM docile (1.3.2) domain_name (0.5.20180417) unf (>= 0.0.5, < 1.0.0) - doorkeeper (5.1.0) + doorkeeper (5.2.0) railties (>= 5) dotenv (2.7.5) dotenv-rails (2.7.5) @@ -697,7 +697,7 @@ DEPENDENCIES devise-two-factor (~> 3.1) devise_pam_authenticatable2 (~> 9.2) discard (~> 1.1) - doorkeeper (~> 5.1) + doorkeeper (~> 5.2) dotenv-rails (~> 2.7) fabrication (~> 2.20) faker (~> 2.3) From 71b760f68091773b47083ffe3393094855e4c9a3 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Fri, 20 Sep 2019 02:58:14 +0900 Subject: [PATCH 005/107] Rename package name to @tootsuite/mastodon (#11892) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 24d5fcf9c3..7c378eb39b 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "mastodon", + "name": "@tootsuite/mastodon", "license": "AGPL-3.0-or-later", "engines": { "node": ">=8.12 <13" From 129bc871a0dc9e49900692a0b88d8d5700d9752a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 19 Sep 2019 19:58:26 +0200 Subject: [PATCH 006/107] Fix thread column showing pin button (#11891) Fix #11467 --- app/javascript/mastodon/components/column_header.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/column_header.js b/app/javascript/mastodon/components/column_header.js index 8a26742b57..0038995c8b 100644 --- a/app/javascript/mastodon/components/column_header.js +++ b/app/javascript/mastodon/components/column_header.js @@ -120,7 +120,7 @@ class ColumnHeader extends React.PureComponent { ); - } else if (multiColumn) { + } else if (multiColumn && this.props.onPin) { pinButton = ; } @@ -142,7 +142,7 @@ class ColumnHeader extends React.PureComponent { collapsedContent.push(pinButton); } - if (children || multiColumn) { + if (children || (multiColumn && this.props.onPin)) { collapseButton = ; } From b6df9c10671cd7bf48de3dbd7a94a92fb0a148ec Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 19 Sep 2019 19:58:40 +0200 Subject: [PATCH 007/107] Fix placeholder colors for inputs not being explicitly defined (#11890) Fix #11841 --- app/javascript/styles/mastodon/_mixins.scss | 18 ------- .../styles/mastodon/components.scss | 48 +++++++++++++++++++ app/javascript/styles/mastodon/forms.scss | 4 ++ 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/app/javascript/styles/mastodon/_mixins.scss b/app/javascript/styles/mastodon/_mixins.scss index faaffb30f4..68cad0fde3 100644 --- a/app/javascript/styles/mastodon/_mixins.scss +++ b/app/javascript/styles/mastodon/_mixins.scss @@ -22,24 +22,6 @@ color: $darker-text-color; font-size: 14px; margin: 0; - - &::-moz-focus-inner { - border: 0; - } - - &::-moz-focus-inner, - &:focus, - &:active { - outline: 0 !important; - } - - &:focus { - background: lighten($ui-base-color, 4%); - } - - @media screen and (max-width: 600px) { - font-size: 16px; - } } @mixin search-popout { diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index ef48d2438c..8893848ae9 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -421,6 +421,10 @@ border: 0; outline: 0; + &::placeholder { + color: $dark-text-color; + } + &:focus { outline: 0; } @@ -3533,6 +3537,28 @@ a.status-card.compact:hover { .column-select { &__control { @include search-input; + + &::placeholder { + color: lighten($darker-text-color, 4%); + } + + &::-moz-focus-inner { + border: 0; + } + + &::-moz-focus-inner, + &:focus, + &:active { + outline: 0 !important; + } + + &:focus { + background: lighten($ui-base-color, 4%); + } + + @media screen and (max-width: 600px) { + font-size: 16px; + } } &__placeholder { @@ -4046,6 +4072,28 @@ a.status-card.compact:hover { padding-right: 30px; line-height: 18px; font-size: 16px; + + &::placeholder { + color: lighten($darker-text-color, 4%); + } + + &::-moz-focus-inner { + border: 0; + } + + &::-moz-focus-inner, + &:focus, + &:active { + outline: 0 !important; + } + + &:focus { + background: lighten($ui-base-color, 4%); + } + + @media screen and (max-width: 600px) { + font-size: 16px; + } } .search__icon { diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 80ef8797d2..b729d912e5 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -338,6 +338,10 @@ code { border-radius: 4px; padding: 10px; + &::placeholder { + color: lighten($darker-text-color, 4%); + } + &:invalid { box-shadow: none; } From 3ed94dcc1acf73f1d0d1ab43567b88ee953f57c9 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 19 Sep 2019 20:58:19 +0200 Subject: [PATCH 008/107] Add account migration UI (#11846) Fix #10736 - Change data export to be available for non-functional accounts - Change non-functional accounts to include redirecting accounts --- .../concerns/export_controller_concern.rb | 7 ++ .../settings/aliases_controller.rb | 42 ++++++++++ .../settings/exports_controller.rb | 7 ++ .../settings/migrations_controller.rb | 48 ++++++++--- app/helpers/settings_helper.rb | 8 ++ app/models/account_alias.rb | 41 +++++++++ app/models/account_migration.rb | 74 ++++++++++++++++ app/models/concerns/account_associations.rb | 2 + app/models/form/migration.rb | 25 ------ app/models/remote_follow.rb | 2 +- app/models/user.rb | 2 +- .../activitypub/move_serializer.rb | 26 ++++++ .../auth/registrations/_status.html.haml | 30 ++++--- app/views/auth/registrations/edit.html.haml | 2 +- app/views/settings/aliases/index.html.haml | 29 +++++++ app/views/settings/exports/show.html.haml | 4 + app/views/settings/migrations/show.html.haml | 84 +++++++++++++++++-- app/views/settings/profiles/show.html.haml | 5 ++ .../activitypub/move_distribution_worker.rb | 32 +++++++ config/locales/en.yml | 38 ++++++++- config/locales/simple_form.en.yml | 10 +++ config/navigation.rb | 8 +- config/routes.rb | 8 +- ...0190914202517_create_account_migrations.rb | 12 +++ .../20190915194355_create_account_aliases.rb | 11 +++ db/schema.rb | 23 +++++ .../settings/migrations_controller_spec.rb | 14 ++-- spec/fabricators/account_alias_fabricator.rb | 5 ++ .../account_migration_fabricator.rb | 6 ++ spec/models/account_alias_spec.rb | 5 ++ spec/models/account_migration_spec.rb | 5 ++ 31 files changed, 542 insertions(+), 73 deletions(-) create mode 100644 app/controllers/settings/aliases_controller.rb create mode 100644 app/models/account_alias.rb create mode 100644 app/models/account_migration.rb delete mode 100644 app/models/form/migration.rb create mode 100644 app/serializers/activitypub/move_serializer.rb create mode 100644 app/views/settings/aliases/index.html.haml create mode 100644 app/workers/activitypub/move_distribution_worker.rb create mode 100644 db/migrate/20190914202517_create_account_migrations.rb create mode 100644 db/migrate/20190915194355_create_account_aliases.rb create mode 100644 spec/fabricators/account_alias_fabricator.rb create mode 100644 spec/fabricators/account_migration_fabricator.rb create mode 100644 spec/models/account_alias_spec.rb create mode 100644 spec/models/account_migration_spec.rb diff --git a/app/controllers/concerns/export_controller_concern.rb b/app/controllers/concerns/export_controller_concern.rb index e20b71a303..bfe990c827 100644 --- a/app/controllers/concerns/export_controller_concern.rb +++ b/app/controllers/concerns/export_controller_concern.rb @@ -5,7 +5,10 @@ module ExportControllerConcern included do before_action :authenticate_user! + before_action :require_not_suspended! before_action :load_export + + skip_before_action :require_functional! end private @@ -27,4 +30,8 @@ module ExportControllerConcern def export_filename "#{controller_name}.csv" end + + def require_not_suspended! + forbidden if current_account.suspended? + end end diff --git a/app/controllers/settings/aliases_controller.rb b/app/controllers/settings/aliases_controller.rb new file mode 100644 index 0000000000..2b675f065a --- /dev/null +++ b/app/controllers/settings/aliases_controller.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +class Settings::AliasesController < Settings::BaseController + layout 'admin' + + before_action :authenticate_user! + before_action :set_aliases, except: :destroy + before_action :set_alias, only: :destroy + + def index + @alias = current_account.aliases.build + end + + def create + @alias = current_account.aliases.build(resource_params) + + if @alias.save + redirect_to settings_aliases_path, notice: I18n.t('aliases.created_msg') + else + render :show + end + end + + def destroy + @alias.destroy! + redirect_to settings_aliases_path, notice: I18n.t('aliases.deleted_msg') + end + + private + + def resource_params + params.require(:account_alias).permit(:acct) + end + + def set_alias + @alias = current_account.aliases.find(params[:id]) + end + + def set_aliases + @aliases = current_account.aliases.order(id: :desc).reject(&:new_record?) + end +end diff --git a/app/controllers/settings/exports_controller.rb b/app/controllers/settings/exports_controller.rb index 3012fbf775..0e93d07a9b 100644 --- a/app/controllers/settings/exports_controller.rb +++ b/app/controllers/settings/exports_controller.rb @@ -6,6 +6,9 @@ class Settings::ExportsController < Settings::BaseController layout 'admin' before_action :authenticate_user! + before_action :require_not_suspended! + + skip_before_action :require_functional! def show @export = Export.new(current_account) @@ -34,4 +37,8 @@ class Settings::ExportsController < Settings::BaseController def lock_options { redis: Redis.current, key: "backup:#{current_user.id}" } end + + def require_not_suspended! + forbidden if current_account.suspended? + end end diff --git a/app/controllers/settings/migrations_controller.rb b/app/controllers/settings/migrations_controller.rb index 59eb48779c..90092c6925 100644 --- a/app/controllers/settings/migrations_controller.rb +++ b/app/controllers/settings/migrations_controller.rb @@ -4,31 +4,59 @@ class Settings::MigrationsController < Settings::BaseController layout 'admin' before_action :authenticate_user! + before_action :require_not_suspended! + before_action :set_migrations + before_action :set_cooldown + + skip_before_action :require_functional! def show - @migration = Form::Migration.new(account: current_account.moved_to_account) + @migration = current_account.migrations.build end - def update - @migration = Form::Migration.new(resource_params) + def create + @migration = current_account.migrations.build(resource_params) - if @migration.valid? && migration_account_changed? - current_account.update!(moved_to_account: @migration.account) + if @migration.save_with_challenge(current_user) + current_account.update!(moved_to_account: @migration.target_account) ActivityPub::UpdateDistributionWorker.perform_async(current_account.id) - redirect_to settings_migration_path, notice: I18n.t('migrations.updated_msg') + ActivityPub::MoveDistributionWorker.perform_async(@migration.id) + redirect_to settings_migration_path, notice: I18n.t('migrations.moved_msg', acct: current_account.moved_to_account.acct) else render :show end end + def cancel + if current_account.moved_to_account_id.present? + current_account.update!(moved_to_account: nil) + ActivityPub::UpdateDistributionWorker.perform_async(current_account.id) + end + + redirect_to settings_migration_path, notice: I18n.t('migrations.cancelled_msg') + end + + helper_method :on_cooldown? + private def resource_params - params.require(:migration).permit(:acct) + params.require(:account_migration).permit(:acct, :current_password, :current_username) end - def migration_account_changed? - current_account.moved_to_account_id != @migration.account&.id && - current_account.id != @migration.account&.id + def set_migrations + @migrations = current_account.migrations.includes(:target_account).order(id: :desc).reject(&:new_record?) + end + + def set_cooldown + @cooldown = current_account.migrations.within_cooldown.first + end + + def on_cooldown? + @cooldown.present? + end + + def require_not_suspended! + forbidden if current_account.suspended? end end diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 2b3fd1263a..ecc73baf57 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -87,4 +87,12 @@ module SettingsHelper 'desktop' end end + + def compact_account_link_to(account) + return if account.nil? + + link_to ActivityPub::TagManager.instance.url_for(account), class: 'name-tag', title: account.acct do + safe_join([image_tag(account.avatar.url, width: 15, height: 15, alt: display_name(account), class: 'avatar'), content_tag(:span, account.acct, class: 'username')], ' ') + end + end end diff --git a/app/models/account_alias.rb b/app/models/account_alias.rb new file mode 100644 index 0000000000..e9a0dd79e0 --- /dev/null +++ b/app/models/account_alias.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: account_aliases +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) +# acct :string default(""), not null +# uri :string default(""), not null +# created_at :datetime not null +# updated_at :datetime not null +# + +class AccountAlias < ApplicationRecord + belongs_to :account + + validates :acct, presence: true, domain: { acct: true } + validates :uri, presence: true + + before_validation :set_uri + after_create :add_to_account + after_destroy :remove_from_account + + private + + def set_uri + target_account = ResolveAccountService.new.call(acct) + self.uri = ActivityPub::TagManager.instance.uri_for(target_account) unless target_account.nil? + rescue Goldfinger::Error, HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error + # Validation will take care of it + end + + def add_to_account + account.update(also_known_as: account.also_known_as + [uri]) + end + + def remove_from_account + account.update(also_known_as: account.also_known_as.reject { |x| x == uri }) + end +end diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb new file mode 100644 index 0000000000..15830bffbd --- /dev/null +++ b/app/models/account_migration.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: account_migrations +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) +# acct :string default(""), not null +# followers_count :bigint(8) default(0), not null +# target_account_id :bigint(8) +# created_at :datetime not null +# updated_at :datetime not null +# + +class AccountMigration < ApplicationRecord + COOLDOWN_PERIOD = 30.days.freeze + + belongs_to :account + belongs_to :target_account, class_name: 'Account' + + before_validation :set_target_account + before_validation :set_followers_count + + validates :acct, presence: true, domain: { acct: true } + validate :validate_migration_cooldown + validate :validate_target_account + + scope :within_cooldown, ->(now = Time.now.utc) { where(arel_table[:created_at].gteq(now - COOLDOWN_PERIOD)) } + + attr_accessor :current_password, :current_username + + def save_with_challenge(current_user) + if current_user.encrypted_password.present? + errors.add(:current_password, :invalid) unless current_user.valid_password?(current_password) + else + errors.add(:current_username, :invalid) unless account.username == current_username + end + + return false unless errors.empty? + + save + end + + def cooldown_at + created_at + COOLDOWN_PERIOD + end + + private + + def set_target_account + self.target_account = ResolveAccountService.new.call(acct) + rescue Goldfinger::Error, HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error + # Validation will take care of it + end + + def set_followers_count + self.followers_count = account.followers_count + end + + def validate_target_account + if target_account.nil? + errors.add(:acct, I18n.t('migrations.errors.not_found')) + else + errors.add(:acct, I18n.t('migrations.errors.missing_also_known_as')) unless target_account.also_known_as.include?(ActivityPub::TagManager.instance.uri_for(account)) + errors.add(:acct, I18n.t('migrations.errors.already_moved')) if account.moved_to_account_id.present? && account.moved_to_account_id == target_account.id + errors.add(:acct, I18n.t('migrations.errors.move_to_self')) if account.id == target_account.id + end + end + + def validate_migration_cooldown + errors.add(:base, I18n.t('migrations.errors.on_cooldown')) if account.migrations.within_cooldown.exists? + end +end diff --git a/app/models/concerns/account_associations.rb b/app/models/concerns/account_associations.rb index 1db7771c72..c9cc5c610b 100644 --- a/app/models/concerns/account_associations.rb +++ b/app/models/concerns/account_associations.rb @@ -52,6 +52,8 @@ module AccountAssociations # Account migrations belongs_to :moved_to_account, class_name: 'Account', optional: true + has_many :migrations, class_name: 'AccountMigration', dependent: :destroy, inverse_of: :account + has_many :aliases, class_name: 'AccountAlias', dependent: :destroy, inverse_of: :account # Hashtags has_and_belongs_to_many :tags diff --git a/app/models/form/migration.rb b/app/models/form/migration.rb deleted file mode 100644 index c2a8655e13..0000000000 --- a/app/models/form/migration.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -class Form::Migration - include ActiveModel::Validations - - attr_accessor :acct, :account - - def initialize(attrs = {}) - @account = attrs[:account] - @acct = attrs[:account].acct unless @account.nil? - @acct = attrs[:acct].gsub(/\A@/, '').strip unless attrs[:acct].nil? - end - - def valid? - return false unless super - set_account - errors.empty? - end - - private - - def set_account - self.account = (ResolveAccountService.new.call(acct) if account.nil? && acct.present?) - end -end diff --git a/app/models/remote_follow.rb b/app/models/remote_follow.rb index 52dd3f67ba..5ea5352872 100644 --- a/app/models/remote_follow.rb +++ b/app/models/remote_follow.rb @@ -49,7 +49,7 @@ class RemoteFollow end def fetch_template! - return missing_resource if acct.blank? + return missing_resource_error if acct.blank? _, domain = acct.split('@') diff --git a/app/models/user.rb b/app/models/user.rb index b48455802d..9a19a53b32 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -168,7 +168,7 @@ class User < ApplicationRecord end def functional? - confirmed? && approved? && !disabled? && !account.suspended? + confirmed? && approved? && !disabled? && !account.suspended? && account.moved_to_account_id.nil? end def unconfirmed_or_pending? diff --git a/app/serializers/activitypub/move_serializer.rb b/app/serializers/activitypub/move_serializer.rb new file mode 100644 index 0000000000..5675875fa5 --- /dev/null +++ b/app/serializers/activitypub/move_serializer.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +class ActivityPub::MoveSerializer < ActivityPub::Serializer + attributes :id, :type, :target, :actor + attribute :virtual_object, key: :object + + def id + [ActivityPub::TagManager.instance.uri_for(object.account), '#moves/', object.id].join + end + + def type + 'Move' + end + + def target + ActivityPub::TagManager.instance.uri_for(object.target_account) + end + + def virtual_object + ActivityPub::TagManager.instance.uri_for(object.account) + end + + def actor + ActivityPub::TagManager.instance.uri_for(object.account) + end +end diff --git a/app/views/auth/registrations/_status.html.haml b/app/views/auth/registrations/_status.html.haml index b38a83d67d..47112dae07 100644 --- a/app/views/auth/registrations/_status.html.haml +++ b/app/views/auth/registrations/_status.html.haml @@ -1,16 +1,22 @@ %h3= t('auth.status.account_status') -- if @user.account.suspended? - %span.negative-hint= t('user_mailer.warning.explanation.suspend') -- elsif @user.disabled? - %span.negative-hint= t('user_mailer.warning.explanation.disable') -- elsif @user.account.silenced? - %span.warning-hint= t('user_mailer.warning.explanation.silence') -- elsif !@user.confirmed? - %span.warning-hint= t('auth.status.confirming') -- elsif !@user.approved? - %span.warning-hint= t('auth.status.pending') -- else - %span.positive-hint= t('auth.status.functional') +.simple_form + %p.hint + - if @user.account.suspended? + %span.negative-hint= t('user_mailer.warning.explanation.suspend') + - elsif @user.disabled? + %span.negative-hint= t('user_mailer.warning.explanation.disable') + - elsif @user.account.silenced? + %span.warning-hint= t('user_mailer.warning.explanation.silence') + - elsif !@user.confirmed? + %span.warning-hint= t('auth.status.confirming') + = link_to t('auth.didnt_get_confirmation'), new_user_confirmation_path + - elsif !@user.approved? + %span.warning-hint= t('auth.status.pending') + - elsif @user.account.moved_to_account_id.present? + %span.positive-hint= t('auth.status.redirecting_to', acct: @user.account.moved_to_account.acct) + = link_to t('migrations.cancel'), settings_migration_path + - else + %span.positive-hint= t('auth.status.functional') %hr.spacer/ diff --git a/app/views/auth/registrations/edit.html.haml b/app/views/auth/registrations/edit.html.haml index 710ee5c689..885171c58b 100644 --- a/app/views/auth/registrations/edit.html.haml +++ b/app/views/auth/registrations/edit.html.haml @@ -13,7 +13,7 @@ .fields-row__column.fields-group.fields-row__column-6 = f.input :email, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }, required: true, disabled: current_account.suspended? .fields-row__column.fields-group.fields-row__column-6 - = f.input :current_password, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.current_password'), :autocomplete => 'off' }, required: true, disabled: current_account.suspended? + = f.input :current_password, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.current_password'), :autocomplete => 'off' }, required: true, disabled: current_account.suspended?, hint: false .fields-row .fields-row__column.fields-group.fields-row__column-6 diff --git a/app/views/settings/aliases/index.html.haml b/app/views/settings/aliases/index.html.haml new file mode 100644 index 0000000000..5b69863681 --- /dev/null +++ b/app/views/settings/aliases/index.html.haml @@ -0,0 +1,29 @@ +- content_for :page_title do + = t('settings.aliases') + += simple_form_for @alias, url: settings_aliases_path do |f| + = render 'shared/error_messages', object: @alias + + %p.hint= t('aliases.hint_html') + + %hr.spacer/ + + .fields-group + = f.input :acct, wrapper: :with_block_label, input_html: { autocapitalize: 'none', autocorrect: 'off' } + + .actions + = f.button :button, t('aliases.add_new'), type: :submit, class: 'button' + +%hr.spacer/ + +.table-wrapper + %table.table.inline-table + %thead + %tr + %th= t('simple_form.labels.account_alias.acct') + %th + %tbody + - @aliases.each do |account_alias| + %tr + %td= account_alias.acct + %td= table_link_to 'trash', t('aliases.remove'), settings_alias_path(account_alias), data: { method: :delete } diff --git a/app/views/settings/exports/show.html.haml b/app/views/settings/exports/show.html.haml index b13cea976a..76ff76bd9c 100644 --- a/app/views/settings/exports/show.html.haml +++ b/app/views/settings/exports/show.html.haml @@ -37,12 +37,16 @@ %td= number_with_delimiter @export.total_domain_blocks %td= table_link_to 'download', t('exports.csv'), settings_exports_domain_blocks_path(format: :csv) +%hr.spacer/ + %p.muted-hint= t('exports.archive_takeout.hint_html') - if policy(:backup).create? %p= link_to t('exports.archive_takeout.request'), settings_export_path, class: 'button', method: :post - unless @backups.empty? + %hr.spacer/ + .table-wrapper %table.table %thead diff --git a/app/views/settings/migrations/show.html.haml b/app/views/settings/migrations/show.html.haml index c69061d50b..1e5c47726f 100644 --- a/app/views/settings/migrations/show.html.haml +++ b/app/views/settings/migrations/show.html.haml @@ -1,17 +1,85 @@ - content_for :page_title do = t('settings.migrate') -= simple_form_for @migration, as: :migration, url: settings_migration_path, html: { method: :put } do |f| - - if @migration.account - %p.hint= t('migrations.currently_redirecting') +.simple_form + - if current_account.moved_to_account.present? + .fields-row + .fields-row__column.fields-group.fields-row__column-6 + = render 'application/card', account: current_account.moved_to_account + .fields-row__column.fields-group.fields-row__column-6 + %p.hint + %span.positive-hint= t('migrations.redirecting_to', acct: current_account.moved_to_account.acct) - .fields-group - = render partial: 'application/card', locals: { account: @migration.account } + %p.hint= t('migrations.cancel_explanation') + + %p.hint= link_to t('migrations.cancel'), cancel_settings_migration_path, data: { method: :post } + - else + %p.hint + %span.positive-hint= t('migrations.not_redirecting') + +%hr.spacer/ + +%h3= t 'migrations.proceed_with_move' + += simple_form_for @migration, url: settings_migration_path do |f| + - if on_cooldown? + %span.warning-hint= t('migrations.on_cooldown', count: ((@cooldown.cooldown_at - Time.now.utc) / 1.day.seconds).ceil) + - else + %p.hint= t('migrations.warning.before') + + %ul.hint + %li.warning-hint= t('migrations.warning.followers') + %li.warning-hint= t('migrations.warning.other_data') + %li.warning-hint= t('migrations.warning.backreference_required') + %li.warning-hint= t('migrations.warning.cooldown') + %li.warning-hint= t('migrations.warning.disabled_account') + + %hr.spacer/ = render 'shared/error_messages', object: @migration - .fields-group - = f.input :acct, placeholder: t('migrations.acct') + .fields-row + .fields-row__column.fields-group.fields-row__column-6 + = f.input :acct, wrapper: :with_block_label, input_html: { autocapitalize: 'none', autocorrect: 'off' }, disabled: on_cooldown? + + .fields-row__column.fields-group.fields-row__column-6 + - if current_user.encrypted_password.present? + = f.input :current_password, wrapper: :with_block_label, input_html: { :autocomplete => 'off' }, required: true, disabled: on_cooldown? + - else + = f.input :current_username, wrapper: :with_block_label, input_html: { :autocomplete => 'off' }, required: true, disabled: on_cooldown? .actions - = f.button :button, t('migrations.proceed'), type: :submit, class: 'negative' + = f.button :button, t('migrations.proceed_with_move'), type: :submit, class: 'button button--destructive', disabled: on_cooldown? + +- unless @migrations.empty? + %hr.spacer/ + + %h3= t 'migrations.past_migrations' + + %hr.spacer/ + + .table-wrapper + %table.table.inline-table + %thead + %tr + %th= t('migrations.acct') + %th= t('migrations.followers_count') + %th + %tbody + - @migrations.each do |migration| + %tr + %td + - if migration.target_account.present? + = compact_account_link_to migration.target_account + - else + = migration.acct + + %td= number_with_delimiter migration.followers_count + + %td + %time.time-ago{ datetime: migration.created_at.iso8601, title: l(migration.created_at) }= l(migration.created_at) + +%hr.spacer/ + +%h3= t 'migrations.incoming_migrations' +%p.muted-hint= t('migrations.incoming_migrations_html', path: settings_aliases_path) diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml index f042011d64..6929f54f30 100644 --- a/app/views/settings/profiles/show.html.haml +++ b/app/views/settings/profiles/show.html.haml @@ -60,6 +60,11 @@ %h6= t('auth.migrate_account') %p.muted-hint= t('auth.migrate_account_html', path: settings_migration_path) +%hr.spacer/ + +%h6= t 'migrations.incoming_migrations' +%p.muted-hint= t('migrations.incoming_migrations_html', path: settings_aliases_path) + - if open_deletion? %hr.spacer/ diff --git a/app/workers/activitypub/move_distribution_worker.rb b/app/workers/activitypub/move_distribution_worker.rb new file mode 100644 index 0000000000..396d5258fe --- /dev/null +++ b/app/workers/activitypub/move_distribution_worker.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +class ActivityPub::MoveDistributionWorker + include Sidekiq::Worker + include Payloadable + + sidekiq_options queue: 'push' + + def perform(migration_id) + @migration = AccountMigration.find(migration_id) + + ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| + [signed_payload, @account.id, inbox_url] + end + + ActivityPub::DeliveryWorker.push_bulk(Relay.enabled.pluck(:inbox_url)) do |inbox_url| + [signed_payload, @account.id, inbox_url] + end + rescue ActiveRecord::RecordNotFound + true + end + + private + + def inboxes + @inboxes ||= @migration.account.followers.inboxes + end + + def signed_payload + @signed_payload ||= Oj.dump(serialize_payload(@migration, ActivityPub::MoveSerializer, signer: @account)) + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml index dabb679e76..c29c7f8717 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -554,6 +554,12 @@ en: new_trending_tag: body: 'The hashtag #%{name} is trending today, but has not been previously reviewed. It will not be displayed publicly unless you allow it to, or just save the form as it is to never hear about it again.' subject: New hashtag up for review on %{instance} (#%{name}) + aliases: + add_new: Create alias + created_msg: Successfully created a new alias. You can now initiate the move from the old account. + deleted_msg: Successfully remove the alias. Moving from that account to this one will no longer be possible. + hint_html: If you want to move from another account to this one, here you can create an alias, which is required before you can proceed with moving followers from the old account to this one. This action by itself is harmless and reversible. The account migration is initiated from the old account. + remove: Unlink alias appearance: advanced_web_interface: Advanced web interface advanced_web_interface_hint: 'If you want to make use of your entire screen width, the advanced web interface allows you to configure many different columns to see as much information at the same time as you want: Home, notifications, federated timeline, any number of lists and hashtags.' @@ -613,6 +619,7 @@ en: confirming: Waiting for e-mail confirmation to be completed. functional: Your account is fully operational. pending: Your application is pending review by our staff. This may take some time. You will receive an e-mail if your application is approved. + redirecting_to: Your account is inactive because it is currently redirecting to %{acct}. trouble_logging_in: Trouble logging in? authorize_follow: already_following: You are already following this account @@ -801,10 +808,32 @@ en: images_and_video: Cannot attach a video to a status that already contains images too_many: Cannot attach more than 4 files migrations: - acct: username@domain of the new account - currently_redirecting: 'Your profile is set to redirect to:' - proceed: Save - updated_msg: Your account migration setting successfully updated! + acct: Moved to + cancel: Cancel redirect + cancel_explanation: Cancelling the redirect will re-activate your current account, but will not bring back followers that have been moved to that account. + cancelled_msg: Successfully cancelled the redirect. + errors: + already_moved: is the same account you have already moved to + missing_also_known_as: is not back-referencing this account + move_to_self: cannot be current account + not_found: could not be found + on_cooldown: You are on cooldown + followers_count: Followers at time of move + incoming_migrations: Moving from a different account + incoming_migrations_html: To move from another account to this one, first you need to create an account alias. + moved_msg: Your account is now redirecting to %{acct} and your followers are being moved over. + not_redirecting: Your account is not redirecting to any other account currently. + on_cooldown: You have recently migrated your account. This function will become available again in %{count} days. + past_migrations: Past migrations + proceed_with_move: Move followers + redirecting_to: Your account is redirecting to %{acct}. + warning: + backreference_required: The new account must first be configured to back-reference this one + before: 'Before proceeding, please read these notes carefully:' + cooldown: After moving there is a cooldown period during which you will not be able to move again + disabled_account: Your current account will not be fully usable afterwards. However, you will have access to data export as well as re-activation. + followers: This action will move all followers from the current account to the new account + other_data: No other data will be moved automatically moderation: title: Moderation notification_mailer: @@ -950,6 +979,7 @@ en: settings: account: Account account_settings: Account settings + aliases: Account aliases appearance: Appearance authorized_apps: Authorized apps back: Back to Mastodon diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index c9ffcfc13f..3d909e9991 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -2,6 +2,10 @@ en: simple_form: hints: + account_alias: + acct: Specify the username@domain of the account you want to move from + account_migration: + acct: Specify the username@domain of the account you want to move to account_warning_preset: text: You can use toot syntax, such as URLs, hashtags and mentions admin_account_action: @@ -15,6 +19,8 @@ en: avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px bot: This account mainly performs automated actions and might not be monitored context: One or multiple contexts where the filter should apply + current_password: For security purposes please enter the password of the current account + current_username: To confirm, please enter the username of the current account digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence discoverable: The profile directory is another way by which your account can reach a wider audience email: You will be sent a confirmation e-mail @@ -60,6 +66,10 @@ en: fields: name: Label value: Content + account_alias: + acct: Handle of the old account + account_migration: + acct: Handle of the new account account_warning_preset: text: Preset text admin_account_action: diff --git a/config/navigation.rb b/config/navigation.rb index 38668bbf74..32c299143f 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -5,7 +5,7 @@ SimpleNavigation::Configuration.run do |navigation| n.item :web, safe_join([fa_icon('chevron-left fw'), t('settings.back')]), root_url n.item :profile, safe_join([fa_icon('user fw'), t('settings.profile')]), settings_profile_url, if: -> { current_user.functional? } do |s| - s.item :profile, safe_join([fa_icon('pencil fw'), t('settings.appearance')]), settings_profile_url, highlights_on: %r{/settings/profile|/settings/migration} + s.item :profile, safe_join([fa_icon('pencil fw'), t('settings.appearance')]), settings_profile_url s.item :featured_tags, safe_join([fa_icon('hashtag fw'), t('settings.featured_tags')]), settings_featured_tags_url s.item :identity_proofs, safe_join([fa_icon('key fw'), t('settings.identity_proofs')]), settings_identity_proofs_path, highlights_on: %r{/settings/identity_proofs*}, if: proc { current_account.identity_proofs.exists? } end @@ -20,13 +20,13 @@ SimpleNavigation::Configuration.run do |navigation| n.item :filters, safe_join([fa_icon('filter fw'), t('filters.index.title')]), filters_path, highlights_on: %r{/filters}, if: -> { current_user.functional? } n.item :security, safe_join([fa_icon('lock fw'), t('settings.account')]), edit_user_registration_url do |s| - s.item :password, safe_join([fa_icon('lock fw'), t('settings.account_settings')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete} + s.item :password, safe_join([fa_icon('lock fw'), t('settings.account_settings')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete|/settings/migration|/settings/aliases} s.item :two_factor_authentication, safe_join([fa_icon('mobile fw'), t('settings.two_factor_authentication')]), settings_two_factor_authentication_url, highlights_on: %r{/settings/two_factor_authentication} s.item :authorized_apps, safe_join([fa_icon('list fw'), t('settings.authorized_apps')]), oauth_authorized_applications_url end - n.item :data, safe_join([fa_icon('cloud-download fw'), t('settings.import_and_export')]), settings_export_url, if: -> { current_user.functional? } do |s| - s.item :import, safe_join([fa_icon('cloud-upload fw'), t('settings.import')]), settings_import_url + n.item :data, safe_join([fa_icon('cloud-download fw'), t('settings.import_and_export')]), settings_export_url do |s| + s.item :import, safe_join([fa_icon('cloud-upload fw'), t('settings.import')]), settings_import_url, if: -> { current_user.functional? } s.item :export, safe_join([fa_icon('cloud-download fw'), t('settings.export')]), settings_export_url end diff --git a/config/routes.rb b/config/routes.rb index dcfa079a0f..37e0cbdee8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -134,8 +134,14 @@ Rails.application.routes.draw do end resource :delete, only: [:show, :destroy] - resource :migration, only: [:show, :update] + resource :migration, only: [:show, :create] do + collection do + post :cancel + end + end + + resources :aliases, only: [:index, :create, :destroy] resources :sessions, only: [:destroy] resources :featured_tags, only: [:index, :create, :destroy] end diff --git a/db/migrate/20190914202517_create_account_migrations.rb b/db/migrate/20190914202517_create_account_migrations.rb new file mode 100644 index 0000000000..cb9d71c096 --- /dev/null +++ b/db/migrate/20190914202517_create_account_migrations.rb @@ -0,0 +1,12 @@ +class CreateAccountMigrations < ActiveRecord::Migration[5.2] + def change + create_table :account_migrations do |t| + t.belongs_to :account, foreign_key: { on_delete: :cascade } + t.string :acct, null: false, default: '' + t.bigint :followers_count, null: false, default: 0 + t.belongs_to :target_account, foreign_key: { to_table: :accounts, on_delete: :nullify } + + t.timestamps + end + end +end diff --git a/db/migrate/20190915194355_create_account_aliases.rb b/db/migrate/20190915194355_create_account_aliases.rb new file mode 100644 index 0000000000..32ce031d91 --- /dev/null +++ b/db/migrate/20190915194355_create_account_aliases.rb @@ -0,0 +1,11 @@ +class CreateAccountAliases < ActiveRecord::Migration[5.2] + def change + create_table :account_aliases do |t| + t.belongs_to :account, foreign_key: { on_delete: :cascade } + t.string :acct, null: false, default: '' + t.string :uri, null: false, default: '' + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 749f79deee..fabeb16f35 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -15,6 +15,15 @@ ActiveRecord::Schema.define(version: 2019_09_17_213523) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "account_aliases", force: :cascade do |t| + t.bigint "account_id" + t.string "acct", default: "", null: false + t.string "uri", default: "", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id"], name: "index_account_aliases_on_account_id" + end + create_table "account_conversations", force: :cascade do |t| t.bigint "account_id" t.bigint "conversation_id" @@ -49,6 +58,17 @@ ActiveRecord::Schema.define(version: 2019_09_17_213523) do t.index ["account_id"], name: "index_account_identity_proofs_on_account_id" end + create_table "account_migrations", force: :cascade do |t| + t.bigint "account_id" + t.string "acct", default: "", null: false + t.bigint "followers_count", default: 0, null: false + t.bigint "target_account_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id"], name: "index_account_migrations_on_account_id" + t.index ["target_account_id"], name: "index_account_migrations_on_target_account_id" + end + create_table "account_moderation_notes", force: :cascade do |t| t.text "content", null: false t.bigint "account_id", null: false @@ -768,10 +788,13 @@ ActiveRecord::Schema.define(version: 2019_09_17_213523) do t.index ["user_id"], name: "index_web_settings_on_user_id", unique: true end + add_foreign_key "account_aliases", "accounts", on_delete: :cascade add_foreign_key "account_conversations", "accounts", on_delete: :cascade add_foreign_key "account_conversations", "conversations", on_delete: :cascade add_foreign_key "account_domain_blocks", "accounts", name: "fk_206c6029bd", on_delete: :cascade add_foreign_key "account_identity_proofs", "accounts", on_delete: :cascade + add_foreign_key "account_migrations", "accounts", column: "target_account_id", on_delete: :nullify + add_foreign_key "account_migrations", "accounts", on_delete: :cascade add_foreign_key "account_moderation_notes", "accounts" add_foreign_key "account_moderation_notes", "accounts", column: "target_account_id" add_foreign_key "account_pins", "accounts", column: "target_account_id", on_delete: :cascade diff --git a/spec/controllers/settings/migrations_controller_spec.rb b/spec/controllers/settings/migrations_controller_spec.rb index 4d814a45e2..36e4ba86e4 100644 --- a/spec/controllers/settings/migrations_controller_spec.rb +++ b/spec/controllers/settings/migrations_controller_spec.rb @@ -21,6 +21,7 @@ describe Settings::MigrationsController do let(:user) { Fabricate(:user, account: account) } let(:account) { Fabricate(:account, moved_to_account: moved_to_account) } + before { sign_in user, scope: :user } context 'when user does not have moved to account' do @@ -32,7 +33,7 @@ describe Settings::MigrationsController do end end - context 'when user does not have moved to account' do + context 'when user has a moved to account' do let(:moved_to_account) { Fabricate(:account) } it 'renders show page' do @@ -43,21 +44,22 @@ describe Settings::MigrationsController do end end - describe 'PUT #update' do + describe 'POST #create' do context 'when user is not sign in' do - subject { put :update } + subject { post :create } it_behaves_like 'authenticate user' end context 'when user is sign in' do - subject { put :update, params: { migration: { acct: acct } } } + subject { post :create, params: { account_migration: { acct: acct, current_password: '12345678' } } } + + let(:user) { Fabricate(:user, password: '12345678') } - let(:user) { Fabricate(:user) } before { sign_in user, scope: :user } context 'when migration account is changed' do - let(:acct) { Fabricate(:account) } + let(:acct) { Fabricate(:account, also_known_as: [ActivityPub::TagManager.instance.uri_for(user.account)]) } it 'updates moved to account' do is_expected.to redirect_to settings_migration_path diff --git a/spec/fabricators/account_alias_fabricator.rb b/spec/fabricators/account_alias_fabricator.rb new file mode 100644 index 0000000000..94dde9bb8c --- /dev/null +++ b/spec/fabricators/account_alias_fabricator.rb @@ -0,0 +1,5 @@ +Fabricator(:account_alias) do + account + acct 'test@example.com' + uri 'https://example.com/users/test' +end diff --git a/spec/fabricators/account_migration_fabricator.rb b/spec/fabricators/account_migration_fabricator.rb new file mode 100644 index 0000000000..3b3fc20773 --- /dev/null +++ b/spec/fabricators/account_migration_fabricator.rb @@ -0,0 +1,6 @@ +Fabricator(:account_migration) do + account + target_account + followers_count 1234 + acct 'test@example.com' +end diff --git a/spec/models/account_alias_spec.rb b/spec/models/account_alias_spec.rb new file mode 100644 index 0000000000..27ec215aa4 --- /dev/null +++ b/spec/models/account_alias_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe AccountAlias, type: :model do + +end diff --git a/spec/models/account_migration_spec.rb b/spec/models/account_migration_spec.rb new file mode 100644 index 0000000000..8461b4b28e --- /dev/null +++ b/spec/models/account_migration_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe AccountMigration, type: :model do + +end From 37ccafec8fe8bf5588794257744554be61a3f22e Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 20 Sep 2019 10:51:52 +0200 Subject: [PATCH 009/107] Fix left side of single column layout being cropped on smaller screens (#11894) Fix #11476 --- app/javascript/styles/mastodon/components.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 8893848ae9..17c94e23cd 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1893,6 +1893,7 @@ a.account__display-name { pointer-events: none; display: flex; justify-content: flex-end; + min-width: 285px; &--start { justify-content: flex-start; @@ -1910,6 +1911,7 @@ a.account__display-name { box-sizing: border-box; width: 100%; max-width: 600px; + flex: 0 0 auto; display: flex; flex-direction: column; From b9a8b38844278f26b9d1d1d53256e0781ba3575a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 20 Sep 2019 10:52:14 +0200 Subject: [PATCH 010/107] Fix page body not being scrollable in admin layout (#11893) Hide navigation behind hamburger icon on small screens in admin layout --- app/javascript/packs/public.js | 10 ++ app/javascript/styles/mastodon/admin.scss | 138 +++++++++++++++++---- app/javascript/styles/mastodon/basics.scss | 3 - app/views/layouts/admin.html.haml | 20 ++- 4 files changed, 142 insertions(+), 29 deletions(-) diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index 97ee4dfa21..ed713f335a 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -247,6 +247,16 @@ function main() { input.readonly = oldReadOnly; }); + + delegate(document, '.sidebar__toggle__icon', 'click', () => { + const target = document.querySelector('.sidebar ul'); + + if (target.style.display === 'block') { + target.style.display = 'none'; + } else { + target.style.display = 'block'; + } + }); } loadPolyfills().then(main).catch(error => { diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 074eee2cd2..dde1d69ba0 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -5,21 +5,66 @@ $content-width: 840px; .admin-wrapper { display: flex; justify-content: center; - height: 100%; + width: 100%; + min-height: 100vh; .sidebar-wrapper { - flex: 1 1 $sidebar-width; - height: 100%; - background: $ui-base-color; - display: flex; - justify-content: flex-end; + min-height: 100vh; + overflow: hidden; + pointer-events: none; + flex: 1 1 auto; + + &__inner { + display: flex; + justify-content: flex-end; + background: $ui-base-color; + height: 100%; + } } .sidebar { width: $sidebar-width; - height: 100%; padding: 0; - overflow-y: auto; + pointer-events: auto; + + &__toggle { + display: none; + background: lighten($ui-base-color, 8%); + height: 48px; + + &__logo { + flex: 1 1 auto; + + a { + display: inline-block; + padding: 15px; + } + + svg { + fill: $primary-text-color; + height: 20px; + position: relative; + bottom: -2px; + } + } + + &__icon { + display: block; + color: $darker-text-color; + text-decoration: none; + flex: 0 0 auto; + font-size: 20px; + padding: 15px; + } + + a { + &:hover, + &:focus, + &:active { + background: lighten($ui-base-color, 12%); + } + } + } .logo { display: block; @@ -52,6 +97,9 @@ $content-width: 840px; transition: all 200ms linear; transition-property: color, background-color; border-radius: 4px 0 0 4px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; i.fa { margin-right: 5px; @@ -99,12 +147,30 @@ $content-width: 840px; } .content-wrapper { - flex: 2 1 $content-width; - overflow: auto; + box-sizing: border-box; + width: 100%; + max-width: $content-width; + flex: 1 1 auto; + } + + @media screen and (max-width: $content-width + $sidebar-width) { + .sidebar-wrapper--empty { + display: none; + } + + .sidebar-wrapper { + width: $sidebar-width; + flex: 0 0 auto; + } + } + + @media screen and (max-width: $no-columns-breakpoint) { + .sidebar-wrapper { + width: 100%; + } } .content { - max-width: $content-width; padding: 20px 15px; padding-top: 60px; padding-left: 25px; @@ -123,6 +189,12 @@ $content-width: 840px; padding-bottom: 40px; border-bottom: 1px solid lighten($ui-base-color, 8%); margin-bottom: 40px; + + @media screen and (max-width: $no-columns-breakpoint) { + border-bottom: 0; + padding-bottom: 0; + font-weight: 700; + } } h3 { @@ -147,7 +219,7 @@ $content-width: 840px; font-size: 16px; color: $secondary-text-color; line-height: 28px; - font-weight: 400; + font-weight: 500; } .fields-group h6 { @@ -176,7 +248,7 @@ $content-width: 840px; & > p { font-size: 14px; - line-height: 18px; + line-height: 21px; color: $secondary-text-color; margin-bottom: 20px; @@ -208,20 +280,42 @@ $content-width: 840px; @media screen and (max-width: $no-columns-breakpoint) { display: block; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - .sidebar-wrapper, - .content-wrapper { - flex: 0 0 auto; - height: auto; - overflow: initial; + .sidebar-wrapper { + min-height: 0; } .sidebar { width: 100%; padding: 0; height: auto; + + &__toggle { + display: flex; + } + + & > ul { + display: none; + } + + ul a, + ul ul a { + border-radius: 0; + border-bottom: 1px solid lighten($ui-base-color, 4%); + transition: none; + + &:hover { + transition: none; + } + } + + ul ul { + border-radius: 0; + } + + ul .simple-navigation-active-leaf a { + border-bottom-color: $ui-highlight-color; + } } } } @@ -270,10 +364,10 @@ body, .filter-subset { flex: 0 0 auto; - margin: 0 40px 10px 0; + margin: 0 40px 20px 0; &:last-child { - margin-bottom: 20px; + margin-bottom: 30px; } ul { diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss index f9332caa39..1f3ef7da2e 100644 --- a/app/javascript/styles/mastodon/basics.scss +++ b/app/javascript/styles/mastodon/basics.scss @@ -86,9 +86,6 @@ body { &.admin { background: darken($ui-base-color, 4%); - position: fixed; - width: 100%; - height: 100%; padding: 0; } diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index 083f2fac76..57bda45e23 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -4,11 +4,21 @@ - content_for :content do .admin-wrapper .sidebar-wrapper - .sidebar - = link_to root_path do - = image_pack_tag 'logo.svg', class: 'logo', alt: 'Mastodon' + .sidebar-wrapper__inner + .sidebar + = link_to root_path do + = image_pack_tag 'logo.svg', class: 'logo', alt: 'Mastodon' + + .sidebar__toggle + .sidebar__toggle__logo + = link_to root_path do + = svg_logo_full + + = link_to '#', class: 'sidebar__toggle__icon' do + = fa_icon 'bars' + + = render_navigation - = render_navigation .content-wrapper .content %h2= yield :page_title @@ -17,4 +27,6 @@ = yield + .sidebar-wrapper.sidebar-wrapper--empty + = render template: 'layouts/application' From 73a5ef03b2ea175a24c33257638f46f71d22b95a Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sat, 21 Sep 2019 00:13:45 +0900 Subject: [PATCH 011/107] Respect original ID with ToC (#11895) --- 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 c6e1795579..351675a5cd 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.text.parameterize + anchor = node['id'] || node.text.parameterize @slugs[anchor] += 1 anchor = "#{anchor}-#{@slugs[anchor]}" if @slugs[anchor] > 1 From 450639a406217bf4aaad5a37d874f384cec06164 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 20 Sep 2019 21:22:16 +0200 Subject: [PATCH 012/107] Fix hashtag batch actions being unavailable on pending review page (#11897) Regression from #11829 --- app/views/admin/tags/index.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admin/tags/index.html.haml b/app/views/admin/tags/index.html.haml index c767c9d188..498b930835 100644 --- a/app/views/admin/tags/index.html.haml +++ b/app/views/admin/tags/index.html.haml @@ -51,7 +51,7 @@ %label.batch-table__toolbar__select.batch-checkbox-all = check_box_tag :batch_checkbox_all, nil, false .batch-table__toolbar__actions - - if params[:review] == 'pending_review' + - if params[:pending_review] == '1' = f.button safe_join([fa_icon('check'), t('admin.accounts.approve')]), name: :approve, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } = f.button safe_join([fa_icon('times'), t('admin.accounts.reject')]), name: :reject, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } From 3c8372fa81c77bb470be150f1fb56136317e4cfe Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 20 Sep 2019 22:59:29 +0200 Subject: [PATCH 013/107] Bump version to 2.9.3 (#11899) --- CHANGELOG.md | 59 +++++++++++++++++++++++++++++++++++++++++ lib/mastodon/version.rb | 2 +- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 539fec5317..a17fbf8f06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,65 @@ Changelog All notable changes to this project will be documented in this file. +## [2.9.3] - 2019-08-10 +### Added + +- Add GIF and WebP support for custom emojis ([Gargron](https://github.com/tootsuite/mastodon/pull/11519)) +- Add logout link to dropdown menu in web UI ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/11353)) +- Add indication that text search is unavailable in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11112), [ThibG](https://github.com/tootsuite/mastodon/pull/11202)) +- Add `suffix` to `Mastodon::Version` to help forks ([clarfon](https://github.com/tootsuite/mastodon/pull/11407)) +- Add on-hover animation to animated custom emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11348), [ThibG](https://github.com/tootsuite/mastodon/pull/11404), [ThibG](https://github.com/tootsuite/mastodon/pull/11522)) +- Add custom emoji support in profile metadata labels ([ThibG](https://github.com/tootsuite/mastodon/pull/11350)) + +### Changed + +- Change default interface of web and streaming from 0.0.0.0 to 127.0.0.1 ([Gargron](https://github.com/tootsuite/mastodon/pull/11302), [zunda](https://github.com/tootsuite/mastodon/pull/11378), [Gargron](https://github.com/tootsuite/mastodon/pull/11351), [zunda](https://github.com/tootsuite/mastodon/pull/11326)) +- Change the retry limit of web push notifications ([highemerly](https://github.com/tootsuite/mastodon/pull/11292)) +- Change ActivityPub deliveries to not retry HTTP 501 errors ([Gargron](https://github.com/tootsuite/mastodon/pull/11233)) +- Change language detection to include hashtags as words ([Gargron](https://github.com/tootsuite/mastodon/pull/11341)) +- Change terms and privacy policy pages to always be accessible ([Gargron](https://github.com/tootsuite/mastodon/pull/11334)) +- Change robots tag to include `noarchive` when user opts out of indexing ([Kjwon15](https://github.com/tootsuite/mastodon/pull/11421)) + +### Fixed + +- Fix account domain block not clearing out notifications ([Gargron](https://github.com/tootsuite/mastodon/pull/11393)) +- Fix incorrect locale sometimes being detected for browser ([Gargron](https://github.com/tootsuite/mastodon/pull/8657)) +- Fix crash when saving invalid domain name ([Gargron](https://github.com/tootsuite/mastodon/pull/11528)) +- Fix pinned statuses REST API returning pagination headers ([Gargron](https://github.com/tootsuite/mastodon/pull/11526)) +- Fix "cancel follow request" button having unreadable text in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11521)) +- Fix image uploads being blank when canvas read access is blocked ([ThibG](https://github.com/tootsuite/mastodon/pull/11499)) +- Fix avatars not being animated on hover when not logged in ([ThibG](https://github.com/tootsuite/mastodon/pull/11349)) +- Fix overzealous sanitization of HTML lists ([ThibG](https://github.com/tootsuite/mastodon/pull/11354)) +- Fix block crashing when a follow request exists ([ThibG](https://github.com/tootsuite/mastodon/pull/11288)) +- Fix backup service crashing when an attachment is missing ([ThibG](https://github.com/tootsuite/mastodon/pull/11241)) +- Fix account moderation action always sending e-mail notification ([Gargron](https://github.com/tootsuite/mastodon/pull/11242)) +- Fix swiping columns on mobile sometimes failing in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11200)) +- Fix wrong actor URI being serialized into poll updates ([ThibG](https://github.com/tootsuite/mastodon/pull/11194)) +- Fix statsd UDP sockets not being cleaned up in Sidekiq ([Gargron](https://github.com/tootsuite/mastodon/pull/11230)) +- Fix expiration date of filters being set to "never" when editing them ([ThibG](https://github.com/tootsuite/mastodon/pull/11204)) +- Fix support for MP4 files that are actually M4V files ([Gargron](https://github.com/tootsuite/mastodon/pull/11210)) +- Fix `alerts` not being typecast correctly in push subscription in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/11343)) +- Fix some notices staying on unrelated pages ([ThibG](https://github.com/tootsuite/mastodon/pull/11364)) +- Fix unboosting sometimes preventing a boost from reappearing on feed ([ThibG](https://github.com/tootsuite/mastodon/pull/11405), [Gargron](https://github.com/tootsuite/mastodon/pull/11450)) +- Fix only one middle dot being recognized in hashtags ([Gargron](https://github.com/tootsuite/mastodon/pull/11345), [ThibG](https://github.com/tootsuite/mastodon/pull/11363)) +- Fix unnecessary SQL query performed on unauthenticated requests ([Gargron](https://github.com/tootsuite/mastodon/pull/11179)) +- Fix incorrect timestamp displayed on featured tags ([Kjwon15](https://github.com/tootsuite/mastodon/pull/11477)) +- Fix privacy dropdown active state when dropdown is placed on top of it ([ThibG](https://github.com/tootsuite/mastodon/pull/11495)) +- Fix filters not being applied to poll options ([ThibG](https://github.com/tootsuite/mastodon/pull/11174)) +- Fix keyboard navigation on various dropdowns ([ThibG](https://github.com/tootsuite/mastodon/pull/11511), [ThibG](https://github.com/tootsuite/mastodon/pull/11492), [ThibG](https://github.com/tootsuite/mastodon/pull/11491)) +- Fix keyboard navigation in modals ([ThibG](https://github.com/tootsuite/mastodon/pull/11493)) +- Fix image conversation being non-deterministic due to timestamps ([Gargron](https://github.com/tootsuite/mastodon/pull/11408)) +- Fix web UI performance ([ThibG](https://github.com/tootsuite/mastodon/pull/11211), [ThibG](https://github.com/tootsuite/mastodon/pull/11234)) +- Fix scrolling to compose form when not necessary in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11246), [ThibG](https://github.com/tootsuite/mastodon/pull/11182)) +- Fix save button being enabled when list title is empty in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11475)) +- Fix poll expiration not being pre-filled on delete & redraft in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11203)) +- Fix content warning sometimes being set when not requested in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11206)) + +### Security + +- Fix invites not being disabled upon account suspension ([ThibG](https://github.com/tootsuite/mastodon/pull/11412)) +- Fix blocked domains still being able to fill database with account records ([Gargron](https://github.com/tootsuite/mastodon/pull/11219)) + ## [2.9.2] - 2019-06-22 ### Added diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 3db57ceaa5..99d709c980 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 2 + 3 end def flags From 1caa823d0654b86f8e69446bad8a3adee276d12a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 20 Sep 2019 23:05:23 +0200 Subject: [PATCH 014/107] New Crowdin translations (#11861) * New translations devise.en.yml (Esperanto) [ci skip] * New translations devise.en.yml (Danish) [ci skip] * New translations devise.en.yml (Asturian) [ci skip] * New translations devise.en.yml (Norwegian) [ci skip] * New translations en.json (Breton) [ci skip] * New translations devise.en.yml (Bulgarian) [ci skip] * New translations devise.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations devise.en.yml (Croatian) [ci skip] * New translations devise.en.yml (Georgian) [ci skip] * New translations devise.en.yml (Hebrew) [ci skip] * New translations devise.en.yml (Ido) [ci skip] * New translations devise.en.yml (Indonesian) [ci skip] * New translations devise.en.yml (Russian) [ci skip] * New translations devise.en.yml (Czech) [ci skip] * New translations devise.en.yml (Serbian (Cyrillic)) [ci skip] * New translations devise.en.yml (Serbian (Latin)) [ci skip] * New translations devise.en.yml (Slovak) [ci skip] * New translations devise.en.yml (Ukrainian) [ci skip] * New translations devise.en.yml (Albanian) [ci skip] * New translations devise.en.yml (Arabic) [ci skip] * New translations devise.en.yml (Basque) [ci skip] * New translations devise.en.yml (Bengali) [ci skip] * New translations devise.en.yml (Catalan) [ci skip] * New translations devise.en.yml (Chinese Simplified) [ci skip] * New translations devise.en.yml (Chinese Traditional) [ci skip] * New translations devise.en.yml (Corsican) [ci skip] * New translations devise.en.yml (Welsh) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.json (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations simple_form.en.yml (Czech) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.json (German) [ci skip] * New translations en.yml (German) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.json (Corsican) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations simple_form.en.yml (Corsican) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.json (French) [ci skip] * New translations simple_form.en.yml (French) [ci skip] * New translations en.json (Korean) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations simple_form.en.yml (Korean) [ci skip] * New translations en.json (Greek) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations simple_form.en.yml (Greek) [ci skip] * New translations activerecord.en.yml (Breton) [ci skip] * New translations activerecord.en.yml (Breton) [ci skip] * New translations devise.en.yml (Breton) [ci skip] * New translations devise.en.yml (Breton) [ci skip] * New translations devise.en.yml (Breton) [ci skip] * New translations devise.en.yml (Breton) [ci skip] * New translations simple_form.en.yml (Dutch) [ci skip] * New translations simple_form.en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (Estonian) [ci skip] * New translations simple_form.en.yml (Finnish) [ci skip] * New translations simple_form.en.yml (Danish) [ci skip] * New translations simple_form.en.yml (Chinese Simplified) [ci skip] * New translations simple_form.en.yml (Catalan) [ci skip] * New translations simple_form.en.yml (Chinese Traditional) [ci skip] * New translations simple_form.en.yml (Galician) [ci skip] * New translations simple_form.en.yml (Basque) [ci skip] * New translations simple_form.en.yml (Hungarian) [ci skip] * New translations simple_form.en.yml (Italian) [ci skip] * New translations simple_form.en.yml (Japanese) [ci skip] * New translations simple_form.en.yml (Ido) [ci skip] * New translations simple_form.en.yml (Indonesian) [ci skip] * New translations simple_form.en.yml (Croatian) [ci skip] * New translations simple_form.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (Hebrew) [ci skip] * New translations simple_form.en.yml (Georgian) [ci skip] * New translations simple_form.en.yml (Arabic) [ci skip] * New translations simple_form.en.yml (Albanian) [ci skip] * New translations simple_form.en.yml (Asturian) [ci skip] * New translations simple_form.en.yml (Bulgarian) [ci skip] * New translations simple_form.en.yml (Thai) [ci skip] * New translations simple_form.en.yml (Swedish) [ci skip] * New translations simple_form.en.yml (Turkish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Norwegian) [ci skip] * New translations simple_form.en.yml (Russian) [ci skip] * New translations simple_form.en.yml (Serbian (Cyrillic)) [ci skip] * New translations simple_form.en.yml (Serbian (Latin)) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations simple_form.en.yml (Slovak) [ci skip] * New translations simple_form.en.yml (Ukrainian) [ci skip] * New translations simple_form.en.yml (Portuguese) [ci skip] * New translations simple_form.en.yml (Slovenian) [ci skip] * New translations simple_form.en.yml (Romanian) [ci skip] * New translations simple_form.en.yml (Portuguese, Brazilian) [ci skip] * New translations simple_form.en.yml (Polish) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations simple_form.en.yml (Occitan) [ci skip] * New translations devise.en.yml (Slovak) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations simple_form.en.yml (Czech) [ci skip] * New translations devise.en.yml (Czech) [ci skip] * New translations devise.en.yml (Occitan) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations devise.en.yml (Occitan) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations simple_form.en.yml (Corsican) [ci skip] * New translations devise.en.yml (Corsican) [ci skip] * New translations devise.en.yml (Corsican) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.yml (Bengali) [ci skip] * New translations en.yml (Asturian) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Kazakh) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Telugu) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Slovenian) [ci skip] * New translations en.yml (Estonian) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.yml (Lithuanian) [ci skip] * New translations en.yml (Malay) [ci skip] * New translations en.yml (Norwegian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Georgian) [ci skip] * New translations en.yml (Hebrew) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Serbian (Cyrillic)) [ci skip] * New translations en.yml (Serbian (Latin)) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations devise.en.yml (Greek) [ci skip] * New translations en.yml (German) [ci skip] * New translations devise.en.yml (German) [ci skip] * New translations en.yml (German) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Estonian) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.yml (Georgian) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Asturian) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Slovenian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.yml (Norwegian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Serbian (Cyrillic)) [ci skip] * New translations en.yml (Serbian (Latin)) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Kazakh) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Lithuanian) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (German) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.json (Bulgarian) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations simple_form.en.yml (Czech) [ci skip] * New translations simple_form.en.yml (Czech) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations devise.en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.json (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations devise.en.yml (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations simple_form.en.yml (Galician) [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 (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations devise.en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations devise.en.yml (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 (Dutch) [ci skip] * i18n-tasks normalize * yarn manage:translations --- app/javascript/mastodon/locales/ar.json | 4 + app/javascript/mastodon/locales/ast.json | 4 + app/javascript/mastodon/locales/bg.json | 18 +- app/javascript/mastodon/locales/bn.json | 4 + app/javascript/mastodon/locales/br.json | 94 ++-- app/javascript/mastodon/locales/ca.json | 4 + app/javascript/mastodon/locales/co.json | 10 +- app/javascript/mastodon/locales/cs.json | 8 +- app/javascript/mastodon/locales/cy.json | 4 + app/javascript/mastodon/locales/da.json | 4 + app/javascript/mastodon/locales/de.json | 10 +- .../mastodon/locales/defaultMessages.json | 50 +++ app/javascript/mastodon/locales/el.json | 10 +- app/javascript/mastodon/locales/en.json | 4 + app/javascript/mastodon/locales/eo.json | 4 + app/javascript/mastodon/locales/es.json | 4 + app/javascript/mastodon/locales/et.json | 4 + app/javascript/mastodon/locales/eu.json | 4 + app/javascript/mastodon/locales/fa.json | 4 + app/javascript/mastodon/locales/fi.json | 4 + app/javascript/mastodon/locales/fr.json | 10 +- app/javascript/mastodon/locales/ga.json | 419 +++++++++++++++++- app/javascript/mastodon/locales/gl.json | 8 +- app/javascript/mastodon/locales/he.json | 4 + app/javascript/mastodon/locales/hi.json | 4 + app/javascript/mastodon/locales/hr.json | 4 + app/javascript/mastodon/locales/hu.json | 4 + app/javascript/mastodon/locales/hy.json | 4 + app/javascript/mastodon/locales/id.json | 4 + app/javascript/mastodon/locales/io.json | 4 + app/javascript/mastodon/locales/it.json | 4 + app/javascript/mastodon/locales/ja.json | 4 + app/javascript/mastodon/locales/ka.json | 4 + app/javascript/mastodon/locales/kk.json | 4 + app/javascript/mastodon/locales/ko.json | 10 +- app/javascript/mastodon/locales/lt.json | 4 + app/javascript/mastodon/locales/lv.json | 4 + app/javascript/mastodon/locales/ms.json | 4 + app/javascript/mastodon/locales/nl.json | 32 +- app/javascript/mastodon/locales/nn.json | 14 +- app/javascript/mastodon/locales/no.json | 4 + app/javascript/mastodon/locales/oc.json | 54 +-- app/javascript/mastodon/locales/pl.json | 4 + app/javascript/mastodon/locales/pt-BR.json | 4 + app/javascript/mastodon/locales/pt-PT.json | 4 + app/javascript/mastodon/locales/ro.json | 4 + app/javascript/mastodon/locales/ru.json | 4 + app/javascript/mastodon/locales/sk.json | 10 +- app/javascript/mastodon/locales/sl.json | 4 + app/javascript/mastodon/locales/sq.json | 4 + app/javascript/mastodon/locales/sr-Latn.json | 4 + app/javascript/mastodon/locales/sr.json | 4 + app/javascript/mastodon/locales/sv.json | 4 + app/javascript/mastodon/locales/ta.json | 4 + app/javascript/mastodon/locales/te.json | 4 + app/javascript/mastodon/locales/th.json | 4 + app/javascript/mastodon/locales/tr.json | 4 + app/javascript/mastodon/locales/uk.json | 4 + .../mastodon/locales/whitelist_ga.json | 2 + app/javascript/mastodon/locales/zh-CN.json | 4 + app/javascript/mastodon/locales/zh-HK.json | 4 + app/javascript/mastodon/locales/zh-TW.json | 4 + config/locales/activerecord.br.yml | 12 + config/locales/ar.yml | 11 - config/locales/ast.yml | 4 - config/locales/bn.yml | 3 - config/locales/ca.yml | 23 - config/locales/co.yml | 34 +- config/locales/cs.yml | 78 ++-- config/locales/cy.yml | 6 - config/locales/da.yml | 8 - config/locales/de.yml | 74 +++- config/locales/devise.br.yml | 32 ++ config/locales/devise.co.yml | 12 + config/locales/devise.cs.yml | 12 + config/locales/devise.de.yml | 12 + config/locales/devise.el.yml | 4 + config/locales/devise.gl.yml | 12 + config/locales/devise.nl.yml | 12 + config/locales/devise.oc.yml | 12 + config/locales/devise.pt-PT.yml | 83 ++++ config/locales/devise.sk.yml | 2 +- config/locales/el.yml | 36 +- config/locales/eo.yml | 10 - config/locales/es.yml | 8 - config/locales/et.yml | 6 - config/locales/eu.yml | 10 - config/locales/fa.yml | 8 - config/locales/fi.yml | 6 - config/locales/fr.yml | 23 - config/locales/gl.yml | 77 +++- config/locales/he.yml | 3 - config/locales/hu.yml | 6 - config/locales/id.yml | 3 - config/locales/it.yml | 23 - config/locales/ja.yml | 23 - config/locales/ka.yml | 6 - config/locales/kk.yml | 6 - config/locales/ko.yml | 51 ++- config/locales/lt.yml | 6 - config/locales/ms.yml | 3 - config/locales/nl.yml | 68 ++- config/locales/no.yml | 6 - config/locales/oc.yml | 6 - config/locales/pl.yml | 6 - config/locales/pt-BR.yml | 6 - config/locales/pt-PT.yml | 6 - config/locales/ru.yml | 8 - config/locales/simple_form.co.yml | 4 + config/locales/simple_form.cs.yml | 16 +- config/locales/simple_form.de.yml | 14 + config/locales/simple_form.el.yml | 2 + config/locales/simple_form.fr.yml | 2 + config/locales/simple_form.gl.yml | 14 + config/locales/simple_form.ko.yml | 2 + config/locales/sk.yml | 40 +- config/locales/sl.yml | 6 - config/locales/sq.yml | 6 - config/locales/sr-Latn.yml | 6 - config/locales/sr.yml | 6 - config/locales/sv.yml | 6 - config/locales/te.yml | 3 - config/locales/th.yml | 4 - config/locales/tr.yml | 15 - config/locales/uk.yml | 17 - config/locales/zh-CN.yml | 10 - config/locales/zh-HK.yml | 6 - config/locales/zh-TW.yml | 6 - 128 files changed, 1361 insertions(+), 633 deletions(-) create mode 100644 app/javascript/mastodon/locales/whitelist_ga.json create mode 100644 config/locales/devise.pt-PT.yml diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index ce66a5d1c6..01c56b4a0c 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -111,6 +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}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "الوافدون الجُدد", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 2ef693fcbc..c636e313be 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "¿De xuru que quies dexar de siguir a {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 309f045132..10f493b26d 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -1,12 +1,12 @@ { - "account.add_or_remove_from_list": "Add or Remove from lists", - "account.badges.bot": "Bot", + "account.add_or_remove_from_list": "Добави или премахни от списъците", + "account.badges.bot": "бот", "account.block": "Блокирай", - "account.block_domain": "Hide everything from {domain}", - "account.blocked": "Blocked", + "account.block_domain": "скрий всичко от (домейн)", + "account.blocked": "Блокирани", "account.cancel_follow_request": "Cancel follow request", "account.direct": "Direct Message @{name}", - "account.domain_blocked": "Domain hidden", + "account.domain_blocked": "Скрит домейн", "account.edit_profile": "Редактирай профила си", "account.endorse": "Feature on profile", "account.follow": "Последвай", @@ -45,7 +45,7 @@ "autosuggest_hashtag.per_week": "{count} per week", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", + "bundle_column_error.retry": "Опитай отново", "bundle_column_error.title": "Network error", "bundle_modal_error.close": "Close", "bundle_modal_error.message": "Something went wrong while loading this component.", @@ -58,7 +58,7 @@ "column.favourites": "Favourites", "column.follow_requests": "Follow requests", "column.home": "Начало", - "column.lists": "Lists", + "column.lists": "Списъци", "column.mutes": "Muted users", "column.notifications": "Известия", "column.pins": "Pinned toot", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "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", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index e4984a1188..8d67a93dac 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -111,6 +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}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 2de037f16c..4104534af0 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -1,60 +1,60 @@ { - "account.add_or_remove_from_list": "Add or Remove from lists", - "account.badges.bot": "Bot", - "account.block": "Block @{name}", - "account.block_domain": "Hide everything from {domain}", - "account.blocked": "Blocked", - "account.cancel_follow_request": "Cancel follow request", - "account.direct": "Direct message @{name}", - "account.domain_blocked": "Domain hidden", - "account.edit_profile": "Edit profile", - "account.endorse": "Feature on profile", - "account.follow": "Follow", - "account.followers": "Followers", - "account.followers.empty": "No one follows this user yet.", - "account.follows": "Follows", + "account.add_or_remove_from_list": "Ouzhpenn pe lemel ag ar listennadoù", + "account.badges.bot": "Robot", + "account.block": "Stankañ @{name}", + "account.block_domain": "Kuzh kement tra a {domain}", + "account.blocked": "Stanket", + "account.cancel_follow_request": "Nullañ ar pedad heuliañ", + "account.direct": "Kas ur c'hemennad da @{name}", + "account.domain_blocked": "Domani kuzhet", + "account.edit_profile": "Aozañ ar profil", + "account.endorse": "Lakaat war-wel war ar profil", + "account.follow": "Heuliañ", + "account.followers": "Heilour·ezed·ion", + "account.followers.empty": "Den na heul an implijour-mañ c'hoazh.", + "account.follows": "Koumanantoù", "account.follows.empty": "This user doesn't follow anyone yet.", - "account.follows_you": "Follows you", - "account.hide_reblogs": "Hide boosts from @{name}", - "account.last_status": "Last active", + "account.follows_you": "Ho heul", + "account.hide_reblogs": "Kuzh toudoù skignet gant @{name}", + "account.last_status": "Oberiantiz zivezhañ", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mention @{name}", - "account.moved_to": "{name} has moved to:", - "account.mute": "Mute @{name}", - "account.mute_notifications": "Mute notifications from @{name}", - "account.muted": "Muted", - "account.never_active": "Never", - "account.posts": "Toots", - "account.posts_with_replies": "Toots and replies", - "account.report": "Report @{name}", + "account.mention": "Menegiñ @{name}", + "account.moved_to": "Dilojet en·he deus {name} da:", + "account.mute": "Kuzhat @{name}", + "account.mute_notifications": "Kuzh kemennoù a @{name}", + "account.muted": "Kuzhet", + "account.never_active": "Birviken", + "account.posts": "Toudoù", + "account.posts_with_replies": "Toudoù ha respontoù", + "account.report": "Disklêriañ @{name}", "account.requested": "Awaiting approval", - "account.share": "Share @{name}'s profile", - "account.show_reblogs": "Show boosts from @{name}", - "account.unblock": "Unblock @{name}", - "account.unblock_domain": "Unhide {domain}", + "account.share": "Skignañ profil @{name}", + "account.show_reblogs": "Diskouez toudoù a @{name}", + "account.unblock": "Distankañ @{name}", + "account.unblock_domain": "Diguzh {domain}", "account.unendorse": "Don't feature on profile", - "account.unfollow": "Unfollow", - "account.unmute": "Unmute @{name}", - "account.unmute_notifications": "Unmute notifications from @{name}", + "account.unfollow": "Diheuliañ", + "account.unmute": "Diguzhat @{name}", + "account.unmute_notifications": "Diguzhat kemennoù a @{name}", "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", "alert.rate_limited.title": "Rate limited", - "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", - "autosuggest_hashtag.per_week": "{count} per week", + "alert.unexpected.message": "Ur fazi dic'hortozet zo degouezhet.", + "alert.unexpected.title": "C'hem !", + "autosuggest_hashtag.per_week": "{count} bep sizhun", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", - "bundle_modal_error.close": "Close", + "bundle_column_error.retry": "Klask endro", + "bundle_column_error.title": "Fazi rouedad", + "bundle_modal_error.close": "Serriñ", "bundle_modal_error.message": "Something went wrong while loading this component.", - "bundle_modal_error.retry": "Try again", - "column.blocks": "Blocked users", - "column.community": "Local timeline", - "column.direct": "Direct messages", - "column.directory": "Browse profiles", - "column.domain_blocks": "Hidden domains", + "bundle_modal_error.retry": "Klask endro", + "column.blocks": "Implijour·ezed·ion stanket", + "column.community": "Red-amzer lec'hel", + "column.direct": "Kemennadoù prevez", + "column.directory": "Mont a-dreuz ar profiloù", + "column.domain_blocks": "Domani kuzhet", "column.favourites": "Favourites", "column.follow_requests": "Follow requests", "column.home": "Home", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "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", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 77f84ac7d7..b3afb0d5b3 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Responen ara es sobreescriurà el missatge que estàs editant. Estàs segur que vols continuar?", "confirmations.unfollow.confirm": "Deixa de seguir", "confirmations.unfollow.message": "Estàs segur que vols deixar de seguir {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index d95f32b181..85685dccd8 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -63,7 +63,7 @@ "column.notifications": "Nutificazione", "column.pins": "Statuti puntarulati", "column.public": "Linea pubblica glubale", - "column.status": "Toot", + "column.status": "Statutu", "column_back_button.label": "Ritornu", "column_header.hide_settings": "Piattà i parametri", "column_header.moveLeft_settings": "Spiazzà à manca", @@ -111,6 +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}", "directory.federated": "Da u fediverse cunisciutu", "directory.local": "Solu da {domain}", "directory.new_arrivals": "Ultimi arrivi", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Bàsichi", "home.column_settings.show_reblogs": "Vede e spartere", "home.column_settings.show_replies": "Vede e risposte", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Attualizà in tempu reale", "intervals.full.days": "{number, plural, one {# ghjornu} other {# ghjorni}}", "intervals.full.hours": "{number, plural, one {# ora} other {# ore}}", "intervals.full.minutes": "{number, plural, one {# minuta} other {# minute}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Preferenze", "navigation_bar.public_timeline": "Linea pubblica glubale", "navigation_bar.security": "Sicurità", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "è {count, plural, one {# altru} other {# altri}}", "notification.favourite": "{name} hà aghjuntu u vostru statutu à i so favuriti", "notification.follow": "{name} v'hà seguitatu", "notification.mention": "{name} v'hà mintuvatu", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 8acf27cb39..586ca5fd59 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Odpovězením nyní přepíšete zprávu, kterou aktuálně píšete. Jste si jistý/á, že chcete pokračovat?", "confirmations.unfollow.confirm": "Přestat sledovat", "confirmations.unfollow.message": "jste si jistý/á, že chcete přestat sledovat uživatele {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Ze známého fedivesmíru", "directory.local": "Pouze z {domain}", "directory.new_arrivals": "Nově příchozí", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Základní", "home.column_settings.show_reblogs": "Zobrazit boosty", "home.column_settings.show_replies": "Zobrazit odpovědi", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Aktualizovat v reálném čase", "intervals.full.days": "{number, plural, one {# den} few {# dny} many {# dne} other {# dní}}", "intervals.full.hours": "{number, plural, one {# hodina} few {# hodiny} many {# hodiny} other {# hodin}}", "intervals.full.minutes": "{number, plural, one {# minuta} few {# minuty} many {# minuty} other {# minut}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Předvolby", "navigation_bar.public_timeline": "Federovaná časová osa", "navigation_bar.security": "Zabezpečení", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "a {count, plural, one {# další} few {# další} many {# dalších} other {# dalších}}", "notification.favourite": "{name} si oblíbil/a váš toot", "notification.follow": "{name} vás začal/a sledovat", "notification.mention": "{name} vás zmínil/a", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index cdf2656d7d..c06f0fd665 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -111,6 +111,10 @@ "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.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", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 14b0f75639..aef26dbf02 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Hvis du svarer nu vil du overskrive den besked du er ved at skrive. Er du sikker på, du vil fortsætte?", "confirmations.unfollow.confirm": "Følg ikke længere", "confirmations.unfollow.message": "Er du sikker på, du ikke længere vil følge {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Fra kendt fedivers", "directory.local": "Kun fra {domain}", "directory.new_arrivals": "Nye ankomster", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 845bc5156b..566332293b 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -63,7 +63,7 @@ "column.notifications": "Mitteilungen", "column.pins": "Angeheftete Beiträge", "column.public": "Föderierte Zeitleiste", - "column.status": "Toot", + "column.status": "Beitrag", "column_back_button.label": "Zurück", "column_header.hide_settings": "Einstellungen verbergen", "column_header.moveLeft_settings": "Spalte nach links verschieben", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Aus dem Fediverse", "directory.local": "Nur von {domain}", "directory.new_arrivals": "Neue Benutzer", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Einfach", "home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen", "home.column_settings.show_replies": "Antworten anzeigen", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "In Echtzeit aktualisieren", "intervals.full.days": "{number, plural, one {# Tag} other {# Tage}}", "intervals.full.hours": "{number, plural, one {# Stunde} other {# Stunden}}", "intervals.full.minutes": "{number, plural, one {# Minute} other {# Minuten}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Einstellungen", "navigation_bar.public_timeline": "Föderierte Zeitleiste", "navigation_bar.security": "Sicherheit", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "und {count, plural, one {# andere Person} other {# andere Personen}}", "notification.favourite": "{name} hat deinen Beitrag favorisiert", "notification.follow": "{name} folgt dir", "notification.mention": "{name} hat dich erwähnt", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index db68f18c59..887952190e 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -1264,6 +1264,56 @@ ], "path": "app/javascript/mastodon/features/compose/index.json" }, + { + "descriptors": [ + { + "defaultMessage": "More", + "id": "status.more" + }, + { + "defaultMessage": "View conversation", + "id": "conversation.open" + }, + { + "defaultMessage": "Reply", + "id": "status.reply" + }, + { + "defaultMessage": "Mark as read", + "id": "conversation.mark_as_read" + }, + { + "defaultMessage": "Delete conversation", + "id": "conversation.delete" + }, + { + "defaultMessage": "Mute conversation", + "id": "status.mute_conversation" + }, + { + "defaultMessage": "Unmute conversation", + "id": "status.unmute_conversation" + }, + { + "defaultMessage": "With {names}", + "id": "conversation.with" + } + ], + "path": "app/javascript/mastodon/features/direct_timeline/components/conversation.json" + }, + { + "descriptors": [ + { + "defaultMessage": "Reply", + "id": "confirmations.reply.confirm" + }, + { + "defaultMessage": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "id": "confirmations.reply.message" + } + ], + "path": "app/javascript/mastodon/features/direct_timeline/containers/conversation_container.json" + }, { "descriptors": [ { diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index bdd1da36cf..ffbdefaebd 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.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,6 +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}", "directory.federated": "Από το γνωστό fediverse", "directory.local": "Μόνο από {domain}", "directory.new_arrivals": "Νέες αφίξεις", @@ -170,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, one {# μέρα} other {# μέρες}}", "intervals.full.hours": "{number, plural, one {# ώρα} other {# ώρες}}", "intervals.full.minutes": "{number, plural, one {# λεπτό} other {# λεπτά}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Προτιμήσεις", "navigation_bar.public_timeline": "Ομοσπονδιακή ροή", "navigation_bar.security": "Ασφάλεια", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "και {count, plural, one {# άλλη} other {# άλλες}}", "notification.favourite": "Ο/Η {name} σημείωσε ως αγαπημένη την κατάστασή σου", "notification.follow": "Ο/Η {name} σε ακολούθησε", "notification.mention": "Ο/Η {name} σε ανέφερε", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index e959e51887..0b95118003 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "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", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 31750050e0..2d7fcd19bc 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Respondi nun anstataŭigos la mesaĝon, kiun vi nun skribas. Ĉu vi certas, ke vi volas daŭrigi?", "confirmations.unfollow.confirm": "Ne plu sekvi", "confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "El konata fediverso", "directory.local": "Nur de {domain}", "directory.new_arrivals": "Novaj veniĝoj", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index a033f6e1fc..33ee263371 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Desde el fediverso conocido", "directory.local": "Sólo de {domain}", "directory.new_arrivals": "Recién llegados", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 1d1dfd35ab..7a7f6bec27 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Kohene vastamine kirjutab üle sõnumi, mida hetkel koostad. Oled kindel, et soovid jätkata?", "confirmations.unfollow.confirm": "Ära jälgi", "confirmations.unfollow.message": "Oled kindel, et ei soovi jälgida {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index f1fc17fdd6..5ec03c3bab 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Orain erantzuteak idazten ari zaren mezua gainidatziko du. Ziur jarraitu nahi duzula?", "confirmations.unfollow.confirm": "Utzi jarraitzeari", "confirmations.unfollow.message": "Ziur {name} jarraitzeari utzi nahi diozula?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Fedibertso ezagunekoak", "directory.local": "{domain} domeinukoak soilik", "directory.new_arrivals": "Iritsi berriak", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 9382ec5ee0..c4bcf21ef1 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -111,6 +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}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 01b5edad1b..ff11915c39 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa tällä hetkellä työstämäsi viestin. Oletko varma, että haluat jatkaa?", "confirmations.unfollow.confirm": "Lakkaa seuraamasta", "confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta käyttäjää {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 7cfe9829ad..59c9ce8003 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -63,7 +63,7 @@ "column.notifications": "Notifications", "column.pins": "Pouets épinglés", "column.public": "Fil public global", - "column.status": "Toot", + "column.status": "Pouet", "column_back_button.label": "Retour", "column_header.hide_settings": "Masquer les paramètres", "column_header.moveLeft_settings": "Déplacer la colonne vers la gauche", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Répondre maintenant écrasera le message que vous êtes en train de composer. Voulez-vous vraiment continuer ?", "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous arrêter de suivre {name} ?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "De la fédiverse connue", "directory.local": "De {domain} seulement", "directory.new_arrivals": "Nouveaux arrivants", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Basique", "home.column_settings.show_reblogs": "Afficher les partages", "home.column_settings.show_replies": "Afficher les réponses", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Mettre à jour en temps réel", "intervals.full.days": "{number, plural, one {# jour} other {# jours}}", "intervals.full.hours": "{number, plural, one {# heure} other {# heures}}", "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Préférences", "navigation_bar.public_timeline": "Fil public global", "navigation_bar.security": "Sécurité", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "et {count, plural, one {# autre} other {# autres}}", "notification.favourite": "{name} a ajouté à ses favoris :", "notification.follow": "{name} vous suit", "notification.mention": "{name} vous a mentionné :", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 0967ef424b..560fa3bca0 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -1 +1,418 @@ -{} +{ + "account.add_or_remove_from_list": "Add or Remove from lists", + "account.badges.bot": "Bot", + "account.block": "Block @{name}", + "account.block_domain": "Hide everything from {domain}", + "account.blocked": "Blocked", + "account.cancel_follow_request": "Cancel follow request", + "account.direct": "Direct message @{name}", + "account.domain_blocked": "Domain hidden", + "account.edit_profile": "Edit profile", + "account.endorse": "Feature on profile", + "account.follow": "Follow", + "account.followers": "Followers", + "account.followers.empty": "No one follows this user yet.", + "account.follows": "Follows", + "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows_you": "Follows you", + "account.hide_reblogs": "Hide boosts from @{name}", + "account.last_status": "Last active", + "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.media": "Media", + "account.mention": "Mention @{name}", + "account.moved_to": "{name} has moved to:", + "account.mute": "Mute @{name}", + "account.mute_notifications": "Mute notifications from @{name}", + "account.muted": "Muted", + "account.never_active": "Never", + "account.posts": "Toots", + "account.posts_with_replies": "Toots and replies", + "account.report": "Report @{name}", + "account.requested": "Awaiting approval", + "account.share": "Share @{name}'s profile", + "account.show_reblogs": "Show boosts from @{name}", + "account.unblock": "Unblock @{name}", + "account.unblock_domain": "Unhide {domain}", + "account.unendorse": "Don't feature on profile", + "account.unfollow": "Unfollow", + "account.unmute": "Unmute @{name}", + "account.unmute_notifications": "Unmute notifications from @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", + "alert.unexpected.message": "An unexpected error occurred.", + "alert.unexpected.title": "Oops!", + "autosuggest_hashtag.per_week": "{count} per week", + "boost_modal.combo": "You can press {combo} to skip this next time", + "bundle_column_error.body": "Something went wrong while loading this component.", + "bundle_column_error.retry": "Try again", + "bundle_column_error.title": "Network error", + "bundle_modal_error.close": "Close", + "bundle_modal_error.message": "Something went wrong while loading this component.", + "bundle_modal_error.retry": "Try again", + "column.blocks": "Blocked users", + "column.community": "Local timeline", + "column.direct": "Direct messages", + "column.directory": "Browse profiles", + "column.domain_blocks": "Hidden domains", + "column.favourites": "Favourites", + "column.follow_requests": "Follow requests", + "column.home": "Home", + "column.lists": "Lists", + "column.mutes": "Muted users", + "column.notifications": "Notifications", + "column.pins": "Pinned toot", + "column.public": "Federated timeline", + "column.status": "Toot", + "column_back_button.label": "Back", + "column_header.hide_settings": "Hide settings", + "column_header.moveLeft_settings": "Move column to the left", + "column_header.moveRight_settings": "Move column to the right", + "column_header.pin": "Pin", + "column_header.show_settings": "Show settings", + "column_header.unpin": "Unpin", + "column_subheading.settings": "Settings", + "community.column_settings.media_only": "Media only", + "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.", + "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", + "compose_form.lock_disclaimer.lock": "locked", + "compose_form.placeholder": "What is on your mind?", + "compose_form.poll.add_option": "Add a choice", + "compose_form.poll.duration": "Poll duration", + "compose_form.poll.option_placeholder": "Choice {number}", + "compose_form.poll.remove_option": "Remove this choice", + "compose_form.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive.hide": "Mark media as sensitive", + "compose_form.sensitive.marked": "Media is marked as sensitive", + "compose_form.sensitive.unmarked": "Media is not marked as sensitive", + "compose_form.spoiler.marked": "Text is hidden behind warning", + "compose_form.spoiler.unmarked": "Text is not hidden", + "compose_form.spoiler_placeholder": "Write your warning here", + "confirmation_modal.cancel": "Cancel", + "confirmations.block.block_and_report": "Block & Report", + "confirmations.block.confirm": "Block", + "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.delete.confirm": "Delete", + "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.mute.confirm": "Mute", + "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "confirmations.unfollow.confirm": "Unfollow", + "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "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", + "embed.instructions": "Embed this status on your website by copying the code below.", + "embed.preview": "Here is what it will look like:", + "emoji_button.activity": "Activity", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flags", + "emoji_button.food": "Food & Drink", + "emoji_button.label": "Insert emoji", + "emoji_button.nature": "Nature", + "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Objects", + "emoji_button.people": "People", + "emoji_button.recent": "Frequently used", + "emoji_button.search": "Search...", + "emoji_button.search_results": "Search results", + "emoji_button.symbols": "Symbols", + "emoji_button.travel": "Travel & Places", + "empty_column.account_timeline": "No toots here!", + "empty_column.account_unavailable": "Profile unavailable", + "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.domain_blocks": "There are no hidden domains yet.", + "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", + "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", + "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home.public_timeline": "the public timeline", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", + "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other 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": "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": "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": "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": "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": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Cancel", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "report.hint": "The report will be sent to your 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": "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": "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/gl.json b/app/javascript/mastodon/locales/gl.json index 3cc44f43ee..be1b23870d 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Respostando agora sobreescribirá a mensaxe que está a compoñer. Segura de querer proceder?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Quere deixar de seguir a {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Desde o fediverso coñecido", "directory.local": "Só desde {domain}", "directory.new_arrivals": "Novas achegas", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar repeticións", "home.column_settings.show_replies": "Mostrar respostas", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Actualizar en tempo 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}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Preferencias", "navigation_bar.public_timeline": "Liña temporal federada", "navigation_bar.security": "Seguridade", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "e {count, plural, one {# outro} other {# outros}}", "notification.favourite": "{name} marcou como favorito o seu estado", "notification.follow": "{name} está a seguila", "notification.mention": "{name} mencionoute", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index b6cc3e6ce1..7d1ec33aa5 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index e2d1eb49d1..79b918f9d4 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "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", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 6daabc6940..9a95995e37 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "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", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index f5a02065bf..2ab06c6e72 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -111,6 +111,10 @@ "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", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 1484c76df2..52588f089b 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index c9e48a1a6f..23cca64f75 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Membalas sekarang akan menimpa pesan yang sedang Anda buat. Anda yakin ingin melanjutkan?", "confirmations.unfollow.confirm": "Berhenti mengikuti", "confirmations.unfollow.message": "Apakah anda ingin berhenti mengikuti {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 6c1b7fa8ba..a38730c60e 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "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", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index dc43bcb5cc..d21dd88b1f 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Se rispondi ora, il messaggio che stai componendo sarà sovrascritto. Sei sicuro di voler continuare?", "confirmations.unfollow.confirm": "Smetti di seguire", "confirmations.unfollow.message": "Sei sicuro che non vuoi più seguire {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 4fb34e772e..e665a9f18d 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -111,6 +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}", "directory.federated": "既知の連合全体", "directory.local": "{domain} のみ", "directory.new_arrivals": "新着順", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index e2a6ee6c63..d70cf0ed27 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index a07302f0a4..e38aac621b 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -111,6 +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}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 3ec9a8a164..6f05969278 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.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,6 +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}", "directory.federated": "알려진 연합우주로부터", "directory.local": "{domain}에서만", "directory.new_arrivals": "새로운 사람들", @@ -170,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} 일", "intervals.full.hours": "{number} 시간", "intervals.full.minutes": "{number} 분", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "사용자 설정", "navigation_bar.public_timeline": "연합 타임라인", "navigation_bar.security": "보안", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "그리고 {count}개의 기타 항목", "notification.favourite": "{name}님이 즐겨찾기 했습니다", "notification.follow": "{name}님이 나를 팔로우 했습니다", "notification.mention": "{name}님이 답글을 보냈습니다", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 2de037f16c..560fa3bca0 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "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", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 8d281c9d5b..031f758e6c 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Atbildot tagad tava ziņa ko šobrīd raksti tiks pārrakstīta. Vai tiešām vēlies turpināt?", "confirmations.unfollow.confirm": "Nesekot", "confirmations.unfollow.message": "Vai tiešam vairs nevēlies sekot lietotājam {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 9bd5eef721..e2bf6e1d21 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "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", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 73e7b39050..cd09acfb45 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -16,7 +16,7 @@ "account.follows.empty": "Deze gebruiker volgt nog niemand.", "account.follows_you": "Volgt jou", "account.hide_reblogs": "Verberg boosts van @{name}", - "account.last_status": "Last active", + "account.last_status": "Laatst actief", "account.link_verified_on": "Eigendom van deze link is gecontroleerd op {date}", "account.locked_info": "De privacystatus van dit account is op besloten gezet. De eigenaar bepaalt handmatig wie hen kan volgen.", "account.media": "Media", @@ -25,7 +25,7 @@ "account.mute": "Negeer @{name}", "account.mute_notifications": "Negeer meldingen van @{name}", "account.muted": "Genegeerd", - "account.never_active": "Never", + "account.never_active": "Nooit", "account.posts": "Toots", "account.posts_with_replies": "Toots en reacties", "account.report": "Rapporteer @{name}", @@ -38,8 +38,8 @@ "account.unfollow": "Ontvolgen", "account.unmute": "@{name} niet langer negeren", "account.unmute_notifications": "@{name} meldingen niet langer negeren", - "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", - "alert.rate_limited.title": "Rate limited", + "alert.rate_limited.message": "Probeer het nog een keer na {retry_time, time, medium}.", + "alert.rate_limited.title": "Beperkt te gebruiken", "alert.unexpected.message": "Er deed zich een onverwachte fout voor", "alert.unexpected.title": "Oeps!", "autosuggest_hashtag.per_week": "{count} per week", @@ -53,7 +53,7 @@ "column.blocks": "Geblokkeerde gebruikers", "column.community": "Lokale tijdlijn", "column.direct": "Directe berichten", - "column.directory": "Browse profiles", + "column.directory": "Gebruikersgids", "column.domain_blocks": "Genegeerde servers", "column.favourites": "Favorieten", "column.follow_requests": "Volgverzoeken", @@ -101,8 +101,8 @@ "confirmations.delete_list.message": "Weet je zeker dat je deze lijst definitief wilt verwijderen?", "confirmations.domain_block.confirm": "Verberg alles van deze server", "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je zult geen toots van deze server op openbare tijdlijnen zien of in jouw meldingen. Jouw volgers van deze server worden verwijderd.", - "confirmations.logout.confirm": "Log out", - "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.confirm": "Uitloggen", + "confirmations.logout.message": "Weet je zeker dat je wilt uitloggen?", "confirmations.mute.confirm": "Negeren", "confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?", "confirmations.redraft.confirm": "Verwijderen en herschrijven", @@ -111,10 +111,14 @@ "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?", - "directory.federated": "From known fediverse", - "directory.local": "From {domain} only", - "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", + "directory.federated": "Fediverse (wat bekend is)", + "directory.local": "Alleen {domain}", + "directory.new_arrivals": "Nieuwe accounts", + "directory.recently_active": "Onlangs actief", "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.", "embed.preview": "Zo komt het eruit te zien:", "emoji_button.activity": "Activiteiten", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Algemeen", "home.column_settings.show_reblogs": "Boosts tonen", "home.column_settings.show_replies": "Reacties tonen", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "In realtime bijwerken", "intervals.full.days": "{number, plural, one {# dag} other {# dagen}}", "intervals.full.hours": "{number, plural, one {# uur} other {# uur}}", "intervals.full.minutes": "{number, plural, one {# minuut} other {# minuten}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Instellingen", "navigation_bar.public_timeline": "Globale tijdlijn", "navigation_bar.security": "Beveiliging", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "en {count, plural, one {# meer} other {# meer}}", "notification.favourite": "{name} voegde jouw toot als favoriet toe", "notification.follow": "{name} volgt jou nu", "notification.mention": "{name} vermeldde jou", @@ -369,7 +373,7 @@ "status.show_more": "Meer tonen", "status.show_more_all": "Alles meer tonen", "status.show_thread": "Gesprek tonen", - "status.uncached_media_warning": "Not available", + "status.uncached_media_warning": "Niet beschikbaar", "status.unmute_conversation": "Gesprek niet langer negeren", "status.unpin": "Van profielpagina losmaken", "suggestions.dismiss": "Voorstel verwerpen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index dda4024940..a98fd9522d 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -77,11 +77,11 @@ "compose_form.direct_message_warning_learn_more": "Lær meir", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", - "compose_form.lock_disclaimer.lock": "locked", - "compose_form.placeholder": "What is on your mind?", - "compose_form.poll.add_option": "Add a choice", - "compose_form.poll.duration": "Poll duration", - "compose_form.poll.option_placeholder": "Choice {number}", + "compose_form.lock_disclaimer.lock": "låst", + "compose_form.placeholder": "Kva har du på hjartet?", + "compose_form.poll.add_option": "Legg til eit punkt", + "compose_form.poll.duration": "Varigheit for spørring", + "compose_form.poll.option_placeholder": "Val {number}", "compose_form.poll.remove_option": "Remove this choice", "compose_form.publish": "Toot", "compose_form.publish_loud": "{publish}!", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "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", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 8fc722037c..82794684b0 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Slutt å følge", "confirmations.unfollow.message": "Er du sikker på at du vil slutte å følge {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index d5abe89fb9..38f3f82c14 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -4,7 +4,7 @@ "account.block": "Blocar @{name}", "account.block_domain": "Tot amagar del domeni {domain}", "account.blocked": "Blocat", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Anullar la demanda de seguiment", "account.direct": "Escriure un MP a @{name}", "account.domain_blocked": "Domeni amagat", "account.edit_profile": "Modificar lo perfil", @@ -16,7 +16,7 @@ "account.follows.empty": "Aqueste utilizaire sèc pas degun pel moment.", "account.follows_you": "Vos sèc", "account.hide_reblogs": "Rescondre los partatges de @{name}", - "account.last_status": "Last active", + "account.last_status": "Darrièra activitat", "account.link_verified_on": "La proprietat d’aqueste ligam foguèt verificada lo {date}", "account.locked_info": "L’estatut de privacitat del compte es configurat sus clavat. Lo proprietari causís qual pòt sègre son compte.", "account.media": "Mèdias", @@ -25,7 +25,7 @@ "account.mute": "Rescondre @{name}", "account.mute_notifications": "Rescondre las notificacions de @{name}", "account.muted": "Mes en silenci", - "account.never_active": "Never", + "account.never_active": "Jamai", "account.posts": "Tuts", "account.posts_with_replies": "Tuts e responsas", "account.report": "Senhalar @{name}", @@ -38,11 +38,11 @@ "account.unfollow": "Quitar de sègre", "account.unmute": "Quitar de rescondre @{name}", "account.unmute_notifications": "Mostrar las notificacions de @{name}", - "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", - "alert.rate_limited.title": "Rate limited", + "alert.rate_limited.message": "Mercés de tornar ensajar aprèp {retry_time, time, medium}.", + "alert.rate_limited.title": "Taus limitat", "alert.unexpected.message": "Una error s’es producha.", "alert.unexpected.title": "Ops !", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} per setmana", "boost_modal.combo": "Podètz botar {combo} per passar aquò lo còp que ven", "bundle_column_error.body": "Quicòm a fach mèuca pendent lo cargament d’aqueste compausant.", "bundle_column_error.retry": "Tornar ensajar", @@ -53,7 +53,7 @@ "column.blocks": "Personas blocadas", "column.community": "Flux public local", "column.direct": "Messatges dirèctes", - "column.directory": "Browse profiles", + "column.directory": "Percórrer los perfils", "column.domain_blocks": "Domenis resconduts", "column.favourites": "Favorits", "column.follow_requests": "Demandas d’abonament", @@ -63,7 +63,7 @@ "column.notifications": "Notificacions", "column.pins": "Tuts penjats", "column.public": "Flux public global", - "column.status": "Toot", + "column.status": "Tut", "column_back_button.label": "Tornar", "column_header.hide_settings": "Amagar los paramètres", "column_header.moveLeft_settings": "Desplaçar la colomna a man drecha", @@ -101,8 +101,8 @@ "confirmations.delete_list.message": "Volètz vertadièrament suprimir aquesta lista per totjorn ?", "confirmations.domain_block.confirm": "Amagar tot lo domeni", "confirmations.domain_block.message": "Volètz vertadièrament blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.\nVeiretz pas cap de contengut d’aquel domeni dins cap de flux public o dins vòstras notificacions. Vòstres seguidors d’aquel domeni seràn levats.", - "confirmations.logout.confirm": "Log out", - "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.confirm": "Desconnexion", + "confirmations.logout.message": "Volètz vertadièrament vos desconnectar ?", "confirmations.mute.confirm": "Rescondre", "confirmations.mute.message": "Volètz vertadièrament rescondre {name} ?", "confirmations.redraft.confirm": "Escafar & tornar formular", @@ -111,10 +111,14 @@ "confirmations.reply.message": "Respondre remplaçarà lo messatge que sètz a escriure. Volètz vertadièrament contunhar ?", "confirmations.unfollow.confirm": "Quitar de sègre", "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?", - "directory.federated": "From known fediverse", - "directory.local": "From {domain} only", - "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", + "directory.federated": "Del fediverse conegut", + "directory.local": "Solament de {domain}", + "directory.new_arrivals": "Nòus-venguts", + "directory.recently_active": "Actius fa res", "embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.", "embed.preview": "Semblarà aquò :", "emoji_button.activity": "Activitats", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Mostrar los partatges", "home.column_settings.show_replies": "Mostrar las responsas", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Actualizacion en dirècte", "intervals.full.days": "{number, plural, one {# jorn} other {# jorns}}", "intervals.full.hours": "{number, plural, one {# ora} other {# oras}}", "intervals.full.minutes": "{number, plural, one {# minuta} other {# minutas}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Preferéncias", "navigation_bar.public_timeline": "Flux public global", "navigation_bar.security": "Seguretat", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "e {count, plural, un {# autre} other {# autres}}", "notification.favourite": "{name} a ajustat a sos favorits", "notification.follow": "{name} vos sèc", "notification.mention": "{name} vos a mencionat", @@ -369,7 +373,7 @@ "status.show_more": "Desplegar", "status.show_more_all": "Los desplegar totes", "status.show_thread": "Mostrar lo fil", - "status.uncached_media_warning": "Not available", + "status.uncached_media_warning": "Pas disponible", "status.unmute_conversation": "Tornar mostrar la conversacion", "status.unpin": "Tirar del perfil", "suggestions.dismiss": "Regetar la suggestion", @@ -385,22 +389,22 @@ "time_remaining.moments": "Moments restants", "time_remaining.seconds": "demòra{number, plural, one { # segonda} other {n # segondas}}", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} ne charra other {people}} ne charran", - "trends.trending_now": "Trending now", + "trends.trending_now": "Tendéncia del moment", "ui.beforeunload": "Vòstre brolhon serà perdut se quitatz Mastodon.", "upload_area.title": "Lisatz e depausatz per mandar", "upload_button.label": "Ajustar un mèdia (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "Talha maximum pels mandadís subrepassada.", "upload_error.poll": "Lo mandadís de fichièr es pas autorizat pels sondatges.", "upload_form.description": "Descripcion pels mal vesents", - "upload_form.edit": "Edit", + "upload_form.edit": "Modificar", "upload_form.undo": "Suprimir", - "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.analyzing_picture": "Analisi de l’imatge…", + "upload_modal.apply": "Aplicar", + "upload_modal.description_placeholder": "Lo dròlle bilingüe manja un yaourt de ròcs exagonals e kiwis verds farà un an mai", + "upload_modal.detect_text": "Detectar lo tèxt de l’imatge", + "upload_modal.edit_media": "Modificar lo mèdia", "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": "Apercebut ({ratio})", "upload_progress.label": "Mandadís…", "video.close": "Tampar la vidèo", "video.exit_fullscreen": "Sortir plen ecran", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 62f75e3c22..9aca1d27f2 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "W ten sposób utracisz wpis który obecnie tworzysz. Czy na pewno chcesz to zrobić?", "confirmations.unfollow.confirm": "Przestań śledzić", "confirmations.unfollow.message": "Czy na pewno zamierzasz przestać śledzić {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index debf9e6f6c..1ee44c283c 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Responder agora vai sobrescrever a mensagem que você está compondo. Você tem certeza que quer continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index feba8fd9a6..4b1e11aa42 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Responder agora irá reescrever a mensagem que estás a compor actualmente. Tens a certeza que queres continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "De certeza que queres deixar de seguir {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 038b8ddd45..6f5c572500 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Răspunzând la asta acum, mesajul pe care îl compui în prezent se va șterge. Ești sigur că vrei să continui?", "confirmations.unfollow.confirm": "Nu mai urmări", "confirmations.unfollow.message": "Ești sigur că nu mai vrei să îl urmărești pe {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 69bd5a422c..eb2d91725b 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -111,6 +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}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 89a472d891..1e944768f7 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -63,7 +63,7 @@ "column.notifications": "Oboznámenia", "column.pins": "Pripnuté príspevky", "column.public": "Federovaná časová os", - "column.status": "Toot", + "column.status": "Príspevok", "column_back_button.label": "Späť", "column_header.hide_settings": "Skryť nastavenia", "column_header.moveLeft_settings": "Presuň stĺpec doľava", @@ -111,6 +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}", "directory.federated": "Zo známého fedivesmíru", "directory.local": "Iba z {domain}", "directory.new_arrivals": "Nové príchody", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Základné", "home.column_settings.show_reblogs": "Zobraziť povýšené", "home.column_settings.show_replies": "Ukázať odpovede", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Aktualizuj v reálnom čase", "intervals.full.days": "{number, plural, one {# deň} few {# dní} many {# dní} other {# dní}}", "intervals.full.hours": "{number, plural, one {# hodina} few {# hodín} many {# hodín} other {# hodín}}", "intervals.full.minutes": "{number, plural, one {# minúta} few {# minút} many {# minút} other {# minút}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Voľby", "navigation_bar.public_timeline": "Federovaná časová os", "navigation_bar.security": "Zabezbečenie", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "a {count, plural,one {# ostatné} other {# ostatných}}", "notification.favourite": "{name} si obľúbil/a tvoj príspevok", "notification.follow": "{name} ťa začal/a následovať", "notification.mention": "{name} ťa spomenul/a", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index d7d78c41cf..9999dcd8b9 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Odgovarjanje bo prepisalo sporočilo, ki ga trenutno sestavljate. Ali ste prepričani, da želite nadaljevati?", "confirmations.unfollow.confirm": "Prenehaj slediti", "confirmations.unfollow.message": "Ali ste prepričani, da ne želite več slediti {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 0f851051c2..9fe768173f 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Përgjigja tani do të shkaktojë mbishkrimin e mesazhit që po hartoni. Jeni i sigurt se doni të vazhdohet më tej?", "confirmations.unfollow.confirm": "Resht së ndjekuri", "confirmations.unfollow.message": "Jeni i sigurt se doni të mos ndiqet më {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index fb6a365cea..5232265e36 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Otprati", "confirmations.unfollow.message": "Da li ste sigurni da želite da otpratite korisnika {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 064934f545..cc8d9d89ca 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index f666a4b6ee..3c3c62f3a2 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Om du svarar nu kommer det att ersätta meddelandet du håller på att skriva. Är du säker på att du vill fortsätta?", "confirmations.unfollow.confirm": "Sluta följa", "confirmations.unfollow.message": "Är du säker på att du vill sluta följa {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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 3caf301d08..fb51b46b4d 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -111,6 +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}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 5827dbb3a8..5af35a04dc 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -111,6 +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}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 33eb315f1e..d7a4da197a 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -111,6 +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}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 2c4d820de5..772b55ee18 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Şimdi yanıtlarken o an oluşturduğunuz mesajın üzerine yazılır. Devam etmek istediğinize emin misiniz?", "confirmations.unfollow.confirm": "Takibi kaldır", "confirmations.unfollow.message": "{name}'yi takipten çıkarmak istediğinizden emin misiniz?", + "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": "Yalnızca {domain} adresinden", "directory.new_arrivals": "Yeni gelenler", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 6ccb20fc69..515ffdd83e 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -111,6 +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}", "directory.federated": "З відомого федесвіту", "directory.local": "Тільки з домену {domain}", "directory.new_arrivals": "Нові надходження", diff --git a/app/javascript/mastodon/locales/whitelist_ga.json b/app/javascript/mastodon/locales/whitelist_ga.json new file mode 100644 index 0000000000..0d4f101c7a --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_ga.json @@ -0,0 +1,2 @@ +[ +] diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 2f0373d93c..28f35313c1 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -111,6 +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}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 0a42aa47f7..845c2c9564 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "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", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 82d7b6db58..8cb6017867 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -111,6 +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}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/config/locales/activerecord.br.yml b/config/locales/activerecord.br.yml index c7677c850c..77fc4f2a11 100644 --- a/config/locales/activerecord.br.yml +++ b/config/locales/activerecord.br.yml @@ -1 +1,13 @@ +--- br: + activerecord: + attributes: + poll: + expires_at: Deiziad termen + options: Dibaboù + errors: + models: + account: + attributes: + username: + invalid: nemet lizherennoù, niverennoù ha isbarrennigoù diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 45001e6fc2..e47bc6871f 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -17,9 +17,6 @@ ar: contact_unavailable: غير متوفر discover_users: اكتشف مستخدِمين documentation: الدليل - extended_description_html: | -

مكان جيد للقواعد

-

لم يتم بعد إدخال الوصف الطويل.

federation_hint_html: بواسطة حساب في %{instance} ستتمكن من تتبع أناس في أي خادم ماستدون وأكثر. generic_description: "%{domain} هو سيرفر من بين سيرفرات الشبكة" get_apps: جرّب تطبيقا على الموبايل @@ -605,11 +602,6 @@ ar: directory: سِجلّ الحسابات explanation: استكشف مستخدِمين آخرين حسب المواضيع التي تهمهم explore_mastodon: استكشف %{title} - domain_blocks: - domain: النطاق - severity: القوّة - silence: اكتم - suspension: علّقه domain_validator: invalid_domain: ليس بإسم نطاق صالح errors: @@ -741,9 +733,6 @@ ar: too_many: لا يمكن إرفاق أكثر من 4 ملفات migrations: acct: username@domain للحساب الجديد - currently_redirecting: 'تم تحويل رابط ملفك الشخصي إلى:' - proceed: حفظ - updated_msg: تم تحديث إعدادات ترحيل حسابك بنجاح! moderation: title: الإشراف notification_mailer: diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 72b87a6acb..ed8aef2354 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -8,9 +8,6 @@ ast: contact_missing: Nun s'afitó contact_unavailable: N/D documentation: Documentación - extended_description_html: | -

Un llugar bonu pa les regles

-

Entá nun se configuró la descripción estendida.

hosted_on: Mastodon ta agospiáu en %{domain} learn_more: Deprendi más source_code: Códigu fonte @@ -199,7 +196,6 @@ ast: too_many: Nun puen axuntase más de 4 ficheros migrations: acct: nome_usuariu@dominiu de la cuenta nueva - proceed: Guardar notification_mailer: digest: body: Equí hai un resume de los mensaxes que nun viesti dende la última visita'l %{since} diff --git a/config/locales/bn.yml b/config/locales/bn.yml index 5f05fe30e6..1da7aac53e 100644 --- a/config/locales/bn.yml +++ b/config/locales/bn.yml @@ -17,9 +17,6 @@ bn: contact_unavailable: প্রযোজ্য নয় discover_users: ব্যবহারকারীদের দেখুন documentation: ব্যবহারবিলি - extended_description_html: | -

নিয়মের জন্য উপযুক্ত জায়গা

-

বিস্তারিত বিবরণ এখনো যুক্ত করা হয়নি

federation_hint_html: "%{instance}তে একটা নিবন্ধন থাকলে আপনি যেকোনো মাস্টাডন বা এধরণের অন্যান্য সার্ভারের মানুষের সাথে যুক্ত হতে পারবেন ।" generic_description: নেটওয়ার্কের ভেতরে %{domain} একটি সার্ভার get_apps: মোবাইল এপ্প একটা ব্যবহার করতে পারেন diff --git a/config/locales/ca.yml b/config/locales/ca.yml index bfd7c514db..eb2bfc96d6 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -17,9 +17,6 @@ ca: contact_unavailable: N/D discover_users: Descobreix usuaris documentation: Documentació - extended_description_html: | -

Un bon lloc per les regles

-

Encara no s'ha configurat la descripció ampliada.

federation_hint_html: Amb un compte de %{instance} podràs seguir persones de qualsevol servidor Mastodon i altres. generic_description: "%{domain} és un servidor a la xarxa" get_apps: Prova una aplicació mòbil @@ -627,23 +624,6 @@ ca: directory: Directori de perfils explanation: Descobreix usuaris segons els seus interessos explore_mastodon: Explora %{title} - domain_blocks: - blocked_domains: Llistat dels dominis limitats i bloquejats - description: Aquesta és la llista de servidors que %{instance} limita o en rebutja la federació. - domain: Domini - media_block: Bloqueig multimèdia - no_domain_blocks: "(Sense bloquejos de domini)" - severity: Severitat - severity_legend: - media_block: Els fitxers multimèdia procedents del servidor no es poden recuperar, emmagatzemar ni mostrar a l'usuari. - silence: Es poden trobar comptes de servidors silenciats, seguits i amb interacció, però els seus tuts no apareixeran en les línies de temps públiques i les seves notificacions no arribaran als usuaris locals que no els segueixen. - suspension: No s’emmagatzema ni es mostra contingut de servidors en suspens, ni se’ls envia cap contingut. S'ignoren les interaccions dels servidors suspesos. - suspension_disclaimer: Els servidors suspesos poden ocasionalment recuperar contingut públic d’aquest servidor. - title: Severitats - show_rationale: Mostra el raonament - silence: Silenci - suspension: Suspensió - title: "%{instance} Llistat de les instàncies bloquejades" domain_validator: invalid_domain: no es un nom de domini vàlid errors: @@ -780,9 +760,6 @@ ca: too_many: No es poden adjuntar més de 4 fitxers migrations: acct: usuari@domini del nou compte - currently_redirecting: 'El teu perfil està configurat com a redirecció a:' - proceed: Desa - updated_msg: La configuració de la migració del compte s'ha actualitzat correctament! moderation: title: Moderació notification_mailer: diff --git a/config/locales/co.yml b/config/locales/co.yml index e91b1361f1..ac558e64ed 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -17,9 +17,6 @@ co: contact_unavailable: Micca dispunibule discover_users: Scopre utilizatori documentation: Ducumentazione - extended_description_html: | -

Una bona piazza per e regule

-

A descrizzione stesa ùn hè micca stata riempiuta.

federation_hint_html: Cù un contu nant'à %{instance} puderete siguità ghjente da tutti i servori Mastodon è ancu più d'altri. generic_description: "%{domain} hè un servore di a rete" get_apps: Pruvà un'applicazione di telefuninu @@ -521,6 +518,10 @@ co: context: Cuntestu directory: In l'annuariu in_directory: "%{count} in l'annuariu" + last_active: Ultima attività + most_popular: Più pupulari + most_recent: Più ricente + name: Hashtag review: Statutu di verificazione reviewed: Verificatu title: Hashtag @@ -617,6 +618,11 @@ co: return: Vede u prufile di l’utilizatore web: Andà à l’interfaccia web title: Siguità %{acct} + challenge: + confirm: Cuntinuvà + hint_html: "Astuzia: Ùn avemu micca da dumandavvi stu codice per l'ore chì vene." + invalid_password: Chjave d'accessu micca curretta + prompt: Cunfirmà a chjave d'accessu per cuntinuvà datetime: distance_in_words: about_x_hours: "%{count}o" @@ -632,7 +638,9 @@ co: x_months: "%{count}Me" x_seconds: "%{count}s" deletes: + challenge_not_passed: L'infurmazione entrata ùn era micca curretta confirm_password: Entrate a vostra chjave d’accessu attuale per verificà a vostra identità + confirm_username: Entrà u vostru cugnome per cunfirmà a prucedura proceed: Sguassà u contu success_msg: U vostru contu hè statu sguassatu warning: @@ -650,23 +658,6 @@ co: directory: Annuariu di i prufili explanation: Scopre utilizatori à partesi di i so centri d'interessu explore_mastodon: Scopre à %{title} - domain_blocks: - blocked_domains: Lista di dumini bluccati è limitati - description: Quessa ghjè a lista di i servori limitati da o cù quelli %{instance} righjetta a federazione. - domain: Duminiu - media_block: Blucchime di media - no_domain_blocks: "(Nisun blucchime di duminiu)" - severity: Severità - severity_legend: - media_block: I fugliali media chì venenu sa stu servore ùn saranu mai ricuperati, cunservati, o affissati à l'utilizatore. - silence: I conti nant'à i servori silenzati ponu esse trovi, siguitati è spartuti/favurizati, mà i statuti ùn saranu micca in e linee pubbliche, è l'utilizatori lucali ch'ùn sò micca abbunati à sti conti ùn anu micca da riceve e so nutificazione. - suspension: U cuntinutu da i servori suspesi ùn hè mai cunservatu o affissatu, è u cuntinutu di stu servore ùn li hè micca mandatu. L'interazzione da sti servori suspesi sò ignurate. - suspension_disclaimer: I servori suspesi ponu ognitantu ricuperà i cuntinuti pubblichi da stu servore. - title: Severità - show_rationale: Vede ragiò - silence: Silenziu - suspension: Suspensione - title: Lista di servori bluccati da %{instance} domain_validator: invalid_domain: ùn hè micca un nome di duminiu currettu errors: @@ -804,9 +795,6 @@ co: too_many: Ùn si pò micca aghjunghje più di 4 fugliali migrations: acct: cugnome@duminiu di u novu contu - currently_redirecting: 'U vostru prufile riindiriza tuttu versu à:' - proceed: Salvà - updated_msg: I paramettri di migrazione sò stati messi à ghjornu! moderation: title: Muderazione notification_mailer: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 569eb35d21..add1c78d50 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -17,9 +17,6 @@ cs: contact_unavailable: Neuvedeno discover_users: Objevujte uživatele documentation: Dokumentace - extended_description_html: | -

Dobré místo pro pravidla

-

Rozšířený popis ještě nebyl nastaven.

federation_hint_html: S účtem na %{instance} můžete sledovat lidi na jakémkoliv serveru Mastodon a jiných službách. generic_description: "%{domain} je jedním ze serverů v síti" get_apps: Vyzkoušejte mobilní aplikaci @@ -40,6 +37,13 @@ cs: status_count_before: Kteří napsali tagline: Sledujte své přátele a objevujte nové terms: Podmínky používání + unavailable_content: Nedostupný obsah + unavailable_content_description: + reason: 'Důvod:' + rejecting_media: Mediální soubory z tohoto serveru nebudou zpracovány a nebudou zobrazeny žádné náhledy. Pro prohlédnutí médií bude třeba manuálně přejít na druhý server. + silenced: Příspěvky z tohoto severu nebudou zobrazeni nikde kromě vašeho domovského proudu, v případě, že sledujete autora. + suspended: Nebudete moci sledovat nikoho z tohoto serveru, žádná data z něj nebudou zpracována či uložena a žádná data nebudou vyměněna mezi servery. + unavailable_content_html: Mastodon vám obvykle dovoluje prohlížet si obsah a komunikovat s uživateli z jakéhokoliv dalšího serveru ve fedivesmíru. Tohle jsou výjimky, které byly zavedeny na tomto konkrétním serveru. user_count_after: few: uživatelé many: uživatelů @@ -533,6 +537,10 @@ cs: context: Kontext directory: V adresáři in_directory: "%{count} v adresáři" + last_active: Naposledy aktivní + most_popular: Nejpopulárnější + most_recent: Nejnovější + name: Hashtag review: Stav schválení reviewed: Schválen title: Hashtagy @@ -558,6 +566,12 @@ cs: new_trending_tag: body: 'Hashtag #%{name} je dnes populární, nebyl však dříve schválen. Nebude zobrazen veřejně, pokud to nedovolíte. Můžete také pouze uložit formulář tak, jak je, a nikdy o něm opět neslyšet.' subject: Nový hashtag ke schválení na %{instance} (#%{name}) + aliases: + add_new: Vytvořit alias + created_msg: Nový alias byl úspěšně vytvořen. Nyní můžete zahájit přesun ze starého účtu. + deleted_msg: Alias byl úspěšně odstraněn. Přesun z tamtoho účtu na tento již nebude možný. + hint_html: Chcete-li se přesunout z jiného účtu na tento, můžete si zde vytvořit alias, který je vyžadován předtím, než můžete pokračovat přesunem sledujících ze starého účtu na tento. Tato akce sama o sobě je neškodná a vratná. Přesun účtu se zahajuje ze starého účtu. + remove: Odpojit alias appearance: advanced_web_interface: Pokročilé webové rozhraní advanced_web_interface_hint: 'Chcete-li využít celé šířky vaší obrazovky, dovolí vám pokročilé webové rozhraní nastavit si mnoho různých sloupců, takže můžete vidět ve stejnou chvíli tolik informací, kolik chcete: domovskou časovou osu, oznámení, federovanou časovou osu a libovolný počet seznamů a hashtagů.' @@ -617,6 +631,7 @@ cs: confirming: Čekám na dokončení potvrzení e-mailu. functional: Váš účet je zcela funkční. pending: Váš požadavek čeká na schválení naším personálem. To může nějakou dobu trvat. Pokud bude váš požadavek schválen, obdržíte e-mail. + redirecting_to: Váš účet je neaktivní, protože právě přesměrovává na účet %{acct}. trouble_logging_in: Problémy s přihlašováním? authorize_follow: already_following: Tento účet již sledujete @@ -629,6 +644,11 @@ cs: return: Zobrazit profil uživatele web: Přejít na web title: Sledovat uživatele %{acct} + challenge: + confirm: Pokračovat + hint_html: "Tip: Po dobu hodiny vás nebudeme znovu žádat o heslo." + invalid_password: Neplatné heslo + prompt: Pokračujte potvrzením hesla datetime: distance_in_words: about_x_hours: "%{count} hod" @@ -644,7 +664,9 @@ cs: x_months: "%{count} mesíců" x_seconds: "%{count} s" deletes: + challenge_not_passed: Informace, které jste zadal/a, nejsou správné confirm_password: Zadejte svoje současné heslo pro ověření vaší identity + confirm_username: Zadáním svého uživatelského jména potvrdíte proces proceed: Odstranit účet success_msg: Váš účet byl úspěšně odstraněn warning: @@ -662,23 +684,6 @@ cs: directory: Adresář profilů explanation: Objevujte uživatele podle jejich zájmů explore_mastodon: Prozkoumejte %{title} - domain_blocks: - blocked_domains: Seznam omezených a blokovaných domén - description: Tohle je seznam serverů, které server %{instance} omezuje nebo odmítá federaci. - domain: Doména - media_block: Blokace médií - no_domain_blocks: "(Žádné blokované domény)" - severity: Přísnost - severity_legend: - media_block: Mediální soubory přicházející ze serveru nejsou stahovány, ukládány ani zobrazovány uživatelům. - silence: Účty z utišených serverů lze nalézt, sledovat a interagovat s nimi, ale jejich tooty nebudou zobrazovány na veřejných časových osách a oznámení od nich se nedostanou k místním uživatelům, kteří je nesledují. - suspension: Z pozastavených serverů se neukládá ani nezobrazuje žádný obsah, ani se naně žádný obsah neposílá. Interakce z pozastavených serverů jsou ignorovány. - suspension_disclaimer: Pozastavené servery mohou občas stahovat veřejný obsah z tohoto serveru. - title: Přísnosti - show_rationale: Zobrazit odůvodnění - silence: Utišení - suspension: Pozastavení - title: "%{instance} Seznam blokovaných serverů" domain_validator: invalid_domain: není platné doménové jméno errors: @@ -819,10 +824,32 @@ cs: images_and_video: K tootu, který již obsahuje obrázky, nelze připojit video too_many: Nelze připojit více než 4 soubory migrations: - acct: přezdívka@doména nového účtu - currently_redirecting: 'Váš profil má nastaveno přesměrování na:' - proceed: Uložit - updated_msg: Vaše nastavení přesunutí účtu bylo úspěšně aktualizováno! + acct: Přesunuto na + cancel: Zrušit přesměrování + cancel_explanation: Zrušením přesměrování znovu aktivujete svůj aktuální účet, ale nevrátí se vám sledující, kteří byli přesměrováni na druhý účet. + cancelled_msg: Přesměrování bylo úspěšně zrušeno. + errors: + already_moved: je stejný účet, na který jste se již přesunul/a + missing_also_known_as: neodkazuje na tento účet + move_to_self: nemůže být aktuální účet + not_found: nemohl být nalezen + on_cooldown: Probíhá období odpočinku + followers_count: Sledující v době přesunu + incoming_migrations: Přesun z jiného účtu + incoming_migrations_html: Chcete-li se přesunout z jiného účtu na tento, potřebujete si nejprve vytvořit alias účtu. + moved_msg: Váš účet nyní přesměrovává na účet %{acct} a vaši sledující se na něj přesouvají. + not_redirecting: Váš účet aktuálně nepřesměrovává na žádný jiný účet. + on_cooldown: Nedávno jste přesunul/a svůj účet. Tato funkce bude opět dostupná za %{count} dní. + past_migrations: Předchozí přesuny + proceed_with_move: Přesunout sledující + redirecting_to: Váš účet přesměrovává na účet %{acct}. + warning: + backreference_required: Nový účet musí být nejprve nastaven, aby odkazoval zpátky na tento + before: 'Před pokračováním si prosím pečlivě přečtěte tyto poznámky:' + cooldown: Po přesunu nastane období odpočinku, kdy se nebudete moci opět přesunout + disabled_account: Váš aktuální účet nebude poté zcela použitelný. Budete však mít přístup k datovým exportům a budete ho moci znovu aktivovat. + followers: Touto akcí přesunete všechny sledující z aktuálního účtu na nový účet + other_data: Žádná další data nebudou přesunuta automaticky moderation: title: Moderování notification_mailer: @@ -971,6 +998,7 @@ cs: settings: account: Účet account_settings: Nastavení účtu + aliases: Aliasy účtů appearance: Vzhled authorized_apps: Autorizované aplikace back: Zpět na Mastodon @@ -982,7 +1010,7 @@ cs: identity_proofs: Důkazy identity import: Import import_and_export: Import a export - migrate: Přesunutí účtu + migrate: Přesun účtu notifications: Oznámení preferences: Předvolby profile: Profil diff --git a/config/locales/cy.yml b/config/locales/cy.yml index a58ea25349..ece0a34a3f 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -17,9 +17,6 @@ cy: contact_unavailable: Ddim yn berthnasol discover_users: Darganfod defnyddwyr documentation: Dogfennaeth - extended_description_html: | -

Lle da ar gyfer rheolau

-

Nid yw'r disgrifiad estynedig wedi ei osod eto.

federation_hint_html: Gyda cyfrif ar %{instance}, gallwch dilyn pobl ar unrhyw gweinydd Mastodon, a thu hwnt. generic_description: Mae %{domain} yn un gweinydd yn y rhwydwaith get_apps: Rhowch gynnig ar ap dyfeis symudol @@ -728,9 +725,6 @@ cy: too_many: Ni ellir ychwanegu mwy na 4 dogfen migrations: acct: enwdefnyddiwr@parth y cyfrif newydd - currently_redirecting: 'Mae eich proffil wedi ei osod i ailgyfeirio i:' - proceed: Cadw - updated_msg: Diweddarwyd gosodiad mudo eich cyfrif yn llwyddiannus! moderation: title: Goruwchwyliad notification_mailer: diff --git a/config/locales/da.yml b/config/locales/da.yml index 06a68f6841..85a5bbefd4 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -14,9 +14,6 @@ da: contact_unavailable: Ikke tilgængeligt discover_users: Opdag brugere documentation: Dokumentation - extended_description_html: | -

Et godt sted for regler

-

Den udvidede beskrivelse er endnu ikke blevet opsat.

generic_description: "%{domain} er en server i netværket" get_apps: Prøv en mobil app hosted_on: Mostodon hostet på %{domain} @@ -524,8 +521,6 @@ da: directories: directory: Profilliste explore_mastodon: Uforsk %{title} - domain_blocks: - domain: Domæne errors: '400': The request you submitted was invalid or malformed. '403': Du har ikke tilladelse til at se denne side. @@ -633,9 +628,6 @@ da: too_many: Kan ikke vedhæfte mere en 4 filer migrations: acct: username@domain af den nye konto - currently_redirecting: 'Din profil er sat til at henvise til:' - proceed: Gem - updated_msg: Dine konti migrærings indstillinger blev opdateret! moderation: title: Moderatering notification_mailer: diff --git a/config/locales/de.yml b/config/locales/de.yml index fb988668a5..785face331 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -17,9 +17,6 @@ de: contact_unavailable: Nicht verfügbar discover_users: Benutzer_innen entdecken documentation: Dokumentation - extended_description_html: | -

Ein hervorragender Ort für Regeln

-

Die erweiterte Beschreibung wurde von dem Administrator noch nicht eingestellt.

federation_hint_html: Mit einem Konto auf %{instance} wirst du in der Lage sein Nutzer_innen auf beliebigen Mastodon-Servern und darüber hinaus zu folgen. generic_description: "%{domain} ist ein Server im Fediversum" get_apps: Versuche eine mobile App @@ -38,6 +35,13 @@ de: status_count_before: mit tagline: Finde deine Freunde und entdecke neue terms: Nutzungsbedingungen + unavailable_content: Nicht verfügbarer Inhalt + unavailable_content_description: + reason: 'Grund:' + rejecting_media: Mediendateien dieses Servers werden nicht verarbeitet und keine Thumbnails werden angezeigt, was manuelles anklicken auf den anderen Server erfordert. + silenced: Beiträge von diesem Server werden nirgends angezeigt, außer in deiner Startseite, wenn du der Person folgst, die den Beitrag verfasst hat. + suspended: Du kannst niemanden von diesem Server folgen, und keine Daten werden verarbeitet oder gespeichert und keine Daten ausgetauscht. + unavailable_content_html: Mastodon erlaubt es dir generell, mit Inhalten zu interagieren, diese anzuzeigen und mit anderen Nutzern im Fediversum über Server hinweg zu interagieren. Dies sind die Ausnahmen, die auf diesem bestimmten Server gemacht wurden. user_count_after: one: Profil other: Profile @@ -521,6 +525,10 @@ de: context: Kontext directory: Im Verzeichnis in_directory: "%{count} im Verzeichnis" + last_active: Zuletzt aktiv + most_popular: Am beliebtesten + most_recent: Neuste + name: Hashtag review: Prüfstatus reviewed: Überprüft title: Hashtags @@ -546,6 +554,12 @@ de: new_trending_tag: body: 'Der Hashtag #%{name} ist heute am trenden, aber wurde vorher noch nicht überprüft. Er wird nicht öffentlich angezeigt, es sei denn du erlaubst es oder speicherst das Formular ab und vergisst es.' subject: Neuer Hashtag zur Überprüfung auf %{instance} verfügbar (#%{name}) + aliases: + add_new: Alias erstellen + created_msg: Ein neuer Alias wurde erfolgreich erstellt. Du kannst nun den Wechsel vom alten Konto starten. + deleted_msg: Der Alias wurde erfolgreich entfernt. Aus diesem Konto zu diesem zu verschieben ist nicht mehr möglich. + hint_html: Wenn du von einem Konto zu einem anderem Konto wechseln möchtest, dann kannst du einen Alias erstellen, welcher benötigt wird bevor du deine Folger_innen vom altem Account zu diesen migrierst. Die Aktion alleine ist harmlos und wi­der­ruf­lich. Die Kontenmigration wird vom altem Konto aus eingeleitet. + remove: Alle Aliase aufheben appearance: advanced_web_interface: Fortgeschrittene Benutzeroberfläche advanced_web_interface_hint: Wenn du mehr aus deiner Bildschirmbreite herausholen möchtest, erlaubt dir die fortgeschrittene Benutzeroberfläche viele unterschiedliche Spalten auf einmal zu sehen, wie z.B. deine Startseite, Benachrichtigungen, das gesamte bekannte Netz, deine Listen und beliebige Hashtags. @@ -605,6 +619,7 @@ de: confirming: Warte auf die Bestätigung der E-Mail. functional: Dein Konto ist voll funktionsfähig. pending: Deine Bewerbung wird von unseren Mitarbeitern noch überprüft. Dies kann einige Zeit dauern. Du erhältst eine E-Mail, wenn deine Bewerbung genehmigt wurde. + redirecting_to: Dein Konto ist inaktiv, da es derzeit zu %{acct} umgeleitet wird. trouble_logging_in: Schwierigkeiten beim Anmelden? authorize_follow: already_following: Du folgst diesem Konto bereits @@ -617,6 +632,11 @@ de: return: Zeige das Profil web: In der Benutzeroberfläche öffnen title: "%{acct} folgen" + challenge: + confirm: Fortfahren + hint_html: "Hinweis: Wir werden dich für die nächste Stunde nicht erneut nach deinem Passwort fragen." + invalid_password: Ungültiges Passwort + prompt: Gib dein Passwort ein um fortzufahren datetime: distance_in_words: about_x_hours: "%{count}h" @@ -632,7 +652,9 @@ de: x_months: "%{count}mo" x_seconds: "%{count}s" deletes: + challenge_not_passed: Die eingegebenen Informationen waren nicht korrekt confirm_password: Gib dein derzeitiges Passwort ein, um deine Identität zu bestätigen + confirm_username: Gib deinen Benutzernamen ein, um das Verfahren zu bestätigen proceed: Konto löschen success_msg: Dein Konto wurde erfolgreich gelöscht warning: @@ -650,23 +672,6 @@ de: directory: Profilverzeichnis explanation: Entdecke Benutzer_innen basierend auf deren Interessen explore_mastodon: Entdecke %{title} - domain_blocks: - blocked_domains: Liste der begrenzten und blockierten Domains - description: Dies ist die Liste der Server, die %{instance} limitiert oder dessen Föderation ablehnt. - domain: Domain - media_block: Medienblockade - no_domain_blocks: "(Keine Domain-Blockaden)" - severity: Schweregrad - severity_legend: - media_block: Mediendateien, die vom Server stammen, werden weder vom Benutzer abgerufen, gespeichert noch angezeigt. - silence: Konten von stummgeschalteten Servern können gefunden und gefolgt werden und man kann mit ihnen interagieren, aber ihre Beiträge werden nicht in der öffentlichen Zeitleiste erscheinen und Benachrichtigungen von ihnen werden nicht zu lokalen Benutzern gesendet, die sie nicht folgen. - suspension: Keine Inhalte von gesperrten Servern werden gespeichert oder angezeigt, und es werden auch keine Inhalte an sie gesendet. Die Interaktionen von gesperrten Servern werden ignoriert. - suspension_disclaimer: Gesperrte Server können gelegentlich öffentliche Inhalte von diesem Server abrufen. - title: Schweregrade - show_rationale: Rationale anzeigen - silence: Stummschalten - suspension: Sperre - title: "%{instance} Liste der blockierten Instanzen" domain_validator: invalid_domain: ist kein gültiger Domain-Name errors: @@ -804,9 +809,31 @@ de: too_many: Es können nicht mehr als 4 Dateien angehängt werden migrations: acct: benutzername@domain des neuen Kontos - currently_redirecting: 'Deine Profilweiterleitung wurde gesetzt auf:' - proceed: Speichern - updated_msg: Deine Konto-Migrationseinstellungen wurden erfolgreich aktualisiert! + cancel: Umleitung abbrechen + cancel_explanation: Das Abbrechen der Umleitung wird dein aktuelles Konto erneut aktivieren, aber keine Folger_innen, die auf dieses Konto verschoben wurden, zurückholen. + cancelled_msg: Die Umleitung wurde erfolgreich abgebrochen. + errors: + already_moved: ist das gleiche Konto, zu dem du bereits umgezogen bist + missing_also_known_as: referenziert nicht zurück auf dieses Konto + move_to_self: darf nicht das aktuelles Konto sein + not_found: kann nicht gefunden werden + on_cooldown: Die Abklingzeit läuft gerade + followers_count: Folger_innen zur Zeit des Verschiebens + incoming_migrations: Ziehe von einem anderen Konto um + incoming_migrations_html: Um von einem anderen Konto zu diesem zu wechseln, musst du zuerst einen Kontoalias erstellen. + moved_msg: Dein Konto wird jetzt zu %{acct} weitergeleitet und deine Folger_innen werden verschoben. + not_redirecting: Dein Konto wird derzeit nicht auf ein anderes Konto weitergeleitet. + on_cooldown: Du hast dein Konto vor kurzem migriert. Diese Funktion wird in %{count} Tagen wieder verfügbar sein. + past_migrations: Vorherige Migrationen + proceed_with_move: Folger_innen verschieben + redirecting_to: Dein Konto wird zu %{acct} weitergeleitet. + warning: + backreference_required: Das neue Konto muss zuerst so konfiguriert werden, dass es auf das alte Konto referenziert + before: 'Bevor du fortfährst, lese bitte diese Hinweise sorgfältig durch:' + cooldown: Nach dem Migrieren wird es eine Abklingzeit geben, in der du das Konto nicht noch einmal migrieren kannst + disabled_account: Dein aktuelles Konto wird nachher nicht vollständig nutzbar sein. Du hast jedoch Zugriff auf den Datenexport sowie die Reaktivierung. + followers: Diese Aktion wird alle Folger_innen vom aktuellen Konto auf das neue Konto verschieben + other_data: Keine anderen Daten werden automatisch verschoben moderation: title: Moderation notification_mailer: @@ -951,6 +978,7 @@ de: settings: account: Konto account_settings: Konto & Sicherheit + aliases: Kontoaliase appearance: Aussehen authorized_apps: Autorisierte Anwendungen back: Zurück zu Mastodon diff --git a/config/locales/devise.br.yml b/config/locales/devise.br.yml index c7677c850c..3fe043754f 100644 --- a/config/locales/devise.br.yml +++ b/config/locales/devise.br.yml @@ -1 +1,33 @@ +--- br: + devise: + failure: + inactive: N'eo ket gweredekaet ho kont c'hoazh. + invalid: "%{authentication_keys} pe ger-tremen diwiriek." + last_attempt: Un esae a chom deoc'h a-raok ma vefe prennet ho kont. + locked: Prennet eo ho kont. + not_found_in_database: "%{authentication_keys} pe ger-tremen diwiriek." + pending: O vezañ asantet eo ho kont. + mailer: + confirmation_instructions: + action: Gwiriekaat ar chomlec'h postel + action_with_app: Kadarnaat ha distroiñ da %{app} + title: Gwiriekaat ar chomlec'h postel + email_changed: + subject: 'Mastodoñ : Postel kemmet' + title: Chomlec'h postel nevez + password_change: + explanation: Kemmet eo bet ger-tremen ho kont. + subject: 'Mastodoñ : Ger-tremen kemmet' + title: Ger-tremen kemmet + reconfirmation_instructions: + explanation: Kadarnait ar chomlec'h nevez evit cheñch ho postel. + subject: 'Mastodoñ : Kadarnait ar postel evit %{instance}' + title: Gwiriekaat ar chomlec'h postel + reset_password_instructions: + action: Cheñch ar ger-tremen + explanation: Goulennet ho peus ur ger-tremen nevez evit ho kont. + passwords: + updated_not_active: Kemmet eo bet ho ker-tremen ent reizh. + registrations: + signed_up: Donemat ! Kevreet oc'h. diff --git a/config/locales/devise.co.yml b/config/locales/devise.co.yml index 16481737f1..c9511d14d1 100644 --- a/config/locales/devise.co.yml +++ b/config/locales/devise.co.yml @@ -46,6 +46,18 @@ co: extra: S’ellu ùn era micca voi, ignurate stu missaghju. A chjave d’accessu ùn cambiarà micca s’è voi ùn cliccate micca u ligame. subject: 'Mastodon: Cambià a chjave d’accessu' title: Cambià a chjave + two_factor_disabled: + explanation: L'autentificazione à dui fattori per u vostru contu hè stata disattivata. A cunnessione hè avà pussibule cù l'usu solu di u vostru e-mail è di a chjave d'accessu. + subject: 'Mastodon: Autentificazione à dui fattori disattivata' + title: A2F disattivata + two_factor_enabled: + explanation: L'autentificazione à dui fattori hè stata attivata per u vostru contu. Un codice, o fiscia, generata da l'applicazione TOTP assuciata sarà dumandata per cunnettavvi. + subject: 'Mastodon: Autentificazione à dui fattori attivata' + title: A2F attivata + two_factor_recovery_codes_changed: + explanation: I codici di ricuperazione pricidenti ùn sò più validi è un novu inseme di codici hè statu creatu. + subject: 'Mastodon: Rigenerazione di i codici à dui fattori di ricuperazione' + title: Cambiamentu di i codici di ricuperazione d'A2F unlock_instructions: subject: 'Mastodon: Riapre u contu' omniauth_callbacks: diff --git a/config/locales/devise.cs.yml b/config/locales/devise.cs.yml index 94c41ed986..d1b9fc09c6 100644 --- a/config/locales/devise.cs.yml +++ b/config/locales/devise.cs.yml @@ -46,6 +46,18 @@ cs: extra: Pokud jste tohle nevyžádal/a, prosím ignorujte tento e-mail. Vaše heslo nebude změněno, dokud nepřejdete na výše uvedenou adresu a nevytvoříte si nové. subject: 'Mastodon: Instrukce pro obnovení hesla' title: Obnovení hesla + two_factor_disabled: + explanation: Dvoufázové ověřování bylo pr váš účet zakázáno. Přihlašování je nyní možné pouze pomocí e-mailové adresy a hesla. + subject: 'Mastodon: Dvoufázové ověřování zakázáno' + title: 2FA zakázáno + two_factor_enabled: + explanation: Dvoufázové ověřování bylo pr váš účet povoleno. Pro přihlášení bude vyžadován token vygenerovaný spárovanou TOTP aplikací. + subject: 'Mastodon: Dvoufázové ověřování povoleno' + title: 2FA povoleno + two_factor_recovery_codes_changed: + explanation: Předchozí záložní kódy byly zrušeny a byly vygenerovány nové. + subject: 'Mastodon: Dvoufázové záložní kódy znovu vygenerovány' + title: Záložní kódy pro 2FA změněny unlock_instructions: subject: 'Mastodon: Instrukce pro odemčení účtu' omniauth_callbacks: diff --git a/config/locales/devise.de.yml b/config/locales/devise.de.yml index bd573dc3e9..372090515f 100644 --- a/config/locales/devise.de.yml +++ b/config/locales/devise.de.yml @@ -46,6 +46,18 @@ de: extra: Wenn du diese Anfrage nicht gestellt hast, solltest du diese E-Mail ignorieren. Dein Passwort wird sich nicht ändern solange du den obigen Link anklickst und ein neues erstellst. subject: 'Mastodon: Passwort zurücksetzen' title: Passwort zurücksetzen + two_factor_disabled: + explanation: Zwei-Faktor-Authentifizierung für dein Konto wurde deaktiviert. Login ist jetzt nur mit E-Mail-Adresse und Passwort möglich. + subject: 'Mastodon: Zwei‐Faktor‐Authentifizierung deaktiviert' + title: 2FA deaktiviert + two_factor_enabled: + explanation: Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Ein Token, der von der gepaarten TOTP-App generiert wird, wird für den Login benötigt. + subject: 'Mastodon: Zwei‐Faktor‐Authentifizierung aktiviert' + title: 2FA aktiviert + two_factor_recovery_codes_changed: + explanation: Die vorherigen Wiederherstellungscodes wurden ungültig gemacht und es wurden neue generiert. + subject: 'Mastodon: Zwei-Faktor-Wiederherstellungscodes neu generiert' + title: 2FA Wiederherstellungscodes geändert unlock_instructions: subject: 'Mastodon: Konto entsperren' omniauth_callbacks: diff --git a/config/locales/devise.el.yml b/config/locales/devise.el.yml index 0b5c686368..75f68c2814 100644 --- a/config/locales/devise.el.yml +++ b/config/locales/devise.el.yml @@ -46,6 +46,10 @@ el: extra: Αν δεν ζήτησες εσύ αυτή την αλλαγή, παρακαλούμε αγνόησε αυτό το email. Το συνθηματικό σου δεν θα αλλάξει μέχρι να επισκεφτείς τον παραπάνω σύνδεσμο και να δημιουργήσεις ένα καινούριο. subject: 'Mastodon: Οδηγίες επαναφοράς συνθηματικού' title: Επαναφορά συνθηματικού + two_factor_disabled: + explanation: Ο έλεγχος ταυτότητας δυο παραγόντων (2FA) έχει απενεργοποιηθεί για το λογαριασμό σου. Η σύνδεση γίνεται απλά με το email και το συνθηματικό. + subject: 'Mastodon: Απενεργοποιήθηκε ο έλεγχος ταυτότητας δύο παραγόντων' + title: Απενεργοποιημένο 2FA unlock_instructions: subject: 'Mastodon: Οδηγίες ξεκλειδώματος' omniauth_callbacks: diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml index 60a935a8a2..0ce335576b 100644 --- a/config/locales/devise.gl.yml +++ b/config/locales/devise.gl.yml @@ -46,6 +46,18 @@ gl: extra: Si non fixo esta solicitude, por favor ignore este correo. O seu contrasinal non cambiará ate que acceda a ligazón superior e cree unha nova. subject: 'Mastodon: Instruccións para restablecer o contrasinal' title: Restablecer contrasinal + two_factor_disabled: + explanation: Desactivouse o segundo factor de autenticación para túa conta. Agora xa podes conectarte utilizando só o correo-e e contrasinal. + subject: 'Mastodon: Autenticación con dobre factor desactivada' + title: 2FA desactivada + two_factor_enabled: + explanation: A autenticación con dobre factor foi activada para a túa conta. Pedirase o testemuño xerado pola aplicación TOTP emparellada. + subject: 'Mastodon: Activouse o dobre factor de autenticación' + title: 2FA activado + two_factor_recovery_codes_changed: + explanation: Os códigos de recuperación anteriores quedan anulados e os novos foron creados. + subject: 'Mastodon: Código de recuperación do dobre factor rexenerados' + title: Códigos de recuperación 2FA cambiados unlock_instructions: subject: 'Mastodon: Instruccións para desbloquear' omniauth_callbacks: diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml index 51a95403fd..3ab4d9f117 100644 --- a/config/locales/devise.nl.yml +++ b/config/locales/devise.nl.yml @@ -46,6 +46,18 @@ nl: extra: Wanneer jij dit niet hebt aangevraagd, mag je deze e-mail negeren. Jouw wachtwoord wordt pas gewijzigd nadat je de link hierboven hebt aangeklikt en een nieuw wachtwoord aanmaakt. subject: 'Mastodon: Wachtwoord opnieuw instellen' title: Wachtwoord opnieuw instellen + two_factor_disabled: + explanation: Tweestapsverificatie voor jouw account is uitgeschakeld. Je kunt nu alleen inloggen met een e-mailadres en wachtwoord. + subject: 'Mastodon: Tweestapsverificatie uitgeschakeld' + title: Tweestapsverificatie uitgeschakeld + two_factor_enabled: + explanation: Tweestapsverificatie voor jouw account is ingeschakeld. Om te kunnen aanmelden is een door een tweestapsverificatie-app genereerde aanmeldcode nodig. + subject: 'Mastodon: Tweestapsverificatie ingeschakeld' + title: Tweestapsverificatie ingeschakeld + two_factor_recovery_codes_changed: + explanation: De vorige herstelcodes zijn ongeldig gemaakt en nieuwe zijn aangemaakt. + subject: 'Mastodon: Tweestaps-herstelcodes zijn opnieuw aangemaakt' + title: Herstelcodes tweestapsverificatie veranderd unlock_instructions: subject: 'Mastodon: Instructies om opschorten account ongedaan te maken' omniauth_callbacks: diff --git a/config/locales/devise.oc.yml b/config/locales/devise.oc.yml index 42be33f6b5..0fb259429a 100644 --- a/config/locales/devise.oc.yml +++ b/config/locales/devise.oc.yml @@ -46,6 +46,18 @@ oc: extra: S’avètz pas res demandat, fasquètz pas cas a aqueste corrièl. Vòstre senhal cambiarà pas se clicatz pas lo ligam e que ne causissètz pas un novèl. subject: Mastodon : consignas per reïnicializar lo senhal title: Reïnicializacion del senhal + two_factor_disabled: + explanation: L’autentificacion dos factors per vòstre compte es estada desactivada. La connexion es ara possibla solament amb l’adreça electronica e lo senhal. + subject: 'Mastodon : autentificacion dos factors desactivada' + title: 2FA desactivat + two_factor_enabled: + explanation: L’autentificacion dos factors es estada activada per vòstre compte. La connexion demandarà un geton generat per l’aplicacion TOTP associada. + subject: 'Mastodon : autentificacion dos factor activada' + title: 2FA activat + two_factor_recovery_codes_changed: + explanation: Los còdis de recuperacion precedents son ara invalids e de nòus son estats generats. + subject: 'Mastodon : còdis de recuperacion dos factors regenerats' + title: Còdis 2FA de recuperacion cambiats unlock_instructions: subject: Mastodon : consignas de desblocatge omniauth_callbacks: diff --git a/config/locales/devise.pt-PT.yml b/config/locales/devise.pt-PT.yml new file mode 100644 index 0000000000..7d3f8fc552 --- /dev/null +++ b/config/locales/devise.pt-PT.yml @@ -0,0 +1,83 @@ +--- +pt-PT: + devise: + confirmations: + confirmed: O teu endereço de e-mail foi confirmado com sucesso. + send_instructions: Vais receber um email com as instruções para confirmar o teu endereço de email dentro de alguns minutos. Por favor, verifica a caixa de spam se não recebeste o e-mail. + send_paranoid_instructions: Se o teu endereço de email já existir na nossa base de dados, vais receber um email com as instruções de confirmação dentro de alguns minutos. Por favor, verifica a caixa de spam se não recebeste o e-mail. + failure: + already_authenticated: A tua sessão já está aberta. + inactive: A tua conta ainda não está ativada. + invalid: "%{authentication_keys} ou palavra-passe inválida." + last_attempt: Tens mais uma tentativa antes de a tua conta ficar bloqueada. + locked: A tua conta está bloqueada. + not_found_in_database: "%{authentication_keys} ou palavra-passe inválida." + timeout: A tua sessão expirou. Por favor, entra de novo para continuares. + unauthenticated: Precisas de entrar na tua conta ou de te registares antes de continuar. + unconfirmed: Tens de confirmar o teu endereço de email antes de continuar. + mailer: + confirmation_instructions: + action: Verificar o endereço de e-mail + action_with_app: Confirmar e regressar a %{app} + explanation: Criaste uma conta em %{host} com este endereço de e-mail. Estás a um clique de activá-la. Se não foste tu que fizeste este registo, por favor ignora esta mensagem. + extra_html: Por favor lê as regras da instância e os nossos termos de serviço. + subject: 'Mastodon: Instruções de confirmação %{instance}' + title: Verificar o endereço de e-mail + email_changed: + explanation: 'O e-mail associado à tua conta será alterado para:' + extra: Se não alteraste o teu e-mail é possível que alguém tenha conseguido aceder à tua conta. Por favor muda a tua palavra-passe imediatamente ou entra em contato com um administrador do servidor se ficaste sem acesso à tua conta. + subject: 'Mastodon: Email alterado' + title: Novo endereço de e-mail + password_change: + explanation: A palavra-passe da tua conta foi alterada. + extra: Se não alteraste a tua palavra-passe, é possível que alguém tenha conseguido aceder à tua conta. Por favor muda a tua palavra-passe imediatamente ou entra em contato com um administrador do servidor se ficaste sem acesso à tua conta. + subject: 'Mastodon: Nova palavra-passe' + title: Palavra-passe alterada + reconfirmation_instructions: + explanation: Confirma o teu novo endereço para alterar o e-mail. + extra: Se esta mudança não foi iniciada por ti, por favor ignora este e-mail. O endereço de e-mail para a tua conta do Mastodon não irá mudar enquanto não acederes ao link acima. + subject: 'Mastodon: Confirmação de e-mail %{instance}' + title: Validar o endereço de e-mail + reset_password_instructions: + action: Alterar palavra-passe + explanation: Pediste a alteração da palavra-passe da tua conta. + extra: Se não fizeste este pedido, por favor ignora este e-mail. A tua palavra-passe não irá mudar se não acederes ao link acima e criares uma nova. + subject: 'Mastodon: Instruções para alterar a palavra-passe' + title: Solicitar nova palavra-passe + unlock_instructions: + subject: 'Mastodon: Instruções para desbloquear a tua conta' + omniauth_callbacks: + failure: Não foi possível autenticar %{kind} porque "%{reason}". + success: Autenticado com sucesso na conta %{kind}. + passwords: + no_token: Não pode aceder a esta página se não vier através do link enviado por email para alteração da sua palavra-passe. Se usaste esse link para chegar aqui, por favor verifica que o endereço URL actual é o mesmo do que foi enviado no email. + send_instructions: Vais receber um email com instruções para alterar a palavra-passe dentro de algns minutos. + send_paranoid_instructions: Se o teu endereço de email existe na nossa base de dados, vais receber um link para recuperar a palavra-passe dentro de alguns minutos. + updated: A tua palavra-passe foi alterada. Estás agora autenticado na tua conta. + updated_not_active: A tua palavra-passe foi alterada. + registrations: + destroyed: Adeus! A tua conta foi cancelada. Esperamos ver-te em breve. + signed_up: Bem-vindo! A tua conta foi registada com sucesso. + signed_up_but_inactive: A tua conta foi registada. No entanto ainda não está activa. + signed_up_but_locked: A tua conta foi registada. No entanto está bloqueada. + signed_up_but_unconfirmed: Uma mensagem com um link de confirmação foi enviada para o teu email. Por favor segue esse link para activar a tua conta. + update_needs_confirmation: Alteraste o teu endereço de email ou palavra-passe, mas é necessário confirmar essa alteração. Por favor vai ao teu email e segue link que te enviámos. + updated: A tua conta foi actualizada com sucesso. + sessions: + already_signed_out: Sessão encerrada. + signed_in: Sessão iniciada. + signed_out: Sessão encerrada. + unlocks: + send_instructions: Vais receber um email com instruções para desbloquear a tua conta dentro de alguns minutos. + send_paranoid_instructions: Se a tua conta existe, vais receber um email com instruções a detalhar como a desbloquear dentro de alguns minutos. + unlocked: A sua conta foi desbloqueada. Por favor inica uma nova sessão para continuar. + errors: + messages: + already_confirmed: já confirmado, por favor tente iniciar sessão + confirmation_period_expired: tem de ser confirmado durante %{period}, por favor tenta outra vez + expired: expirou, por favor tente outra vez + not_found: não encontrado + not_locked: não estava bloqueada + not_saved: + one: '1 erro impediu este %{resource} de ser guardado:' + other: "%{count} erros impediram este %{resource} de ser guardado:" diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml index 4837390dba..759d4874b7 100644 --- a/config/locales/devise.sk.yml +++ b/config/locales/devise.sk.yml @@ -37,7 +37,7 @@ sk: reconfirmation_instructions: explanation: Potvrď novú emailovú adresu na ktorú chceš zmeniť svoj email. extra: Pokiaľ si túto akciu nevyžiadal/a, prosím ignoruj tento email. Emailová adresa pre tvoj Mastodon účet totiž nebude zmenená pokiaľ nepostúpiš na adresu uvedenú vyššie. - subject: 'Mastodon: Potvrďenie emailu pre %{instance}' + subject: 'Mastodon: Potvrď email pre %{instance}' title: Over emailovú adresu reset_password_instructions: action: Zmeň svoje heslo diff --git a/config/locales/el.yml b/config/locales/el.yml index acc97d37e7..03974fa174 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -17,9 +17,6 @@ el: contact_unavailable: Μ/Δ discover_users: Ανακάλυψε χρήστες documentation: Τεκμηρίωση - extended_description_html: | -

Ένα καλό σημείο για κανόνες

-

Η αναλυτική περιγραφή δεν έχει ακόμα οριστεί

federation_hint_html: Με ένα λογαριασμό στο %{instance} θα μπορείς να ακολουθείς ανθρώπους σε οποιοδήποτε κόμβο στο Mastodon αλλά και αλλού. generic_description: "%{domain} είναι ένας εξυπηρετητής στο δίκτυο" get_apps: Δοκίμασε μια εφαρμογή κινητού @@ -225,10 +222,12 @@ el: deleted_status: "(διαγραμμένη δημοσίευση)" title: Αρχείο ελέγχου custom_emojis: + assign_category: Κατηγορία by_domain: Τομέας copied_msg: Επιτυχής δημιουργία τοπικού αντίγραφου του emoji copy: Αντιγραφή copy_failed_msg: Αδυναμία δημιουργίας τοπικού αντίγραφου αυτού του emoji + create_new_category: Νέα κατηγορία created_msg: Επιτυχής δημιουργία του emoji! delete: Διαγραφή destroyed_msg: Επιτυχής καταστροφή του emojo! @@ -245,6 +244,7 @@ el: shortcode: Σύντομος κωδικός shortcode_hint: Τουλάχιστον 2 χαρακτήρες, μόνο αλφαριθμητικοί και κάτω παύλες title: Προσαρμοσμένα emoji + uncategorized: Χωρίς κατηγορία unlisted: Μη καταχωρημένα update_failed_msg: Αδυναμία ενημέρωσης του emoji updated_msg: Επιτυχής ενημέρωση του emoji! @@ -424,6 +424,9 @@ el: custom_css: desc_html: Τροποποίηση της εμφάνισης μέσω CSS που φορτώνεται σε κάθε σελίδα title: Προσαρμοσμένο CSS + default_noindex: + desc_html: Επηρεάζει όσους χρήστες δεν έχουν αλλάξει αυτή τη ρύθμιση + title: Εξαίρεση χρηστών από τις μηχανές αναζήτησης domain_blocks: all: Για όλους disabled: Για κανέναν @@ -515,6 +518,10 @@ el: context: Συνάφεια directory: Στον κατάλογο in_directory: "%{count} στον κατάλογο" + last_active: Τελευταία δραστηριότητα + most_popular: Δημοφιλέστερες + most_recent: Πιο πρόσφατες + name: Ταμπέλα review: Κατάσταση έγκρισης reviewed: Εγκεκριμένες title: Ταμπέλες @@ -626,7 +633,9 @@ el: x_months: "%{count}μ" x_seconds: "%{count}δ" deletes: + challenge_not_passed: Τα στοιχεία δεν ήταν σωστά confirm_password: Γράψε το τρέχον συνθηματικό σου για να πιστοποιήσεις την ταυτότητά σου + confirm_username: Γράψε το όνομα χρήστη σου για επιβεβαίωση proceed: Διαγραφή λογαριασμού success_msg: Ο λογαριασμός σου διαγράφηκε με επιτυχία warning: @@ -644,23 +653,6 @@ el: directory: Κατάλογος λογαριασμών explanation: Βρες χρήστες βάσει των ενδιαφερόντων τους explore_mastodon: Εξερεύνησε το %{title} - domain_blocks: - blocked_domains: Λίστα περιορισμένων και αποκλεισμένων τομέων - description: Αυτή είναι η λίστα των διακομιστών που ο %{instance} περιορίζει ή απορρίπτει τη σύνδεση μαζί τους. - domain: Τομέας - media_block: Αποκλεισμός πολυμέσων - no_domain_blocks: "(Χωρίς αποκλεισμό πολυμέσων)" - severity: Αυστηρότητα - severity_legend: - media_block: Τα αρχεία πολυμέσων από αυτό τον διακομιστή δεν ανακτώνται, δεν αποθηκεύονται και δεν προβάλλονται στο χρήστη. - silence: Οι λογαριασμοί από διακομιστές που έχουν αποσιωπηθεί μπορούν να βρεθούν, να ακολουθηθούν και να δεχτούν αλληλεπιδράσεις αλλά τα τουτ τους δε θα εμφανίζονται στις δημόσιες ροές και οι ειδοποιήσεις τους δε θα παραδίδονται στους τοπικούς χρήστες που δεν τους ακολουθούν. - suspension: Κανένα περιεχόμενο ανασταλμένων διακομιστών δεν αποθηκεύεται και δεν εμφανίζεται, ούτε αποστέλλεται σε αυτούς. Οι ενέργειες από τους ανασταλμένους διακομιστές αγνοούνται. - suspension_disclaimer: Οι ανασταλμενοι διακομιστές μπορεί περιστασιακά να ανακτήσουν δημόσιο περιεχόμενο από αυτό τον διακομιστή. - title: Αυστηρότητες - show_rationale: Εμφάνιση αιτιολογίας - silence: Αποσιώπηση - suspension: Αναστολή - title: "%{instance} Λίστα αποκλεισμένων κόμβων" domain_validator: invalid_domain: δεν είναι έγκυρο όνομα τομέα errors: @@ -726,6 +718,7 @@ el: all: Όλα changes_saved_msg: Οι αλλαγές αποθηκεύτηκαν! copy: Αντιγραφή + no_batch_actions_available: Δεν υπάρχουν ομαδικές ενέργειες σε αυτή τη σελίδα order_by: Ταξινόμηση κατά save_changes: Αποθήκευσε τις αλλαγές validation_errors: @@ -797,9 +790,6 @@ el: too_many: Δεν γίνεται να προσθέσεις περισσότερα από 4 αρχεία migrations: acct: ΌνομαΧρήστη@Τομέας του νέου λογαριασμού - currently_redirecting: 'Το προφίλ σου έχει ρυθμιστεί να ανακατευθύνει στο:' - proceed: Αποθήκευση - updated_msg: Οι ρυθμίσεις μετακόμισης του λογαριασμού σου ενημερώθηκαν! moderation: title: Συντονισμός notification_mailer: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index b5b8656a45..6200168303 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -17,9 +17,6 @@ eo: contact_unavailable: Ne disponebla discover_users: Malkovri uzantojn documentation: Dokumentado - extended_description_html: | -

Bona loko por reguloj

-

La detala priskribo ne estis elektita.

federation_hint_html: Per konto ĉe %{instance}, vi povos sekvi homojn ĉe iu ajn Mastodon nodo kaj preter. generic_description: "%{domain} estas unu servilo en la reto" get_apps: Provu telefonan aplikaĵon @@ -604,10 +601,6 @@ eo: directory: Profilujo explanation: Malkovru uzantojn per iliaj interesoj explore_mastodon: Esplori %{title} - domain_blocks: - domain: Domajno - no_domain_blocks: "(Nenio domajna blokado)" - silence: Silenta domain_validator: invalid_domain: ne estas valida domajna nomo errors: @@ -745,9 +738,6 @@ eo: too_many: Aldoni pli ol 4 dosierojn ne eblas migrations: acct: uzantnomo@domajno de la nova konto - currently_redirecting: 'Via profilo alidirektos al:' - proceed: Konservi - updated_msg: Via agordo pri konta migrado estis sukcese ĝisdatigita! moderation: title: Kontrolado notification_mailer: diff --git a/config/locales/es.yml b/config/locales/es.yml index 892d82e9ca..3703f92ff5 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -17,9 +17,6 @@ es: contact_unavailable: N/A discover_users: Descubrir usuarios documentation: Documentación - extended_description_html: | -

Un buen lugar para las reglas

-

La descripción extendida no se ha colocado aú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 @@ -620,8 +617,6 @@ es: directory: Directorio de perfiles explanation: Descubre usuarios según sus intereses explore_mastodon: Explorar %{title} - domain_blocks: - domain: Dominio domain_validator: invalid_domain: no es un nombre de dominio válido errors: @@ -757,9 +752,6 @@ es: too_many: No se pueden adjuntar más de 4 archivos migrations: acct: username@domain de la nueva cuenta - currently_redirecting: 'Tu perfil está redireccionado a:' - proceed: Guardar - updated_msg: "¡La configuración de migración de tu cuenta ha sido actualizada con éxito!" moderation: title: Moderación notification_mailer: diff --git a/config/locales/et.yml b/config/locales/et.yml index 7d07719830..0a66d49f47 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -17,9 +17,6 @@ et: contact_unavailable: Pole saadaval discover_users: Avasta kasutajaid documentation: Dokumentatsioon - extended_description_html: | -

Hea koht reeglite jaoks

-

Laiendatud kirjeldus pole veel üles seadistatud.

federation_hint_html: Kui Teil on kasutaja %{instance}-is, saate Te jälgida inimesi üks kõik millisel Mastodoni serveril ja kaugemalgi. generic_description: "%{domain} on ainult üks server terves võrgus" get_apps: Proovi mobiilirakendusi @@ -724,9 +721,6 @@ et: too_many: Ei saa lisada rohkem, kui 4 faili migrations: acct: uue konto kasutajanimi@domeen - currently_redirecting: 'Teie profiil on sätestatud suunama ümber:' - proceed: Salvesta - updated_msg: Teie konto migreerumissätete uuendamine õnnestus! moderation: title: Moderatsioon notification_mailer: diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 2a4d612961..a3061b99e9 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -17,9 +17,6 @@ eu: contact_unavailable: E/E discover_users: Aurkitu erabiltzaileak documentation: Dokumentazioa - extended_description_html: | -

Arauentzako toki egoki bat

-

Azalpen luzea ez da ezarri oraindik.

federation_hint_html: "%{instance} instantzian kontu bat izanda edozein Mastodon zerbitzariko jendea jarraitu ahal izango duzu, eta harago ere." generic_description: "%{domain} sareko zerbitzari bat da" get_apps: Probatu mugikorrerako aplikazio bat @@ -618,10 +615,6 @@ eu: directory: Profilen direktorioa explanation: Deskubritu erabiltzaileak interesen arabera explore_mastodon: Esploratu %{title} - domain_blocks: - domain: Domeinua - severity: Larritasuna - silence: Isilarazi domain_validator: invalid_domain: ez da domeinu izen baliogarria errors: @@ -757,9 +750,6 @@ eu: too_many: Ezin dira 4 fitxategi baino gehiago erantsi migrations: acct: Kontu berriaren erabiltzaile@domeinua - currently_redirecting: 'Zure profila hona birbideratzeko ezarri da:' - proceed: Gorde - updated_msg: Kontuaren migrazio-ezarpenak ongi eguneratu dira! moderation: title: Moderazioa notification_mailer: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 7f316c7848..7393341647 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -17,9 +17,6 @@ fa: contact_unavailable: موجود نیست discover_users: یافتن کاربران documentation: مستندات - extended_description_html: | -

جای خوبی برای قانون‌ها

-

توضیحات تکمیلی نوشته نشده است.

federation_hint_html: با داشتن حساب روی %{instance} می‌توانید کاربران همهٔ سرورهای دیگر ماستدون (و سایر شبکه‌های سازگار با آن) را پی بگیرید. generic_description: "%{domain} یک سرور روی شبکه است" get_apps: یک اپ موبایل را امتحان کنید @@ -627,8 +624,6 @@ fa: directory: فهرست گزیدهٔ کاربران explanation: کاربران این سرور را بر اساس علاقه‌مندی‌هایشان پیدا کنید explore_mastodon: گشت و گذار در %{title} - domain_blocks: - blocked_domains: فهرست دامین‌های محدود یا مسدود errors: '400': The request you submitted was invalid or malformed. '403': شما اجازهٔ دیدن این صفحه را ندارید. @@ -761,9 +756,6 @@ fa: too_many: نمی‌توان بیشتر از ۴ تصویر بارگذاری کرد migrations: acct: username@domain حساب تازه - currently_redirecting: 'نمایهٔ شما منتقل می‌شود به:' - proceed: ذخیره - updated_msg: تنظیمات نقل مکان حساب شما با موفقیت به‌روز شد! moderation: title: مدیریت کاربران notification_mailer: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 3d8fdce3a5..2f8fd34974 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -10,9 +10,6 @@ fi: contact_missing: Ei asetettu contact_unavailable: Ei saatavilla documentation: Dokumentaatio - extended_description_html: | -

Hyvä paikka säännöille

-

Pidempää kuvausta ei ole vielä laadittu.

generic_description: "%{domain} on yksi verkostoon kuuluvista palvelimista" hosted_on: Mastodon palvelimella %{domain} learn_more: Lisätietoja @@ -468,9 +465,6 @@ fi: too_many: Tiedostoja voi liittää enintään 4 migrations: acct: uuden tilin käyttäjätunnus@verkkotunnus - currently_redirecting: 'Profiiliisi on asetettu uudelleenohjaus:' - proceed: Tallenna - updated_msg: Tilinsiirtoasetusten päivitys onnistui! moderation: title: Moderointi notification_mailer: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 15d6359b43..be146d997d 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -17,9 +17,6 @@ fr: contact_unavailable: Non disponible discover_users: Découvrez des utilisateur·rice·s documentation: Documentation - extended_description_html: | -

Un bon endroit pour les règles

-

La description étendue n’a pas été remplie.

federation_hint_html: Avec un compte sur %{instance}, vous pourrez suivre les gens sur n’importe quel serveur Mastodon et au-delà. generic_description: "%{domain} est seulement un serveur du réseau" get_apps: Essayez une application mobile @@ -637,23 +634,6 @@ fr: directory: Annuaire des profils explanation: Découvrir des utilisateurs en se basant sur leurs centres d’intérêt explore_mastodon: Explorer %{title} - domain_blocks: - blocked_domains: Liste des domaines limités et bloqués - description: Ceci est la liste des serveurs envers qui %{instance} limite ou rejette la fédération. - domain: Domaine - media_block: Bloqueur de média - no_domain_blocks: "(Aucun bloqueur de domaine)" - severity: Sévérité - severity_legend: - media_block: Les fichiers de média provenant du serveur ne sont ni récupérés, ni stockés, ni affichés à l’utilisateur·rice. - silence: Les comptes des serveurs masqués peuvent être trouvés, suivis et interagis avec, mais leurs Toots n'apparaîtront pas dans les fil d'actualité publiques, et les notifications de ceux-ci ne parviendront pas aux utilisateurs locaux qui ne les suivent pas. - suspension: Aucun contenu des serveurs suspendus n'est stocké ou affiché, ni ne leur est communiqué. Les interactions des serveurs suspendus sont ignorées. - suspension_disclaimer: Les serveurs suspendus peuvent parfois récupérer du contenu public de ce serveur. - title: Séverités - show_rationale: Voir le raisonnement - silence: Masquer - suspension: Suspendre - title: "%{instance} Liste des instances bloquées" domain_validator: invalid_domain: n’est pas un nom de domaine valide errors: @@ -790,9 +770,6 @@ fr: too_many: Impossible de joindre plus de 4 fichiers migrations: acct: profil@domaine du nouveau compte - currently_redirecting: 'Votre profil va être redirigé vers :' - proceed: Enregistrer - updated_msg: Les paramètres de votre migration de compte ont été mis à jour avec succès ! moderation: title: Modération notification_mailer: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 20f535ad5c..3924eeedc7 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -17,9 +17,6 @@ gl: contact_unavailable: N/A discover_users: Descubra usuarias documentation: Documentación - extended_description_html: | -

Un bo lugar para regras

-

A descrición extendida aínda non se proporcionou.

federation_hint_html: Con unha conta en %{instance} poderá seguir a outras persoas en calquera dos servidores Mastodon e incluso máis. generic_description: "%{domain} é un servidor na rede" get_apps: Probe cunha app móbil @@ -38,6 +35,13 @@ gl: status_count_before: Que publicaron tagline: Siga as amizades e faga outras novas terms: Termos do servizo + unavailable_content: Contido non dispoñible + unavailable_content_description: + reason: 'Razón:' + rejecting_media: Os ficheiros de medios de este servidor non se procesarán e non se mostrarán miniaturas, precisando solicitarse manualmente ao outro servidor. + silenced: As publicacións desde este servidor non se mostrarán en ningún lugar excepto no Inicio se segues ao autor. + suspended: Non poderás seguir a ninguén desde este servidor, e non se procesarán nin se gardarán datos que procedan del, e non se intercambiarán datos. + unavailable_content_html: Normalmente Mastodon permíteche ver contidos de outros servidores do fediverso e interactuar coas súas usuarias. Estas son as excepcións que se estableceron en este servidor particular. user_count_after: one: usuaria other: usuarias @@ -427,6 +431,9 @@ gl: custom_css: desc_html: Modificar o aspecto con CSS cargado en cada páxina title: CSS persoalizado + default_noindex: + desc_html: Aféctalle a todas as usuarias que non cambiaron os axustes elas mesmas + title: Por omisión exclúe as usuarias do indexado por servidores de busca domain_blocks: all: Para todas disabled: Para ninguén @@ -518,6 +525,10 @@ gl: context: Contexto directory: No directorio in_directory: "%{count} no directorio" + last_active: Úlimo activo + most_popular: Máis popular + most_recent: Máis recente + name: Etiqueta review: Estado de revisión reviewed: Revisado title: Etiquetas @@ -543,6 +554,12 @@ gl: new_trending_tag: body: 'A etiqueta #%{name} é tendencia hoxe, pero non foi previamente revisada. Non se mostrará publicamente a menos que vostede o permita, ou garde o formulario para facer que non se lle consulte de novo.' subject: Unha nova etiqueta que revisar en %{instance} (#%{name}) + aliases: + add_new: Crear alcume + created_msg: Creou un novo alcume correctamente. Pode iniciar o movemento desde a conta antiga. + deleted_msg: Eliminou correctamente o alias. Xa non será posible mover desde esa conta a esta. + hint_html: Se quere mudarse desde outra conta a esta nova, aquí pode crear un alcume, que é requerido antes de poder proceder a mover os seguidores da conta antiga a esta nova. Esta acción por si mesma é inocua e reversible. A migración da conta iníciase desde a conta antiga. + remove: Desligar alcume appearance: advanced_web_interface: Interface web avanzada advanced_web_interface_hint: Se quere utilizar todo o ancho da súa pantalla, a interface web avanzada permítelle configurar diferentes columnas para ver tanta información como desexe. Inicio, notificacións, liña temporal federada, calquera número de listas e etiquetas. @@ -602,6 +619,7 @@ gl: confirming: Agardando a confirmación do correo enviado. functional: A súa conta está totalmente operativa. pending: A súa aplicación está pendente de revisión. Poderíanos levar algún tempo. Recibirá un correo se a aplicación está aprobada. + redirecting_to: A túa conta está inactiva porque está redirixida a %{acct}. trouble_logging_in: Problemas para conectar? authorize_follow: already_following: Xa está a seguir esta conta @@ -614,6 +632,11 @@ gl: return: Mostrar o perfil da usuaria web: Ir a web title: Seguir %{acct} + challenge: + confirm: Continuar + hint_html: "Nota: Non che pediremos o contrasinal na seguinte hora." + invalid_password: Contrasinal incorrecto + prompt: Confirma o contrasinal para continuar datetime: distance_in_words: about_x_hours: "%{count}h" @@ -629,7 +652,9 @@ gl: x_months: "%{count}mes" x_seconds: "%{count}s" deletes: + challenge_not_passed: A información introducida non é correcta confirm_password: Introduza o seu contrasinal para verificar a súa identidade + confirm_username: Introduce o nome de usuaria para confirmar o procedemento proceed: Eliminar conta success_msg: A súa conta eliminouse correctamente warning: @@ -647,23 +672,6 @@ gl: directory: Directorio de perfil explanation: Descubra usuarias según o seu interese explore_mastodon: Explorar %{title} - domain_blocks: - blocked_domains: Lista de dominios limitados e bloqueados - description: Esta é a lista dos servidores cos que %{instance} limita ou rexeita federar. - domain: Dominio - media_block: Bloqueo de medios - no_domain_blocks: "(Sen bloqueo de medios)" - severity: Rigurosidade - severity_legend: - media_block: Os ficheiros de medios procedentes do servidor non se obterán, gardarán nin mostrarán as usuarias. - silence: As contas de servidores silenciados pódense atopar, seguir e interactuar con elas, pero os seus toots non aparecerán na liña temporal púbica, as notificacións procedentes deles non chegarán as usuarias que non as están a seguir. - suspension: Non se mostra nin garda ningún contido de servidores suspendidos, tampouco se lles envía contido. As interaccións con servidores suspendidos son ignoradas. - suspension_disclaimer: Os servidores suspendidos poderían obter ocasionalmente contido público de este servidor. - title: Rigurosidades - show_rationale: Mostrar razón - silence: Silenciar - suspension: Suspensión - title: "%{instance} Lista de instancias bloqueadas" domain_validator: invalid_domain: non é un nome de dominio válido errors: @@ -801,9 +809,31 @@ gl: too_many: Non pode anexar máis de 4 ficheiros migrations: acct: nomeusuaria@dominio da nova conta - currently_redirecting: 'O seu perfil está listo para redirixir a:' - proceed: Gardar - updated_msg: O axuste de migración da conta actualizouse correctamente! + cancel: Cancelar a redirección + cancel_explanation: Ao cancelar a redirección reactivarás a conta actual, pero non poderás traer de volta os seguidores que se moveron a esa conta. + cancelled_msg: Cancelouse a redirección. + errors: + already_moved: é a mesma conta a que xa te moveches + missing_also_known_as: non está referenciando hacia esta conta + move_to_self: non pode ser a conta actual + not_found: non se atopou + on_cooldown: Estas no período de calma + followers_count: Seguidoras no momento da migración + incoming_migrations: Movendo desde unha conta diferente + incoming_migrations_html: Para migrar doutra conta cara esta, primeiro debes crear un alias da conta. + moved_msg: A túa conta está redirixindo agora a %{acct} e os teus seguidores movéronse alí. + not_redirecting: Neste momento a túa conta non está redirixindo cara a ningunha outra. + on_cooldown: Migraches recentemente a conta. Esta función estará dispoñible de novo en %{count} días. + past_migrations: Migracións pasadas + proceed_with_move: Mover seguidoras + redirecting_to: A conta está redirixindo cara a %{acct}. + warning: + backreference_required: Tes que configurar primeiro a nova conta para referenciar hacia esta + before: 'Antes de seguir, por favor lé estas notas con atención:' + cooldown: Tras a migración existe un período de calma durante o cal non poderás voltar a migrar de novo + disabled_account: Tras o cambio a túa conta actual non será totalmente usable, pero terás acceso a exportar os datos e tamén a reactivación. + followers: Esta acción moverá todas as túas seguidoras desde a conta actual a nova conta + other_data: Non se moverán outros datos de xeito automático moderation: title: Moderación notification_mailer: @@ -948,6 +978,7 @@ gl: settings: account: Conta account_settings: Axustes da conta + aliases: Alcumes da conta appearance: Aparencia authorized_apps: Apps autorizadas back: Voltar a Mastodon diff --git a/config/locales/he.yml b/config/locales/he.yml index 62c04a8e84..f7b1217777 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -9,9 +9,6 @@ he: contact_missing: ללא הגדרה contact_unavailable: לא רלוונטי/חסר documentation: תיעוד - extended_description_html: | -

מקום טוב לכללים

-

התיאור המורחב טרם הוגדר.

generic_description: "%{domain} הוא שרת אחד בתוך הרשת" hosted_on: מסטודון שיושב בכתובת %{domain} learn_more: מידע נוסף diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 5d9097d094..9670079d6f 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -17,9 +17,6 @@ hu: contact_unavailable: N/A discover_users: Találj meg másokat documentation: Dokumentáció - extended_description_html: | -

Ez itt a szabályzat helye

-

Még nem állítottál be bővebb leírást.

federation_hint_html: Egy %{instance} fiókkal bármely más Mastodon szerveren vagy a föderációban lévő felhasználót követni tudsz. generic_description: "%{domain} csak egy a számtalan szerver közül a föderációban" get_apps: Próbálj ki egy mobil appot @@ -752,9 +749,6 @@ hu: too_many: Maximum négy fájlt csatolhatsz a tülkhöz migrations: acct: Az új fiók felhasznalonev@domain formátumban - currently_redirecting: 'A profilod az alábbi fiókra van átirányítva:' - proceed: Mentés - updated_msg: Fiókod átirányítási beállításait sikeresen mentettük! moderation: title: Moderáció notification_mailer: diff --git a/config/locales/id.yml b/config/locales/id.yml index 81a8ffd1fd..bd47d05f89 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -10,9 +10,6 @@ id: contact_missing: Belum diset contact_unavailable: Tidak Tersedia documentation: Dokumentasi - extended_description_html: | -

Tempat yang baik untuk peraturan

-

Deskripsi lainnya belum diset.

generic_description: "%{domain} adalah satu server dalam jaringan" hosted_on: Mastodon dihosting di %{domain} learn_more: Pelajari selengkapnya diff --git a/config/locales/it.yml b/config/locales/it.yml index 7b3eede09d..9681609103 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -17,9 +17,6 @@ it: contact_unavailable: N/D discover_users: Scopri utenti documentation: Documentazione - extended_description_html: | -

Un buon posto per le regole

-

La descrizione estesa non è ancora stata preparata.

federation_hint_html: Con un account su %{instance} sarai in grado di seguire persone su qualsiasi server Mastodon e oltre. generic_description: "%{domain} è un server nella rete" get_apps: Prova un'app per smartphone @@ -624,23 +621,6 @@ it: directory: Directory dei profili explanation: Scopri utenti in base ai loro interessi explore_mastodon: Esplora %{title} - domain_blocks: - blocked_domains: Elenco dei domini limitati e bloccati - description: Questo è l'elenco dei server con cui %{instance} limita o rifiuta la federazione. - domain: Dominio - media_block: Blocco dei media - no_domain_blocks: "(Nessun blocco di dominio)" - severity: Gravità - severity_legend: - media_block: I file multimediali provenienti dal server non sono recuperati, memorizzati o visualizzati all'utente. - silence: Gli account di server silenziati possono essere trovati e seguiti, e gli utenti possono interagire con essi, ma i loro toot non appariranno nelle timeline pubbliche e le relative notifiche non raggiungeranno gli utenti locali che non li seguono. - suspension: Nessun contenuto dai server sospesi è memorizzato o visualizzato, e nessun contenuto gli viene inviato. Le interazioni dai server sospesi sono ignorate. - suspension_disclaimer: I server sospesi possono talvolta recuperare contenuti pubblici da questo server. - title: Gravità - show_rationale: Mostra motivazione - silence: Silenzia - suspension: Sospensione - title: "%{instance} Elenco delle istanze bloccate" domain_validator: invalid_domain: non è un nome di dominio valido errors: @@ -777,9 +757,6 @@ it: too_many: Impossibile allegare più di 4 file migrations: acct: utente@dominio del nuovo account - currently_redirecting: 'Il tuo profilo sarà ridirezionato a:' - proceed: Salva - updated_msg: L'impostazione per la migrazione dell'account è sta aggiornata! moderation: title: Moderazione notification_mailer: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index cfaee9a381..1c63a706fe 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -17,9 +17,6 @@ ja: contact_unavailable: N/A discover_users: ユーザーを見つける documentation: ドキュメント - extended_description_html: | -

ルールを書くのに適した場所

-

詳細説明が設定されていません。

federation_hint_html: "%{instance} のアカウントひとつでどんなMastodon互換サーバーのユーザーでもフォローできるでしょう。" generic_description: "%{domain} は、Mastodon サーバーの一つです" get_apps: モバイルアプリを試す @@ -623,23 +620,6 @@ ja: directory: ディレクトリ explanation: 関心を軸にユーザーを発見しよう explore_mastodon: "%{title}を探索" - domain_blocks: - blocked_domains: ドメインブロックリスト - description: "%{instance} が連合を制限または拒否しているサーバーのリストです。" - domain: ドメイン - media_block: メディアを拒否 - no_domain_blocks: "(ドメインブロックなし)" - severity: 重大性 - severity_legend: - media_block: サーバーから送信されるメディアファイルは取得も保存もされず、またユーザーには表示されません。 - silence: サイレンスされたサーバーのアカウントは検索やフォロー、交流することができますが、トゥートは公開タイムラインに表示されません。またフォローしていないユーザーには通知が届きません。 - suspension: 停止されたサーバーからのコンテンツは保存も表示もされず、また送信もされません。停止されたサーバーからの交流は拒否されます。 - suspension_disclaimer: 停止されたサーバーでもこのサーバーから公開コンテンツを取得することがあります。 - title: 重大性 - show_rationale: コメントを表示 - silence: サイレンス - suspension: 停止 - title: "%{instance} のドメインブロックリスト" domain_validator: invalid_domain: は無効なドメイン名です errors: @@ -774,9 +754,6 @@ ja: too_many: 追加できるファイルは4つまでです migrations: acct: 引っ越し先の ユーザー名@ドメイン - currently_redirecting: 'あなたのプロフィールは引っ越し先が設定されています:' - proceed: 保存 - updated_msg: アカウントの引っ越し設定を更新しました! moderation: title: モデレーション notification_mailer: diff --git a/config/locales/ka.yml b/config/locales/ka.yml index 93cc8ec5a6..c921fa56f2 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -11,9 +11,6 @@ ka: contact_missing: არაა დაყენებული contact_unavailable: მიუწ. documentation: დოკუმენტაცია - extended_description_html: | -

კარგი ადგილი წესებისთვის

-

განვრცობილი აღწერილობა ჯერ არ შექმნილა.

generic_description: "%{domain} ერთი სერვერია ქსელში" hosted_on: მასტოდონს მასპინძლობს %{domain} learn_more: გაიგე მეტი @@ -531,9 +528,6 @@ ka: too_many: თან ვერ დაურთავთ 4 ფაილზე მეტს migrations: acct: username@domain ახალი ანგარიშის - currently_redirecting: 'თქვენი პროფილი გამართულია მოახდინოს გადამისამართება მისამართზე:' - proceed: შენახვა - updated_msg: თქვენი ანგარიშის მიგრაციის პარამეტრები წარმატეებით დამახსოვრდა! moderation: title: მოდერაცია notification_mailer: diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 3658b2293b..84cbdd294b 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -10,9 +10,6 @@ kk: contact_missing: Бапталмаған contact_unavailable: Белгісіз documentation: Құжаттама - extended_description_html: | -

Ережелерге арналған жақсы орын

-

Әлі ештеңе жазылмапты

generic_description: "%{domain} желідегі серверлердің бірі" hosted_on: Mastodon орнатылған %{domain} доменінде learn_more: Көбірек білу @@ -624,9 +621,6 @@ kk: too_many: 4 файлдан артық қосылмайды migrations: acct: жаңа аккаунт үшін username@domain - currently_redirecting: 'Профиліңіз көшіріледі:' - proceed: Сақтау - updated_msg: Аккаунт көшіруіңіз сәтті аяқталды! moderation: title: Модерация notification_mailer: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index fc9fa7b80a..c95189dc5f 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -17,9 +17,6 @@ ko: contact_unavailable: 없음 discover_users: 유저 발견하기 documentation: 문서 - extended_description_html: | -

룰을 작성하는 장소

-

아직 설명이 작성되지 않았습니다.

federation_hint_html: "%{instance}에 계정을 만드는 것으로 모든 마스토돈 서버, 그리고 호환 되는 모든 서버의 사용자를 팔로우 할 수 있습니다." generic_description: "%{domain} 은 네트워크에 있는 한 서버입니다" get_apps: 모바일 앱 사용해 보기 @@ -221,10 +218,12 @@ ko: deleted_status: "(삭제됨)" title: 감사 기록 custom_emojis: + assign_category: 분류 지정 by_domain: 도메인 copied_msg: 성공적으로 에모지의 로컬 복사본을 생성했습니다 copy: 복사 copy_failed_msg: 에모지의 로컬 복사본을 만드는 데 실패하였습니다 + create_new_category: 분류 생성 created_msg: 에모지가 성공적으로 생성되었습니다! delete: 삭제 destroyed_msg: 에모지가 성공적으로 삭제되었습니다! @@ -241,6 +240,7 @@ ko: shortcode: 짧은 코드 shortcode_hint: 최소 2글자, 영문자, 숫자, _만 사용 가능 title: 커스텀 에모지 + uncategorized: 분류되지 않음 unlisted: 목록에 없음 update_failed_msg: 에모지를 업데이트 할 수 없습니다 updated_msg: 에모지가 성공적으로 업데이트 되었습니다! @@ -420,6 +420,9 @@ ko: custom_css: desc_html: 모든 페이지에 적용할 CSS title: 커스텀 CSS + default_noindex: + desc_html: 이 설정을 바꾸지 않은 모든 유저들에게 적용 됩니다 + title: 유저들이 기본적으로 검색엔진에 인덱싱 되지 않도록 합니다 domain_blocks: all: 모두에게 disabled: 아무에게도 안 함 @@ -511,6 +514,10 @@ ko: context: 문맥 directory: 디렉토리에 있음 in_directory: 디렉토리에 %{count}개 있음 + last_active: 최근 활동 + most_popular: 최고 인기 + most_recent: 최신 + name: 해시태그 review: 심사 상태 reviewed: 심사 됨 title: 해시태그 @@ -565,6 +572,10 @@ ko: checkbox_agreement_without_rules_html: 이용 약관에 동의합니다 delete_account: 계정 삭제 delete_account_html: 계정을 삭제하고 싶은 경우, 여기서 삭제할 수 있습니다. 삭제 전 확인 화면이 표시됩니다. + description: + prefix_invited_by_user: "@%{name} 님이 당신을 이 마스토돈 서버로 초대했습니다!" + prefix_sign_up: 마스토돈에 가입하세요! + suffix: 계정 하나로 사람들을 팔로우 하고, 게시물을 작성하며 마스토돈을 포함한 다른 어떤 서버의 유저와도 메시지를 주고 받을 수 있습니다! didnt_get_confirmation: 확인 메일을 받지 못하셨습니까? forgot_password: 비밀번호를 잊어버리셨습니까? invalid_reset_password_token: 암호 리셋 토큰이 올바르지 못하거나 기간이 만료되었습니다. 다시 요청해주세요. @@ -618,30 +629,26 @@ ko: x_months: "%{count}월" x_seconds: "%{count}초" deletes: + challenge_not_passed: 입력한 정보가 올바르지 않습니다 confirm_password: 본인 확인을 위해 현재 사용 중인 암호를 입력해 주십시오 + confirm_username: 절차를 진행하려면 당신의 사용자명을 입력하세요 proceed: 계정 삭제 success_msg: 계정이 성공적으로 삭제되었습니다 + warning: + before: '진행하기 전, 주의사항을 꼼꼼히 읽어보세요:' + caches: 다른 서버에 캐싱 된 정보들은 남아있을 수 있습니다 + data_removal: 당신의 게시물과 다른 정보들은 영구적으로 삭제 됩니다 + email_change_html: 계정을 지우지 않고도 이메일 주소를 수정할 수 있습니다 + email_contact_html: 아직 도착하지 않았다면, %{email}에 메일을 보내 도움을 요청할 수 있습니다 + email_reconfirmation_html: 아직 확인 메일이 도착하지 않은 경우, 다시 요청할 수 있습니다 + irreversible: 계정을 복구하거나 다시 사용할 수 없게 됩니다 + more_details_html: 더 자세한 정보는, 개인정보 정책을 참고하세요. + username_available: 당신의 계정명은 다시 사용할 수 있게 됩니다 + username_unavailable: 당신의 계정명은 앞으로 사용할 수 없습니다 directories: directory: 프로필 디렉토리 explanation: 관심사에 대한 유저들을 발견합니다 explore_mastodon: "%{title} 탐사하기" - domain_blocks: - blocked_domains: 제한 되거나 차단 된 도메인 목록 - description: 이것은 %{instance}가 제한하거나 연합을 거부한 서버들의 목록입니다. - domain: 도메인 - media_block: 미디어 차단 - no_domain_blocks: "(도메인 차단 없음)" - severity: 심각도 - severity_legend: - media_block: 이 서버의 미디어는 불러오거나, 저장 되거나, 유저에게 보여지지 않습니다. - silence: 침묵 된 서버의 계정은 발견 되고, 팔로우 하고, 그들과 상호작용 할 수 있습니다, 그러나 그들의 툿은 툿 공개 타임라인에 나타나지 않으며 그들에게서 오는 알림은 그들을 팔로우 하지 않는 로컬 유저에게는 전달되지 않습니다. - suspension: 정지 된 서버의 어떤 콘텐츠도 저장 되거나 보여지거나 하지 않고 어떤 콘텐츠도 그 서버로 전달 되지 않습니다. 정지 된 서버에서의 상호작용은 무시됩니다. - suspension_disclaimer: 정지 된 서버는 때때로 이 서버의 공개 콘텐츠를 받아 갈 수도 잇습니다. - title: 심각도 - show_rationale: 사유 보여주기 - silence: 침묵 - suspension: 정지 - title: "%{instance}의 차단한 인스턴스 목록" domain_validator: invalid_domain: 올바른 도메인 네임이 아닙니다 errors: @@ -707,6 +714,7 @@ ko: all: 모두 changes_saved_msg: 정상적으로 변경되었습니다! copy: 복사 + no_batch_actions_available: 이 페이지에서 수행할 수 있는 일괄작업이 없습니다 order_by: 순서 save_changes: 변경 사항을 저장 validation_errors: @@ -776,9 +784,6 @@ ko: too_many: 최대 4개까지 첨부할 수 있습니다 migrations: acct: 새 계정의 username@domain - currently_redirecting: '당신의 프로파일은 여기로 리디렉션 됩니다:' - proceed: 저장 - updated_msg: 계정 이동 설정이 저장되었습니다! moderation: title: 모더레이션 notification_mailer: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 7aed705cb3..e1471eed07 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -9,9 +9,6 @@ lt: contact: Kontaktai contact_missing: Nenustatyta documentation: Dokumentacija - extended_description_html: | -

Taisyklės

-

Ilgas aprašymas dar nėra sudartyas

generic_description: "%{domain} yra vienas serveris tinkle" hosted_on: Mastodon palaikomas naudojantis %{domain} talpinimu learn_more: Daugiau @@ -597,9 +594,6 @@ lt: too_many: Negalima pridėti daugiau nei 4 failų migrations: acct: slapyvardis@domenas naujam vartotojui - currently_redirecting: 'Jūsų profilis nustatytas nukreipimui į:' - proceed: Išsaugoti - updated_msg: Jūsų paskyros migracijos nustatymai sėkmingai pakeisti! moderation: title: Moderacija notification_mailer: diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 4573d53dd2..b77a1fd92a 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -10,9 +10,6 @@ ms: contact_missing: Tidak ditetapkan contact_unavailable: Tidak tersedia documentation: Pendokumenan - extended_description_html: | -

Tempat sesuai untuk peraturan

-

Kenyataan penuh masih belum ditetapkan.

generic_description: "%{domain} ialah salah sebuah pelayan dalam rangkaian Mastodon" hosted_on: Mastodon dihoskan di %{domain} learn_more: Ketahui lebih lanjut diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 9298e0ae08..1878a95a25 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -17,13 +17,13 @@ nl: contact_unavailable: n.v.t discover_users: Gebruikers ontdekken documentation: Documentatie - extended_description_html: | -

Een goede plek voor richtlijnen

-

De uitgebreide omschrijving is nog niet ingevuld.

federation_hint_html: Met een account op %{instance} ben je in staat om mensen die zich op andere Mastodonservers (en op andere plekken) bevinden te volgen. generic_description: "%{domain} is een server in het Mastodonnetwerk" get_apps: Mobiele apps hosted_on: Mastodon op %{domain} + instance_actor_flash: 'Dit account is een virtuel actor die wordt gebruikt om de server zelf te vertegenwoordigen en is geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden geblokkeerd, tenzij je de hele server wil blokkeren. In zo''n geval dien je echter een domeinblokkade te gebruiken. + +' learn_more: Meer leren privacy_policy: Privacybeleid see_whats_happening: Kijk wat er aan de hand is @@ -35,6 +35,11 @@ nl: status_count_before: Zij schreven tagline: Vrienden volgen en nieuwe ontdekken terms: Gebruiksvoorwaarden + unavailable_content: Niet beschikbare inhoud + unavailable_content_description: + reason: 'Reden:' + rejecting_media: Mediabestanden van deze server worden niet verwerkt en er worden geen thumbnails getoond. Je moet handmatig naar deze server doorklikken om de mediabestanden te kunnen bekijken. + silenced: Toots van deze server worden nergens weergegeven, behalve op jouw eigen starttijdlijn wanneer je het account volgt. user_count_after: one: gebruiker other: gebruikers @@ -53,6 +58,7 @@ nl: media: Media moved_html: "%{name} is verhuisd naar %{new_profile_link}:" network_hidden: Deze informatie is niet beschikbaar + never_active: Nooit nothing_here: Hier is niets! people_followed_by: Mensen die %{name} volgen people_who_follow: Mensen die %{name} volgen @@ -219,10 +225,12 @@ nl: deleted_status: "(verwijderde toot}" title: Auditlog custom_emojis: + assign_category: Categorie toewijzen by_domain: Domein copied_msg: Lokale kopie van emoji maken geslaagd copy: Kopiëren copy_failed_msg: Kan geen lokale kopie van deze emoji maken + create_new_category: Nieuwe categorie toevoegen created_msg: Aanmaken van emoji geslaagd! delete: Verwijderen destroyed_msg: Verwijderen van emoji geslaagd! @@ -239,6 +247,7 @@ nl: shortcode: Verkorte code shortcode_hint: Tenminste 2 tekens (alleen alfanumeriek en underscores) title: Lokale emoji’s + uncategorized: Niet gecategoriseerd unlisted: Niet weergegeven update_failed_msg: Deze emoji kon niet worden bijgewerkt updated_msg: Bijwerken van emoji is geslaagd! @@ -475,6 +484,8 @@ nl: desc_html: Je kan hier jouw eigen privacybeleid, gebruiksvoorwaarden en ander juridisch jargon kwijt. Je kan HTML gebruiken title: Aangepaste gebruiksvoorwaarden site_title: Naam Mastodonserver + spam_check_enabled: + title: Automatische spambestrijding thumbnail: desc_html: Gebruikt als voorvertoning voor OpenGraph en de API. 1200x630px aanbevolen title: Thumbnail Mastodonserver @@ -501,13 +512,19 @@ nl: tags: accounts_today: Aantal unieke keren vandaag gebruikt accounts_week: Aantal unieke keren deze week gebruikt + breakdown: Uitsplitsing van het gebruik van vandaag naar bron context: Context directory: In de gebruikersgids in_directory: "%{count} keer in de gebruikersgids" + last_active: Laatst actief + most_popular: Meest populair + most_recent: Meest recent + name: Hashtag review: Status beoordelen reviewed: Beoordeeld title: Hashtags trending_right_now: Op dit moment trending + unique_uses_today: "%{count} toots vandaag" unreviewed: Niet beoordeeld title: Beheer warning_presets: @@ -585,6 +602,10 @@ nl: return: Profiel van deze gebruiker tonen web: Ga naar de webapp title: Volg %{acct} + challenge: + confirm: Doorgaan + invalid_password: Ongeldig wachtwoord + prompt: Bevestig wachtwoord om door te gaan datetime: distance_in_words: about_x_hours: "%{count}u" @@ -600,23 +621,15 @@ nl: x_months: "%{count}ma" x_seconds: "%{count}s" deletes: + challenge_not_passed: De informatie die u hebt ingevoerd is ongeldig confirm_password: Voer jouw huidige wachtwoord in om jouw identiteit te bevestigen + confirm_username: Voer uw gebruikersnaam in om de procedure te bevestigen proceed: Account verwijderen success_msg: Jouw account is succesvol verwijderd directories: directory: Gebruikersgids explanation: Ontdek gebruikers aan de hand van hun interesses explore_mastodon: "%{title} verkennen" - domain_blocks: - domain: Domein - media_block: Mediabestanden weigeren - no_domain_blocks: "(geen domeinblokkades)" - severity: Zwaarte - severity_legend: - media_block: Mediabestanden die van deze server komen worden niet opgehaald, opgeslagen en aan de gebruiker getoond. - title: Zwaartes - show_rationale: Motivering tonen - silence: Negeren errors: '400': The request you submitted was invalid or malformed. '403': Jij hebt geen toestemming om deze pagina te bekijken. @@ -749,10 +762,30 @@ nl: images_and_video: Een video kan niet aan een toot met afbeeldingen worden gekoppeld too_many: Er kunnen niet meer dan 4 afbeeldingen toegevoegd worden migrations: - acct: gebruikersnaam@domein van het nieuwe account - currently_redirecting: 'Jouw profiel wordt nu doorverwezen naar:' - proceed: Opslaan - updated_msg: Jouw accountmigratie-instelling is succesvol bijgewerkt! + acct: Verhuisd naar + cancelled_msg: De doorverwijzing is succesvol geannuleerd. + errors: + already_moved: is hetzelfde account waarnaar je al naar toe bent verhuisd + missing_also_known_as: verwijst niet terug naar dit account + move_to_self: kan niet het huidige account zijn + not_found: kon niet worden gevonden + on_cooldown: Jouw laatste migratie is nog te kort geleden + followers_count: Volgers op het moment van verhuizing + incoming_migrations: Verhuizen vanaf een ander account + incoming_migrations_html: Om te vanaf een ander account naar dit account te verhuizen, moet je eerst een accountalias aanmaken. + moved_msg: Jouw account wordt nu naar %{acct} doorverwezen en jouw volgers worden verhuisd. + not_redirecting: Jouw account wordt momenteel niet naar een ander account doorverwezen. + on_cooldown: Je hebt recentelijk jouw account verhuisd. Deze mogelijkheid is weer beschikbaar over %{count} dagen. + past_migrations: Vorige migraties + proceed_with_move: Volgers verhuizen + redirecting_to: Jouw account wordt nu naar %{acct} doorverwezen. + warning: + backreference_required: Het nieuwe account moet eerst worden ingesteld om naar dit account te kunnen terugverwijzen + before: 'Lees eerst goed deze tekst, alvorens verder te gaan:' + cooldown: Na de verhuizing kun je tijdelijk niet opnieuw verhuizen + disabled_account: Jouw huidige account is hierna niet meer volledig bruikbaar. Je hebt echter wel toegang tot het exporteren van je gegevens en tot het opnieuw activeren van je account. + followers: Deze actie verhuisd alle volgers vanaf het huidige account naar het nieuwe account + other_data: Geen andere gegevens worden automatisch verhuisd moderation: title: Moderatie notification_mailer: @@ -897,6 +930,7 @@ nl: settings: account: Account account_settings: Accountinstellingen + aliases: Accountaliassen appearance: Uiterlijk authorized_apps: Geautoriseerde apps back: Terug naar Mastodon diff --git a/config/locales/no.yml b/config/locales/no.yml index 1d675aef68..c6b9605b3f 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -7,9 +7,6 @@ contact: Kontakt contact_missing: Ikke innstilt contact_unavailable: Ikke tilgjengelig - extended_description_html: | -

En god plassering for regler

-

En utvidet beskrivelse er ikke satt opp ennå.

generic_description: "%{domain} er en tjener i nettverket" hosted_on: Mastodon driftet på %{domain} learn_more: Lær mer @@ -394,9 +391,6 @@ too_many: Kan ikke legge ved mer enn 4 filer migrations: acct: brukernavn@domene til den nye kontoen - currently_redirecting: 'Din profil er omdirigert til:' - proceed: Lagre - updated_msg: Dine innstillinger for kontomigrering er oppdatert! moderation: title: Moderasjon notification_mailer: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 2884380b8b..2d11d3399f 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -17,9 +17,6 @@ oc: contact_unavailable: Pas disponible discover_users: Descobrissètz de nòvas personas documentation: Documentacion - extended_description_html: | -

Una bona plaça per las règlas

-

La descripcion longa es pas estada causida pel moment.

federation_hint_html: Amb un compte sus %{instance} poiretz sègre de personas de qualque siasque servidor Mastodon e encara mai. generic_description: "%{domain} es un dels servidors del malhum" get_apps: Ensajatz una aplicacion mobil @@ -719,9 +716,6 @@ oc: too_many: Se pòt pas ajustar mai de 4 fichièrs migrations: acct: nomutilizaire@domeni del nòu compte - currently_redirecting: 'Vòstre perfil es parametrat per mandar a :' - proceed: Enregistrar - updated_msg: Vòstre paramètre de migracion es ben estat mes a jorn ! moderation: title: Moderacion notification_mailer: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 23d0c8a989..46b9116941 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -17,9 +17,6 @@ pl: contact_unavailable: Nie dotyczy discover_users: Odkrywaj użytkowników documentation: Dokumentacja - extended_description_html: | -

Dobre miejsce na zasady użytkowania

-

Nie ustawiono jeszcze szczegółowego opisu

federation_hint_html: Z kontem na %{instance}, możesz śledzić użytkowników każdego serwera Mastodona i nie tylko. generic_description: "%{domain} jest jednym z serwerów sieci" get_apps: Spróbuj aplikacji mobilnej @@ -712,9 +709,6 @@ pl: too_many: Nie możesz załączyć więcej niż 4 plików migrations: acct: nazwa@domena nowego konta - currently_redirecting: 'Obecnie Twoje konto przekierowuje do:' - proceed: Zapisz - updated_msg: Pomyślnie zaktualizowano ustawienia migracji Twojego konta! moderation: title: Moderacja notification_mailer: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 9896f888a4..ac7e709084 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -16,9 +16,6 @@ pt-BR: contact_unavailable: Não disponível discover_users: Descubra usuários documentation: Documentação - extended_description_html: | -

Um bom lugar para regras

-

A descrição da instância ainda não foi feita.

federation_hint_html: Com uma conta em %{instance} você vai poder seguir pessoas em qualquer servidor Mastodon ou outros do fediverso. generic_description: "%{domain} é um servidor na rede" get_apps: Experimente um aplicativo @@ -664,9 +661,6 @@ pt-BR: too_many: Não é possível anexar mais de 4 imagens migrations: acct: username@domain da nova conta - currently_redirecting: 'Seu perfil está configurado para redirecionar para:' - proceed: Salvar - updated_msg: As configurações de migração da sua conta foram atualizadas com sucesso! moderation: title: Moderação notification_mailer: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 25ee570851..ecca3b8458 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -10,9 +10,6 @@ pt-PT: contact_missing: Não configurado contact_unavailable: n.d. documentation: Documentação - extended_description_html: | -

Um bom lugar para regras

-

A descrição estendida ainda não foi configurada.

generic_description: "%{domain} é um servidor na rede" hosted_on: Mastodon em %{domain} learn_more: Saber mais @@ -612,9 +609,6 @@ pt-PT: too_many: Não é possível anexar mais de 4 arquivos migrations: acct: username@domain da nova conta - currently_redirecting: 'O teu perfil está configurado para redirecionar para:' - proceed: Salvar - updated_msg: As configurações de migração da tua conta foram atualizadas com sucesso! moderation: title: Moderação notification_mailer: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 0c12021182..3b10925ac3 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -17,9 +17,6 @@ ru: contact_unavailable: неизв. discover_users: Находите пользователей documentation: Документация - extended_description_html: | -

Хорошее место для правил

-

Расширенное описание еще не настроено.

federation_hint_html: С учётной записью на %{instance} вы сможете подписываться на людей с любого сервера Mastodon и не только. generic_description: "%{domain} - один из серверов сети" get_apps: Попробуйте мобильное приложение @@ -592,8 +589,6 @@ ru: directory: Каталог профилей explanation: Находите пользователей по интересам explore_mastodon: Изучайте %{title} - domain_blocks: - domain: Домен errors: '400': The request you submitted was invalid or malformed. '403': У Вас нет доступа к просмотру этой страницы. @@ -730,9 +725,6 @@ ru: too_many: Нельзя добавить более 4 файлов migrations: acct: имя@домен нового аккаунта - currently_redirecting: 'Ваш профиль будет перенаправлен на:' - proceed: Сохранить - updated_msg: Настройки миграции вашего аккаунта обновлены! moderation: title: Модерация notification_mailer: diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index eeb5a913a4..fbf6813a49 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -43,6 +43,8 @@ co: domain: Stu duminiu puderà ricuperà i dati di stu servore è i dati ch'affaccanu da quallà saranu trattati è cunservati featured_tag: name: 'Pudete vulè utilizà unu di quelli:' + form_challenge: + current_password: Entrate in in una zona sicurizata imports: data: Un fugliale CSV da un’altru servore di Mastodon invite_request: @@ -131,6 +133,8 @@ co: must_be_follower: Piattà e nutificazione di quelli·e ch’ùn vi seguitanu must_be_following: Piattà e nutificazione di quelli·e ch’ùn seguitate must_be_following_dm: Bluccà e missaghji diretti di quelli·e ch’ùn seguitate + invite: + comment: Cummentariu invite_request: text: Perchè vulete ghjunghje? notification_emails: diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index b6b61747f2..047d59c698 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -2,6 +2,10 @@ cs: simple_form: hints: + account_alias: + acct: Zadejte přezdívku@doménu účtu, ze kterého se chcete přesunout + account_migration: + acct: Zadejte přezdívku@doménu účtu, na který se chcete přesunout account_warning_preset: text: Můžete používat syntaxi tootů, jako například URL, hashtagy a zmínky admin_account_action: @@ -15,6 +19,8 @@ cs: avatar: PNG, GIF či JPG. Maximálně %{size}. Bude zmenšen na %{dimensions} px bot: Tento účet provádí hlavně automatizované akce a nemusí být spravován context: Jeden či více kontextů, ve kterých má být filtr uplatněn + current_password: Z bezpečnostních důvodů prosím zadejte heslo aktuálního účtu + current_username: Prosím potvrďte zadáním uživatelského jména aktuálního účtu digest: Odesíláno pouze po dlouhé době nečinnosti a pouze, pokud jste při své nepřítomnosti obdržel/a osobní zprávy discoverable: Adresář profilů je další způsob, díky kterému se může váš účet dostat k širšímu publiku email: Bude vám poslán potvrzovací e-mail @@ -36,13 +42,15 @@ cs: setting_noindex: Ovlivňuje váš veřejný profil a stránky tootů setting_show_application: Aplikace, kterou používáte k psaní tootů, bude zobrazena v detailním zobrazení vašich tootů setting_use_blurhash: Gradienty jsou založeny na barvách skryté grafiky, ale zakrývají jakékoliv detaily - setting_use_pending_items: Skrýt aktualizace časový osy a načíst je kliknutím namísto automatického rolování proudu + setting_use_pending_items: Skrýt aktualizace časové osy a načíst je kliknutím namísto automatického rolování proudu username: Vaše uživatelské jméno bude na %{domain} unikátní whole_word: Je-li klíčové slovo či fráze pouze alfanumerická, bude aplikována pouze, pokud se shoduje s celým slovem domain_allow: domain: Tato doména bude moci stahovat data z tohoto serveru a příchozí data z ní budou zpracována a uložena featured_tag: name: 'Nejspíš budete chtít použít jeden z těchto:' + form_challenge: + current_password: Vstupujete do zabezpečeného prostoru imports: data: Soubor CSV exportovaný z jiného serveru Mastodon invite_request: @@ -58,6 +66,10 @@ cs: fields: name: Označení value: Obsah + account_alias: + acct: Adresa starého účtu + account_migration: + acct: Adresa nového účtu account_warning_preset: text: Text předlohy admin_account_action: @@ -131,6 +143,8 @@ cs: must_be_follower: Blokovat oznámení od lidí, kteří vás nesledují must_be_following: Blokovat oznámení od lidí, které nesledujete must_be_following_dm: Blokovat přímé zprávy od lidí, které nesledujete + invite: + comment: Komentář invite_request: text: Proč se chcete připojit? notification_emails: diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index ac153805e9..2ce2869739 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -2,6 +2,10 @@ de: simple_form: hints: + account_alias: + acct: Gib den benutzernamen@domain des Kontos an, von dem du umziehen möchtest + account_migration: + acct: Gib den benutzernamen@domain des Kontos an, zu dem du umziehen möchtest account_warning_preset: text: Du kannst Beitragssyntax benutzen, wie z.B. URLs, Hashtags und Erwähnungen admin_account_action: @@ -15,6 +19,8 @@ de: avatar: PNG, GIF oder JPG. Maximal %{size}. Wird auf %{dimensions} px herunterskaliert bot: Dieses Konto führt lediglich automatisierte Aktionen durch und wird möglicherweise nicht überwacht context: Ein oder mehrere Kontexte, wo der Filter aktiv werden soll + current_password: Aus Sicherheitsgründen gib bitte das Passwort des aktuellen Kontos ein + current_username: Um das zu bestätigen, gib den Benutzernamen des aktuellen Kontos ein digest: Wenn du eine lange Zeit inaktiv bist, wird dir eine Zusammenfassung von Erwähnungen zugeschickt, die du in deiner Abwesenheit empfangen hast discoverable: Das Profilverzeichnis ist eine andere Möglichkeit, mit der dein Konto ein größeres Publikum erreichen kann email: Du wirst eine Bestätigungs-E-Mail erhalten @@ -43,6 +49,8 @@ de: domain: Diese Domain kann Daten von diesem Server abrufen und eingehende Daten werden verarbeitet und gespeichert featured_tag: name: 'Du möchtest vielleicht einen von diesen benutzen:' + form_challenge: + current_password: Du betrittst einen sicheren Bereich imports: data: CSV-Datei, die aus einem anderen Mastodon-Server exportiert wurde invite_request: @@ -58,6 +66,10 @@ de: fields: name: Bezeichnung value: Inhalt + account_alias: + acct: Adresse des alten Kontos + account_migration: + acct: Adresse des neuen Kontos account_warning_preset: text: Vorlagentext admin_account_action: @@ -131,6 +143,8 @@ de: must_be_follower: Benachrichtigungen von Profilen blockieren, die mir nicht folgen must_be_following: Benachrichtigungen von Profilen blockieren, denen ich nicht folge must_be_following_dm: Private Nachrichten von Profilen, denen ich nicht folge, blockieren + invite: + comment: Kommentar invite_request: text: Warum möchtest du beitreten? notification_emails: diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 4eb0ce7104..7ff5fbf77f 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -131,6 +131,8 @@ el: must_be_follower: Μπλόκαρε τις ειδοποιήσεις από όσους δεν ακολουθείς must_be_following: Μπλόκαρε τις ειδοποιήσεις που προέρχονται από άτομα που δεν τα ακολουθείς must_be_following_dm: Μπλόκαρε τα προσωπικά μηνύματα από όσους δεν ακολουθείς + invite: + comment: Σχόλια invite_request: text: Γιατί θέλεις να συμμετάσχεις; notification_emails: diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index a92c20f105..9f2f15b07c 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -131,6 +131,8 @@ fr: must_be_follower: Masquer les notifications des personnes qui ne vous suivent pas must_be_following: Masquer les notifications des personnes que vous ne suivez pas must_be_following_dm: Bloquer les messages directs des personnes que vous ne suivez pas + invite: + comment: Commentaire invite_request: text: Pourquoi voulez-vous vous inscrire ? notification_emails: diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index adb06bc2c6..61308bf48b 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -2,6 +2,10 @@ gl: simple_form: hints: + account_alias: + acct: Indica o usuaria@servidor da conta desde a cal queres migrar + account_migration: + acct: Indica o usuaria@servidor da conta a cal queres migrar account_warning_preset: text: Pódeslle dar formato ao toot, como URLs, etiquetas e mencións admin_account_action: @@ -15,6 +19,8 @@ gl: avatar: PNG, GIF ou JPG. Máximo %{size}. Será reducida a %{dimensions}px bot: Esta conta realiza principalmente accións automatizadas e podería non estar monitorizada context: Un ou varios contextos onde se debería aplicar o filtro + current_password: Por razóns de seguridade, introduce o contrasinal da conta actual + current_username: Para confirmar, introduce o nome de usuaria da conta actual digest: Enviar só tras un longo período de inactividade e só si recibeu algunha mensaxe persoal na súa ausencia discoverable: O directorio de perfil é outro xeito para que a túa conta alcance unha maior audiencia email: Enviaráselle un correo-e de confirmación @@ -43,6 +49,8 @@ gl: domain: Este dominio estará en disposición de obter datos desde este servidor e datos de entrada a el poderán ser procesados e gardados featured_tag: name: 'Podería utilizar algunha de estas:' + form_challenge: + current_password: Estás entrando nun área segura imports: data: Ficheiro CSV exportado desde outro servidor Mastodon invite_request: @@ -58,6 +66,10 @@ gl: fields: name: Etiqueta value: Contido + account_alias: + acct: Xestina a conta antiga + account_migration: + acct: Xestiona a nova conta account_warning_preset: text: Texto preestablecido admin_account_action: @@ -131,6 +143,8 @@ gl: must_be_follower: Bloquear as notificacións de non-seguidoras must_be_following: Bloquea as notificacións de personas que non segue must_be_following_dm: Bloquea as mensaxes directas de personas que non segue + invite: + comment: Comentar invite_request: text: Por que quere unirse? notification_emails: diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 118bf50d4a..a6db9e0065 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -131,6 +131,8 @@ ko: must_be_follower: 나를 팔로우 하지 않는 사람에게서 온 알림을 차단 must_be_following: 내가 팔로우 하지 않는 사람에게서 온 알림을 차단 must_be_following_dm: 내가 팔로우 하지 않은 사람에게서 오는 다이렉트메시지를 차단 + invite: + comment: 주석 invite_request: text: 가입하려는 이유가 무엇인가요? notification_emails: diff --git a/config/locales/sk.yml b/config/locales/sk.yml index e6a30f0c34..01f5bf7504 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -17,9 +17,6 @@ sk: contact_unavailable: Neuvedený/á discover_users: Objavuj užívateľov documentation: Dokumentácia - extended_description_html: | -

Pravidlá

-

Žiadne zatiaľ uvedené nie sú

federation_hint_html: S účtom na %{instance} budeš môcť následovať ľúdí na hociakom Mastodon serveri, ale aj na iných serveroch. generic_description: "%{domain} je jeden server v sieti" get_apps: Vyskúšaj aplikácie @@ -40,6 +37,9 @@ sk: status_count_before: Ktorí napísali tagline: Následuj kamarátov, a objavuj nových terms: Podmienky užitia + unavailable_content: Nedostupný obsah + unavailable_content_description: + reason: 'Dôvod:' user_count_after: few: užívateľov many: užívatelia @@ -527,6 +527,10 @@ sk: context: Súvis directory: V zozname in_directory: "%{count} v zozname" + last_active: Naposledy aktívny + most_popular: Najpopulárnejšie + most_recent: Najnovšie + name: Haštag review: Prehodnoť stav reviewed: Zhodnotené title: Haštagy @@ -551,6 +555,8 @@ sk: subject: Nové hlásenie pre %{instance} (#%{id}) new_trending_tag: subject: Nový haštag očakáva preverenie na %{instance} (#%{name}) + aliases: + add_new: Vytvor alias appearance: advanced_web_interface: Pokročilé webové rozhranie advanced_web_interface_hint: 'Ak chceš využiť celkovú šírku tvojej obrazovky, pokročilé webové rozhranie ti umožňuje nastaviť mnoho rôznych stĺpcov, aby si videl/a toľko informácií naraz, koľko chceš: Domov, oboznámenia, federovanú časovú os, a ľubovolný počet zoznamov, či haštagov.' @@ -619,6 +625,10 @@ sk: return: Ukáž užívateľov profil web: Prejdi do siete title: Následuj %{acct} + challenge: + confirm: Pokračuj + invalid_password: Nesprávne heslo + prompt: Pre pokračovanie potvrď svoje heslo datetime: distance_in_words: about_x_hours: "%{count}hod" @@ -648,21 +658,6 @@ sk: directory: Katalóg profilov explanation: Pátraj po užívateľoch podľa ich záujmov explore_mastodon: Prebádaj %{title} - domain_blocks: - blocked_domains: Zoznam obmedzovaných a blokovaných domén - description: Toto je zoznam serverov, ktorých federáciu %{instance} obmedzuje, alebo nepríjma. - domain: Doména - media_block: Blokovanie médií - no_domain_blocks: "(Žiadne domény niesú blokované)" - severity: Závažnosť - severity_legend: - media_block: Mediálne súbory zo servera niesú ani zachytávané, ani ukladané, či zobrazované užívateľovi. - suspension_disclaimer: Vylúčené servery sa môžu občas dostať k verejnému obsahu tohto servera. - title: Závažnosti - show_rationale: Ukáž zdôvodnenie - silence: Stíš - suspension: Vylúčenie - title: Zoznam instancií, ktoré blokuje %{instance} domain_validator: invalid_domain: nieje správny tvar domény errors: @@ -805,9 +800,12 @@ sk: too_many: Nemôžeš priložiť viac ako 4 súbory migrations: acct: prezývka@doména nového účtu - currently_redirecting: 'Tvoj profil má nastavené presmerovanie na:' - proceed: Uložiť - updated_msg: Tvoje nastavenia pre presmerovanie účtu boli úspešne aktualizované! + cancel: Zruš presmerovanie + errors: + move_to_self: nemôže to byť tvoj súčasný účet + not_found: nebolo možné nájsť + past_migrations: Predošlé presuny + proceed_with_move: Presuň sledovateľov moderation: title: Moderovanie notification_mailer: diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 47b835646b..63eed6409d 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -17,9 +17,6 @@ sl: contact_unavailable: Ni na voljo discover_users: Odkrijte uporabnike documentation: Dokumentacija - extended_description_html: | -

Dober prostor za pravila

-

Razširjen opis še ni bil nastavljen.

federation_hint_html: Z računom na %{instance} boste lahko spremljali ljudi na kateremkoli Mastodon strežniku. generic_description: "%{domain} je en strežnik v omrežju" get_apps: Poskusite mobilno aplikacijo @@ -734,9 +731,6 @@ sl: too_many: Ni možno priložiti več kot 4 datoteke migrations: acct: username@domain novega računa - currently_redirecting: 'Vaš profil je preusmerjen na:' - proceed: Shrani - updated_msg: Nastavitev selitve računa je bila uspešno posodobljena! moderation: title: Moderiranje notification_mailer: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 4e5f372947..af180e2819 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -9,9 +9,6 @@ sq: contact: Kontakt contact_missing: I parregulluar documentation: Dokumentim - extended_description_html: | -

Një vend i mirë për rregulla

-

Përshkrimi i zgjeruar s’është sajuar ende.

generic_description: "%{domain} është një shërbyes te rrjeti" hosted_on: Mastodon i strehuar në %{domain} learn_more: Mësoni më tepër @@ -602,9 +599,6 @@ sq: too_many: S’mund të bashkëngjiten më shumë se 4 kartela migrations: acct: emërpërdoruesi@përkatësi e llogarisë së re - currently_redirecting: 'Profili juaj është caktuar të ridrejtojë te:' - proceed: Ruaje - updated_msg: Rregullimi juaj për migrim llogarish u përditësua me sukses! moderation: title: Moderim notification_mailer: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 5c06242cc1..44bae34d03 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -6,9 +6,6 @@ sr-Latn: about_this: O instanci contact: Kontakt contact_missing: Nije postavljeno - extended_description_html: | -

Dobro mesto za pravila

-

Prošireni opis koji još nije postavljen.

generic_description: "%{domain} je server na mreži" hosted_on: Mastodont hostovan na %{domain} learn_more: Saznajte više @@ -381,9 +378,6 @@ sr-Latn: too_many: Ne može se prikačiti više od 4 fajla migrations: acct: korisnik@domen novog naloga - currently_redirecting: 'Profil Vam je podešen da preusmerava na :' - proceed: Sačuvaj - updated_msg: Prebacivanje postavki Vašeg naloga uspešno izmenjeno! moderation: title: Moderacija notification_mailer: diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 772c04d642..4a5d551ef5 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -9,9 +9,6 @@ sr: contact: Контакт contact_missing: Није постављено documentation: Документација - extended_description_html: | -

Добро место за правила

-

Проширени опис који још није постављен.

generic_description: "%{domain} је сервер на мрежи" hosted_on: Мастодонт хостован на %{domain} learn_more: Сазнајте више @@ -614,9 +611,6 @@ sr: too_many: Не може се прикачити више од 4 фајла migrations: acct: корисник@домен новог налога - currently_redirecting: 'Профил Вам је подешен да преусмерава на :' - proceed: Сачувај - updated_msg: Пребацивање поставки Вашег налога успешно измењено! moderation: title: Модерација notification_mailer: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index a71ea9e185..740aad00d8 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -8,9 +8,6 @@ sv: api: API contact: Kontakt contact_missing: Inte inställd - extended_description_html: | -

En bra plats för regler

-

Den utökade beskrivningen har inte konfigurerats ännu.

generic_description: "%{domain} är en server i nätverket" hosted_on: Mastodon värd på %{domain} learn_more: Lär dig mer @@ -454,9 +451,6 @@ sv: too_many: Det går inte att bifoga mer än 4 filer migrations: acct: användarnamn@domän av det nya kontot - currently_redirecting: 'Din profil är satt att omdirigeras till:' - proceed: Spara - updated_msg: Dina kontoflyttsinställning har uppdaterats! moderation: title: Moderera notification_mailer: diff --git a/config/locales/te.yml b/config/locales/te.yml index 560a295a6d..ec48465543 100644 --- a/config/locales/te.yml +++ b/config/locales/te.yml @@ -10,9 +10,6 @@ te: contact_missing: ఇంకా సెట్ చేయలేదు contact_unavailable: వర్తించదు documentation: పత్రీకరణ - extended_description_html: | -

నియమాలకు ఒక మంచి ప్రదేశం

-

మరింత విశదీకరణ ఇంకా సెట్ చేయబడలేదు.

generic_description: "%{domain} అనేది నెట్వర్కులోని ఒక సర్వరు" hosted_on: మాస్టొడాన్ %{domain} లో హోస్టు చేయబడింది learn_more: మరింత తెలుసుకోండి diff --git a/config/locales/th.yml b/config/locales/th.yml index 97ef414608..e1056d0c25 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -17,9 +17,6 @@ th: contact_unavailable: ไม่มี discover_users: ค้นพบผู้ใช้ documentation: เอกสารประกอบ - extended_description_html: | -

สถานที่ที่ดีสำหรับกฎ

-

ยังไม่ได้ตั้งคำอธิบายเพิ่มเติม

federation_hint_html: เมื่อคุณมีบัญชีที่ %{instance} แล้ว คุณสามารถติดตามผู้คนบนเซิร์ฟเวอร์ Mastodon เซิร์ฟเวอร์ใดก็ได้ generic_description: "%{domain} เป็นเซิร์ฟเวอร์หนึ่งในเครือข่าย" get_apps: ลองแอปสำหรับมือถือ @@ -515,7 +512,6 @@ th: too_many: ไม่สามารถแนบมากกว่า 4 ไฟล์ migrations: acct: username@domain ของบัญชีใหม่ - proceed: บันทึก moderation: title: การควบคุม notification_mailer: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 550b1cc495..b6817999ed 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -17,9 +17,6 @@ tr: contact_unavailable: Yok discover_users: Kullanıcıları keşfet documentation: Belgeler - extended_description_html: | -

Kural için iyi bir yer

-

Genişletilmiş açıklama henüz ayarlanmamış.

federation_hint_html: "%{instance} hesabınızla, herhangi bir Mastodon sunucusundaki ve haricindeki kişileri takip edebilirsiniz." generic_description: "%{domain} ağdaki bir sunucudur" get_apps: Bir mobil uygulamayı deneyin @@ -444,14 +441,6 @@ tr: directory: Profil dizini explanation: Kullanıcıları ilgi alanlarına göre keşfedin explore_mastodon: "%{title} keşfet" - domain_blocks: - blocked_domains: Sınırlı ve engellenen alanların listesi - description: Bu, %{instance} öğesinin sınırladığı veya federasyonu reddettiği sunucuların listesidir. - domain: Alan adı - severity_legend: - media_block: Sunucudan gelen medya dosyaları alınmaz, saklanmaz veya kullanıcıya gösterilmez. - silence: Susturulmuş sunuculardaki hesaplar bulunabilir, takip edilebilinir ve onlarla etkileşime girilebilinir, ancak gönderileri genel zaman çizelgelerinde görünmez ve onlardan gelen bildirimler onları takip etmeyen yerel kullanıcılara ulaşmaz. - show_rationale: Gerekçeyi göster domain_validator: invalid_domain: geçerli bir alan adı değil errors: @@ -540,10 +529,6 @@ tr: validations: images_and_video: Halihazırda görsel içeren bir gönderiye video ekleyemezsiniz too_many: 4'ten fazla dosya ekleyemezsiniz - migrations: - currently_redirecting: 'Profiliniz yönlendirmek üzere ayarlandı:' - proceed: Kaydet - updated_msg: Hesap taşıma ayarınız başarıyla güncellendi! moderation: title: Yönetim notification_mailer: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 5edbbd1940..ade86d6047 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -17,9 +17,6 @@ uk: contact_unavailable: Недоступно discover_users: Знайдіть цікавих користувачів documentation: Документація - extended_description_html: | -

Гарне місце для правил

-

Детальний опис ще не налаштований.

federation_hint_html: З обліковим записом на %{instance} ви зможете слідкувати за людьми на будь-якому сервері Mastodon та поза ним. generic_description: "%{domain} є одним сервером у мережі" get_apps: Спробуйте мобільний додаток @@ -651,17 +648,6 @@ uk: directory: Каталог профілів explanation: Шукайте користувачів за їх інтересами explore_mastodon: Досліджуйте %{title} - domain_blocks: - blocked_domains: Обмежені та заблоковані домени - description: Перелік серверів, з якими %{instance} не хоче або не буде вступати до федеративних відносин. - domain: Домен - no_domain_blocks: "(Немає заблокованих доменів)" - severity_legend: - media_block: Файли медіа з цього сервера не отримуються, не зберігаються та не відображаються. - suspension: Інформація з призупинених серверів не зберігається та не відображається. Ніякі дані не надсилаються до них, взаємодії ігноруються. - suspension_disclaimer: Призупинені сервери можуть інколи отримувати публічні дані з цього сервера. - show_rationale: Обґрунтування - title: "%{instance} Перелік заблокованих серверів" domain_validator: invalid_domain: не є допустимим ім'ям домену errors: @@ -797,9 +783,6 @@ uk: too_many: Не можна додати більше 4 файлів migrations: acct: username@domain нового облікового запису - currently_redirecting: 'Ваш профіль налаштований перенаправляти до:' - proceed: Зберегти - updated_msg: Налаштування переїзду вашого облікового запису успішно оновлені! moderation: title: Модерація notification_mailer: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 9c6fd27e8d..89506e2232 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -17,9 +17,6 @@ zh-CN: contact_unavailable: 未公开 discover_users: 发现用户 documentation: 文档 - extended_description_html: | -

这里可以写一些规定

-

本站尚未设置详细介绍。

federation_hint_html: 在%{instance} 上拥有账户后,你可以关注任何 Mastodon 服务器或其他服务器上的人。 generic_description: "%{domain} 是这个庞大网络中的一台服务器" get_apps: 尝试移动应用 @@ -593,10 +590,6 @@ zh-CN: directory: 用户目录 explanation: 根据兴趣发现用户 explore_mastodon: 探索 %{title} - domain_blocks: - silence: 隐藏 - suspension: 屏蔽 - title: "%{instance} 已屏蔽实例列表" domain_validator: invalid_domain: 不是一个有效的域名 errors: @@ -730,9 +723,6 @@ zh-CN: too_many: 最多只能添加 4 张图片 migrations: acct: 新帐户的 用户名@域名 - currently_redirecting: 目前你的个人资料页显示的新帐户是: - proceed: 保存 - updated_msg: 帐户迁移设置更新成功! moderation: title: 运营 notification_mailer: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 2c59b3f076..6f77f52c37 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -8,9 +8,6 @@ zh-HK: contact: 聯絡 contact_missing: 未設定 contact_unavailable: 未公開 - extended_description_html: | -

這裡可以寫一些網站規則

-

本站未有詳細介紹

generic_description: "%{domain} 是 Mastodon 網絡中其中一個服務站" hosted_on: 在 %{domain} 運作的 Mastodon 服務站 learn_more: 了解更多 @@ -465,9 +462,6 @@ zh-HK: too_many: 不可以加入超過 4 個檔案 migrations: acct: 新帳戶的 用戶名@域名 - currently_redirecting: 目前你的個人資料頁顯示的新帳戶是: - proceed: 保存 - updated_msg: 帳戶遷移設置更新成功! moderation: title: 營運 notification_mailer: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 8bdbf87aa5..7750d596b7 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -16,9 +16,6 @@ zh-TW: contact_unavailable: 未公開 discover_users: 探索使用者 documentation: 文件 - extended_description_html: | -

這裡可以寫一些網站規則

-

本站點未有詳細介紹

generic_description: "%{domain} 是 Mastodon 網路中其中一個站點" get_apps: 嘗試行動應用程式 hosted_on: 在 %{domain} 運作的 Mastodon 站點 @@ -535,9 +532,6 @@ zh-TW: too_many: 無法加入超過 4 個檔案 migrations: acct: 新帳戶的 使用者名稱@站點網域 - currently_redirecting: 目前你的個人資料頁顯示的新帳戶是: - proceed: 儲存 - updated_msg: 帳戶搬遷設定更新成功! moderation: title: 營運 notification_mailer: From e35636a0d16f3154970d71a305574e59fa2ad393 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Sat, 21 Sep 2019 09:59:37 +0900 Subject: [PATCH 015/107] Fixed an error in the aliases template of the aliases controller (#11902) --- app/controllers/settings/aliases_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/settings/aliases_controller.rb b/app/controllers/settings/aliases_controller.rb index 2b675f065a..da0a4a9fa6 100644 --- a/app/controllers/settings/aliases_controller.rb +++ b/app/controllers/settings/aliases_controller.rb @@ -17,7 +17,7 @@ class Settings::AliasesController < Settings::BaseController if @alias.save redirect_to settings_aliases_path, notice: I18n.t('aliases.created_msg') else - render :show + render :index end end From f497d14b19ce150ee19e6478c9018833e28c7d52 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Sat, 21 Sep 2019 16:11:21 +0900 Subject: [PATCH 016/107] Addition of update activity distribution by alias, minor correction (#11905) * Addition of update activity distribution by alias, minor correction * Distribute Update activity after adding alias * Add uniqueness verification to alias uri * accept acct starting with @ * fix double-quoted to single-quoted --- app/controllers/settings/aliases_controller.rb | 1 + app/models/account_alias.rb | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/app/controllers/settings/aliases_controller.rb b/app/controllers/settings/aliases_controller.rb index da0a4a9fa6..b7c9a409d1 100644 --- a/app/controllers/settings/aliases_controller.rb +++ b/app/controllers/settings/aliases_controller.rb @@ -15,6 +15,7 @@ class Settings::AliasesController < Settings::BaseController @alias = current_account.aliases.build(resource_params) if @alias.save + ActivityPub::UpdateDistributionWorker.perform_async(current_account.id) redirect_to settings_aliases_path, notice: I18n.t('aliases.created_msg') else render :index diff --git a/app/models/account_alias.rb b/app/models/account_alias.rb index e9a0dd79e0..66f8ce4095 100644 --- a/app/models/account_alias.rb +++ b/app/models/account_alias.rb @@ -17,11 +17,17 @@ class AccountAlias < ApplicationRecord validates :acct, presence: true, domain: { acct: true } validates :uri, presence: true + validates :uri, uniqueness: { scope: :account_id } before_validation :set_uri after_create :add_to_account after_destroy :remove_from_account + def acct=(val) + val = val.to_s.strip + super(val.start_with?('@') ? val[1..-1] : val) + end + private def set_uri From b18aea91e3b7c89338c2b0cd07e037e6557514ee Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Sat, 21 Sep 2019 16:11:38 +0900 Subject: [PATCH 017/107] Accept acct starting with @ in account migration (#11907) --- app/models/account_migration.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb index 15830bffbd..e2c2cb0850 100644 --- a/app/models/account_migration.rb +++ b/app/models/account_migration.rb @@ -46,6 +46,11 @@ class AccountMigration < ApplicationRecord created_at + COOLDOWN_PERIOD end + def acct=(val) + val = val.to_s.strip + super(val.start_with?('@') ? val[1..-1] : val) + end + private def set_target_account From a90243a712ac17708de898e302e337de05b7699d Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Sat, 21 Sep 2019 16:11:58 +0900 Subject: [PATCH 018/107] Fixed missing account in MoveDistributionWorker (#11906) --- app/workers/activitypub/move_distribution_worker.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/workers/activitypub/move_distribution_worker.rb b/app/workers/activitypub/move_distribution_worker.rb index 396d5258fe..bf1c0e7ae4 100644 --- a/app/workers/activitypub/move_distribution_worker.rb +++ b/app/workers/activitypub/move_distribution_worker.rb @@ -8,6 +8,7 @@ class ActivityPub::MoveDistributionWorker def perform(migration_id) @migration = AccountMigration.find(migration_id) + @account = @migration.account ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| [signed_payload, @account.id, inbox_url] From ba0de8fb68f5e67312446d1ac351f06d093fc2b8 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 21 Sep 2019 09:12:13 +0200 Subject: [PATCH 019/107] Fix updates being hidden behind pending items on unmounted components (#11898) --- app/javascript/mastodon/actions/notifications.js | 11 +++++++++++ .../mastodon/components/scrollable_list.js | 5 +++++ .../mastodon/features/notifications/index.js | 7 ++++++- app/javascript/mastodon/reducers/notifications.js | 14 +++++++++++--- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index ea76255e38..58803d1ae5 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -28,6 +28,9 @@ export const NOTIFICATIONS_CLEAR = 'NOTIFICATIONS_CLEAR'; export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP'; export const NOTIFICATIONS_LOAD_PENDING = 'NOTIFICATIONS_LOAD_PENDING'; +export const NOTIFICATIONS_MOUNT = 'NOTIFICATIONS_MOUNT'; +export const NOTIFICATIONS_UNMOUNT = 'NOTIFICATIONS_UNMOUNT'; + defineMessages({ mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' }, group: { id: 'notifications.group', defaultMessage: '{count} notifications' }, @@ -215,3 +218,11 @@ export function setFilter (filterType) { dispatch(saveSettings()); }; }; + +export const mountNotifications = () => ({ + type: NOTIFICATIONS_MOUNT, +}); + +export const unmountNotifications = () => ({ + type: NOTIFICATIONS_UNMOUNT, +}); diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js index 253646ed01..b8fa0c2d9a 100644 --- a/app/javascript/mastodon/components/scrollable_list.js +++ b/app/javascript/mastodon/components/scrollable_list.js @@ -199,7 +199,12 @@ export default class ScrollableList extends PureComponent { this.clearMouseIdleTimer(); this.detachScrollListener(); this.detachIntersectionObserver(); + detachFullscreenListener(this.onFullScreenChange); + + if (this.props.onScrollToTop) { + this.props.onScrollToTop(); + } } onFullScreenChange = () => { diff --git a/app/javascript/mastodon/features/notifications/index.js b/app/javascript/mastodon/features/notifications/index.js index 7e5de0613a..d16a0f33a4 100644 --- a/app/javascript/mastodon/features/notifications/index.js +++ b/app/javascript/mastodon/features/notifications/index.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import Column from '../../components/column'; import ColumnHeader from '../../components/column_header'; -import { expandNotifications, scrollTopNotifications, loadPending } from '../../actions/notifications'; +import { expandNotifications, scrollTopNotifications, loadPending, mountNotifications, unmountNotifications } from '../../actions/notifications'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; import NotificationContainer from './containers/notification_container'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; @@ -66,11 +66,16 @@ class Notifications extends React.PureComponent { trackScroll: true, }; + componentWillMount() { + this.props.dispatch(mountNotifications()); + } + componentWillUnmount () { this.handleLoadOlder.cancel(); this.handleScrollToTop.cancel(); this.handleScroll.cancel(); this.props.dispatch(scrollTopNotifications(false)); + this.props.dispatch(unmountNotifications()); } handleLoadGap = (maxId) => { diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index 45d3a5c516..aac644950f 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -7,6 +7,8 @@ import { NOTIFICATIONS_CLEAR, NOTIFICATIONS_SCROLL_TOP, NOTIFICATIONS_LOAD_PENDING, + NOTIFICATIONS_MOUNT, + NOTIFICATIONS_UNMOUNT, } from '../actions/notifications'; import { ACCOUNT_BLOCK_SUCCESS, @@ -22,6 +24,7 @@ const initialState = ImmutableMap({ items: ImmutableList(), hasMore: true, top: false, + mounted: false, unread: 0, isLoading: false, }); @@ -35,9 +38,10 @@ const notificationToMap = notification => ImmutableMap({ }); const normalizeNotification = (state, notification, usePendingItems) => { - const top = state.get('top'); + const top = state.get('top'); + const mounted = state.get('mounted'); - if (usePendingItems || !top || !state.get('pendingItems').isEmpty()) { + if (usePendingItems || (!top && mounted) || !state.get('pendingItems').isEmpty()) { return state.update('pendingItems', list => list.unshift(notificationToMap(notification))).update('unread', unread => unread + 1); } @@ -63,7 +67,7 @@ const expandNormalizedNotifications = (state, notifications, next, isLoadingRece return state.withMutations(mutable => { if (!items.isEmpty()) { - usePendingItems = isLoadingRecent && (usePendingItems || !mutable.get('top') || !mutable.get('pendingItems').isEmpty()); + usePendingItems = isLoadingRecent && (usePendingItems || (!mutable.get('top') && mutable.get('mounted')) || !mutable.get('pendingItems').isEmpty()); mutable.update(usePendingItems ? 'pendingItems' : 'items', list => { const lastIndex = 1 + list.findLastIndex( @@ -134,6 +138,10 @@ export default function notifications(state = initialState, action) { return action.timeline === 'home' ? state.update(action.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items) : state; + case NOTIFICATIONS_MOUNT: + return state.set('mounted', true); + case NOTIFICATIONS_UNMOUNT: + return state.set('mounted', false); default: return state; } From 33b2e0f1895f981c13e3257badcd1210c3d86946 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 21 Sep 2019 20:01:02 +0200 Subject: [PATCH 020/107] Fix "reason" prefix being shown with no reason for public blocks (#11908) --- app/views/about/more.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index 4b3035ee82..cba2fe657e 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -65,7 +65,7 @@ = t('about.unavailable_content_description.silenced') if domain_block.silence? = t('about.unavailable_content_description.rejecting_media') if domain_block.reject_media? - - if display_blocks_rationale? + - if display_blocks_rationale? && domain_block.public_comment.present? %strong= t('about.unavailable_content_description.reason') = domain_block.public_comment From bc5678d0151dd96e0ec5f3d4084ac6356c1d02f5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 21 Sep 2019 20:01:16 +0200 Subject: [PATCH 021/107] Change conversations UI (#11896) Fix #11414, fix #9860, fix #10434 --- .../mastodon/actions/conversations.js | 28 ++++ .../mastodon/components/avatar_composite.js | 28 ++-- .../mastodon/containers/status_container.js | 1 + .../components/conversation.js | 130 +++++++++++++++--- .../containers/conversation_container.js | 75 ++++++++-- .../styles/mastodon/components.scss | 99 ++++++++----- 6 files changed, 286 insertions(+), 75 deletions(-) diff --git a/app/javascript/mastodon/actions/conversations.js b/app/javascript/mastodon/actions/conversations.js index c6e062ef73..4ef654b1f9 100644 --- a/app/javascript/mastodon/actions/conversations.js +++ b/app/javascript/mastodon/actions/conversations.js @@ -15,6 +15,10 @@ export const CONVERSATIONS_UPDATE = 'CONVERSATIONS_UPDATE'; export const CONVERSATIONS_READ = 'CONVERSATIONS_READ'; +export const CONVERSATIONS_DELETE_REQUEST = 'CONVERSATIONS_DELETE_REQUEST'; +export const CONVERSATIONS_DELETE_SUCCESS = 'CONVERSATIONS_DELETE_SUCCESS'; +export const CONVERSATIONS_DELETE_FAIL = 'CONVERSATIONS_DELETE_FAIL'; + export const mountConversations = () => ({ type: CONVERSATIONS_MOUNT, }); @@ -82,3 +86,27 @@ export const updateConversations = conversation => dispatch => { conversation, }); }; + +export const deleteConversation = conversationId => (dispatch, getState) => { + dispatch(deleteConversationRequest(conversationId)); + + api(getState).delete(`/api/v1/conversations/${conversationId}`) + .then(() => dispatch(deleteConversationSuccess(conversationId))) + .catch(error => dispatch(deleteConversationFail(conversationId, error))); +}; + +export const deleteConversationRequest = id => ({ + type: CONVERSATIONS_DELETE_REQUEST, + id, +}); + +export const deleteConversationSuccess = id => ({ + type: CONVERSATIONS_DELETE_SUCCESS, + id, +}); + +export const deleteConversationFail = (id, error) => ({ + type: CONVERSATIONS_DELETE_FAIL, + id, + error, +}); diff --git a/app/javascript/mastodon/components/avatar_composite.js b/app/javascript/mastodon/components/avatar_composite.js index 4a9a73c512..5d5b897492 100644 --- a/app/javascript/mastodon/components/avatar_composite.js +++ b/app/javascript/mastodon/components/avatar_composite.js @@ -35,35 +35,35 @@ export default class AvatarComposite extends React.PureComponent { if (size === 2) { if (index === 0) { - right = '2px'; + right = '1px'; } else { - left = '2px'; + left = '1px'; } } else if (size === 3) { if (index === 0) { - right = '2px'; + right = '1px'; } else if (index > 0) { - left = '2px'; + left = '1px'; } if (index === 1) { - bottom = '2px'; + bottom = '1px'; } else if (index > 1) { - top = '2px'; + top = '1px'; } } else if (size === 4) { if (index === 0 || index === 2) { - right = '2px'; + right = '1px'; } if (index === 1 || index === 3) { - left = '2px'; + left = '1px'; } if (index < 2) { - bottom = '2px'; + bottom = '1px'; } else { - top = '2px'; + top = '1px'; } } @@ -88,7 +88,13 @@ export default class AvatarComposite extends React.PureComponent { return (
- {accounts.take(4).map((account, i) => this.renderItem(account, accounts.size, i))} + {accounts.take(4).map((account, i) => this.renderItem(account, Math.min(accounts.size, 4), i))} + + {accounts.size > 4 && ( + + +{accounts.size - 4} + + )}
); } diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js index fa58589a61..7b0906b396 100644 --- a/app/javascript/mastodon/containers/status_container.js +++ b/app/javascript/mastodon/containers/status_container.js @@ -56,6 +56,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ onReply (status, router) { dispatch((_, getState) => { let state = getState(); + if (state.getIn(['compose', 'text']).trim().length !== 0) { dispatch(openModal('CONFIRM', { message: intl.formatMessage(messages.replyMessage), diff --git a/app/javascript/mastodon/features/direct_timeline/components/conversation.js b/app/javascript/mastodon/features/direct_timeline/components/conversation.js index ffcd6d2811..cc3faf0de6 100644 --- a/app/javascript/mastodon/features/direct_timeline/components/conversation.js +++ b/app/javascript/mastodon/features/direct_timeline/components/conversation.js @@ -2,9 +2,28 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import StatusContainer from '../../../containers/status_container'; +import StatusContent from 'mastodon/components/status_content'; +import AttachmentList from 'mastodon/components/attachment_list'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container'; +import AvatarComposite from 'mastodon/components/avatar_composite'; +import Permalink from 'mastodon/components/permalink'; +import IconButton from 'mastodon/components/icon_button'; +import RelativeTimestamp from 'mastodon/components/relative_timestamp'; +import { HotKeys } from 'react-hotkeys'; -export default class Conversation extends ImmutablePureComponent { +const messages = defineMessages({ + more: { id: 'status.more', defaultMessage: 'More' }, + open: { id: 'conversation.open', defaultMessage: 'View conversation' }, + reply: { id: 'status.reply', defaultMessage: 'Reply' }, + markAsRead: { id: 'conversation.mark_as_read', defaultMessage: 'Mark as read' }, + delete: { id: 'conversation.delete', defaultMessage: 'Delete conversation' }, + muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' }, + unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' }, +}); + +export default @injectIntl +class Conversation extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, @@ -13,11 +32,12 @@ export default class Conversation extends ImmutablePureComponent { static propTypes = { conversationId: PropTypes.string.isRequired, accounts: ImmutablePropTypes.list.isRequired, - lastStatusId: PropTypes.string, + lastStatus: ImmutablePropTypes.map, unread:PropTypes.bool.isRequired, onMoveUp: PropTypes.func, onMoveDown: PropTypes.func, markRead: PropTypes.func.isRequired, + intl: PropTypes.object.isRequired, }; handleClick = () => { @@ -25,13 +45,25 @@ export default class Conversation extends ImmutablePureComponent { return; } - const { lastStatusId, unread, markRead } = this.props; + const { lastStatus, unread, markRead } = this.props; if (unread) { markRead(); } - this.context.router.history.push(`/statuses/${lastStatusId}`); + this.context.router.history.push(`/statuses/${lastStatus.get('id')}`); + } + + handleMarkAsRead = () => { + this.props.markRead(); + } + + handleReply = () => { + this.props.reply(this.props.lastStatus, this.context.router.history); + } + + handleDelete = () => { + this.props.delete(); } handleHotkeyMoveUp = () => { @@ -42,22 +74,88 @@ export default class Conversation extends ImmutablePureComponent { this.props.onMoveDown(this.props.conversationId); } - render () { - const { accounts, lastStatusId, unread } = this.props; + handleConversationMute = () => { + this.props.onMute(this.props.lastStatus); + } - if (lastStatusId === null) { + handleShowMore = () => { + this.props.onToggleHidden(this.props.lastStatus); + } + + render () { + const { accounts, lastStatus, unread, intl } = this.props; + + if (lastStatus === null) { return null; } + const menu = [ + { text: intl.formatMessage(messages.open), action: this.handleClick }, + null, + ]; + + menu.push({ text: intl.formatMessage(lastStatus.get('muted') ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMute }); + + if (unread) { + menu.push({ text: intl.formatMessage(messages.markAsRead), action: this.handleMarkAsRead }); + menu.push(null); + } + + menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDelete }); + + const names = accounts.map(a => ).reduce((prev, cur) => [prev, ', ', cur]); + + const handlers = { + reply: this.handleReply, + open: this.handleClick, + moveUp: this.handleHotkeyMoveUp, + moveDown: this.handleHotkeyMoveDown, + toggleHidden: this.handleShowMore, + }; + return ( - + +
+
+ +
+ +
+
+
+ +
+ +
+ {names} }} /> +
+
+ + + + {lastStatus.get('media_attachments').size > 0 && ( + + )} + +
+ + +
+ +
+
+
+
+
); } diff --git a/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js b/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js index bd6f6bfb01..94cef81a7d 100644 --- a/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js +++ b/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js @@ -1,19 +1,74 @@ import { connect } from 'react-redux'; import Conversation from '../components/conversation'; -import { markConversationRead } from '../../../actions/conversations'; +import { markConversationRead, deleteConversation } from 'mastodon/actions/conversations'; +import { makeGetStatus } from 'mastodon/selectors'; +import { replyCompose } from 'mastodon/actions/compose'; +import { openModal } from 'mastodon/actions/modal'; +import { muteStatus, unmuteStatus, hideStatus, revealStatus } from 'mastodon/actions/statuses'; +import { defineMessages, injectIntl } from 'react-intl'; -const mapStateToProps = (state, { conversationId }) => { - const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId); +const messages = defineMessages({ + 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?' }, +}); - return { - accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)), - unread: conversation.get('unread'), - lastStatusId: conversation.get('last_status', null), +const mapStateToProps = () => { + const getStatus = makeGetStatus(); + + return (state, { conversationId }) => { + const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId); + const lastStatusId = conversation.get('last_status', null); + + return { + accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)), + unread: conversation.get('unread'), + lastStatus: lastStatusId && getStatus(state, { id: lastStatusId }), + }; }; }; -const mapDispatchToProps = (dispatch, { conversationId }) => ({ - markRead: () => dispatch(markConversationRead(conversationId)), +const mapDispatchToProps = (dispatch, { intl, conversationId }) => ({ + + markRead () { + dispatch(markConversationRead(conversationId)); + }, + + reply (status, router) { + dispatch((_, getState) => { + let state = getState(); + + if (state.getIn(['compose', 'text']).trim().length !== 0) { + dispatch(openModal('CONFIRM', { + message: intl.formatMessage(messages.replyMessage), + confirm: intl.formatMessage(messages.replyConfirm), + onConfirm: () => dispatch(replyCompose(status, router)), + })); + } else { + dispatch(replyCompose(status, router)); + } + }); + }, + + delete () { + dispatch(deleteConversation(conversationId)); + }, + + onMute (status) { + if (status.get('muted')) { + dispatch(unmuteStatus(status.get('id'))); + } else { + dispatch(muteStatus(status.get('id'))); + } + }, + + onToggleHidden (status) { + if (status.get('hidden')) { + dispatch(revealStatus(status.get('id'))); + } else { + dispatch(hideStatus(status.get('id'))); + } + }, + }); -export default connect(mapStateToProps, mapDispatchToProps)(Conversation); +export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(Conversation)); diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 17c94e23cd..f4f26203e5 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1276,14 +1276,28 @@ &-composite { @include avatar-radius; + border-radius: 50%; overflow: hidden; + position: relative; + cursor: default; & > div { - @include avatar-radius; float: left; position: relative; box-sizing: border-box; } + + &__label { + display: block; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: $primary-text-color; + text-shadow: 1px 1px 2px $base-shadow-color; + font-weight: 700; + font-size: 15px; + } } } @@ -6383,48 +6397,57 @@ noscript { } } -.layout-toggle { +.conversation { display: flex; + border-bottom: 1px solid lighten($ui-base-color, 8%); padding: 5px; + padding-bottom: 0; - button { - box-sizing: border-box; - flex: 0 0 50%; - background: transparent; - padding: 5px; - border: 0; - position: relative; + &:focus { + background: lighten($ui-base-color, 2%); + outline: 0; + } - &:hover, - &:focus, - &:active { - svg path:first-child { - fill: lighten($ui-base-color, 16%); + &__avatar { + flex: 0 0 auto; + padding: 10px; + padding-top: 12px; + } + + &__content { + flex: 1 1 auto; + padding: 10px 5px; + padding-right: 15px; + + &__info { + overflow: hidden; + } + + &__relative-time { + float: right; + font-size: 15px; + color: $darker-text-color; + padding-left: 15px; + } + + &__names { + color: $darker-text-color; + font-size: 15px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-bottom: 4px; + + a { + color: $primary-text-color; + text-decoration: none; + + &:hover, + &:focus, + &:active { + text-decoration: underline; + } } } } - - svg { - width: 100%; - height: auto; - - path:first-child { - fill: lighten($ui-base-color, 12%); - } - - path:last-child { - fill: darken($ui-base-color, 14%); - } - } - - &__active { - color: $ui-highlight-color; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background: lighten($ui-base-color, 12%); - border-radius: 50%; - padding: 0.35rem; - } } From e87bcaa10761b73d22a6b826e8aa7eebf316bad3 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 21 Sep 2019 20:02:14 +0200 Subject: [PATCH 022/107] Bump version to 3.0.0rc1 (#11900) --- CHANGELOG.md | 4 ++++ lib/mastodon/version.rb | 18 +++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a17fbf8f06..d8f7c77d37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ Changelog All notable changes to this project will be documented in this file. +## Unreleased + +TODO + ## [2.9.3] - 2019-08-10 ### Added diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 99d709c980..bd49f0a173 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -5,19 +5,19 @@ module Mastodon module_function def major - 2 - end - - def minor - 9 - end - - def patch 3 end + def minor + 0 + end + + def patch + 0 + end + def flags - '' + 'rc1' end def suffix From b240f7873f1ffbaf77bda715848005fadbec1701 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 21 Sep 2019 20:04:43 +0200 Subject: [PATCH 023/107] New Crowdin translations (#11901) * New translations en.json (Armenian) [ci skip] * New translations doorkeeper.en.yml (Italian) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations doorkeeper.en.yml (Greek) [ci skip] * New translations en.json (Hungarian) [ci skip] * New translations en.yml (Hungarian) [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 en.json (Japanese) [ci skip] * New translations doorkeeper.en.yml (German) [ci skip] * New translations en.yml (Japanese) [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 en.json (Korean) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations doorkeeper.en.yml (Korean) [ci skip] * New translations en.json (Greek) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Estonian) [ci skip] * New translations doorkeeper.en.yml (Danish) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations doorkeeper.en.yml (Dutch) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations doorkeeper.en.yml (Esperanto) [ci skip] * New translations en.json (Estonian) [ci skip] * New translations doorkeeper.en.yml (Estonian) [ci skip] * New translations en.json (German) [ci skip] * New translations en.json (Finnish) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations doorkeeper.en.yml (Finnish) [ci skip] * New translations en.json (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 doorkeeper.en.yml (Galician) [ci skip] * New translations en.yml (Norwegian Nynorsk) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations en.json (Danish) [ci skip] * New translations en.yml (Telugu) [ci skip] * New translations en.json (Swedish) [ci skip] * New translations 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 (Spanish) [ci skip] * New translations en.json (Thai) [ci skip] * New translations en.yml (Thai) [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 doorkeeper.en.yml (Turkish) [ci skip] * New translations en.json (Welsh) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations doorkeeper.en.yml (Occitan) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.yml (Persian) [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 doorkeeper.en.yml (Polish) [ci skip] * New translations en.json (Portuguese) [ci skip] * New translations doorkeeper.en.yml (Portuguese) [ci skip] * New translations doorkeeper.en.yml (Slovenian) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [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 en.json (Slovenian) [ci skip] * New translations en.yml (Slovenian) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations doorkeeper.en.yml (Czech) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Latvian) [ci skip] * New translations en.json (Ido) [ci skip] * New translations 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 doorkeeper.en.yml (Indonesian) [ci skip] * New translations en.json (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 doorkeeper.en.yml (Hebrew) [ci skip] * New translations en.json (Hebrew) [ci skip] * New translations en.json (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 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 doorkeeper.en.yml (Bulgarian) [ci skip] * New translations doorkeeper.en.yml (Georgian) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations 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 doorkeeper.en.yml (Croatian) [ci skip] * New translations en.json (Georgian) [ci skip] * New translations en.yml (Georgian) [ci skip] * New translations doorkeeper.en.yml (Norwegian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.json (Chinese Simplified) [ci skip] * New translations doorkeeper.en.yml (Basque) [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 doorkeeper.en.yml (Catalan) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.json (Basque) [ci skip] * New translations doorkeeper.en.yml (Chinese Simplified) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations doorkeeper.en.yml (Chinese Traditional) [ci skip] * New translations en.json (Corsican) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations doorkeeper.en.yml (Corsican) [ci skip] * New translations en.json (Czech) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations doorkeeper.en.yml (Arabic) [ci skip] * New translations doorkeeper.en.yml (Russian) [ci skip] * New translations doorkeeper.en.yml (Slovak) [ci skip] * New translations en.json (Serbian (Cyrillic)) [ci skip] * New translations 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 doorkeeper.en.yml (Serbian (Latin)) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.json (Ukrainian) [ci skip] * New translations doorkeeper.en.yml (Albanian) [ci skip] * New translations en.yml (Ukrainian) [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 (Arabic) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.json (Albanian) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations doorkeeper.en.yml (Welsh) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations devise.en.yml (Welsh) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations en.json (Welsh) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations en.json (Czech) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (German) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations simple_form.en.yml (Occitan) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (French) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations devise.en.yml (French) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations devise.en.yml (French) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations devise.en.yml (Spanish) [ci skip] * New translations en.yml (French) [ci skip] * New translations simple_form.en.yml (French) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations simple_form.en.yml (Korean) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations devise.en.yml (Korean) [ci skip] * New translations en.json (Korean) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations devise.en.yml (Korean) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations devise.en.yml (Persian) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Japanese) [ci skip] * i18n-tasks normalize * yarn manage:translations --- app/javascript/mastodon/locales/cs.json | 8 +- app/javascript/mastodon/locales/cy.json | 10 +- app/javascript/mastodon/locales/de.json | 8 +- app/javascript/mastodon/locales/eo.json | 68 +++++------ app/javascript/mastodon/locales/es.json | 18 +-- app/javascript/mastodon/locales/fa.json | 40 +++---- app/javascript/mastodon/locales/fr.json | 8 +- app/javascript/mastodon/locales/ja.json | 24 ++-- app/javascript/mastodon/locales/ko.json | 8 +- app/javascript/mastodon/locales/oc.json | 10 +- app/javascript/mastodon/locales/pt-BR.json | 22 ++-- config/locales/cy.yml | 25 +++++ config/locales/devise.cy.yml | 12 ++ config/locales/devise.es.yml | 12 ++ config/locales/devise.fa.yml | 12 ++ config/locales/devise.fr.yml | 12 ++ config/locales/devise.ko.yml | 12 ++ config/locales/eo.yml | 14 ++- config/locales/es.yml | 19 ++++ config/locales/fa.yml | 89 ++++++++++++++- config/locales/fr.yml | 69 +++++++++++- config/locales/ja.yml | 33 ++++++ config/locales/ko.yml | 21 ++++ config/locales/nl.yml | 26 ++++- config/locales/oc.yml | 20 ++++ config/locales/pt-BR.yml | 124 +++++++++++++++++++++ config/locales/simple_form.cy.yml | 21 ++++ config/locales/simple_form.es.yml | 14 +++ config/locales/simple_form.fa.yml | 8 ++ config/locales/simple_form.fr.yml | 12 ++ config/locales/simple_form.ko.yml | 4 + config/locales/simple_form.oc.yml | 7 ++ 32 files changed, 667 insertions(+), 123 deletions(-) diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 586ca5fd59..e566d46caf 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -111,10 +111,10 @@ "confirmations.reply.message": "Odpovězením nyní přepíšete zprávu, kterou aktuálně píšete. Jste si jistý/á, že chcete pokračovat?", "confirmations.unfollow.confirm": "Přestat sledovat", "confirmations.unfollow.message": "jste si jistý/á, že chcete přestat sledovat uživatele {name}?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Smazat konverzaci", + "conversation.mark_as_read": "Označit jako přečtenou", + "conversation.open": "Zobrazit konverzaci", + "conversation.with": "S {names}", "directory.federated": "Ze známého fedivesmíru", "directory.local": "Pouze z {domain}", "directory.new_arrivals": "Nově příchozí", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index c06f0fd665..eecb43b593 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -25,7 +25,7 @@ "account.mute": "Tawelu @{name}", "account.mute_notifications": "Cuddio hysbysiadau o @{name}", "account.muted": "Distewyd", - "account.never_active": "Never", + "account.never_active": "Byth", "account.posts": "Tŵtiau", "account.posts_with_replies": "Tŵtiau ac atebion", "account.report": "Adrodd @{name}", @@ -63,7 +63,7 @@ "column.notifications": "Hysbysiadau", "column.pins": "Tŵtiau wedi eu pinio", "column.public": "Ffrwd y ffederasiwn", - "column.status": "Toot", + "column.status": "Tŵt", "column_back_button.label": "Nôl", "column_header.hide_settings": "Cuddio dewisiadau", "column_header.moveLeft_settings": "Symud y golofn i'r chwith", @@ -101,7 +101,7 @@ "confirmations.delete_list.message": "Ydych chi'n sicr eich bod eisiau dileu y rhestr hwn am byth?", "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": "Log out", + "confirmations.logout.confirm": "Allgofnodi", "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Tawelu", "confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?", @@ -112,7 +112,7 @@ "confirmations.unfollow.confirm": "Dad-ddilynwch", "confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?", "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", + "conversation.mark_as_read": "Nodi fel wedi'i ddarllen", "conversation.open": "View conversation", "conversation.with": "With {names}", "directory.federated": "From known fediverse", @@ -396,7 +396,7 @@ "upload_error.limit": "Wedi mynd heibio'r uchafswm terfyn uwchlwytho.", "upload_error.poll": "Nid oes modd uwchlwytho ffeiliau â phleidleisiau.", "upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg", - "upload_form.edit": "Edit", + "upload_form.edit": "Golygu", "upload_form.undo": "Dileu", "upload_modal.analyzing_picture": "Analyzing picture…", "upload_modal.apply": "Apply", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 566332293b..58392eecab 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -111,10 +111,10 @@ "confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Unterhaltung löschen", + "conversation.mark_as_read": "Als gelesen markieren", + "conversation.open": "Unterhaltung anzeigen", + "conversation.with": "Mit {names}", "directory.federated": "Aus dem Fediverse", "directory.local": "Nur von {domain}", "directory.new_arrivals": "Neue Benutzer", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 2d7fcd19bc..ee224e9fb1 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -4,7 +4,7 @@ "account.block": "Bloki @{name}", "account.block_domain": "Kaŝi ĉion de {domain}", "account.blocked": "Blokita", - "account.cancel_follow_request": "Nuligi peto de sekvado", + "account.cancel_follow_request": "Nuligi peton de sekvado", "account.direct": "Rekte mesaĝi @{name}", "account.domain_blocked": "Domajno kaŝita", "account.edit_profile": "Redakti profilon", @@ -16,14 +16,14 @@ "account.follows.empty": "Tiu uzanto ankoraŭ ne sekvas iun.", "account.follows_you": "Sekvas vin", "account.hide_reblogs": "Kaŝi diskonigojn de @{name}", - "account.last_status": "Lasta aktiva", + "account.last_status": "Laste aktiva", "account.link_verified_on": "La posedanto de tiu ligilo estis kontrolita je {date}", "account.locked_info": "La privateco de tiu konto estas elektita kiel fermita. La posedanto povas mane akcepti tiun, kiu povas sekvi rin.", "account.media": "Aŭdovidaĵoj", "account.mention": "Mencii @{name}", "account.moved_to": "{name} moviĝis al:", "account.mute": "Silentigi @{name}", - "account.mute_notifications": "Silentigi sciigojn el @{name}", + "account.mute_notifications": "Silentigi sciigojn de @{name}", "account.muted": "Silentigita", "account.never_active": "Neniam", "account.posts": "Mesaĝoj", @@ -38,8 +38,8 @@ "account.unfollow": "Ne plu sekvi", "account.unmute": "Malsilentigi @{name}", "account.unmute_notifications": "Malsilentigi sciigojn de @{name}", - "alert.rate_limited.message": "Bonvolu reprovi poste {retry_time, time, medium}.", - "alert.rate_limited.title": "Rate limited", + "alert.rate_limited.message": "Bonvolu reprovi post {retry_time, time, medium}.", + "alert.rate_limited.title": "Mesaĝkvante limigita", "alert.unexpected.message": "Neatendita eraro okazis.", "alert.unexpected.title": "Ups!", "autosuggest_hashtag.per_week": "{count} semajne", @@ -53,7 +53,7 @@ "column.blocks": "Blokitaj uzantoj", "column.community": "Loka tempolinio", "column.direct": "Rektaj mesaĝoj", - "column.directory": "Browse profiles", + "column.directory": "Trarigardi profilojn", "column.domain_blocks": "Kaŝitaj domajnoj", "column.favourites": "Stelumoj", "column.follow_requests": "Petoj de sekvado", @@ -63,7 +63,7 @@ "column.notifications": "Sciigoj", "column.pins": "Alpinglitaj mesaĝoj", "column.public": "Fratara tempolinio", - "column.status": "Toot", + "column.status": "Mesaĝo", "column_back_button.label": "Reveni", "column_header.hide_settings": "Kaŝi agordojn", "column_header.moveLeft_settings": "Movi kolumnon maldekstren", @@ -79,10 +79,10 @@ "compose_form.lock_disclaimer": "Via konta ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn mesaĝojn, kiuj estas nur por sekvantoj.", "compose_form.lock_disclaimer.lock": "ŝlosita", "compose_form.placeholder": "Pri kio vi pensas?", - "compose_form.poll.add_option": "Aldoni elekto", + "compose_form.poll.add_option": "Aldoni elekteblon", "compose_form.poll.duration": "Balotenketa daŭro", - "compose_form.poll.option_placeholder": "elekto {number}", - "compose_form.poll.remove_option": "Forigi ĉi tiu elekton", + "compose_form.poll.option_placeholder": "Elekteblo {number}", + "compose_form.poll.remove_option": "Forigi ĉi tiu elekteblon", "compose_form.publish": "Hup", "compose_form.publish_loud": "{publish}!", "compose_form.sensitive.hide": "Marki la aŭdovidaĵojn kiel tiklaj", @@ -92,7 +92,7 @@ "compose_form.spoiler.unmarked": "Teksto ne kaŝita", "compose_form.spoiler_placeholder": "Skribu vian averton ĉi tie", "confirmation_modal.cancel": "Nuligi", - "confirmations.block.block_and_report": "Bloki & Signali", + "confirmations.block.block_and_report": "Bloki kaj signali", "confirmations.block.confirm": "Bloki", "confirmations.block.message": "Ĉu vi certas, ke vi volas bloki {name}?", "confirmations.delete.confirm": "Forigi", @@ -111,14 +111,14 @@ "confirmations.reply.message": "Respondi nun anstataŭigos la mesaĝon, kiun vi nun skribas. Ĉu vi certas, ke vi volas daŭrigi?", "confirmations.unfollow.confirm": "Ne plu sekvi", "confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Forigi konversacion", + "conversation.mark_as_read": "Marki legita", + "conversation.open": "Vidi konversacion", + "conversation.with": "Kun {names}", "directory.federated": "El konata fediverso", "directory.local": "Nur de {domain}", - "directory.new_arrivals": "Novaj veniĝoj", - "directory.recently_active": "Recently active", + "directory.new_arrivals": "Novaj alvenoj", + "directory.recently_active": "Lastatempe aktiva", "embed.instructions": "Enkorpigu ĉi tiun mesaĝon en vian retejon per kopio de la suba kodo.", "embed.preview": "Ĝi aperos tiel:", "emoji_button.activity": "Agadoj", @@ -170,18 +170,18 @@ "hashtag.column_settings.tag_mode.all": "Ĉiuj", "hashtag.column_settings.tag_mode.any": "Iu ajn", "hashtag.column_settings.tag_mode.none": "Neniu", - "hashtag.column_settings.tag_toggle": "Inkluzivi pluajn etikedojn por ĉi tiu kolumno", + "hashtag.column_settings.tag_toggle": "Aldoni pliajn etikedojn por ĉi tiu kolumno", "home.column_settings.basic": "Bazaj agordoj", "home.column_settings.show_reblogs": "Montri diskonigojn", "home.column_settings.show_replies": "Montri respondojn", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Tuje ĝisdatigi", "intervals.full.days": "{number, plural, one {# tago} other {# tagoj}}", "intervals.full.hours": "{number, plural, one {# horo} other {# horoj}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutoj}}", "introduction.federation.action": "Sekva", - "introduction.federation.federated.headline": "Federacio", + "introduction.federation.federated.headline": "Fratara", "introduction.federation.federated.text": "Publikaj mesaĝoj el aliaj serviloj de la Fediverse aperos en la fratara tempolinio.", - "introduction.federation.home.headline": "Heimo", + "introduction.federation.home.headline": "Hejmo", "introduction.federation.home.text": "Mesaĝoj de homoj, kiujn vi sekvas, aperos en via hejma fluo. Vi povas sekvi iun ajn de ajna servilo!", "introduction.federation.local.headline": "Loka", "introduction.federation.local.text": "Publikaj mesaĝoj de homoj de via servilo aperos en la loka tempolinio.", @@ -230,7 +230,7 @@ "lightbox.close": "Fermi", "lightbox.next": "Sekva", "lightbox.previous": "Antaŭa", - "lightbox.view_context": "Vidi kontekston", + "lightbox.view_context": "Vidi kuntekston", "lists.account.add": "Aldoni al la listo", "lists.account.remove": "Forigi de la listo", "lists.delete": "Forigi la liston", @@ -240,12 +240,12 @@ "lists.new.title_placeholder": "Titolo de la nova listo", "lists.search": "Serĉi inter la homoj, kiujn vi sekvas", "lists.subheading": "Viaj listoj", - "load_pending": "{count,plural, one {# nova ero} other {# novaj eroj}}", + "load_pending": "{count,plural, one {# nova elemento} other {# novaj elementoj}}", "loading_indicator.label": "Ŝargado…", "media_gallery.toggle_visible": "Baskuligi videblecon", "missing_indicator.label": "Ne trovita", "missing_indicator.sublabel": "Ĉi tiu elemento ne estis trovita", - "mute_modal.hide_notifications": "Ĉu vi volas kaŝi la sciigojn el ĉi tiu uzanto?", + "mute_modal.hide_notifications": "Ĉu vi volas kaŝi la sciigojn de ĉi tiu uzanto?", "navigation_bar.apps": "Telefonaj aplikaĵoj", "navigation_bar.blocks": "Blokitaj uzantoj", "navigation_bar.community_timeline": "Loka tempolinio", @@ -268,7 +268,7 @@ "navigation_bar.preferences": "Preferoj", "navigation_bar.public_timeline": "Fratara tempolinio", "navigation_bar.security": "Sekureco", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "kaj {count, plural, one {# alia} other {# aliaj}}", "notification.favourite": "{name} stelumis vian mesaĝon", "notification.follow": "{name} eksekvis vin", "notification.mention": "{name} menciis vin", @@ -339,7 +339,7 @@ "status.admin_account": "Malfermi la kontrolan interfacon por @{name}", "status.admin_status": "Malfermi ĉi tiun mesaĝon en la kontrola interfaco", "status.block": "Bloki @{name}", - "status.cancel_reblog_private": "Eksdiskonigi", + "status.cancel_reblog_private": "Ne plu diskonigi", "status.cannot_reblog": "Ĉi tiu mesaĝo ne diskonigeblas", "status.copy": "Kopii la ligilon al la mesaĝo", "status.delete": "Forigi", @@ -398,19 +398,19 @@ "upload_form.description": "Priskribi por misvidantaj homoj", "upload_form.edit": "Redakti", "upload_form.undo": "Forigi", - "upload_modal.analyzing_picture": "Analyzing picture…", + "upload_modal.analyzing_picture": "Bilda analizado…", "upload_modal.apply": "Apliki", - "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": "Redakti aŭdvidaĵo", - "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.description_placeholder": "Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj", + "upload_modal.detect_text": "Detekti tekston de la bildo", + "upload_modal.edit_media": "Redakti aŭdovidaĵon", + "upload_modal.hint": "Klaku aŭ trenu la cirklon en la antaŭvidilo por elekti la fokuspunkton kiu ĉiam videblos en ĉiuj etigitaj bildoj.", "upload_modal.preview_label": "Antaŭvido ({ratio})", "upload_progress.label": "Alŝutado…", - "video.close": "Fermi videon", + "video.close": "Fermi la videon", "video.exit_fullscreen": "Eksigi plenekrana", - "video.expand": "Grandigi videon", + "video.expand": "Grandigi la videon", "video.fullscreen": "Igi plenekrana", - "video.hide": "Kaŝi videon", + "video.hide": "Kaŝi la videon", "video.mute": "Silentigi", "video.pause": "Paŭzi", "video.play": "Ekigi", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 33ee263371..54466f1ac3 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -38,11 +38,11 @@ "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": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.message": "Por favor reintente después de {retry_time, time, medium}.", "alert.rate_limited.title": "Tarifa limitada", "alert.unexpected.message": "Hubo un error inesperado.", "alert.unexpected.title": "¡Ups!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} por semana", "boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez", "bundle_column_error.body": "Algo salió mal al cargar este componente.", "bundle_column_error.retry": "Inténtalo de nuevo", @@ -111,10 +111,10 @@ "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Borrar 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.local": "Sólo de {domain}", "directory.new_arrivals": "Recién llegados", @@ -174,7 +174,7 @@ "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": "Update in real-time", + "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}}", @@ -268,7 +268,7 @@ "navigation_bar.preferences": "Preferencias", "navigation_bar.public_timeline": "Historia federada", "navigation_bar.security": "Seguridad", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "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", @@ -404,7 +404,7 @@ "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": "Preview ({ratio})", + "upload_modal.preview_label": "Vista previa ({ratio})", "upload_progress.label": "Subiendo…", "video.close": "Cerrar video", "video.exit_fullscreen": "Salir de pantalla completa", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index c4bcf21ef1..54ab420090 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -3,7 +3,7 @@ "account.badges.bot": "ربات", "account.block": "مسدودسازی @{name}", "account.block_domain": "پنهان‌سازی همه چیز از سرور {domain}", - "account.blocked": "مسدودشده", + "account.blocked": "مسدود شده", "account.cancel_follow_request": "لغو درخواست پیگیری", "account.direct": "پیغام خصوصی به @{name}", "account.domain_blocked": "دامین پنهان‌شده", @@ -16,7 +16,7 @@ "account.follows.empty": "این کاربر هنوز هیچ کسی را پی نمی‌گیرد.", "account.follows_you": "پیگیر شماست", "account.hide_reblogs": "پنهان کردن بازبوق‌های @{name}", - "account.last_status": "Last active", + "account.last_status": "آخرین فعالیت", "account.link_verified_on": "مالکیت این نشانی در تاریخ {date} بررسی شد", "account.locked_info": "این حساب خصوصی است. صاحب این حساب تصمیم می‌گیرد که چه کسی می‌تواند پیگیرش باشد.", "account.media": "عکس و ویدیو", @@ -25,7 +25,7 @@ "account.mute": "بی‌صدا کردن @{name}", "account.mute_notifications": "بی‌صداکردن اعلان‌ها از طرف @{name}", "account.muted": "بی‌صداشده", - "account.never_active": "Never", + "account.never_active": "هرگز", "account.posts": "نوشته‌ها", "account.posts_with_replies": "نوشته‌ها و پاسخ‌ها", "account.report": "گزارش @{name}", @@ -38,8 +38,8 @@ "account.unfollow": "پایان پیگیری", "account.unmute": "باصدا کردن @{name}", "account.unmute_notifications": "باصداکردن اعلان‌ها از طرف @{name}", - "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", - "alert.rate_limited.title": "Rate limited", + "alert.rate_limited.message": "لطفاً پس از {retry_time, time, medium} دوباره تلاش کنید.", + "alert.rate_limited.title": "محدودیت تعداد", "alert.unexpected.message": "خطای پیش‌بینی‌نشده‌ای رخ داد.", "alert.unexpected.title": "ای وای!", "autosuggest_hashtag.per_week": "{count} در هفته", @@ -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": "انتقال ستون به راست", @@ -101,8 +101,8 @@ "confirmations.delete_list.message": "آیا واقعاً می‌خواهید این فهرست را برای همیشه پاک کنید؟", "confirmations.domain_block.confirm": "پنهان‌سازی کل دامین", "confirmations.domain_block.message": "آیا جدی جدی می‌خواهید کل دامین {domain} را مسدود کنید؟ بیشتر وقت‌ها مسدودکردن یا بی‌صداکردن چند حساب کاربری خاص کافی است و توصیه می‌شود. پس از این کار شما هیچ نوشته‌ای را از این دامین در فهرست نوشته‌های عمومی یا اعلان‌هایتان نخواهید دید. پیگیران شما از این دامین هم حذف خواهد شد.", - "confirmations.logout.confirm": "Log out", - "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.confirm": "خروج", + "confirmations.logout.message": "آیا مطمئنید که می‌خواهید خارج شوید؟", "confirmations.mute.confirm": "بی‌صدا کن", "confirmations.mute.message": "آیا واقعاً می‌خواهید {name} را بی‌صدا کنید؟", "confirmations.redraft.confirm": "پاک‌کردن و بازنویسی", @@ -111,14 +111,14 @@ "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", - "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "conversation.delete": "حذف گفتگو", + "conversation.mark_as_read": "علامت‌گذاری به عنوان خوانده شده", + "conversation.open": "دیدن گفتگو", + "conversation.with": "با {names}", + "directory.federated": "از سرورهای همسایه", + "directory.local": "تنها از {domain}", + "directory.new_arrivals": "تازه‌واردان", + "directory.recently_active": "کاربران فعال اخیر", "embed.instructions": "برای جاگذاری این نوشته در سایت خودتان، کد زیر را کپی کنید.", "embed.preview": "نوشتهٔ جاگذاری‌شده این گونه به نظر خواهد رسید:", "emoji_button.activity": "فعالیت", @@ -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, one {# روز} other {# روز}}", "intervals.full.hours": "{number, plural, one {# ساعت} other {# ساعت}}", "intervals.full.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}}", @@ -268,7 +268,7 @@ "navigation_bar.preferences": "ترجیحات", "navigation_bar.public_timeline": "نوشته‌های همه‌جا", "navigation_bar.security": "امنیت", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "و {count, plural, one {# اعلان دیگر} other {# اعلان دیگر}}", "notification.favourite": "‫{name}‬ نوشتهٔ شما را پسندید", "notification.follow": "‫{name}‬ پیگیر شما شد", "notification.mention": "‫{name}‬ از شما نام برد", @@ -373,7 +373,7 @@ "status.show_more": "نمایش", "status.show_more_all": "نمایش بیشتر همه", "status.show_thread": "نمایش گفتگو", - "status.uncached_media_warning": "Not available", + "status.uncached_media_warning": "ناموجود", "status.unmute_conversation": "باصداکردن گفتگو", "status.unpin": "برداشتن نوشتهٔ ثابت نمایه", "suggestions.dismiss": "پیشنهاد را نادیده بگیر", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 59c9ce8003..a3b0bb3f59 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -111,10 +111,10 @@ "confirmations.reply.message": "Répondre maintenant écrasera le message que vous êtes en train de composer. Voulez-vous vraiment continuer ?", "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous arrêter de suivre {name} ?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Supprimer la conversation", + "conversation.mark_as_read": "Marquer comme lu", + "conversation.open": "Afficher la conversation", + "conversation.with": "Avec {names}", "directory.federated": "De la fédiverse connue", "directory.local": "De {domain} seulement", "directory.new_arrivals": "Nouveaux arrivants", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index e665a9f18d..27fa7e93f5 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -38,7 +38,7 @@ "account.unfollow": "フォロー解除", "account.unmute": "@{name}さんのミュートを解除", "account.unmute_notifications": "@{name}さんからの通知を受け取るようにする", - "alert.rate_limited.message": "{retry_time, time, medium} 後に再試行してください。", + "alert.rate_limited.message": "{retry_time, time, medium} 以降に再試行してください。", "alert.rate_limited.title": "制限に達しました", "alert.unexpected.message": "不明なエラーが発生しました。", "alert.unexpected.title": "エラー!", @@ -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,11 +111,11 @@ "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": "既知の連合全体", + "conversation.delete": "このやりとりを削除", + "conversation.mark_as_read": "既読にする", + "conversation.open": "会話を表示する", + "conversation.with": "{names} を付ける", + "directory.federated": "既知の連合より", "directory.local": "{domain} のみ", "directory.new_arrivals": "新着順", "directory.recently_active": "最近の活動順", @@ -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}日", "intervals.full.hours": "{number}時間", "intervals.full.minutes": "{number}分", @@ -268,7 +268,7 @@ "navigation_bar.preferences": "ユーザー設定", "navigation_bar.public_timeline": "連合タイムライン", "navigation_bar.security": "セキュリティ", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "と、その他 {count, plural, one {#} other {#}}", "notification.favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました", "notification.follow": "{name}さんにフォローされました", "notification.mention": "{name}さんがあなたに返信しました", @@ -389,7 +389,7 @@ "time_remaining.moments": "まもなく終了", "time_remaining.seconds": "残り{number}秒", "trends.count_by_accounts": "{count}人がトゥート", - "trends.trending_now": "トレンドタグ", + "trends.trending_now": "トレンド", "ui.beforeunload": "Mastodonから離れると送信前の投稿は失われます。", "upload_area.title": "ドラッグ&ドロップでアップロード", "upload_button.label": "メディアを追加 ({formats})", @@ -403,7 +403,7 @@ "upload_modal.description_placeholder": "素早い茶色の狐はのろまな犬を飛び越える", "upload_modal.detect_text": "画像からテキストを検出", "upload_modal.edit_media": "メディアを編集", - "upload_modal.hint": "画像をクリックするか円をドラッグすると全てのサムネイルで注目する場所を選ぶことができます", + "upload_modal.hint": "画像をクリックするか円をドラッグすると全てのサムネイルの中心点を決めることができます", "upload_modal.preview_label": "プレビュー ({ratio})", "upload_progress.label": "アップロード中...", "video.close": "動画を閉じる", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 6f05969278..def02860bb 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -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": "알려진 연합우주로부터", "directory.local": "{domain}에서만", "directory.new_arrivals": "새로운 사람들", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 38f3f82c14..e3322baf4b 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -111,10 +111,10 @@ "confirmations.reply.message": "Respondre remplaçarà lo messatge que sètz a escriure. Volètz vertadièrament contunhar ?", "confirmations.unfollow.confirm": "Quitar de sègre", "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Suprimir la conversacion", + "conversation.mark_as_read": "Marcar coma legida", + "conversation.open": "Veire la conversacion", + "conversation.with": "Amb {names}", "directory.federated": "Del fediverse conegut", "directory.local": "Solament de {domain}", "directory.new_arrivals": "Nòus-venguts", @@ -403,7 +403,7 @@ "upload_modal.description_placeholder": "Lo dròlle bilingüe manja un yaourt de ròcs exagonals e kiwis verds farà un an mai", "upload_modal.detect_text": "Detectar lo tèxt de l’imatge", "upload_modal.edit_media": "Modificar lo mèdia", - "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.hint": "Clicatz o lissatz lo cercle de l’apercebut per causir lo ponch que serà totjorn visible dins las vinhetas.", "upload_modal.preview_label": "Apercebut ({ratio})", "upload_progress.label": "Mandadís…", "video.close": "Tampar la vidèo", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 1ee44c283c..e1e7e2cd12 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -4,7 +4,7 @@ "account.block": "Bloquear @{name}", "account.block_domain": "Esconder tudo de {domain}", "account.blocked": "Bloqueado", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Cancelar solicitação para seguir", "account.direct": "Direct Message @{name}", "account.domain_blocked": "Domínio escondido", "account.edit_profile": "Editar perfil", @@ -25,7 +25,7 @@ "account.mute": "Silenciar @{name}", "account.mute_notifications": "Silenciar notificações de @{name}", "account.muted": "Silenciado", - "account.never_active": "Never", + "account.never_active": "Nunca", "account.posts": "Toots", "account.posts_with_replies": "Toots e respostas", "account.report": "Denunciar @{name}", @@ -38,11 +38,11 @@ "account.unfollow": "Deixar de seguir", "account.unmute": "Não silenciar @{name}", "account.unmute_notifications": "Retirar silêncio das notificações vindas de @{name}", - "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.message": "Por favor tente novamente após {retry_time, time, medium}.", "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Um erro inesperado ocorreu.", "alert.unexpected.title": "Eita!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} por semana", "boost_modal.combo": "Você pode pressionar {combo} para ignorar este diálogo na próxima vez", "bundle_column_error.body": "Algo de errado aconteceu enquanto este componente era carregado.", "bundle_column_error.retry": "Tente novamente", @@ -111,14 +111,14 @@ "confirmations.reply.message": "Responder agora vai sobrescrever a mensagem que você está compondo. Você tem certeza que quer continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {name}?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", + "conversation.delete": "Excluir conversa", + "conversation.mark_as_read": "Marcar como lida", "conversation.open": "View conversation", "conversation.with": "With {names}", - "directory.federated": "From known fediverse", + "directory.federated": "De fediverso conhecido", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "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á:", "emoji_button.activity": "Atividades", @@ -338,7 +338,7 @@ "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", - "status.block": "Block @{name}", + "status.block": "Bloquear @{name}", "status.cancel_reblog_private": "Desfazer compartilhamento", "status.cannot_reblog": "Esta postagem não pode ser compartilhada", "status.copy": "Copiar o link para o status", @@ -398,10 +398,10 @@ "upload_form.description": "Descreva a imagem para deficientes visuais", "upload_form.edit": "Edit", "upload_form.undo": "Remover", - "upload_modal.analyzing_picture": "Analyzing picture…", + "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.detect_text": "Detect text from picture", + "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.", "upload_modal.preview_label": "Preview ({ratio})", diff --git a/config/locales/cy.yml b/config/locales/cy.yml index ece0a34a3f..2027a7316b 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -36,6 +36,12 @@ cy: status_count_before: Ysgriffennwyd gan tagline: Dilyn ffrindiau a darganfod rhai newydd terms: Telerau gwasanaeth + unavailable_content: Cynnwys nad yw ar gael + unavailable_content_description: + 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. + 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 many: defnyddwyr @@ -62,6 +68,7 @@ cy: media: Cyfryngau moved_html: 'Mae %{name} wedi symud i %{new_profile_link}:' network_hidden: Nid yw'r wybodaeth hyn ar gael + never_active: Peidiwch byth nothing_here: Does dim byd yma! people_followed_by: Pobl y mae %{name} yn ei ddilyn people_who_follow: Pobl sy'n dilyn %{name} @@ -235,6 +242,7 @@ cy: copied_msg: Llwyddwyd i greu copi lleol o'r emoji copy: Copïo copy_failed_msg: Methwyd i greu copi lleol o'r emoji hwnnw + create_new_category: Create new category created_msg: Llwyddwyd i greu emoji! delete: Dileu destroyed_msg: Llwyddwyd i ddinistrio emojo! @@ -251,6 +259,7 @@ cy: shortcode: Byrgod shortcode_hint: O leiaf 2 nodyn, dim ond nodau alffaniwmerig a tanlinellau title: Emoji unigryw + uncategorized: Heb gategori unlisted: Heb eu rhestru update_failed_msg: Methwyd a diweddaru'r emoji hwnnw updated_msg: Llwyddwyd i ddiweddaru'r emoji! @@ -263,10 +272,13 @@ cy: feature_profile_directory: Cyfeiriadur proffil feature_registrations: Cofrestriadau feature_relay: Relái ffederasiwn + feature_spam_check: Gwrth-sbam feature_timeline_preview: Rhagolwg o'r ffrwd features: Nodweddion hidden_service: Ffederasiwn a gwasanaethau cudd open_reports: adroddiadau agored + pending_tags: hashnodau yn aros am adolygiad + pending_users: defnyddwyr yn aros am adolygiad recent_users: Defnyddwyr diweddar search: Chwilio testun llawn single_user_mode: Modd un defnyddiwr @@ -293,6 +305,8 @@ cy: silence: Tawelwch suspend: Atal title: Blocio parth newydd + private_comment: Sylw preifat + public_comment: Sylw cyhoeddus reject_media: Gwrthod dogfennau cyfryngau reject_media_hint: Dileu dogfennau cyfryngau wedi eu cadw yn lleol ac yn gwrthod i lawrlwytho unrhyw rai yn y dyfodol. Amherthnasol i ataliadau reject_reports: Gwrthod adroddiadau @@ -343,6 +357,8 @@ cy: all: Pob limited: Gyfyngedig title: Goruwchwyliad + private_comment: Sylw preifat + public_comment: Sylw cyhoeddus title: Ffederasiwn total_blocked_by_us: Wedi'i bloc gan ni total_followed_by_them: Yn dilyn ganynt @@ -420,6 +436,8 @@ cy: custom_css: desc_html: Addasu gwedd gyda CSS wedi lwytho ar bob tudalen title: CSS wedi'i addasu + domain_blocks: + all: I bawb hero: desc_html: Yn cael ei arddangos ar y dudadlen flaen. Awgrymir 600x100px oleia. Pan nad yw wedi ei osod, mae'n ymddangos fel mân-lun yr achos title: Delwedd arwr @@ -491,7 +509,12 @@ cy: title: Statysau cyfrif with_media: A chyfryngau tags: + context: Cyd-destun + last_active: Yn weithredol ddiwethaf + name: Hashnod + reviewed: Wedi'i adolygu title: Hashnodau + unreviewed: Heb ei adolygu title: Gweinyddiaeth warning_presets: add_new: Ychwanegu newydd @@ -725,6 +748,8 @@ cy: too_many: Ni ellir ychwanegu mwy na 4 dogfen migrations: acct: enwdefnyddiwr@parth y cyfrif newydd + errors: + not_found: ni ellid dod o hyd iddo moderation: title: Goruwchwyliad notification_mailer: diff --git a/config/locales/devise.cy.yml b/config/locales/devise.cy.yml index 727c714644..e5366f8cdf 100644 --- a/config/locales/devise.cy.yml +++ b/config/locales/devise.cy.yml @@ -46,6 +46,18 @@ cy: extra: Os na wnaethoch gais am hyn, anwybyddwch yr e-bost hwn os gwelwch yn dda. Ni fydd eich cyfrinair yn newid nes i chi fynd at y ddolen uchod a chreu un newydd. subject: 'Mastodon: Ailosod cyfarwyddiadau cyfrinair' title: Ailosod cyfrinair + two_factor_disabled: + explanation: Mae dilysu dau ffactor ar gyfer eich cyfrif wedi'i anablu. Mae mewngofnodi bellach yn bosibl gan ddefnyddio cyfeiriad e-bost a chyfrinair yn unig. + subject: 'Mastodon: Dilysu dau ffactor yn anabl' + title: Dilysu dau ffactor yn anabl + two_factor_enabled: + explanation: Mae dilysu dau ffactor wedi'i alluogi ar gyfer eich cyfrif. Bydd angen tocyn a gynhyrchir gan yr ap TOTP pâr i fewngofnodi. + subject: 'Mastodon: mae dilysu dau ffactor wedi''i alluogi' + title: Mae dilysu dau ffactor wedi'i alluogi + two_factor_recovery_codes_changed: + explanation: Mae'r codau adfer blaenorol wedi'u hannilysu a chynhyrchwyd rhai newydd. + subject: 'Mastodon: Mae codau adfer dau ffactor wedi''u hadfywio' + title: Newidiodd codau adfer 2FA unlock_instructions: subject: 'Mastodon: Cyfarwyddiadau datgloi' omniauth_callbacks: diff --git a/config/locales/devise.es.yml b/config/locales/devise.es.yml index 8210415f21..80d4380923 100644 --- a/config/locales/devise.es.yml +++ b/config/locales/devise.es.yml @@ -46,6 +46,18 @@ es: 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: diff --git a/config/locales/devise.fa.yml b/config/locales/devise.fa.yml index 963572e6b4..0954c8484b 100644 --- a/config/locales/devise.fa.yml +++ b/config/locales/devise.fa.yml @@ -46,6 +46,18 @@ fa: extra: اگر شما چنین درخواستی نکردید، لطفاً این ایمیل را نادیده بگیرید. تا زمانی که شما پیوند بالا را باز نکنید و رمز تازه‌ای نسازید، رمز شما عوض نخواهد شد. subject: 'ماستدون: راهنمایی برای بازنشانی رمز' title: بازنشانی رمز + two_factor_disabled: + explanation: ورود دومرحله‌ای برای حساب شما غیرفعال شده است. از الان می‌توانید تنها با نشانی ایمیل و رمز وارد حساب خود شوید. + subject: 'ماستدون: ورود دومرحله‌ای فعال نیست' + title: ورود دومرحله‌ای غیرفعال + two_factor_enabled: + explanation: ورود دومرحله‌ای برای حساب شما فعال شده است. برای ورود به کدی نیاز خواهید داشت که نرم‌افزار TOTP از پیش تنظیم شده برایتان می‌سازد. + subject: 'ماستدون: ورود دومرحله‌ای فعال است' + title: ورود دومرحله‌ای فعال + two_factor_recovery_codes_changed: + explanation: کدهای بازیابی قبلی نامعتبر شده‌اند و کدهای تازه‌ای ساخته شده‌اند. + subject: 'ماستدون: کدهای بازیابی برای ورود دومرحله‌ای دوباره ساخته شدند' + title: کدهای ورود دومرحله‌ای تغییر کرد unlock_instructions: subject: 'ماستدون: راهنمایی برای بازکردن قفل' omniauth_callbacks: diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml index 321e72f4ad..dc89b478b1 100644 --- a/config/locales/devise.fr.yml +++ b/config/locales/devise.fr.yml @@ -46,6 +46,18 @@ fr: extra: Si vous ne l’avez pas demandé, veuillez ignorer ce courriel. Votre mot de passe ne changera pas tant que vous n’aurez pas cliqué sur le lien ci-dessus et que vous n’en aurez pas créé un nouveau. subject: 'Mastodon : Instructions pour changer votre mot de passe' title: Réinitialisation du mot de passe + two_factor_disabled: + explanation: L'authentification à deux facteurs pour votre compte a été désactivée. La connexion est maintenant possible en utilisant uniquement l'adresse courriel et le mot de passe. + subject: 'Mastodon : authentification à deux facteurs désactivée' + title: 2FA désactivée + two_factor_enabled: + explanation: L'authentification à deux facteurs a été activée pour votre compte. Un jeton généré par l'application appariée TOTP sera nécessaire pour vous connecter. + subject: 'Mastodon : authentification à deux facteurs activée' + title: A2F activée + two_factor_recovery_codes_changed: + explanation: Les codes de récupération précédents ont été invalidés et de nouveaux sont générés. + subject: 'Mastodon : codes de récupération à deux facteurs ré-générés' + title: Codes de récupération 2FA modifiés unlock_instructions: subject: 'Mastodon : Instructions pour déverrouiller votre compte' omniauth_callbacks: diff --git a/config/locales/devise.ko.yml b/config/locales/devise.ko.yml index f48531246e..63072340cf 100644 --- a/config/locales/devise.ko.yml +++ b/config/locales/devise.ko.yml @@ -46,6 +46,18 @@ ko: extra: 만약 당신이 시도한 것이 아니라면 이 메일을 무시해 주세요. 위 링크를 클릭해 패스워드를 새로 설정하기 전까지는 패스워드가 바뀌지 않습니다. subject: '마스토돈: 패스워드 재설정 방법' title: 패스워드 재설정 + two_factor_disabled: + explanation: 당신의 계정에 설정된 이중 인증이 비활성화 되었습니다. 이제 이메일과 비밀번호만으로 로그인이 가능합니다. + subject: '마스토돈: 이중 인증 비활성화' + title: 2FA 비활성화 + two_factor_enabled: + explanation: 당신의 계정에 이중 인증이 활성화되었습니다. 로그인을 위해 페어링된 T-OTP 앱에서 생성된 토큰이 필요합니다. + subject: '마스토돈: 이중 인증 활성화' + title: 2FA 활성화 + two_factor_recovery_codes_changed: + explanation: 이전 복구 코드가 무효화되어 새 코드가 생성되었습니다 + subject: '마스토돈: 이중 인증 복구 코드 재생성됨' + title: 2FA 복구 코드 변경됨 unlock_instructions: subject: '마스토돈: 잠금 해제 방법' omniauth_callbacks: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 6200168303..ae8ea32565 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1,7 +1,7 @@ --- eo: about: - about_hashtag_html: Ĉi tiuj estas la publikaj fajfoj markitaj per #%{hashtag}. Vi povas interagi kun ili se vi havas konton ie ajn en la fediverse. + about_hashtag_html: Ĉi tiuj estas la publikaj mesaĝoj markitaj per #%{hashtag}. Vi povas interagi kun ili se vi havas konton ie ajn en la fediverse. about_mastodon_html: Mastodon estas socia reto bazita sur malfermitaj retaj protokoloj kaj sur libera malfermitkoda programo. Ĝi estas sencentra kiel retmesaĝoj. about_this: Pri active_count_after: aktiva @@ -21,6 +21,9 @@ eo: generic_description: "%{domain} estas unu servilo en la reto" get_apps: Provu telefonan aplikaĵon hosted_on: "%{domain} estas nodo de Mastodon" + instance_actor_flash: | + Ĉi tiu konto estas virtuala ulo uzata por reprezenti la servilon mem kaj ne iun apartan uzanton. + Ĝi estas uzata por frataraj celoj kaj ĝi ne devus esti blokita krom se vi volas bloki la tutan servilon, tiuokaze vi devus uzi domajnan blokadon. learn_more: Lerni pli privacy_policy: Privateca politiko see_whats_happening: Vidi kio okazas @@ -32,6 +35,9 @@ eo: status_count_before: Kie skribiĝis tagline: Sekvi amikojn kaj trovi novan onin terms: Uzkondiĉoj + unavailable_content: Nedisponebla enhavo + unavailable_content_description: + reason: 'Kialo:' user_count_after: one: uzanto other: uzantoj @@ -482,7 +488,7 @@ eo: back_to_account: Reveni al konta paĝo batch: delete: Forigi - nsfw_off: Marki ne tikla + nsfw_off: Marki netikla nsfw_on: Marki tikla deleted: Forigita failed_to_execute: Ekigo malsukcesa @@ -521,6 +527,7 @@ eo: subject: Nova kradvorto kontrolebla en %{instance} (#%{name}) appearance: advanced_web_interface: Altnivela retpaĝa interfaco + 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 sensitive_content: Tikla enhavo @@ -642,6 +649,7 @@ eo: add_new: Aldoni novan errors: limit: Vi jam elstarigis la maksimuman kvanton da kradvortoj + hint_html: "Kio estas la trajtaj kradvortoj? Ili bone videblas en via publika profilo kaj permesas al homoj trarigardi viajn publikajn mesaĝojn specife laŭ tiuj kradvortoj. Ili estas bonaj iloj por sekvi la evoluon de kreadaj laboroj aŭ longdaŭraj projektoj." filters: contexts: home: Hejma templinio @@ -673,7 +681,7 @@ eo: one: Io mise okazis! Bonvolu konsulti la suban erar-raporton other: Io mise okazis! Bonvolu konsulti la subajn %{count} erar-raportojn html_validator: - invalid_markup: 'havas malvalida HTML markado: %{error}' + invalid_markup: 'havas nevalidan HTML-markadon: %{error}' identity_proofs: active: Aktiva authorize: Jes, permesi diff --git a/config/locales/es.yml b/config/locales/es.yml index 3703f92ff5..ef22c7b827 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -35,6 +35,13 @@ es: 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 @@ -42,6 +49,8 @@ es: 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 @@ -225,6 +234,7 @@ es: 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!" @@ -420,6 +430,9 @@ es: 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 @@ -503,6 +516,10 @@ es: 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 @@ -595,6 +612,8 @@ es: 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" diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 7393341647..b19cd4c96c 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -35,6 +35,13 @@ fa: status_count_before: که در کنار هم tagline: با دوستان خود در ارتباط باشید و دوستان تازه پیدا کنید terms: شرایط کاربری + unavailable_content: محتوای ناموجود + unavailable_content_description: + reason: 'دلیل:' + rejecting_media: تصاویر فرستاده شده از سمت این سرور پردازش نخواهد شد و هیچ تصویر کوچکی از آن‌ها در این‌جا نمایش نخواهد یافت، و آن‌ها را باید مستقیماً در آن سرور ببینید. + silenced: هیچ کدام از نوشته‌ها از طرف این سرور این‌جا نمایش نخواهند یافت مگر در فهرست پیگیری‌ها شما، اگر نویسنده‌اش را پی بگیرید. + suspended: شما نمی‌توانید هیچ کدام از کاربرهای این سرور را پی بگیرید، و هیچ داده‌ای از طرف این سرور پردازش یا ذخیره یا مبادله نخواهد شد. + unavailable_content_html: ماستدون در حالت کلی اجازه می‌دهد که شما همهٔ مطالب و کاربران در سرورهای دیگر را نیز ببینید و با آن‌ها برهم‌کنش داشته باشید. فهرست زیر ولی استثناهای این ارتباط است که به طور خاص روی این سرور اعمال شده‌اند. user_count_after: one: کاربر other: کاربر @@ -55,6 +62,7 @@ fa: media: عکس و ویدیو moved_html: "%{name} حساب خود را به %{new_profile_link} منتقل کرده است:" network_hidden: این اطلاعات در دسترس نیست + never_active: هرگز nothing_here: این‌جا چیزی نیست! people_followed_by: کسانی که %{name} پی می‌گیرد people_who_follow: کسانی که %{name} را پی می‌گیرند @@ -221,10 +229,12 @@ fa: deleted_status: "(بوق پاک‌شده)" title: سیاههٔ بازرسی custom_emojis: + assign_category: تعیین دسته by_domain: دامین copied_msg: نسخهٔ محلی شکلک با موفقیت ساخته شد copy: نسخه‌برداری copy_failed_msg: نشد که نسخهٔ محلی این شکلک ساخته شود + create_new_category: ساختن دستهٔ تازه created_msg: این شکلک با موفقیت ساخته شد! delete: پاک کردن destroyed_msg: این شکلک با موفقیت پاک شد! @@ -241,11 +251,13 @@ fa: shortcode: کد کوتاه shortcode_hint: دست‌کم ۲ نویسه و تنها شامل حروف، اعداد و زیرخط title: شکلک‌های سفارشی + uncategorized: دسته‌بندی نشده unlisted: فهرست‌نشده update_failed_msg: این شکلک نتوانست به‌روز شود updated_msg: شکلک با موفقیت به‌روز شد! upload: بارگذاری dashboard: + authorized_fetch_mode: حالت دریافت مجازشده backlog: کارهای باقیمانده config: پیکربندی feature_deletions: حساب‌های حذف‌شده @@ -419,6 +431,9 @@ fa: custom_css: desc_html: ظاهر ماستدون را با CSS-ای که در همهٔ صفحه‌ها جاسازی می‌شود تغییر دهید title: سبک CSS سفارشی + default_noindex: + desc_html: روی همهٔ کاربرانی که این تنظیم را خودشان تغییر نداده‌اند تأثیر می‌گذارد + title: درخواست پیش‌فرض از طرف کاربران برای ظاهر نشدن در نتایج موتورهای جستجوگر domain_blocks: all: برای همه disabled: برای هیچ‌کدام @@ -510,6 +525,10 @@ fa: context: زمینه directory: در فهرست in_directory: "%{count} در فهرست" + last_active: آخرین فعالیت + most_popular: محبوب‌ترین + most_recent: تازه‌ترین + name: برچسب review: وضعیت بازبینی reviewed: بازبینی شده title: برچسب‌ها @@ -535,6 +554,12 @@ fa: new_trending_tag: body: 'برچسب #%{name} امروز پرطرفدار است، ولی تا حالا بازبینی نشده. تا وقتی که شما اجازه نداده‌اید، این برچسب به طور عمومی نمایش داده نخواهد شد. اگر فرم را به شکل فعلی ذخیره کنید، هیچ وقت چیزی دربارهٔ این برچسب نخواهید دید.' subject: برچسب تازه‌ای در %{instance} نیازمند بررسی است (#%{name}) + aliases: + add_new: ساختن نام مستعار + created_msg: نام مستعار تازه با موفقیت ساخته شد. الان می‌توانید انتقال از حساب قدیمی را آغاز کنید. + deleted_msg: نام مستعار با موفقیت حذف شد. انتقال از آن حساب به حساب فعلی دیگر ممکن نیست. + hint_html: اگر می‌خواهید از حساب دیگری به این حساب منتقل شوید، این‌جا می‌توانید یک نام مستعار بسازید که برای انتقال از حساب قدیمی به این حساب لازم است. این کار به تنهایی بی‌ضرر و قابل بازگشت است. فرایند انتقال حساب از حساب قدیمی آغاز خواهد شد. + remove: حذف ارتباط نام مستعار appearance: advanced_web_interface: رابط کاربری پیشرفته advanced_web_interface_hint: 'اگر می‌خواهید همهٔ فضای نمایشگر خود را به کار ببرید، می‌توانید به کمک رابط کاربری پیشرفته ستون‌های گوناگونی داشته باشید تا در یک نگاه همهٔ اطلاعاتی را که می‌خواهید ببینید: نوشته‌های دیگران، اعلان‌ها، فهرست نوشته‌های همه‌جا، و هر تعداد فهرست و برچسب که بخواهید.' @@ -564,6 +589,10 @@ fa: checkbox_agreement_without_rules_html: من با شرایط استفاده موافقم delete_account: پاک‌کردن حساب delete_account_html: اگر می‌خواهید حساب خود را پاک کنید، از این‌جا پیش بروید. از شما درخواست تأیید خواهد شد. + description: + prefix_invited_by_user: "@%{name} شما را به عضویت در این سرور ماستدون دعوت کرده است!" + prefix_sign_up: همین امروز عضو ماستدون شوید! + suffix: با داشتن حساب می‌توانید دیگران را پی بگیرید، نوشته‌های تازه منتشر کنید، و با کاربران دیگر از هر سرور ماستدون دیگری و حتی سرورهای دیگر در ارتباط باشید! didnt_get_confirmation: راهنمایی برای تأیید را دریافت نکردید؟ forgot_password: رمزتان را گم کرده‌اید؟ invalid_reset_password_token: کد بازنشانی رمز نامعتبر یا منقضی شده است. لطفاً کد دیگری درخواست کنید. @@ -590,6 +619,7 @@ fa: confirming: در حال انتظار برای کامل شدن تأیید ایمیل. functional: حساب شما قابل استفاده است. pending: درخواست شما منتظر تأیید مسئولان سایت است و این فرایند ممکن است کمی طول بکشد. اگر درخواست شما پذیرفته شود به شما ایمیلی فرستاده خواهد شد. + redirecting_to: حساب شما غیرفعال است زیرا هم‌اکنون به %{acct} منتقل شده است. trouble_logging_in: برای ورود مشکلی دارید؟ authorize_follow: already_following: شما همین الان هم این حساب را پی‌می‌گیرید @@ -602,6 +632,11 @@ fa: return: نمایهٔ این کاربر را نشان بده web: رفتن به وب title: پیگیری %{acct} + challenge: + confirm: ادامه + hint_html: "نکته: ما در یک ساعت آینده رمزتان را از شما نخواهیم پرسید." + invalid_password: رمز نامعتبر + prompt: برای ادامه رمزتان را تأیید کنید datetime: distance_in_words: about_x_hours: "%{count} ساعت" @@ -617,18 +652,33 @@ fa: x_months: "%{count} ماه" x_seconds: "%{count} ثانیه" deletes: + challenge_not_passed: اطلاعاتی که وارد کردید اشتباه بود confirm_password: رمز فعلی خود را وارد کنید تا معلوم شود که خود شمایید + confirm_username: برای تأیید این فرایند نام کاربری خود را وارد کنید proceed: پاک‌کردن حساب success_msg: حساب شما با موفقیت پاک شد + warning: + before: 'پیش از ادامه،‌ لطفاً نکته‌های زیر را به دقت بخوانید:' + caches: محتواهایی که سرورهای دیگر ذخیره کرده‌اند شاید همچنان باقی بمانند + data_removal: نوشته‌ها و داده‌های شما برای همیشه پاک خواهند شد + email_change_html: شما می‌توانید بدون پاک کردن حساب نشانی ایمیل خود را تغییر دهید + email_contact_html: اگر ایمیل همچنان نرسیده، برای درخواست کمک به %{email} پیغام دهید + email_reconfirmation_html: اگر ایمیل تأیید به دستتان نرسیده، می‌توانید یک بار دیگر برایش درخواست بدهید + irreversible: شما نخواهید توانست حساب خود را بازیابی یا فعال‌سازی کنید + more_details_html: برای اطلاعات بیشتر سیاست رازداری را ببینید. + username_available: نام کاربری شما دوباره در دسترس خواهد بود + username_unavailable: نام کاربری شما برای دیگران غیرقابل دسترس خواهد ماند directories: directory: فهرست گزیدهٔ کاربران explanation: کاربران این سرور را بر اساس علاقه‌مندی‌هایشان پیدا کنید explore_mastodon: گشت و گذار در %{title} + domain_validator: + invalid_domain: نام دامین معتبر نیست errors: - '400': The request you submitted was invalid or malformed. + '400': درخواستی که فرستادید نامعتبر یا اشتباه بود. '403': شما اجازهٔ دیدن این صفحه را ندارید. '404': صفحه‌ای که به دنبالش هستید این‌جا نیست. - '406': This page is not available in the requested format. + '406': این صفحه در قالبی که درخواست کرده‌اید موجود نیست. '410': صفحه‌ای که به دنبالش بودید دیگر این‌جا وجود ندارد. '422': content: تأیید امنیتی انجام نشد. آیا مرورگر شما کوکی‌ها را مسدود می‌کند؟ @@ -637,7 +687,7 @@ fa: '500': content: شرمنده، یک چیزی از سمت ما اشتباه شده. title: این صفحه درست نیست - '503': The page could not be served due to a temporary server failure. + '503': این صفحه به خاطر مشکل موقت سرور در دسترس نیست. noscript_html: برای استفاده از نسخهٔ تحت وب ماستدون، لطفاً جاوااسکریپت را فعال کنید. یا به جایش می‌توانید یک اپ ماستدون را به‌کار ببرید. existing_username_validator: not_found: کاربری در این سرور با این نام کاربری پیدا نشد @@ -661,6 +711,7 @@ fa: add_new: افزودن تازه errors: limit: شما بیشترین تعداد مجاز برچسب‌ها را دارید + hint_html: "برچسب‌های برگزیده چیستند؟ این برچسب‌ها (هشتگ‌ها) به طور واضحی روی نمایهٔ عمومی شما نمایش می‌یابند و دیگران می‌توانند نوشته‌های شما را تحت هر کدام از این برچسب‌ها مرور کنند. این یک روش بسیار خوب برای دسته‌بندی آثار خلاقانه یا پروژه‌های بلندمدت شماست." filters: contexts: home: خانه @@ -681,10 +732,12 @@ fa: developers: برنامه‌نویسان more: بیشتر… resources: منابع + trending_now: پرطرفدار generic: all: همه changes_saved_msg: تغییرات با موفقیت ذخیره شدند! copy: رونوشت + no_batch_actions_available: هیچ کار گروهی‌ای در این صفحه موجود نیست order_by: مرتب‌سازی save_changes: ذخیرهٔ تغییرات validation_errors: @@ -756,6 +809,31 @@ fa: too_many: نمی‌توان بیشتر از ۴ تصویر بارگذاری کرد migrations: acct: username@domain حساب تازه + cancel: لغو انتقال + cancel_explanation: با لغو انتقال، حساب شما دوباره فعال می‌شود، ولی این کار پیگیران شما را که به حساب دیگر منتقل شده‌اند برنمی‌گرداند. + cancelled_msg: انتقال حساب با موفقیت لغو شد. + errors: + already_moved: این همان حسابی است که به آن منتقل شده‌اید + missing_also_known_as: به حساب شما اشاره نمی‌کند + move_to_self: نمی‌تواند حساب فعلی شما باشد + not_found: چنین حسابی پیدا نشد + on_cooldown: شما باید صبر کنید + followers_count: شمار پیگیران در زمان انتقال + incoming_migrations: انتقال از یک حساب دیگر + incoming_migrations_html: برای انتقال از یک حساب دیگر به این حساب، شما باید نخست یک نام مستعار بسازید. + moved_msg: حساب شما هم‌اینک به %{acct} منتقل شده است و پیگیران شما در حال انتقال به آن‌جا هستند. + not_redirecting: حساب شما هم‌اینک به هیچ حساب دیگری منتقل نشده است یا اشاره نمی‌کند. + on_cooldown: شما به تازگی حساب خود را منتقل کرده‌اید. این ویژگی برای شما دوباره در %{count} روز فعال خواهد شد. + past_migrations: انتقال‌های پیشین + proceed_with_move: انتقال پیگیران + redirecting_to: حساب شما هم‌اینک به %{acct} منتقل شده است. + warning: + backreference_required: حساب تازهٔ شما نخست باید تنظیم شود تا به این حساب اشاره کند + before: 'پیش از ادامه،‌ لطفاً نکته‌های زیر را به دقت بخوانید:' + cooldown: پس از انتقال حساب، یک دورهٔ انتظار وجود دارد که در این مدت نخواهید توانست دوباره حسابتان را منتقل کنید + disabled_account: حساب فعلی شما پس از این کار دیگر قابل استفاده نخواهد بود. شما فقط خواهید توانست داده‌های خود را بیرون ببرید یا حساب را دوباره فعال کنید. + followers: این کار همهٔ پیگیران شما را از حساب فعلی به حساب تازه منتقل خواهد کرد + other_data: هیچ دادهٔ دیگری خودبه‌خود منتقل نخواهد شد moderation: title: مدیریت کاربران notification_mailer: @@ -900,6 +978,7 @@ fa: settings: account: حساب account_settings: تنظیمات حساب + aliases: نام‌های مستعار appearance: نما authorized_apps: برنامه‌های مجاز back: بازگشت به ماستدون @@ -960,6 +1039,8 @@ fa: pinned: نوشته‌های ثابت reblogged: بازبوقید sensitive_content: محتوای حساس + tags: + does_not_match_previous_name: با نام پیشین مطابق نیست terms: body_html: |

سیاست رازداری

@@ -1077,7 +1158,9 @@ fa: disable: تا وقتی حساب شما متوقف باشد، داده‌های شما دست‌نخورده باقی می‌مانند، ولی تا وقتی که حسابتان باز نشده، نمی‌توانید هیچ کاری با آن بکنید. silence: تا وقتی حساب شما محدود باشد، تنها کسانی که از قبل پیگیر شما بودند نوشته‌های شما در این سرور را می‌بینند و شما در فهرست‌های عمومی دیده نمی‌شوید. ولی دیگران همچنان می‌توانند به دلخواه خودشان پیگیر شما شوند. suspend: حساب شما معلق شده است، و همهٔ نوشته‌ها و رسانه‌های تصویری شما به طور بازگشت‌ناپذیری پاک شده‌اند؛ چه از این سرور و چه از سرورهای دیگری که از آن‌ها پیگیر داشتید. + get_in_touch: با پاسخ به این ایمیل می‌توانید با دست‌اندرکاران %{instance} در تماس باشید. review_server_policies: مرور سیاست‌های این سرور + statuses: 'به طور خاص برای:' subject: disable: حساب %{acct} شما متوقف شده است none: هشدار برای %{acct} diff --git a/config/locales/fr.yml b/config/locales/fr.yml index be146d997d..faffc5e754 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -35,6 +35,13 @@ fr: status_count_before: Ayant publié tagline: Suivez vos ami·e·s et découvrez en de nouveaux·elles terms: Conditions d’utilisation + unavailable_content: Contenu non disponible + unavailable_content_description: + reason: 'Motif :' + rejecting_media: Les fichiers média de ce serveur ne seront pas traités et aucune miniature ne sera affichée, nécessitant un clic manuel vers l'autre serveur. + silenced: Les messages de ce serveur ne s'afficheront nulle part sauf votre flux personnel si vous suivez l'auteur. + suspended: Vous ne pourrez suivre personne de ce serveur, aucune donnée ne sera traitée ou stockée et aucune donnée ne sera échangée. + unavailable_content_html: Mastodon vous permet généralement de visualiser le contenu et d'interagir avec les utilisateurs de n'importe quel autre serveur dans le fédiverse. Voici les exceptions qui ont été faites sur ce serveur en particulier. user_count_after: one: utilisateur other: utilisateurs @@ -222,10 +229,12 @@ fr: deleted_status: "(statut supprimé)" title: Journal d’audit custom_emojis: + assign_category: Attribuer une catégorie by_domain: Domaine copied_msg: Copie locale de l’émoji créée avec succès ! copy: Copier copy_failed_msg: Impossible de faire une copie locale de cet émoji + create_new_category: Créer une nouvelle catégorie created_msg: Émoji créé avec succès ! delete: Supprimer destroyed_msg: Émoji supprimé avec succès ! @@ -242,6 +251,7 @@ fr: shortcode: Raccourci shortcode_hint: Au moins deux caractères, seulement des caractères alphanumériques ou des tirets bas title: Émojis personnalisés + uncategorized: Non catégorisé unlisted: Délisté update_failed_msg: N’a pas pu mettre à jour cet émoji updated_msg: Émoji mis à jour avec succès ! @@ -421,6 +431,9 @@ fr: custom_css: desc_html: Modifier l’apparence avec une CSS chargée sur chaque page title: CSS personnalisé + default_noindex: + desc_html: Affecte tous les utilisateurs qui n'ont pas changé eux-mêmes ce paramètre + title: Opter pour le retrait de l'indexation des moteurs de recherche par défaut domain_blocks: all: À tout le monde disabled: À personne @@ -512,6 +525,10 @@ fr: context: Contexte  directory: Dans le répertoire in_directory: "%{count} dans le répertoire" + last_active: Dernière activité + most_popular: Plus populaire + most_recent: Plus récent + name: Mot-clé review: État de traitement reviewed: Traité title: Hashtags @@ -537,6 +554,12 @@ fr: new_trending_tag: body: 'Le hashtag #%{name} est populaire aujourd’hui, mais il n’a pas été approuvé. Il ne sera pas affiché publiquement à moins que l’autorisiez, ou sauvegardez simplement ce formulaire tel quel pour ne plus jamais en entendre parler.' subject: Nouveau hashtag en attente de traitement sur %{instance} (#%{name}) + aliases: + add_new: Créer un alias + created_msg: Un nouvel alias a été créé avec succès. Vous pouvez maintenant lancer le déplacement depuis l'ancien compte. + deleted_msg: Suppression réussie de l'alias. Déplacer de ce compte vers celui-ci ne sera plus possible. + hint_html: Si vous voulez passer d'un autre compte à celui-ci, vous pouvez créer ici un alias, qui est nécessaire avant de pouvoir déplacer les abonné·e·s de l'ancien compte à celui-ci. Cette action en soi est inoffensive et réversible. La migration du compte est initiée à partir de l'ancien compte. + remove: Détacher l'alias appearance: advanced_web_interface: Interface web avancée advanced_web_interface_hint: 'Si vous voulez utiliser toute la largeur de votre écran, l’interface web avancée vous permet de configurer plusieurs colonnes différentes pour voir autant d’informations que vous le souhaitez en même temps : Accueil, notifications, fil public fédéré, un nombre illimité de listes et hashtags.' @@ -596,6 +619,7 @@ fr: confirming: En attente de la confirmation par e-mail à compléter. functional: Votre compte est entièrement opérationnel. pending: Votre demande est en attente d'examen par notre personnel. Cela peut prendre un certain temps. Vous recevrez un courriel si votre demande est approuvée. + redirecting_to: Votre compte est inactif car il est actuellement redirigé vers %{acct}. trouble_logging_in: Vous avez un problème pour vous connecter ? authorize_follow: already_following: Vous suivez déjà ce compte @@ -608,6 +632,11 @@ fr: return: Afficher le profil de l’utilisateur⋅ice web: Retour à l’interface web title: Suivre %{acct} + challenge: + confirm: Continuer + hint_html: "Astuce : Nous ne vous demanderons plus votre mot de passe pour la prochaine heure." + invalid_password: Mot de passe invalide + prompt: Confirmez votre mot de passe pour continuer datetime: distance_in_words: about_x_hours: "%{count} h" @@ -623,10 +652,19 @@ fr: x_months: "%{count} mois" x_seconds: "%{count} s" deletes: + challenge_not_passed: Les renseignements que vous avez entrés n'étaient pas exacts confirm_password: Entrez votre mot de passe pour vérifier votre identité + confirm_username: Entrez votre nom d'utilisateur pour confirmer la procédure proceed: Supprimer compte success_msg: Votre compte a été supprimé avec succès warning: + before: 'Avant de procéder, veuillez lire attentivement ces notes :' + caches: Le contenu mis en cache par d'autres serveurs peut persister + data_removal: Vos messages et autres données seront définitivement supprimés + email_change_html: Vous pouvez modifier votre adresse courriel sans supprimer votre compte + email_contact_html: S'il n'arrive toujours pas, vous pouvez envoyer un courriel à %{email} pour de l'aide + email_reconfirmation_html: Si vous ne recevez pas le courriel de confirmation, vous pouvez le demander à nouveau + irreversible: Vous ne pourrez pas restaurer ou réactiver votre compte more_details_html: Pour plus de détails, voir la politique de confidentialité. username_available: Votre nom d’utilisateur sera à nouveau disponible username_unavailable: Votre nom d’utilisateur restera indisponible @@ -637,7 +675,7 @@ fr: domain_validator: invalid_domain: n’est pas un nom de domaine valide errors: - '400': The request you submitted was invalid or malformed. + '400': La demande que vous avez soumise est invalide ou mal formée. '403': Vous n’avez pas accès à cette page. '404': La page que vous recherchez n’existe pas. '406': Cette page n'est pas disponible au format demandé. @@ -649,7 +687,7 @@ fr: '500': content: Nous sommes désolé·e·s, mais quelque chose s’est mal passé de notre côté. title: Cette page n’est pas correcte - '503': The page could not be served due to a temporary server failure. + '503': La page n'a pas pu être servie en raison d'une défaillance temporaire du serveur. noscript_html: Pour utiliser Mastodon, veuillez activer JavaScript. Sinon, essayez l’une des applications natives pour Mastodon pour votre plate-forme. existing_username_validator: not_found: n’a pas trouvé d’utilisateur·rice local·e avec ce nom @@ -699,6 +737,7 @@ fr: all: Tous changes_saved_msg: Les modifications ont été enregistrées avec succès ! copy: Copier + no_batch_actions_available: Aucune action par lots disponible sur cette page order_by: Classer par save_changes: Enregistrer les modifications validation_errors: @@ -770,6 +809,31 @@ fr: too_many: Impossible de joindre plus de 4 fichiers migrations: acct: profil@domaine du nouveau compte + cancel: Annuler la redirection + cancel_explanation: Annuler la redirection réactivera votre compte courant, mais ne rapportera pas les abonnés qui ont été déplacés sur ce compte. + cancelled_msg: Suppression de la redirection réussie. + errors: + already_moved: est le même compte que vous avez déjà déplacé vers + missing_also_known_as: ne référence pas rétroactivement ce compte + move_to_self: ne peut pas être un compte courant + not_found: n'a pas été trouvé + on_cooldown: Vous êtes en refroidissement + followers_count: Abonnés au moment du déplacement + incoming_migrations: Déplacement d'un compte différent + incoming_migrations_html: Pour passer d'un autre compte à celui-ci, vous devez d'abord créer un alias de compte. + moved_msg: Votre compte est maintenant redirigé vers %{acct} et vos abonnés sont déplacés. + not_redirecting: Votre compte n'est pas redirigé vers un autre compte actuellement. + on_cooldown: Vous avez récemment migré votre compte. Cette fonction sera à nouveau disponible dans %{count} jours. + past_migrations: Migrations passées + proceed_with_move: Déplacer les abonnés + redirecting_to: Votre compte est redirigé vers %{acct}. + warning: + backreference_required: Le nouveau compte doit d'abord être configuré pour faire référence à celui-ci + before: 'Avant de procéder, veuillez lire attentivement ces notes :' + cooldown: Après le déménagement, il y a une période de refroidissement pendant laquelle vous ne pourrez plus bouger + disabled_account: Votre compte actuel ne sera pas entièrement utilisable par la suite. Cependant, vous aurez accès à l'exportation de données et à la ré-activation. + followers: Cette action va déplacer tous les abonnés du compte courant vers le nouveau compte + other_data: Aucune autre donnée ne sera déplacée automatiquement moderation: title: Modération notification_mailer: @@ -914,6 +978,7 @@ fr: settings: account: Compte account_settings: Paramètres du compte + aliases: Alias du compte appearance: Apparence authorized_apps: Applications autorisées back: Retour vers Mastodon diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 1c63a706fe..2649fb2a34 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -34,6 +34,13 @@ ja: status_count_before: トゥート数 tagline: Follow friends and discover new ones terms: 利用規約 + unavailable_content: 制限中のサーバー + unavailable_content_description: + reason: '制限理由:' + rejecting_media: このサーバーからのメディアファイルは受信されず、サムネイルも表示されません。表示するにはクリックしてそのサーバーに直接アクセスする必要があります。 + silenced: このサーバーからの投稿は相手をフォローしてもあなたのホームタイムライン以外には表示されません。 + suspended: このサーバーからは誰もフォローできません。このサーバーからのデータは受信されず、やりとりもされません。 + unavailable_content_html: 通常 Mastodon では連合先のどんなサーバーのユーザーとでもやりとりできます。ただし次のサーバーには例外が設定されています。 user_count_after: other: 人 user_count_before: ユーザー数 @@ -218,10 +225,12 @@ ja: deleted_status: "(削除済)" title: 操作履歴 custom_emojis: + assign_category: カテゴリーを割り当て by_domain: ドメイン copied_msg: 絵文字のコピーをローカルに作成しました copy: コピー copy_failed_msg: 絵文字のコピーをローカルに作成できませんでした + create_new_category: カテゴリーを作成 created_msg: 絵文字の追加に成功しました! delete: 削除 destroyed_msg: 絵文字の削除に成功しました! @@ -238,6 +247,7 @@ ja: shortcode: ショートコード shortcode_hint: 2文字以上の半角英数字とアンダーバーのみ利用できます title: カスタム絵文字 + uncategorized: 未分類 unlisted: 未収載 update_failed_msg: 絵文字を更新できませんでした updated_msg: 絵文字の更新に成功しました! @@ -415,6 +425,9 @@ ja: custom_css: desc_html: 全ページに適用されるCSSの編集 title: カスタムCSS + default_noindex: + desc_html: この設定を変更していない全ユーザーに影響します + title: デフォルトで検索エンジンによるインデックスを拒否する domain_blocks: all: 誰でも許可 disabled: 誰も許可しない @@ -506,6 +519,10 @@ ja: context: 表示先 directory: ディレクトリに使用 in_directory: "%{count} 人がディレクトリに使用" + last_active: 最近使われた順 + most_popular: 使用頻度順 + most_recent: 新着順 + name: ハッシュタグ review: 審査状況 reviewed: 審査済み title: ハッシュタグ @@ -531,6 +548,12 @@ ja: new_trending_tag: body: 'ハッシュタグ #%{name} が本日のトレンドになっていますが、審査がまだ行われていないためトレンドタグには表示されていません。一度許可すれば次回からこの操作は不要です。' subject: "%{instance} で新しいハッシュタグ (#%{name}) が審査待ちです" + aliases: + add_new: エイリアスを作成 + created_msg: エイリアスを作成しました。これで以前のアカウントから引っ越しを開始できます。 + deleted_msg: エイリアスを解除しました。そのアカウントからは引っ越しできなくなります。 + hint_html: 他のアカウントからこのアカウントにフォロワーを引き継いで引っ越したい場合、ここでエイリアスを作成しておく必要があります。エイリアス自体は無害で、取り消すことができます。引っ越しは以前のアカウント側から開始する必要があります。 + remove: エイリアスを解除 appearance: advanced_web_interface: 上級者向け UI advanced_web_interface_hint: ディスプレイを幅いっぱいまで活用したい場合、上級者向け UI をおすすめします。ホーム、通知、連合タイムライン、更にはリストやハッシュタグなど、様々な異なるカラムから望む限りの情報を一度に受け取れるような設定が可能になります。 @@ -560,6 +583,10 @@ ja: checkbox_agreement_without_rules_html: 利用規約 に同意します delete_account: アカウントの削除 delete_account_html: アカウントを削除したい場合、こちら から手続きが行えます。削除する前に、確認画面があります。 + description: + prefix_invited_by_user: "@%{name} があなたをこの Mastodon サーバーに招待しました" + prefix_sign_up: 今すぐ Mastodon に登録しましょう! + suffix: アカウントがあれば、どんな Mastodon 互換サーバーのユーザーでもフォローしたりメッセージをやり取りできるようになります! didnt_get_confirmation: 確認メールを受信できませんか? forgot_password: パスワードをお忘れですか? invalid_reset_password_token: パスワードリセットトークンが正しくないか期限切れです。もう一度リクエストしてください。 @@ -586,6 +613,7 @@ ja: confirming: メールアドレスの確認が完了するのを待っています。 functional: アカウントは完全に機能しています。 pending: あなたの申請は現在サーバー管理者による審査待ちです。これにはしばらくかかります。申請が承認されるとメールが届きます。 + redirecting_to: アカウントは %{acct} に引っ越し設定されているため非アクティブになっています。 trouble_logging_in: ログインできませんか? authorize_follow: already_following: あなたは既にこのアカウントをフォローしています @@ -598,6 +626,11 @@ ja: return: ユーザーのプロフィールを見る web: Web を開く title: "%{acct} をフォロー" + challenge: + confirm: 続行する + hint_html: 以後 1 時間はパスワードの再入力を求めません + invalid_password: パスワードが間違っています + prompt: 続行するにはパスワードを入力してください datetime: distance_in_words: about_x_hours: "%{count}時間" diff --git a/config/locales/ko.yml b/config/locales/ko.yml index c95189dc5f..fb32552da0 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -34,6 +34,9 @@ ko: status_count_before: 툿 수 tagline: 친구들을 팔로우 하고 새로운 사람들도 만나기 terms: 이용약관 + unavailable_content: 이용 불가능한 컨텐츠 + unavailable_content_description: + reason: '이유:' user_count_after: other: 명 user_count_before: 사용자 수 @@ -614,6 +617,11 @@ ko: return: 유저 프로필 보기 web: 웹으로 가기 title: "%{acct} 를 팔로우" + challenge: + confirm: 계속 + hint_html: "팁:한 시간동안 다시 비밀번호를 묻지 않을 겁니다." + invalid_password: 잘못된 비밀번호 + prompt: 계속하려면 암호 확인 datetime: distance_in_words: about_x_hours: "%{count}시간" @@ -784,6 +792,18 @@ ko: too_many: 최대 4개까지 첨부할 수 있습니다 migrations: acct: 새 계정의 username@domain + cancel: 리디렉션 취소 + errors: + not_found: 찾을 수 없습니다 + incoming_migrations: 다른 계정으로부터 옮기기 + on_cooldown: 당신은 최근에 이미 계정을 이동했습니다. 이 기능은 %{count} 일 후에 다시 이용 가능합니다. + past_migrations: 이전 마이그레이션 + proceed_with_move: 팔로워 이동 + redirecting_to: 당신의 계정은 %{acct} 로 리다이렉트됩니다. + warning: + before: '진행하기 전, 주의사항을 꼼꼼히 읽어보세요:' + followers: 이 행동은 현재 계정의 모든 팔로워를 새 계정으로 이동시킵니다 + other_data: 다른 어떤 데이터도 자동적으로 옮겨지지 않을 것입니다 moderation: title: 모더레이션 notification_mailer: @@ -926,6 +946,7 @@ ko: settings: account: 계정 account_settings: 계정 설정 + aliases: 계정 별명 appearance: 외관 authorized_apps: 인증된 애플리케이션 back: 돌아가기 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 1878a95a25..213d213c34 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -40,6 +40,7 @@ nl: reason: 'Reden:' rejecting_media: Mediabestanden van deze server worden niet verwerkt en er worden geen thumbnails getoond. Je moet handmatig naar deze server doorklikken om de mediabestanden te kunnen bekijken. silenced: Toots van deze server worden nergens weergegeven, behalve op jouw eigen starttijdlijn wanneer je het account volgt. + suspended: Je bent niet in staat om iemand van deze server te volgen, en er worden geen gegevens van deze server verwerkt of opgeslagen, en met deze server uitgewisseld. user_count_after: one: gebruiker other: gebruikers @@ -510,8 +511,8 @@ nl: title: Toots van account with_media: Met media tags: - accounts_today: Aantal unieke keren vandaag gebruikt - accounts_week: Aantal unieke keren deze week gebruikt + accounts_today: Aantal verschillende keren vandaag gebruikt + accounts_week: Aantal verschillende keren deze week gebruikt breakdown: Uitsplitsing van het gebruik van vandaag naar bron context: Context directory: In de gebruikersgids @@ -524,8 +525,9 @@ nl: reviewed: Beoordeeld title: Hashtags trending_right_now: Op dit moment trending - unique_uses_today: "%{count} toots vandaag" + unique_uses_today: "%{count} keer vandaag gebruikt" unreviewed: Niet beoordeeld + updated_msg: Instellingen hashtag succesvol bijgewerkt title: Beheer warning_presets: add_new: Nieuwe toevoegen @@ -541,6 +543,11 @@ nl: body: "%{reporter} heeft %{target} gerapporteerd" body_remote: Iemand van %{domain} heeft %{target} gerapporteerd subject: Nieuwe rapportage op %{instance} (#%{id}) + aliases: + add_new: Alias aanmaken + created_msg: Succesvol een nieuwe alias aangemaakt. Je kunt nu met de verhuizing vanaf het oude account beginnen. + deleted_msg: De alias is succesvol verwijderd. Verhuizen vanaf dat account naar dit account is niet meer mogelijk. + remove: Alias ontkoppelen appearance: advanced_web_interface: Geavanceerde webomgeving advanced_web_interface_hint: 'Wanneer je van de hele schermbreedte gebruik wilt maken, stelt de geavanceerde webomgeving je in staat om meerdere verschillende kolommen te configureren. Hiermee kun je zoveel mogelijk informatie op hetzelfde moment bekijken, zoals: Start, meldingen, de globale tijdlijn, meerdere lijsten en hashtags.' @@ -569,6 +576,8 @@ nl: checkbox_agreement_html: Ik ga akkoord met de regels van deze server en de gebruiksvoorwaarden delete_account: Account verwijderen delete_account_html: Wanneer je jouw account graag wilt verwijderen, kun je dat hier doen. We vragen jou daar om een bevestiging. + description: + prefix_sign_up: Registreer je vandaag nog op Mastodon! didnt_get_confirmation: Geen bevestigingsinstructies ontvangen? forgot_password: Wachtwoord vergeten? invalid_reset_password_token: De code om jouw wachtwoord opnieuw in te stellen is verlopen. Vraag een nieuwe aan. @@ -590,6 +599,7 @@ nl: title: Instellen status: account_status: Accountstatus + functional: Jouw account is volledig operationeel. trouble_logging_in: Problemen met inloggen? authorize_follow: already_following: Je volgt dit account al @@ -626,10 +636,15 @@ nl: confirm_username: Voer uw gebruikersnaam in om de procedure te bevestigen proceed: Account verwijderen success_msg: Jouw account is succesvol verwijderd + warning: + username_available: Jouw gebruikersnaam zal weer beschikbaar komen + username_unavailable: Jouw gebruikersnaam zal onbeschikbaar blijven directories: directory: Gebruikersgids explanation: Ontdek gebruikers aan de hand van hun interesses explore_mastodon: "%{title} verkennen" + domain_validator: + invalid_domain: is een ongeldige domeinnaam errors: '400': The request you submitted was invalid or malformed. '403': Jij hebt geen toestemming om deze pagina te bekijken. @@ -763,6 +778,7 @@ nl: too_many: Er kunnen niet meer dan 4 afbeeldingen toegevoegd worden migrations: acct: Verhuisd naar + cancel: Doorverwijzing annuleren cancelled_msg: De doorverwijzing is succesvol geannuleerd. errors: already_moved: is hetzelfde account waarnaar je al naar toe bent verhuisd @@ -989,6 +1005,8 @@ nl: pinned: Vastgemaakte toot reblogged: boostte sensitive_content: Gevoelige inhoud + tags: + does_not_match_previous_name: komt niet overeen met de vorige naam terms: body_html: |

Privacy Policy

@@ -1106,7 +1124,9 @@ nl: disable: Zolang jouw account is bevroren blijven jouw accountgegevens intact, maar kun je geen handelingen uitvoeren totdat het account is vrijgegeven. silence: Zolang jouw account wordt beperkt, kunnen alleen mensen die jou al volgen jouw toots op deze server zien. Tevens ben je niet zichtbaar in meldingen, gesprekken en op openbare tijdlijnen. Anderen kunnen je echter wel handmatig volgen. suspend: Jouw account is opgeschort. Jouw toots en geüploade media zijn onomkeerbaar van deze server verwijderd, en ook o.a. van de servers waar jij volgers had. + get_in_touch: Je kunt deze e-mail beantwoorden om in contact te komen met de medewerkers van %{instance}. review_server_policies: Serverbeleid bekijken + statuses: 'Met name voor:' subject: disable: Jouw account %{acct} is bevroren none: Waarschuwing voor %{acct} diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 2d11d3399f..101483c3ea 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -32,6 +32,9 @@ oc: status_count_before: qu’an escrich tagline: Seguètz d’amics e trobatz-ne de nòus terms: Condicions d’utilizacion + unavailable_content: Contengut pas disponible + unavailable_content_description: + reason: 'Motiu :' user_count_after: one: utilizaire other: utilizaires @@ -486,6 +489,10 @@ oc: context: Contèxt directory: A l’annuari in_directory: "%{count} a l’annuari" + last_active: Darrièra activitat + most_popular: Mai popularas + most_recent: Mai recentas + name: Etiqueta title: Etiquetas title: Administracion warning_presets: @@ -507,6 +514,7 @@ oc: advanced_web_interface_hint: 'Se volètz utilizar la nautor complèta de l’ecran, l’interfàcia web avançada vos permet de configurar diferentas colomnas per mostrar tan d’informacions que volètz : Acuèlh, notificacions, flux d’actualitat, e d’autras listas e etiquetas.' animations_and_accessibility: Animacion e accessibilitat confirmation_dialogs: Fenèstras de confirmacion + discovery: Descobèrta sensitive_content: Contengut sensible application_mailer: notification_preferences: Cambiar las preferéncias de corrièl @@ -562,6 +570,10 @@ oc: return: Veire lo perfil a la persona web: Tornar a l’interfàcia Web title: Sègre %{acct} + challenge: + confirm: Contunhar + invalid_password: Senhal invalid + prompt: Confirmatz lo senhal per dire de contunhar datetime: distance_in_words: about_x_hours: "%{count} h" @@ -584,6 +596,8 @@ oc: directory: Annuari de perfils explanation: Trobar d’utilizaires segon lor interèsses explore_mastodon: Explorar %{title} + domain_validator: + invalid_domain: es pas un nom de domeni valid errors: '400': The request you submitted was invalid or malformed. '403': Avètz pas l’autorizacion de veire aquesta pagina. @@ -641,6 +655,7 @@ oc: developers: Desvolopaires more: Mai… resources: Ressorsas + trending_now: Tendéncia del moment generic: all: Tot changes_saved_msg: Cambiaments ben realizats ! @@ -716,6 +731,10 @@ oc: too_many: Se pòt pas ajustar mai de 4 fichièrs migrations: acct: nomutilizaire@domeni del nòu compte + errors: + move_to_self: pòt pas èsser lo compte actual + not_found: impossible de trobar + proceed_with_move: Desplaçar los seguidors moderation: title: Moderacion notification_mailer: @@ -1038,6 +1057,7 @@ oc: silence: Del temps que vòstre compte es limitat, solament lo monde que vos sègon veiràn vòstres tuts sus aqueste servidor, e poiriatz èsser tirat de mantunas listas publicas. Pasmens, d’autres vos pòdon sègre manualament. suspend: Vòstre compte es suspendut e totes vòstres tuts e fichièrs enviats son estats suprimits sens retorn possible d’aqueste servidor e los de vòstres seguidors. review_server_policies: Repassar las politicas del servidor + statuses: 'Especificament per :' subject: disable: Vòstre compte %{acct} es gelat none: Avertiment per %{acct} diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index ac7e709084..32ea8caf65 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -7,6 +7,7 @@ pt-BR: active_count_after: Ativo active_footnote: Usuários ativos mensais (UAM) administered_by: 'Administrado por:' + api: API apps: Apps apps_platforms: Use o Mastodon a partir de iOS, Android e outras plataformas browse_directory: Navegue pelo diretório de perfis e filtre por interesses @@ -28,6 +29,11 @@ pt-BR: status_count_before: Autores de tagline: Siga amigos e encontre novos terms: Termos de serviço + unavailable_content: Conteúdo indisponível + unavailable_content_description: + reason: 'Motivo:' + suspended: Você não será capaz de seguir ninguém deste servidor, e nenhum dado dele será processado ou armazenado, e nenhum dado trocado. + unavailable_content_html: Mastodon geralmente permite que você veja o conteúdo e interaja com usuários de qualquer outro servidor no fediverso. Estas são as exceções deste servidor específico. user_count_after: one: usuário other: usuários @@ -35,6 +41,7 @@ pt-BR: what_is_mastodon: O que é Mastodon? accounts: choices_html: 'Escolhas de %{name}:' + featured_tags_hint: Você pode destacar hashtags específicas que serão exibidas aqui. follow: Seguir followers: one: Seguidor @@ -46,11 +53,16 @@ pt-BR: media: Mídia moved_html: "%{name} se mudou para %{new_profile_link}:" network_hidden: Esta informação não está disponível + never_active: Nunca nothing_here: Não há nada aqui! people_followed_by: Pessoas que %{name} segue people_who_follow: Pessoas que seguem %{name} pin_errors: following: Você tem que estar seguindo a pessoa que você quer sugerir + posts: + one: Toot + other: Toots + posts_tab_heading: Toots posts_with_replies: Toots e respostas reserved_username: Este usuário está reservado roles: @@ -72,6 +84,7 @@ pt-BR: approve: Aprovar approve_all: Aprovar tudo are_you_sure: Você tem certeza? + avatar: Imagem de Perfil by_domain: Domínio change_email: changed_msg: E-mail da conta modificado com sucesso! @@ -102,9 +115,11 @@ pt-BR: header: Cabeçalho inbox_url: URL da caixa de entrada invited_by: Convidado por + ip: IP joined: Se cadastrou location: all: Todos + local: Local remote: Remoto title: Localização login_status: Situação de login @@ -160,6 +175,7 @@ pt-BR: statuses: Postagens subscribe: Inscrever-se suspended: Suspenso + time_in_queue: Esperando na fila por %{time} title: Contas unconfirmed_email: E-mail não confirmado undo_silenced: Retirar silenciamento @@ -167,6 +183,7 @@ pt-BR: unsubscribe: Desinscrever-se username: Nome de usuário warn: Notificar + web: Web action_logs: actions: assigned_to_self_report: "%{name} designou a denúncia %{target} para si" @@ -202,15 +219,18 @@ pt-BR: deleted_status: "(status deletado)" title: Auditar relatório custom_emojis: + assign_category: Designar Categoria by_domain: Domínio copied_msg: Cópia local do emoji criada com sucesso copy: Copiar copy_failed_msg: Não foi possível criar uma cópia local deste emoji + create_new_category: Criar nova categoria created_msg: Emoji criado com sucesso! delete: Excluir destroyed_msg: Emoji deletado com sucesso! disable: Desabilitar disabled_msg: Emoji desabilitado com sucesso + emoji: Emoji enable: Habilitar enabled_msg: Emoji habilitado com sucesso image_hint: PNG de até 50KB @@ -221,6 +241,7 @@ pt-BR: shortcode: Atalho shortcode_hint: Pelo menos 2 caracteres, apenas caracteres alfanuméricos e underscores title: Emojis customizados + uncategorized: Não categorizado unlisted: Não listado update_failed_msg: Não foi possível atualizar esse emoji updated_msg: Emoji atualizado com sucesso! @@ -233,13 +254,17 @@ pt-BR: feature_profile_directory: Diretório de perfis feature_registrations: Cadastros feature_relay: Repetidor da federação + feature_spam_check: Anti-spam feature_timeline_preview: pré-visualização da timeline features: Funcionalidades hidden_service: Federação com serviços onion open_reports: Denúncias em aberto + pending_tags: hashtags aguardando revisão + pending_users: usuários aguardando revisão recent_users: Usuários recentes search: Pesquisa em texto single_user_mode: Modo de usuário único + software: Software space: Uso de espaço em disco title: Painel de controle total_users: usuários no total @@ -252,6 +277,8 @@ pt-BR: created_msg: Bloqueio de domínio está sendo processado destroyed_msg: Bloqueio de domínio desfeito domain: Domínio + edit: Editar bloqueio de domínio + existing_domain_block_html: Você já impôs limites mais restritivos a %{name}, é necessário primeiro desbloqueá-lo. new: create: Criar bloqueio hint: O bloqueio de domínio não prevenirá a criação de entradas de contas na base de dados, mas vai reatroativa e automaticamente aplicar métodos específicos de moderação nestas contas. @@ -261,6 +288,8 @@ pt-BR: silence: Silêncio suspend: Suspensão title: Novo bloqueio de domínio + private_comment: Comentário privado + public_comment: Comentário público reject_media: Rejeitar arquivos de mídia reject_media_hint: Remove arquivos de mídia armazenados localmente e recusa quaisquer outros no futuro. Irrelevante para suspensões reject_reports: Rejeitar denúncias @@ -280,6 +309,7 @@ pt-BR: title: Retirar bloqueio de domínio de %{domain} undo: Retirar undo: Retirar bloqueio de domínio + view: Ver domínios bloqueados email_domain_blocks: add_new: Adicionar novo created_msg: Bloqueio de domínio de e-mail criado com sucesso @@ -303,6 +333,8 @@ pt-BR: all: Todas limited: Limitado title: Moderação + private_comment: Comentário privado + public_comment: Comentário público title: Federação total_blocked_by_us: Bloqueado por nós total_followed_by_them: Seguidos por eles @@ -378,6 +410,15 @@ pt-BR: custom_css: desc_html: Modificar o visual com CSS que é carregado em todas as páginas title: CSS customizado + default_noindex: + desc_html: Afeta qualquer usuário que não tenha modificado esta configuração manualmente + domain_blocks: + all: Para todo mundo + disabled: Para ninguém + title: Mostrar domínios bloqueados + users: Para usuários locais logados + domain_blocks_rationale: + title: Visualizar justificativa hero: desc_html: Aparece na página inicial. Ao menos 600x100px é recomendado. Se não estiver definido, o thumbnail da instância é usado no lugar title: Imagem de capa @@ -428,6 +469,8 @@ pt-BR: desc_html: Você pode escrever a sua própria política de privacidade, termos de serviço, entre outras coisas. Você pode usar tags HTML title: Termos de serviço customizados site_title: Nome da instância + spam_check_enabled: + title: Automação anti-spam thumbnail: desc_html: Usada para prévias via OpenGraph e API. Recomenda-se 1200x630px title: Miniatura da instância @@ -435,12 +478,15 @@ pt-BR: desc_html: Exibir a timeline pública na página inicial title: Prévia da timeline title: Configurações do site + trends: + title: Hashtags em alta statuses: back_to_account: Voltar para página da conta batch: delete: Deletar nsfw_off: Marcar como não-sensível nsfw_on: Marcar como sensível + deleted: Excluídos failed_to_execute: Falha em executar media: title: Mídia @@ -448,6 +494,16 @@ pt-BR: no_status_selected: Nenhum status foi modificado porque nenhum estava selecionado title: Postagens da conta with_media: Com mídia + tags: + context: Contexto + directory: No diretório + most_popular: Mais populares + most_recent: Mais recentes + name: Hashtag + title: Hashtags + trending_right_now: Em alta no momento + unreviewed: Não revisadas + updated_msg: Configurações de hashtag atualizadas com sucesso title: Administração warning_presets: add_new: Adicionar um novo @@ -463,8 +519,14 @@ pt-BR: body: "%{reporter} denunciou %{target}" body_remote: Alguém da instância %{domain} reportou %{target} subject: Nova denúncia sobre %{instance} (#%{id}) + appearance: + animations_and_accessibility: Animações e acessibilidade + confirmation_dialogs: Popups de confirmação + discovery: Descobrir + sensitive_content: Conteúdo sensível application_mailer: notification_preferences: Mudar preferências de e-mail + salutation: "%{name}," settings: 'Mudar e-mail de preferência: %{link}' view: 'Visualizar:' view_profile: Ver perfil @@ -481,8 +543,13 @@ pt-BR: apply_for_account: Pedir um convite change_password: Senha checkbox_agreement_html: Eu concordo com as regras do servidor e com os termos de serviço + checkbox_agreement_without_rules_html: Concordo com os termos do serviço delete_account: Excluir conta delete_account_html: Se você deseja excluir a sua conta, você pode prosseguir para cá. Uma confirmação será requisitada. + description: + prefix_invited_by_user: "@%{name} convidou você para entrar neste servidor do Mastodon!" + prefix_sign_up: Cadastre-se no Mastodon hoje! + suffix: Com uma conta, você poderá seguir pessoas, postar atualizações, trocar mensagens com usuários de qualquer servidor Mastodon e muito mais! didnt_get_confirmation: Não recebeu instruções de confirmação? forgot_password: Esqueceu a sua senha? invalid_reset_password_token: Token de modificação de senha é inválido ou expirou. Por favor, requisite um novo. @@ -491,6 +558,9 @@ pt-BR: migrate_account: Mudar para uma conta diferente migrate_account_html: Se você quer redirecionar essa conta para uma outra você pode configurar isso aqui. or_log_in_with: Ou faça login com + providers: + cas: CAS + saml: SAML register: Cadastrar-se registration_closed: "%{instance} não está aceitando novos membros" resend_confirmation: Reenviar instruções de confirmação @@ -509,8 +579,12 @@ pt-BR: return: Exibir o perfil do usuário web: Voltar para a página inicial title: Seguir %{acct} + challenge: + invalid_password: Senha inválida + prompt: Confirme sua senha para continuar datetime: distance_in_words: + about_x_hours: "%{count}h" about_x_months: "%{count} meses" about_x_years: "%{count} anos" almost_x_years: "%{count} anos" @@ -523,9 +597,16 @@ pt-BR: x_months: "%{count} meses" x_seconds: "%{count} segundos" deletes: + challenge_not_passed: As informações que você inseriu não estão corretas confirm_password: Insira a sua senha atual para verificar a sua identidade + confirm_username: Digite seu nome de usuário para confirmar o procedimento proceed: Excluir conta success_msg: A sua conta foi excluída com sucesso + warning: + before: 'Antes de prosseguir, por favor leia com cuidado:' + data_removal: Suas postagens e outros dados serão removidos permanentemente + username_available: Seu nome de usuário ficará disponível novamente + username_unavailable: Seu nome de usuário permanecerá indisponível directories: directory: Diretório de perfis explanation: Descobrir usuários baseado em seus interesses @@ -557,6 +638,7 @@ pt-BR: request: Solicitar o seu arquivo size: Tamanho blocks: Você bloqueou + csv: CSV domain_blocks: Bloqueios de domínio follows: Você segue lists: Listas @@ -661,6 +743,15 @@ pt-BR: too_many: Não é possível anexar mais de 4 imagens migrations: acct: username@domain da nova conta + incoming_migrations: Migrando de outra conta + moved_msg: Agora sua conta está redirecionando para %{acct} e seus seguidores estão sendo movidos. + not_redirecting: Sua conta não está redirecionando para nenhuma outra conta atualmente. + on_cooldown: Você migrou recentemente sua conta. Esta função ficará disponível novamente em %{count} dias. + past_migrations: Migrações passadas + proceed_with_move: Migrar seguidores + redirecting_to: Sua conta está redirecionando para %{acct}. + warning: + before: 'Antes de prosseguir, por favor leia com cuidado:' moderation: title: Moderação notification_mailer: @@ -752,13 +843,40 @@ pt-BR: activity: Última atividade browser: Navegador browsers: + alipay: Alipay + blackberry: BlackBerry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox generic: Navegador desconhecido + ie: Internet Explorer + micro_messenger: MicroMessenger nokia: Navegador Nokia S40 Ovi + opera: Opera + otter: Otter + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UCBrowser + weibo: Weibo current_session: Sessão atual description: "%{browser} em %{platform}" explanation: Estes são os navegadores que estão conectados com a sua conta do 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: Plataforma desconhecida + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone revoke: Revogar revoke_success: Sessão revogada com sucesso title: Sessões @@ -782,6 +900,8 @@ pt-BR: profile: Perfil relationships: Seguindo e seguidores two_factor_authentication: Autenticação em dois passos + spam_check: + spam_detected_and_silenced: Este é um relatório automatizado. Spam foi detectado e o remetente foi silenciado automaticamente. Se isto for um erro, por favor, desfaça esta ação. statuses: attached: description: 'Anexado: %{attached}' @@ -811,6 +931,7 @@ pt-BR: vote: Votar show_more: Mostrar mais sign_in_to_participate: Entre para participar dessa conversa + title: '%{name}: "%{quote}"' visibilities: private: Apenas seguidores private_long: Mostrar apenas para seguidores @@ -822,6 +943,8 @@ pt-BR: pinned: Toot fixado reblogged: compartilhou sensitive_content: Conteúdo sensível + tags: + does_not_match_previous_name: não corresponde ao nome anterior terms: body_html: |

Política de privacidade

@@ -938,6 +1061,7 @@ pt-BR: disable: Enquanto sua conta está congelada, seus dados estão intactos, mas você não pode realizar nenhuma ação até que sua conta seja desbloqueada. silence: Enquanto sua conta está limitada, somente pessoas que já estão seguindo você poderão ver seus toots nesse servidor, e você pode ser excluído de diversas listagens públicas. No entanto, outros ainda podem seguir você manualmente. suspend: Sua conta está suspensa e todos os seus toots e mídias foram irreversivelmente removidas desse servidor e de servidores onde você tinha seguidores. + get_in_touch: Você pode responder a este e-mail para entrar em contato com a equipe de %{instance}. review_server_policies: Revisar as políticas do servidor subject: disable: Sua conta %{acct} foi congelada diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 1d5ecae959..93e052f271 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -2,9 +2,14 @@ cy: simple_form: hints: + account_alias: + acct: Rhowch enwdefnyddiwr@parth y cyfrif rydych chi am symud ohono + account_migration: + acct: Rhowch enwdefnyddiwr@parth y cyfrif rydych chi am symud iddo account_warning_preset: text: Gallwch defnyddio cystrawen tŵt, fel URLs, hashnodau a sôniadau admin_account_action: + include_statuses: Bydd y defnyddiwr yn gweld pa tŵtiau sydd wedi achosi'r weithred gymedroli neu'r rhybudd send_email_notification: Bydd y defnyddiwr yn derbyn esboniad o beth digwyddodd gyda'i cyfrif text_html: Yn ddewisol. Gallwch defnyddio cystrawen tŵt. Gallwch ychwanegu rhagosodiadau rhybydd i arbed amser type_html: Dewis beth i wneud gyda %{acct} @@ -14,7 +19,10 @@ cy: avatar: PNG, GIF neu JPG. %{size} ar y mwyaf. Caiff ei israddio i %{dimensions}px bot: Mae'r cyfrif hwn yn perfformio gweithredoedd awtomatig yn bennaf ac mae'n bosib nad yw'n cael ei fonitro context: Un neu fwy cyd-destun lle dylai'r hidlydd weithio + current_password: At ddibenion diogelwch, nodwch gyfrinair y cyfrif cyfredol + current_username: I gadarnhau, nodwch enw defnyddiwr y cyfrif cyfredol digest: Ond yn cael eu hanfon ar ôl cyfnod hir o anweithgarwch ac ond os ydych wedi derbyn unrhyw negeseuon personol yn eich absenoldeb + discoverable: Mae'r cyfeirlyfr proffil yn ffordd arall y gall eich cyfrif gyrraedd cynulleidfa ehangach email: Byddwch yn derbyn e-bost i gadarnhau fields: Mae modd i chi arddangos hyd at 4 eitem fel tabl ar eich proffil header: PNG, GIF neu JPG. %{size} ar y mwyaf. Ceith ei israddio i %{dimensions}px @@ -34,10 +42,15 @@ cy: setting_noindex: Mae hyn yn effeithio ar eich proffil cyhoeddus a'ch tudalennau statws setting_show_application: Bydd y offer frydych yn defnyddio i dŵtio yn cael ei arddangos yn golwg manwl eich tŵtiau setting_use_blurhash: Mae graddiannau wedi'u seilio ar liwiau'r delweddau cudd ond maent yn cuddio unrhyw fanylion + setting_use_pending_items: Cuddio diweddariadau llinell amser y tu ôl i glic yn lle sgrolio yn awtomatig username: Bydd eich enw defnyddiwr yn unigryw ar %{domain} whole_word: Os yw'r allweddair neu'r ymadrodd yn alffaniwmerig yn unig, mi fydd ond yn cael ei osod os yw'n cyfateb a'r gair cyfan + domain_allow: + domain: Bydd y parth hwn yn gallu nôl data o'r gweinydd hwn a bydd data sy'n dod i mewn ohono yn cael ei brosesu a'i storio featured_tag: name: 'Efallai hoffech defnyddio un o''r rhain:' + form_challenge: + current_password: Rydych chi'n mynd i mewn i ardal sicr imports: data: Allforiwyd dogfen CSV o achos Mastodon arall invite_request: @@ -110,6 +123,7 @@ cy: setting_theme: Thema'r wefan setting_unfollow_modal: Dangos deialog cadarnhau cyn dad-ddilyn rhywun setting_use_blurhash: Dangoswch raddiannau lliwgar ar gyfer cyfryngau cudd + setting_use_pending_items: Modd araf severity: Difrifoldeb type: Modd mewnforio username: Enw defnyddiwr @@ -121,6 +135,8 @@ cy: must_be_follower: Blocio hysbysiadau o bobl nad ydynt yn eich dilyn must_be_following: Blocio hysbysiadau o bobl nad ydych yn eu dilyn must_be_following_dm: Blocio negeseuon uniongyrchol o bobl nad ydych yn eu dilyn + invite: + comment: Sylw invite_request: text: Pam hoffech ymuno? notification_emails: @@ -132,6 +148,11 @@ cy: pending_account: Anfon ebost pan mae cyfrif newydd angen adolygiad reblog: Anfon e-bost pan mae rhywun yn bŵstio eich statws report: Anfon e-bost pan y cyflwynir adroddiad newydd + tag: + listable: Gadewch i'r hashnod hwn ymddangos mewn chwiliadau ac ar y cyfeiriadur proffil + name: Hashnod + trendable: Gadewch i'r hashnod hwn ymddangos o dan dueddiadau + usable: Caniatáu i tŵtiau ddefnyddio'r hashnod hwn 'no': Na recommended: Argymhellwyd required: diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 898d200d29..2fb33dbc3c 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -2,6 +2,10 @@ 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: @@ -15,6 +19,8 @@ es: 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 @@ -43,6 +49,8 @@ es: 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: @@ -58,6 +66,10 @@ es: 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: @@ -131,6 +143,8 @@ es: 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: diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 90e644e556..b9f0e93727 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -2,9 +2,14 @@ fa: simple_form: hints: + account_alias: + acct: نشانی username@domain را برای حسابی که می‌خواهید از آن منتقل شوید بنویسید + account_migration: + acct: نشانی username@domain را برای حسابی که می‌خواهید به آن منتقل شوید بنویسید account_warning_preset: text: می‌توانید مانند بوق‌های معمولی کاربران دیگر را نام ببرید یا پیوند و برچسب بگذارید admin_account_action: + include_statuses: این کاربر خواهد دید که کدام بوق او موجب اقدام مدیریتی یا هشدار شده است send_email_notification: توضیحی که کاربر می‌بینید که برای حسابش چه رخ داده است text_html: اختیاری. می‌توانید مثل بوق‌های معمولی بنویسید. می‌توانید برای صرفه‌جویی در زمان هشدارهای ازپیش‌آماده بیفزایید type_html: با حساب %{acct} می‌خواهید چه کار کنید؟‌ @@ -14,7 +19,10 @@ fa: avatar: یکی از قالب‌های PNG یا GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد bot: این حساب بیشتر به طور خودکار فعالیت می‌کند و نظارت پیوسته‌ای روی آن وجود ندارد context: یک یا چند زمینه که فیلتر باید در آن‌ها اعمال شود + current_password: به دلایل امنیتی لطفاً رمز این حساب را وارد کنید + current_username: برای تأیید، لطفاً نام کاربری حساب فعلی را وارد کنید digest: تنها وقتی فرستاده می‌شود که مدتی طولانی فعالیتی نداشته باشید و در این مدت برای شما پیغام خصوصی‌ای نوشته شده باشد + discoverable: فهرست گزیدهٔ کاربران این سرور راه دیگری است که با آن حساب شما می‌تواند مخاطبان بیشتری پیدا کند email: به شما ایمیل تأییدی فرستاده خواهد شد fields: شما می‌توانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید header: یکی از قالب‌های PNG یا GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 9f2f15b07c..c41292abf3 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -2,6 +2,10 @@ fr: simple_form: hints: + account_alias: + acct: Spécifiez le nom d'utilisateur@domaine du compte que vous souhaitez déplacer + account_migration: + acct: Spécifiez le nom d'utilisateur@domaine du compte vers lequel vous souhaitez déplacer account_warning_preset: text: Vous pouvez utiliser la syntaxe des pouets, comme les URLs, les hashtags et les mentions admin_account_action: @@ -15,6 +19,8 @@ fr: avatar: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px bot: Ce compte exécute principalement des actions automatisées et pourrait ne pas être surveillé context: Un ou plusieurs contextes où le filtre devrait s’appliquer + current_password: Pour des raisons de sécurité, veuillez saisir le mot de passe du compte courant + current_username: Pour confirmer, veuillez saisir le nom d'utilisateur du compte courant digest: Uniquement envoyé après une longue période d’inactivité et uniquement si vous avez reçu des messages personnels pendant votre absence discoverable: L’annuaire des profils est une autre façon pour votre compte d’atteindre une plus grand audience email: Vous recevrez un courriel de confirmation @@ -43,6 +49,8 @@ fr: domain: Ce domaine pourra récupérer des données de ce serveur et les données entrantes seront traitées et stockées featured_tag: name: 'Vous pourriez vouloir utiliser l’un d’entre eux :' + form_challenge: + current_password: Vous entrez une zone sécurisée imports: data: Un fichier CSV généré par un autre serveur de Mastodon invite_request: @@ -58,6 +66,10 @@ fr: fields: name: Étiquette value: Contenu + account_alias: + acct: Gestion de l'ancien compte + account_migration: + acct: Gestion du nouveau compte account_warning_preset: text: Texte de présélection admin_account_action: diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index a6db9e0065..7c0a81558b 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -15,6 +15,8 @@ ko: avatar: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 다운스케일 될 것임 bot: 사람들에게 계정이 사람이 아님을 알립니다 context: 필터를 적용 할 한 개 이상의 컨텍스트 + current_password: 보안을 위해 현재 계정의 비밀번호를 입력해주세요 + current_username: 확인을 위해, 현재 계정의 유저명을 입력해주세요 digest: 오랫동안 활동하지 않았을 때 받은 멘션들에 대한 요약 받기 discoverable: 프로필 디렉터리는 내 계정이 더 많은 관심을 갖게 할 수 있는 다른 방법입니다 email: 당신은 확인 메일을 받게 됩니다 @@ -43,6 +45,8 @@ ko: domain: 이 도메인은 이 서버에서 데이터를 가져갈 수 있고 이 도메인에서 보내진 데이터는 처리되고 저장 됩니다 featured_tag: name: '이것들을 사용하면 좋을 것 같습니다:' + form_challenge: + current_password: 당신은 보안 구역에 진입하고 있습니다 imports: data: 다른 마스토돈 서버에서 추출된 CSV 파일 invite_request: diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index 9336a98466..50a8efab16 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -124,6 +124,8 @@ oc: must_be_follower: Blocar las notificacions del mond que vos sègon pas must_be_following: Blocar las notificacions del mond que seguètz pas must_be_following_dm: Blocar los messatges del monde que seguètz pas + invite: + comment: Comentari invite_request: text: Perqué volètz vos marcar ? notification_emails: @@ -135,6 +137,11 @@ oc: pending_account: Enviar un corrièl quand cal validar un compte novèl reblog: Enviar un corrièl quand qualqu’un tòrna partejar vòstre estatut report: Enviar un corrièl pels nòus senhalaments + tag: + listable: Permetre a aquesta etiqueta d’aparéisser a las recèrcas e a l’annuari de perfils + name: Etiqueta + trendable: Permetre a aquesta etiqueta d’aparéisser a las tendéncias + usable: Permetre als tuts d’utilizar aquesta etiqueta 'no': Non recommended: Recomandat required: From 4fe5f8f3c7db8842fc58b8116bd1ae219ab068a9 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Sun, 22 Sep 2019 09:37:15 +0900 Subject: [PATCH 024/107] Add full numeric notation to the dashboard title attribute (#11911) --- app/views/admin/dashboard/index.html.haml | 24 +++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 514637c4f0..2849f07aab 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -4,35 +4,43 @@ .dashboard__counters %div = link_to admin_accounts_url(local: 1, recent: 1) do - .dashboard__counters__num= number_to_human @users_count, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@users_count, strip_insignificant_zeros: true) } + = number_to_human @users_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.total_users' %div %div - .dashboard__counters__num= number_to_human @registrations_week, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@registrations_week, strip_insignificant_zeros: true) } + = number_to_human @registrations_week, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.week_users_new' %div %div - .dashboard__counters__num= number_to_human @logins_week, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@logins_week, strip_insignificant_zeros: true) } + = number_to_human @logins_week, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.week_users_active' %div = link_to admin_pending_accounts_path do - .dashboard__counters__num= number_to_human @pending_users_count, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@pending_users_count, strip_insignificant_zeros: true) } + = number_to_human @pending_users_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.pending_users' %div = link_to admin_reports_url do - .dashboard__counters__num= number_to_human @reports_count, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@reports_count, strip_insignificant_zeros: true) } + = number_to_human @reports_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.open_reports' %div = link_to admin_tags_path(pending_review: '1') do - .dashboard__counters__num= number_to_human @pending_tags_count, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@pending_tags_count, strip_insignificant_zeros: true) } + = number_to_human @pending_tags_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.pending_tags' %div %div - .dashboard__counters__num= number_to_human @interactions_week, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@interactions_week, strip_insignificant_zeros: true) } + = number_to_human @interactions_week, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.week_interactions' %div = link_to sidekiq_url do - .dashboard__counters__num= number_to_human @queue_backlog, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@queue_backlog, strip_insignificant_zeros: true) } + = number_to_human @queue_backlog, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.backlog' .dashboard__widgets From 26b810561a5b7cfd1766699358d998b5882a5876 Mon Sep 17 00:00:00 2001 From: Jeong Arm Date: Sun, 22 Sep 2019 19:58:29 +0900 Subject: [PATCH 025/107] Fix ugly TOC when title is too long (#11916) * Fix ugly TOC when title is too long * Fix TOC using grid, minmax --- app/javascript/styles/mastodon/containers.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss index 24bbf82119..2d1bf1abd4 100644 --- a/app/javascript/styles/mastodon/containers.scss +++ b/app/javascript/styles/mastodon/containers.scss @@ -169,7 +169,7 @@ .grid-4 { display: grid; grid-gap: 10px; - grid-template-columns: 1fr 1fr 1fr 1fr; + grid-template-columns: repeat(4, minmax(0, 1fr)); grid-auto-columns: 25%; grid-auto-rows: max-content; From b359974d9b356bb723fe046466b178328cf9bbaf Mon Sep 17 00:00:00 2001 From: ThibG Date: Sun, 22 Sep 2019 14:15:18 +0200 Subject: [PATCH 026/107] Show user what options they have voted (#11195) * Add own_votes field to poll results in REST API Fixes #10679 * Display user votes in WebUI * Update styling * Add vote checkmark to public pages --- app/javascript/mastodon/actions/importer/normalizer.js | 3 ++- app/javascript/mastodon/components/poll.js | 7 ++++++- app/javascript/styles/mastodon/polls.scss | 10 ++++++++-- app/models/poll.rb | 4 ++++ app/serializers/rest/poll_serializer.rb | 5 +++++ app/views/statuses/_poll.html.haml | 8 ++++++-- 6 files changed, 31 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/actions/importer/normalizer.js b/app/javascript/mastodon/actions/importer/normalizer.js index 5e7e78e698..f7108fdb90 100644 --- a/app/javascript/mastodon/actions/importer/normalizer.js +++ b/app/javascript/mastodon/actions/importer/normalizer.js @@ -73,8 +73,9 @@ export function normalizePoll(poll) { const emojiMap = makeEmojiMap(normalPoll); - normalPoll.options = poll.options.map(option => ({ + normalPoll.options = poll.options.map((option, index) => ({ ...option, + voted: poll.own_votes && poll.own_votes.includes(index), title_emojified: emojify(escapeTextContentForBrowser(option.title), emojiMap), })); diff --git a/app/javascript/mastodon/components/poll.js b/app/javascript/mastodon/components/poll.js index 373f710d3c..4c9b23b770 100644 --- a/app/javascript/mastodon/components/poll.js +++ b/app/javascript/mastodon/components/poll.js @@ -10,6 +10,7 @@ import spring from 'react-motion/lib/spring'; import escapeTextContentForBrowser from 'escape-html'; import emojify from 'mastodon/features/emoji/emoji'; import RelativeTimestamp from './relative_timestamp'; +import Icon from 'mastodon/components/icon'; const messages = defineMessages({ closed: { id: 'poll.closed', defaultMessage: 'Closed' }, @@ -103,6 +104,7 @@ class Poll extends ImmutablePureComponent { 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 active = !!this.state.selected[`${optionIndex}`]; + const voted = option.get('voted') || (poll.get('own_votes') && poll.get('own_votes').includes(optionIndex)); let titleEmojified = option.get('title_emojified'); if (!titleEmojified) { @@ -131,7 +133,10 @@ class Poll extends ImmutablePureComponent { /> {!showResults && } - {showResults && {Math.round(percent)}%} + {showResults && + {!!voted && } + {Math.round(percent)}% + } diff --git a/app/javascript/styles/mastodon/polls.scss b/app/javascript/styles/mastodon/polls.scss index e80220f278..85ba138b41 100644 --- a/app/javascript/styles/mastodon/polls.scss +++ b/app/javascript/styles/mastodon/polls.scss @@ -95,13 +95,19 @@ &__number { display: inline-block; - width: 36px; + width: 48px; font-weight: 700; padding: 0 10px; text-align: right; margin-top: auto; margin-bottom: auto; - flex: 0 0 36px; + flex: 0 0 48px; + } + + &__vote__mark { + float: left; + color: $valid-value-color; + line-height: 18px; } &__footer { diff --git a/app/models/poll.rb b/app/models/poll.rb index 8f72c7b112..55a8f13a65 100644 --- a/app/models/poll.rb +++ b/app/models/poll.rb @@ -54,6 +54,10 @@ class Poll < ApplicationRecord account.id == account_id || votes.where(account: account).exists? end + def own_votes(account) + votes.where(account: account).pluck(:choice) + end + delegate :local?, to: :account def remote? diff --git a/app/serializers/rest/poll_serializer.rb b/app/serializers/rest/poll_serializer.rb index 356c45b838..eb98bb2d23 100644 --- a/app/serializers/rest/poll_serializer.rb +++ b/app/serializers/rest/poll_serializer.rb @@ -8,6 +8,7 @@ class REST::PollSerializer < ActiveModel::Serializer has_many :emojis, serializer: REST::CustomEmojiSerializer attribute :voted, if: :current_user? + attribute :own_votes, if: :current_user? def id object.id.to_s @@ -21,6 +22,10 @@ class REST::PollSerializer < ActiveModel::Serializer object.voted?(current_user.account) end + def own_votes + object.own_votes(current_user.account) + end + def current_user? !current_user.nil? end diff --git a/app/views/statuses/_poll.html.haml b/app/views/statuses/_poll.html.haml index ba34890dfe..d6b36a5d12 100644 --- a/app/views/statuses/_poll.html.haml +++ b/app/views/statuses/_poll.html.haml @@ -1,15 +1,19 @@ - show_results = (user_signed_in? && poll.voted?(current_account)) || poll.expired? +- own_votes = user_signed_in? ? poll.own_votes(current_account) : [] .poll %ul - - poll.loaded_options.each do |option| + - poll.loaded_options.each_with_index do |option, index| %li - if show_results - percent = poll.votes_count > 0 ? 100 * option.votes_count / poll.votes_count : 0 %span.poll__chart{ style: "width: #{percent}%" } %label.poll__text>< - %span.poll__number= percent.round + %span.poll__number>< + - if own_votes.include?(index) + %i.poll__vote__mark.fa.fa-check + = percent.round = Formatter.instance.format_poll_option(status, option, autoplay: autoplay) - else %label.poll__text>< From 8c4b5f7cef60700af7ae64c7b524d899a1d033c5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 23 Sep 2019 00:48:31 +0200 Subject: [PATCH 027/107] Revert "Change timelines to add new items to pending items when scrolled down #11867" (#11921) Fix #11912 --- app/javascript/mastodon/reducers/notifications.js | 7 +++---- app/javascript/mastodon/reducers/timelines.js | 5 +++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index aac644950f..6ba80bd6a5 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -38,10 +38,9 @@ const notificationToMap = notification => ImmutableMap({ }); const normalizeNotification = (state, notification, usePendingItems) => { - const top = state.get('top'); - const mounted = state.get('mounted'); + const top = state.get('top'); - if (usePendingItems || (!top && mounted) || !state.get('pendingItems').isEmpty()) { + if (usePendingItems || !state.get('pendingItems').isEmpty()) { return state.update('pendingItems', list => list.unshift(notificationToMap(notification))).update('unread', unread => unread + 1); } @@ -67,7 +66,7 @@ const expandNormalizedNotifications = (state, notifications, next, isLoadingRece return state.withMutations(mutable => { if (!items.isEmpty()) { - usePendingItems = isLoadingRecent && (usePendingItems || (!mutable.get('top') && mutable.get('mounted')) || !mutable.get('pendingItems').isEmpty()); + usePendingItems = isLoadingRecent && (usePendingItems || !mutable.get('pendingItems').isEmpty()); mutable.update(usePendingItems ? 'pendingItems' : 'items', list => { const lastIndex = 1 + list.findLastIndex( diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js index f3ed2fc59a..0d7222e10a 100644 --- a/app/javascript/mastodon/reducers/timelines.js +++ b/app/javascript/mastodon/reducers/timelines.js @@ -40,7 +40,8 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is if (timeline.endsWith(':pinned')) { mMap.set('items', statuses.map(status => status.get('id'))); } else if (!statuses.isEmpty()) { - usePendingItems = isLoadingRecent && (usePendingItems || !mMap.get('top') || !mMap.get('pendingItems').isEmpty()); + usePendingItems = isLoadingRecent && (usePendingItems || !mMap.get('pendingItems').isEmpty()); + mMap.update(usePendingItems ? 'pendingItems' : 'items', ImmutableList(), oldIds => { const newIds = statuses.map(status => status.get('id')); @@ -63,7 +64,7 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is const updateTimeline = (state, timeline, status, usePendingItems) => { const top = state.getIn([timeline, 'top']); - if (usePendingItems || !top || !state.getIn([timeline, 'pendingItems']).isEmpty()) { + if (usePendingItems || !state.getIn([timeline, 'pendingItems']).isEmpty()) { if (state.getIn([timeline, 'pendingItems'], ImmutableList()).includes(status.get('id')) || state.getIn([timeline, 'items'], ImmutableList()).includes(status.get('id'))) { return state; } From 0d2b60ab8b13a28e99a83e1104e7208de2025304 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 23 Sep 2019 00:48:43 +0200 Subject: [PATCH 028/107] Fix emoji search not showing custom emoji when none are uncategorized (#11920) Fix #11903 --- app/javascript/mastodon/features/emoji/emoji.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/emoji/emoji.js b/app/javascript/mastodon/features/emoji/emoji.js index 359bb7ffd4..cd10e20b7e 100644 --- a/app/javascript/mastodon/features/emoji/emoji.js +++ b/app/javascript/mastodon/features/emoji/emoji.js @@ -99,4 +99,4 @@ export const buildCustomEmojis = (customEmojis) => { return emojis; }; -export const categoriesFromEmojis = customEmojis => customEmojis.reduce((set, emoji) => set.add(emoji.get('category') ? `custom-${emoji.get('category')}` : 'custom'), new Set()); +export const categoriesFromEmojis = customEmojis => customEmojis.reduce((set, emoji) => set.add(emoji.get('category') ? `custom-${emoji.get('category')}` : 'custom'), new Set(['custom'])); From 50b9276330e38657d3a4f596db29f78ac242eaf7 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 23 Sep 2019 02:19:08 +0200 Subject: [PATCH 029/107] Fix unread indicator not updating for notifications (#11923) Regression from #11898 --- app/javascript/mastodon/components/scrollable_list.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js index b8fa0c2d9a..421756803c 100644 --- a/app/javascript/mastodon/components/scrollable_list.js +++ b/app/javascript/mastodon/components/scrollable_list.js @@ -201,10 +201,6 @@ export default class ScrollableList extends PureComponent { this.detachIntersectionObserver(); detachFullscreenListener(this.onFullScreenChange); - - if (this.props.onScrollToTop) { - this.props.onScrollToTop(); - } } onFullScreenChange = () => { From 9707e6471504634818e5aae6495583cd62336ef1 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Mon, 23 Sep 2019 19:11:59 +0900 Subject: [PATCH 030/107] Remove deprecated config from Heroku and Scalingo (#11925) --- app.json | 9 --------- scalingo.json | 9 --------- 2 files changed, 18 deletions(-) diff --git a/app.json b/app.json index 09adaac2c9..211f17d812 100644 --- a/app.json +++ b/app.json @@ -13,15 +13,6 @@ "description": "The domain that your Mastodon instance will run on (this can be appname.herokuapp.com or a custom domain)", "required": true }, - "LOCAL_HTTPS": { - "description": "Will your domain support HTTPS? (Automatic for herokuapp, requires manual configuration for custom domains)", - "value": "false", - "required": true - }, - "PAPERCLIP_SECRET": { - "description": "The secret key for storing media files", - "generator": "secret" - }, "SECRET_KEY_BASE": { "description": "The secret key base", "generator": "secret" diff --git a/scalingo.json b/scalingo.json index dd8fb5530c..324356df0c 100644 --- a/scalingo.json +++ b/scalingo.json @@ -8,15 +8,6 @@ "description": "The domain that your Mastodon instance will run on (this can be appname.scalingo.io or a custom domain)", "required": true }, - "LOCAL_HTTPS": { - "description": "Will your domain support HTTPS? (Automatic for *.scalingo.io, requires manual configuration for custom domains)", - "value": "true", - "required": true - }, - "PAPERCLIP_SECRET": { - "description": "The secret key for storing media files", - "generator": "secret" - }, "SECRET_KEY_BASE": { "description": "The secret key base", "generator": "secret" From 695cbef0e3421e5e9198906c116cca47070080a6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2019 19:19:13 +0900 Subject: [PATCH 031/107] Bump babel-jest from 24.8.0 to 24.9.0 (#11926) Bumps [babel-jest](https://github.com/facebook/jest/tree/HEAD/packages/babel-jest) from 24.8.0 to 24.9.0. - [Release notes](https://github.com/facebook/jest/releases) - [Changelog](https://github.com/facebook/jest/blob/master/CHANGELOG.md) - [Commits](https://github.com/facebook/jest/commits/v24.9.0/packages/babel-jest) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 144 --------------------------------------------------- 2 files changed, 1 insertion(+), 145 deletions(-) diff --git a/package.json b/package.json index 7c378eb39b..46811404fd 100644 --- a/package.json +++ b/package.json @@ -171,7 +171,7 @@ }, "devDependencies": { "babel-eslint": "^10.0.3", - "babel-jest": "^24.8.0", + "babel-jest": "^24.9.0", "enzyme": "^3.10.0", "enzyme-adapter-react-16": "^1.14.0", "eslint": "^6.1.0", diff --git a/yarn.lock b/yarn.lock index 9c85ea741f..72386cda1f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -953,15 +953,6 @@ "@jest/types" "^24.9.0" jest-mock "^24.9.0" -"@jest/fake-timers@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.8.0.tgz#2e5b80a4f78f284bcb4bd5714b8e10dd36a8d3d1" - integrity sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw== - dependencies: - "@jest/types" "^24.8.0" - jest-message-util "^24.8.0" - jest-mock "^24.8.0" - "@jest/fake-timers@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" @@ -1016,15 +1007,6 @@ graceful-fs "^4.1.15" source-map "^0.6.0" -"@jest/test-result@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.8.0.tgz#7675d0aaf9d2484caa65e048d9b467d160f8e9d3" - integrity sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng== - dependencies: - "@jest/console" "^24.7.1" - "@jest/types" "^24.8.0" - "@types/istanbul-lib-coverage" "^2.0.0" - "@jest/test-result@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" @@ -1044,27 +1026,6 @@ jest-runner "^24.9.0" jest-runtime "^24.9.0" -"@jest/transform@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.8.0.tgz#628fb99dce4f9d254c6fd9341e3eea262e06fef5" - integrity sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^24.8.0" - babel-plugin-istanbul "^5.1.0" - chalk "^2.0.1" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.15" - jest-haste-map "^24.8.0" - jest-regex-util "^24.3.0" - jest-util "^24.8.0" - micromatch "^3.1.10" - realpath-native "^1.1.0" - slash "^2.0.0" - source-map "^0.6.1" - write-file-atomic "2.4.1" - "@jest/transform@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" @@ -1087,15 +1048,6 @@ source-map "^0.6.1" write-file-atomic "2.4.1" -"@jest/types@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.8.0.tgz#f31e25948c58f0abd8c845ae26fcea1491dea7ad" - integrity sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^12.0.9" - "@jest/types@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" @@ -1204,11 +1156,6 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== -"@types/yargs@^12.0.9": - version "12.0.9" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.9.tgz#693e76a52f61a2f1e7fb48c0eef167b95ea4ffd0" - integrity sha512-sCZy4SxP9rN2w30Hlmg5dtdRwgYQfYRiLo9usw8X9cxlf+H4FqM1xX7+sNH7NNKVdbXMJWqva7iyy+fxh/V7fA== - "@types/yargs@^13.0.0": version "13.0.2" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.2.tgz#a64674fc0149574ecd90ba746e932b5a5f7b3653" @@ -1798,19 +1745,6 @@ babel-eslint@^10.0.3: eslint-visitor-keys "^1.0.0" resolve "^1.12.0" -babel-jest@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.8.0.tgz#5c15ff2b28e20b0f45df43fe6b7f2aae93dba589" - integrity sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw== - dependencies: - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" - "@types/babel__core" "^7.1.0" - babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.6.0" - chalk "^2.4.2" - slash "^2.0.0" - babel-jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" @@ -1868,13 +1802,6 @@ babel-plugin-istanbul@^5.1.0: istanbul-lib-instrument "^3.0.0" test-exclude "^5.0.0" -babel-plugin-jest-hoist@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz#f7f7f7ad150ee96d7a5e8e2c5da8319579e78019" - integrity sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w== - dependencies: - "@types/babel__traverse" "^7.0.6" - babel-plugin-jest-hoist@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" @@ -1936,14 +1863,6 @@ babel-plugin-transform-react-remove-prop-types@^0.4.24: resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== -babel-preset-jest@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz#66f06136eefce87797539c0d63f1769cc3915984" - integrity sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw== - dependencies: - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.6.0" - babel-preset-jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" @@ -5902,25 +5821,6 @@ jest-get-type@^24.9.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== -jest-haste-map@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.8.0.tgz#51794182d877b3ddfd6e6d23920e3fe72f305800" - integrity sha512-ZBPRGHdPt1rHajWelXdqygIDpJx8u3xOoLyUBWRW28r3tagrgoepPrzAozW7kW9HrQfhvmiv1tncsxqHJO1onQ== - dependencies: - "@jest/types" "^24.8.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.4.0" - jest-util "^24.8.0" - jest-worker "^24.6.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" - jest-haste-map@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" @@ -5980,20 +5880,6 @@ jest-matcher-utils@^24.9.0: jest-get-type "^24.9.0" pretty-format "^24.9.0" -jest-message-util@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.8.0.tgz#0d6891e72a4beacc0292b638685df42e28d6218b" - integrity sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - jest-message-util@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" @@ -6008,13 +5894,6 @@ jest-message-util@^24.9.0: slash "^2.0.0" stack-utils "^1.0.1" -jest-mock@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.8.0.tgz#2f9d14d37699e863f1febf4e4d5a33b7fdbbde56" - integrity sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A== - dependencies: - "@jest/types" "^24.8.0" - jest-mock@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" @@ -6111,11 +5990,6 @@ jest-runtime@^24.9.0: strip-bom "^3.0.0" yargs "^13.3.0" -jest-serializer@^24.4.0: - version "24.4.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" - integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== - jest-serializer@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" @@ -6140,24 +6014,6 @@ jest-snapshot@^24.9.0: pretty-format "^24.9.0" semver "^6.2.0" -jest-util@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.8.0.tgz#41f0e945da11df44cc76d64ffb915d0716f46cd1" - integrity sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA== - dependencies: - "@jest/console" "^24.7.1" - "@jest/fake-timers" "^24.8.0" - "@jest/source-map" "^24.3.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" - is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" - jest-util@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" From 93659569716e308b6d894f1e6f19de268926819f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2019 19:19:52 +0900 Subject: [PATCH 032/107] Bump mini-css-extract-plugin from 0.7.0 to 0.8.0 (#11927) Bumps [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) from 0.7.0 to 0.8.0. - [Release notes](https://github.com/webpack-contrib/mini-css-extract-plugin/releases) - [Changelog](https://github.com/webpack-contrib/mini-css-extract-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/mini-css-extract-plugin/compare/v0.7.0...v0.8.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 46811404fd..184251576a 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "lodash": "^4.17.14", "mark-loader": "^0.1.6", "marky": "^1.2.1", - "mini-css-extract-plugin": "^0.7.0", + "mini-css-extract-plugin": "^0.8.0", "mkdirp": "^0.5.1", "npmlog": "^4.1.2", "object-assign": "^4.1.1", diff --git a/yarn.lock b/yarn.lock index 72386cda1f..9d9214ffbe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6686,10 +6686,10 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mini-css-extract-plugin@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz#5ba8290fbb4179a43dd27cca444ba150bee743a0" - integrity sha512-RQIw6+7utTYn8DBGsf/LpRgZCJMpZt+kuawJ/fju0KiOL6nAaTBNmCJwS7HtwSCXfS47gCkmtBFS7HdsquhdxQ== +mini-css-extract-plugin@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz#81d41ec4fe58c713a96ad7c723cdb2d0bd4d70e1" + integrity sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw== dependencies: loader-utils "^1.1.0" normalize-url "1.9.1" From 3708132631c8fc9af690ed58885797f8c513829c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2019 19:22:51 +0900 Subject: [PATCH 033/107] Bump sass from 1.22.9 to 1.22.12 (#11928) Bumps [sass](https://github.com/sass/dart-sass) from 1.22.9 to 1.22.12. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/master/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.22.9...1.22.12) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 184251576a..72265326cb 100644 --- a/package.json +++ b/package.json @@ -152,7 +152,7 @@ "requestidlecallback": "^0.3.0", "reselect": "^4.0.0", "rimraf": "^3.0.0", - "sass": "^1.22.9", + "sass": "^1.22.12", "sass-loader": "^7.0.3", "stringz": "^2.0.0", "substring-trie": "^1.0.2", diff --git a/yarn.lock b/yarn.lock index 9d9214ffbe..fed0bc13e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9224,10 +9224,10 @@ sass-loader@^7.0.3: pify "^3.0.0" semver "^5.5.0" -sass@^1.22.9: - version "1.22.9" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.22.9.tgz#41a2ed6038027f58be2bd5041293452a29c2cb84" - integrity sha512-FzU1X2V8DlnqabrL4u7OBwD2vcOzNMongEJEx3xMEhWY/v26FFR3aG0hyeu2T965sfR0E9ufJwmG+Qjz78vFPQ== +sass@^1.22.12: + version "1.22.12" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.22.12.tgz#5cbdd38720ffd1857da695331faee9f634bcb5d7" + integrity sha512-u5Rxn+dKTPCW5/11kMNxtmqKsxCjcpnqj9CaJoru1NqeJ0DOa9rOM00e0HqmseTAatGkKoLY+jaNecMYevu1gg== dependencies: chokidar ">=2.0.0 <4.0.0" From 3ff74cea72fa5e0b0859201e2efae371d3afeca3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2019 19:25:59 +0900 Subject: [PATCH 034/107] Bump faker from 2.3.0 to 2.4.0 (#11933) Bumps [faker](https://github.com/faker-ruby/faker) from 2.3.0 to 2.4.0. - [Release notes](https://github.com/faker-ruby/faker/releases) - [Changelog](https://github.com/faker-ruby/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/faker-ruby/faker/compare/v2.3.0...v2.4.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 081cdd04ec..d9965e7da0 100644 --- a/Gemfile +++ b/Gemfile @@ -115,7 +115,7 @@ end group :test do gem 'capybara', '~> 3.29' gem 'climate_control', '~> 0.2' - gem 'faker', '~> 2.3' + gem 'faker', '~> 2.4' gem 'microformats', '~> 4.1' gem 'rails-controller-testing', '~> 1.0' gem 'rspec-sidekiq', '~> 3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 4545872f06..088f01920d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -231,7 +231,7 @@ GEM tzinfo excon (0.62.0) fabrication (2.20.2) - faker (2.3.0) + faker (2.4.0) i18n (~> 1.6.0) faraday (0.15.0) multipart-post (>= 1.2, < 3) @@ -700,7 +700,7 @@ DEPENDENCIES doorkeeper (~> 5.2) dotenv-rails (~> 2.7) fabrication (~> 2.20) - faker (~> 2.3) + faker (~> 2.4) fast_blank (~> 1.0) fastimage fog-core (<= 2.1.0) From bdad34adf4e0a644fce33d2393767216cc292c30 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2019 19:48:03 +0900 Subject: [PATCH 035/107] Bump redis from 4.1.2 to 4.1.3 (#11938) Bumps [redis](https://github.com/redis/redis-rb) from 4.1.2 to 4.1.3. - [Release notes](https://github.com/redis/redis-rb/releases) - [Changelog](https://github.com/redis/redis-rb/blob/master/CHANGELOG.md) - [Commits](https://github.com/redis/redis-rb/compare/v4.1.2...v4.1.3) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 088f01920d..65b8451462 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -500,7 +500,7 @@ GEM link_header (~> 0.0, >= 0.0.8) rdf-normalize (0.3.3) rdf (>= 2.2, < 4.0) - redis (4.1.2) + redis (4.1.3) redis-actionpack (5.0.2) actionpack (>= 4.0, < 6) redis-rack (>= 1, < 3) From a60c78f6b2c07840c3d516663f87d4f5be58390c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2019 19:52:29 +0900 Subject: [PATCH 036/107] Bump chewy from 5.0.0 to 5.0.1 (#11935) Bumps [chewy](https://github.com/toptal/chewy) from 5.0.0 to 5.0.1. - [Release notes](https://github.com/toptal/chewy/releases) - [Changelog](https://github.com/toptal/chewy/blob/master/CHANGELOG.md) - [Commits](https://github.com/toptal/chewy/compare/v5.0.0...v5.0.1) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 65b8451462..42163e6211 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -161,7 +161,7 @@ GEM case_transform (0.2) activesupport charlock_holmes (0.7.6) - chewy (5.0.0) + chewy (5.0.1) activesupport (>= 4.0) elasticsearch (>= 2.0.0) elasticsearch-dsl @@ -215,13 +215,13 @@ GEM dotenv-rails (2.7.5) dotenv (= 2.7.5) railties (>= 3.2, < 6.1) - elasticsearch (6.0.2) - elasticsearch-api (= 6.0.2) - elasticsearch-transport (= 6.0.2) - elasticsearch-api (6.0.2) + elasticsearch (7.3.0) + elasticsearch-api (= 7.3.0) + elasticsearch-transport (= 7.3.0) + elasticsearch-api (7.3.0) multi_json - elasticsearch-dsl (0.1.5) - elasticsearch-transport (6.0.2) + elasticsearch-dsl (0.1.8) + elasticsearch-transport (7.3.0) faraday multi_json encryptor (3.0.0) @@ -233,7 +233,7 @@ GEM fabrication (2.20.2) faker (2.4.0) i18n (~> 1.6.0) - faraday (0.15.0) + faraday (0.15.4) multipart-post (>= 1.2, < 3) fast_blank (1.0.0) fastimage (2.1.7) @@ -370,10 +370,10 @@ GEM mimemagic (0.3.3) mini_mime (1.0.2) mini_portile2 (2.4.0) - minitest (5.11.3) + minitest (5.12.0) msgpack (1.3.1) multi_json (1.13.1) - multipart-post (2.0.0) + multipart-post (2.1.1) necromancer (0.5.0) net-ldap (0.16.1) net-scp (2.0.0) From 36bdfce1bd40d3ba7e940c534dc3592c6cd5fb98 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2019 19:53:09 +0900 Subject: [PATCH 037/107] Bump simplecov from 0.17.0 to 0.17.1 (#11932) Bumps [simplecov](https://github.com/colszowka/simplecov) from 0.17.0 to 0.17.1. - [Release notes](https://github.com/colszowka/simplecov/releases) - [Changelog](https://github.com/colszowka/simplecov/blob/master/CHANGELOG.md) - [Commits](https://github.com/colszowka/simplecov/compare/v0.17.0...v0.17.1) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 42163e6211..dfc00642be 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -590,7 +590,7 @@ GEM simple_form (4.1.0) actionpack (>= 5.0) activemodel (>= 5.0) - simplecov (0.17.0) + simplecov (0.17.1) docile (~> 1.1) json (>= 1.8, < 3) simplecov-html (~> 0.10.0) From ce8ea58bde1c69ca53e77ca61d5add98de7b5fd8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2019 19:53:30 +0900 Subject: [PATCH 038/107] Bump eslint from 6.1.0 to 6.4.0 (#11929) Bumps [eslint](https://github.com/eslint/eslint) from 6.1.0 to 6.4.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v6.1.0...v6.4.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 45 +++++++++++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 72265326cb..382e0b8d36 100644 --- a/package.json +++ b/package.json @@ -174,7 +174,7 @@ "babel-jest": "^24.9.0", "enzyme": "^3.10.0", "enzyme-adapter-react-16": "^1.14.0", - "eslint": "^6.1.0", + "eslint": "^6.4.0", "eslint-plugin-import": "~2.18.2", "eslint-plugin-jsx-a11y": "~6.2.3", "eslint-plugin-promise": "~4.2.1", diff --git a/yarn.lock b/yarn.lock index fed0bc13e5..f8314e4d95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1352,10 +1352,10 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" -acorn-jsx@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" - integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== +acorn-jsx@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f" + integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw== acorn-walk@^6.0.1, acorn-walk@^6.1.1: version "6.1.1" @@ -1377,6 +1377,11 @@ acorn@^6.0.1, acorn@^6.0.7, acorn@^6.2.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.0.tgz#67f0da2fc339d6cfb5d6fb244fd449f33cd8bbe3" integrity sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw== +acorn@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.0.0.tgz#26b8d1cd9a9b700350b71c0905546f64d1284e7a" + integrity sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ== + airbnb-prop-types@^2.13.2: version "2.13.2" resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.13.2.tgz#43147a5062dd2a4a5600e748a47b64004cc5f7fc" @@ -3828,14 +3833,14 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.3.1: +eslint-utils@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== dependencies: eslint-visitor-keys "^1.0.0" -eslint-visitor-keys@^1.0.0: +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== @@ -3879,10 +3884,10 @@ eslint@^2.7.0: text-table "~0.2.0" user-home "^2.0.0" -eslint@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.1.0.tgz#06438a4a278b1d84fb107d24eaaa35471986e646" - integrity sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ== +eslint@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.4.0.tgz#5aa9227c3fbe921982b2eda94ba0d7fae858611a" + integrity sha512-WTVEzK3lSFoXUovDHEbkJqCVPEPwbhCq4trDktNI6ygs7aO41d4cDT0JFAT5MivzZeVLWlg7vHL+bgrQv/t3vA== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -3891,9 +3896,9 @@ eslint@^6.1.0: debug "^4.0.1" doctrine "^3.0.0" eslint-scope "^5.0.0" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^6.0.0" + eslint-utils "^1.4.2" + eslint-visitor-keys "^1.1.0" + espree "^6.1.1" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -3930,14 +3935,14 @@ espree@^3.1.6: acorn "^5.5.0" acorn-jsx "^3.0.0" -espree@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.0.0.tgz#716fc1f5a245ef5b9a7fdb1d7b0d3f02322e75f6" - integrity sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q== +espree@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de" + integrity sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ== dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" + acorn "^7.0.0" + acorn-jsx "^5.0.2" + eslint-visitor-keys "^1.1.0" esprima@^3.1.3: version "3.1.3" From 85a619a428a7d978f9bfc5e8c2822293d2b91fee Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2019 19:54:25 +0900 Subject: [PATCH 039/107] Bump webmock from 3.7.3 to 3.7.5 (#11936) Bumps [webmock](https://github.com/bblimke/webmock) from 3.7.3 to 3.7.5. - [Release notes](https://github.com/bblimke/webmock/releases) - [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md) - [Commits](https://github.com/bblimke/webmock/compare/v3.7.3...v3.7.5) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index dfc00642be..b85879dec7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -646,7 +646,7 @@ GEM uniform_notifier (1.12.1) warden (1.2.8) rack (>= 2.0.6) - webmock (3.7.3) + webmock (3.7.5) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) From 637cc7bf78d054c8e8cb5ab9fa6e63bac0dfd555 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2019 20:05:40 +0900 Subject: [PATCH 040/107] Bump doorkeeper from 5.2.0 to 5.2.1 (#11934) Bumps [doorkeeper](https://github.com/doorkeeper-gem/doorkeeper) from 5.2.0 to 5.2.1. - [Release notes](https://github.com/doorkeeper-gem/doorkeeper/releases) - [Changelog](https://github.com/doorkeeper-gem/doorkeeper/blob/master/CHANGELOG.md) - [Commits](https://github.com/doorkeeper-gem/doorkeeper/compare/v5.2.0...v5.2.1) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index b85879dec7..3af98a43d1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -209,7 +209,7 @@ GEM docile (1.3.2) domain_name (0.5.20180417) unf (>= 0.0.5, < 1.0.0) - doorkeeper (5.2.0) + doorkeeper (5.2.1) railties (>= 5) dotenv (2.7.5) dotenv-rails (2.7.5) From 172eaeba3fd217228dead279712aecce8c3ac080 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Mon, 23 Sep 2019 22:37:45 +0900 Subject: [PATCH 041/107] 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 b322aee1d7..e4ea861e70 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 ce4185e024..cfc95330cc 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 ee9657b0ef..2e92e8dedb 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 042/107] 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 d9965e7da0..2ab3137547 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 3af98a43d1..a796d1aaeb 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 043/107] 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 351675a5cd..0c8f766ca4 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 044/107] 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 b3113bbefc..f48b17c799 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 84ff84c4b0..1179939478 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 5fd37120d0..3ced81b8f3 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 311583820a..fd9a5a8b9b 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 6903d468dc..0000000000 --- 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 0000000000..065aa2de88 --- /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 0000000000..5ce723b331 --- /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 045/107] 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 cfc95330cc..f308c28411 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 046/107] 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 2ab3137547..7ed1a4e6bb 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 a796d1aaeb..900f05ab3e 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 eece67b107..6f1e78fed9 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 047/107] 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 6a6a3d8e35..2714f5313a 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.6.1 +2.6.4 diff --git a/Gemfile.lock b/Gemfile.lock index 900f05ab3e..fdf28bd10d 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 048/107] 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 d8f7c77d37..a170c3ecd5 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 049/107] 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 01caaefa94..40c5f8590c 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 64dd76bb77..5cb0eea7a2 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 050/107] 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 1b02d3c361..6fbb6e0630 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 6934a5c628..8c8a97db32 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 c29c7f8717..c580c5ed5e 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 32c299143f..eebd4f75e3 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 051/107] 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 498b930835..8b1182dbb1 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 052/107] 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 f4f26203e5..7562cc709c 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 053/107] 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 061a36bb8e..79d64dc3e8 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 7891d6690f..1ab79a21df 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 268237846c..5798f529dc 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 054/107] 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 c580c5ed5e..ee798e87f1 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 055/107] 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 5798f529dc..b5dc81703d 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 056/107] 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 989fee385d..910fefb1c7 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 0787cd636f..333db96186 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 057/107] 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 b57807d1c2..c5dbb58baa 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 0000000000..c2397476ad --- /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 fabeb16f35..8eeaf48a08 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 058/107] 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 5cb0eea7a2..47b0e876e8 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 059/107] 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 b306e8e8cc..c12e1c12e1 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 f6d90580b6..67ec7665b6 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 28f1da19f8..ec92f4255f 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 fb195eb07d..be0d763dc1 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 101acdaf96..1941c2e2d8 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 01756a73d4..ebf24be376 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 6bbacdbe64..05112cc184 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 86c85293e8..ae863a9f0e 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 0000000000..960b26891f --- /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 060/107] 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 01c56b4a0c..3b0adb20a8 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 85685dccd8..aba3f59c75 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 eecb43b593..69205d90e8 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 ffbdefaebd..d083dbdc80 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 54466f1ac3..101be4b1de 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 a3b0bb3f59..9a516859cf 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 2ab06c6e72..9069597a5b 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 27fa7e93f5..40c88d6941 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 cd09acfb45..83dba6bd3a 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 e1e7e2cd12..b35d19deea 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 1e944768f7..04968e59a9 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 d7a4da197a..fcd2d30168 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 f40e6c3613..2fbf0ffd71 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 e47bc6871f..a725fa3497 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 ac558e64ed..f1733ad2ba 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 add1c78d50..21b3497996 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 2027a7316b..24bed1060e 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 366bd81b94..90f026e100 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 80d4380923..515d5c1ed9 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 e495cb5f0e..62888be74e 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 dc147be624..ffdbd1b60f 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 f443d0dd3a..51d8b76b43 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 1b03e33f2f..515d5c1ed9 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 03974fa174..5975e1b53a 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 ae8ea32565..6a9dff66b6 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 ef22c7b827..2fbf0ffd71 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.

- -

Adaptado originalmente desde la política de privacidad de Discourse.

- 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 b19cd4c96c..8dbeb3ade2 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -10,7 +10,7 @@ fa: api: رابط برنامه‌نویسی کاربردی apps: اپ‌های موبایل apps_platforms: ماستدون را در iOS، اندروید، و سایر سیستم‌ها داشته باشید - browse_directory: در فهرست گزیدهٔ کاربران این سرور چرخی بزنید و کاربران را بر اساس علاقه‌مندی‌هایشان پیدا کنید + browse_directory: کاربران این سرور را بر اساس علاقه‌مندی‌هایشان پیدا کنید browse_public_posts: فهرست لحظه‌ای نوشته‌های عمومی در ماستدون را ببینید contact: تماس contact_missing: تعیین نشده diff --git a/config/locales/fr.yml b/config/locales/fr.yml index faffc5e754..4b46e7a718 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -242,8 +242,10 @@ fr: disabled_msg: Émoji désactivé avec succès ! emoji: Émoji enable: Activer + enabled: Activé enabled_msg: Émoji activé avec succès image_hint: PNG de moins de 50 Ko + list: Liste listed: Listé new: title: Ajouter un nouvel émoji personnalisé @@ -252,6 +254,7 @@ fr: shortcode_hint: Au moins deux caractères, seulement des caractères alphanumériques ou des tirets bas title: Émojis personnalisés uncategorized: Non catégorisé + unlist: Délisté unlisted: Délisté update_failed_msg: N’a pas pu mettre à jour cet émoji updated_msg: Émoji mis à jour avec succès ! @@ -383,6 +386,7 @@ fr: pending: En attente de l’approbation du relai save_and_enable: Sauvegarder et activer setup: Paramétrer une connexion de relais + signatures_not_enabled: Les relais ne fonctionneront pas correctement lorsque le mode sécurisé ou le mode liste blanche est activé status: Statut title: Relais report_notes: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 9670079d6f..c1222018db 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -35,6 +35,13 @@ hu: status_count_before: eddig tagline: Kövess barátokat és találj újakat terms: Felhasználási feltételek + unavailable_content: A tartalom nem elérhető + unavailable_content_description: + reason: 'Indok:' + rejecting_media: A szerverről származó médiafájlok nem kerülnek feldolgozásra, és nem jelennek meg miniatűrök, amelyek kézi átkattintást igényelnek a másik szerverre. + silenced: A szerver hozzászólásai csak a saját hírvonalon jelennek meg, ha követik a szerzőt. + suspended: Nem fogsz tudni követni senkit ebből a szerverből, és nem kerül feldolgozásra vagy tárolásra a tőle származó adat, és nincs adatcsere. + unavailable_content_html: A Mastodon általában mindenféle tartalomcserét és interakciót lehetővé tesz bármelyik szerverrel a fediverzumban. Ezek azok a kivételek, melyek a mi szerverünkön érvényben vannak. user_count_after: one: felhasználónk other: felhasználónk @@ -42,6 +49,8 @@ hu: what_is_mastodon: Mi a Mastodon? accounts: choices_html: "%{name} választásai:" + endorsements_hint: A webes felületen jóváhagyhatod a követett embereket, és itt jelennek meg. + featured_tags_hint: Szerepeltethetsz bizonyos hashtageket, melyek itt jelennek majd meg. follow: Követés followers: one: Követő @@ -53,6 +62,7 @@ hu: media: Média moved_html: "%{name} ide költözött: %{new_profile_link}" network_hidden: Ez az információ nem elérhető + never_active: Soha nothing_here: Nincs itt semmi! people_followed_by: "%{name} követettjei" people_who_follow: "%{name} követői" @@ -219,10 +229,12 @@ hu: deleted_status: "(törölt tülk)" title: Audit napló custom_emojis: + assign_category: Kategóriák by_domain: Domain copied_msg: Sikeresen létrehoztuk az emoji helyi másolatát copy: Másolás copy_failed_msg: Emoji helyi másolatának létrehozása sikertelen + create_new_category: Új kategória létrehozása created_msg: Emoji létrehozva! delete: Törlés destroyed_msg: Emoji törlése sikeres! @@ -239,6 +251,7 @@ hu: shortcode: Rövidítés shortcode_hint: Legalább két karakter, csak betűk, számok és alsóvonás title: Egyedi emojik + uncategorized: Nem kategorizált unlisted: Nincs listázva update_failed_msg: Nem sikerült frissíteni az emojit updated_msg: Emoji sikeresen frissítve! @@ -418,6 +431,16 @@ hu: custom_css: desc_html: Változtasd meg a kinézetet ebben a CSS-ben, mely minden oldalon be fog töltődni title: Egyedi CSS + default_noindex: + desc_html: Olyan felhasználókat érinti, akik nem módosították ezt a beállítást + title: Alapértelmezésként ne indexeljék a keresők a felhasználóinkat + domain_blocks: + all: Mindenkinek + disabled: Senkinek + title: Domain tiltások megjelenitése + users: Bejelentkezett helyi felhasználóknak + domain_blocks_rationale: + title: Mutasd meg az indokolást hero: desc_html: A kezdőoldalon látszik. Legalább 600x100px méret javasolt. Ha nincs beállítva, a szerver bélyegképet használjuk title: Hősi kép @@ -487,6 +510,7 @@ hu: delete: Törlés nsfw_off: Szenzitív megjelölés törlése nsfw_on: Megjelölés szenzitív tartalomként + deleted: Törölve failed_to_execute: Végrehajtás sikertelen media: title: Média @@ -501,6 +525,10 @@ hu: context: Környezet directory: Katalógusban in_directory: "%{count} a katalógusban" + last_active: Utoljára aktív + most_popular: Legnépszerűbb + most_recent: Legutóbbi + name: Címke review: Engedélyezés állapota reviewed: Engedélyezett title: Hashtagek @@ -526,6 +554,12 @@ hu: new_trending_tag: body: 'A #%{name} hashtag trendi a mai napon, de még nem engedélyeztük eddig. Nem mutatjuk meg nyilvánosan, hacsak nem engedélyezed. Csak simán mentsd az űrlapot, ha soha többé nem akarsz erről a hashtagről hallani.' subject: Új hashtag (#%{name}) engedélyezésre vár a %{instance} szerveren + aliases: + add_new: Alias készítése + created_msg: Elkészült az új aliasod. Most már elkezdheted a költöztetést a régi fiókból. + deleted_msg: Sikeresen eltávolítottad az aliast. A fiókról erre a fiókra való áttérés már nem lehetséges. + hint_html: Ha másik fiókról kívánsz átlépni erre a fiókra, itt létrehozhatsz egy aliast, amelyre szükség van, mielőtt folytathatod a követők áthelyezését a régi fiókból erre. Ez az áthelyezés önmagában ártalmatlan és visszafordítható folyamat. A fiók áttelepítését a régi fiókból indul el. + remove: Alias szétkapcsolása appearance: advanced_web_interface: Haladó webes felület advanced_web_interface_hint: 'Ha szeretnéd, a teljes képernyőszélességet felhasználhatod. A haladó webes felülettel különböző oszlopokat állíthatsz be, hogy egyszerre annyi infót láthass, amennyit csak akarsz: Saját idővonal, értesítések, föderációs idővonal, bármennyi lista vagy hashtag.' @@ -555,6 +589,10 @@ hu: checkbox_agreement_without_rules_html: Egyetértek a felhasználási feltételekkel delete_account: Felhasználói fiók törlése delete_account_html: Felhasználói fiókod törléséhez kattints ide. A rendszer újbóli megerősítést fog kérni. + description: + prefix_invited_by_user: "@%{name} meghív téged, hogy csatlakozz erre a Mastodon szerverre!" + prefix_sign_up: Regisztrláj még ma a Mastodonra! + suffix: Egy fiókkal követhetsz másokat, tülkölhetsz, eszmét cserélhetsz más Mastodon szerverek felhasználóival! didnt_get_confirmation: Nem kaptad meg a megerősítési lépéseket? forgot_password: Elfelejtetted a jelszavad? invalid_reset_password_token: A jelszó-visszaállítási kulcs nem megfelelő vagy lejárt. Kérlek generálj egy újat. @@ -581,6 +619,7 @@ hu: confirming: Várakozás a visszaigazolásra. functional: A fiókod teljesen működőképes. pending: A jelentkezésed engedélyezésre vár. Ez eltarthat egy ideig. Kapsz egy e-mailt, ha az elbírálás megtörtént. + redirecting_to: A fiókod inaktív, mert jelenleg ide %{acct} van átirányítva. trouble_logging_in: Problémád van a bejelentkezéssel? authorize_follow: already_following: Már követed ezt a felhasználót @@ -593,6 +632,11 @@ hu: return: Visszatérés a felhasználó profiloldalára web: Megtekintés a weben title: "%{acct} követése" + challenge: + confirm: Folytatás + hint_html: "Hasznos: Nem fogjuk megint a jelszavadat kérdezni a következő órában." + invalid_password: Érvénytelen jelszó + prompt: Add meg a jelszót a folytatáshoz datetime: distance_in_words: about_x_hours: "%{count}ó" @@ -608,9 +652,22 @@ hu: x_months: "%{count}h" x_seconds: "%{count}mp" deletes: + challenge_not_passed: A beírt információ helytelen confirm_password: Személyazonosságod megerősítéséhez írd be a jelenlegi jelszavad + confirm_username: Add meg a felhasználói nevedet a jóváhagyáshoz proceed: Felhasználói fiók törlése success_msg: Felhasználói fiókod sikeresen töröltük + warning: + before: 'Mielőtt továbbmész, kérlek olvasd el ezt alaposan:' + caches: Más szerverek által cache-elt tartalmak még megmaradhatnak + data_removal: A tülkjeid és minden más adatod véglegesen törlődni fog + email_change_html: Megváltoztathatod az email címed a fiókod törlése nélkül + email_contact_html: Ha még mindig nem érkezik meg, emailezhetsz ide %{email} segítségért + email_reconfirmation_html: Ha nem kaptad meg a megerősítő emailt, itt újrakérheted + irreversible: Nem fogod tudni visszaállítani vagy újraaktiválni a fiókodat + more_details_html: A részletekért nézd meg az adatvédelmi szabályzatot. + username_available: A fiókod ismét elérhetővé válik + username_unavailable: A fiókod elérhetetlen marad directories: directory: Profilok explanation: Találj másokra érdeklődésük alapján @@ -618,10 +675,10 @@ hu: domain_validator: invalid_domain: nem egy valódi domain név errors: - '400': The request you submitted was invalid or malformed. + '400': A küldött kérés érvénytelen vagy hibás volt. '403': Nincs jogosultságod az oldal megtekintéséhez. '404': Az általad keresett oldal nem található. - '406': This page is not available in the requested format. + '406': Ez az oldal a kért formátumban nem áll rendelkezésre. '410': Az általad keresett oldal már nem létezik. '422': content: Megerősítés sikertelen. Nem tiltottad le esetleg a sütiket? @@ -630,7 +687,7 @@ hu: '500': content: Sajnáljuk, valami hiba történt a mi oldalunkon. title: Az oldal nem megfelelő - '503': The page could not be served due to a temporary server failure. + '503': Az oldalt nem tudjuk megmutatni átmeneti szerverprobléma miatt. noscript_html: A Mastodon webalkalmazás használatához engedélyezned kell a JavaScriptet. A másik megoldás, hogy kipróbálsz egy platformodnak megfelelő alkalmazást. existing_username_validator: not_found: ezzel a névvel nem találtunk helyi felhasználót @@ -654,6 +711,7 @@ hu: add_new: Új hozzáadása errors: limit: Már kiemelted a maximálisan engedélyezett számú hashtaget + hint_html: "Mik a kiemelt hashtagek? Ezek állandóan megjelennek a nyilvános profilodon és lehetővé teszik, hogy mások kifejezetten az ezekhez tartozó tülkjeidet böngésszék. Jó eszköz ez kreatív munkák vagy hosszútávú projektek nyomonkövetésére." filters: contexts: home: Saját idővonal @@ -674,10 +732,12 @@ hu: developers: Fejlesztőknek more: Többet… resources: Segédanyagok + trending_now: Most trendi generic: all: Mind changes_saved_msg: A változásokat elmentettük! copy: Másolás + no_batch_actions_available: Ezen az oldalon nem elérhetőek kötegelt műveletek order_by: Rendezés save_changes: Változások mentése validation_errors: @@ -749,6 +809,31 @@ hu: too_many: Maximum négy fájlt csatolhatsz a tülkhöz migrations: acct: Az új fiók felhasznalonev@domain formátumban + cancel: Átirányítás törlése + cancel_explanation: Az átirányítás törlése reaktiválja a fiókodat, de nem fogja visszahozni azokat a követőidet, akik közben a másik fiókhoz kerültek át. + cancelled_msg: Az átirányítást sikeresen töröltük. + errors: + already_moved: ugyanaz a fiók, ahová már elköltöztél + missing_also_known_as: nem hivatkozza vissza ezt a fiókot + move_to_self: nem lehet az aktuális fiók + not_found: nem található + on_cooldown: Még tart a türelmi idő + followers_count: Követő a költözéskor + incoming_migrations: Más fiókból költöző + incoming_migrations_html: Ahhoz, hogy egy másik fiókból ebbe költözz, először hozz létre egy fiók aliast. + moved_msg: A fiókod mostantól ide %{acct} irányít át, a követőidet átköltöztetjük. + not_redirecting: A fiókod nincs átirányítva jelenleg sehová sem. + on_cooldown: Nemrég költöztetted a fiókod. Ez a funkció %{count} nap múlva lesz megint elérhető. + past_migrations: Eddigi költözések + proceed_with_move: Követők átköltöztetése + redirecting_to: A fiókod át van irányítva ide %{acct}. + warning: + backreference_required: Az új fiókot először be kell úgy állítani, hogy ezt visszahivatkozza + before: 'Mielőtt továbbmész, olvasd el ezeket kérlek figyelmesen:' + cooldown: A költözés után van egy türelmi idő, mely alatt nem tudsz majd újra költözni + disabled_account: A jelenlegi fiókod nem lesz teljesen használható ezután. Viszont elérhető lesz majd az adatexport funkció, valamint a reaktiválás is. + followers: Ez a művelet az összes követődet a jelenlegi fiókról az újra fogja költöztetni + other_data: Más adatot nem fogunk automatikusan mozgatni moderation: title: Moderáció notification_mailer: @@ -893,6 +978,7 @@ hu: settings: account: Fiók account_settings: Fiók beállítások + aliases: Fiók aliasok appearance: Megjelenés authorized_apps: Jóváhagyott alkalmazások back: Vissza a Mastodonhoz @@ -1072,7 +1158,9 @@ hu: disable: A fiókod befagyasztott állapotban megtartja minden adatát, de feloldásig nem csinálhatsz vele semmit. silence: A fiókod korlátozott állapotában csak a követőid láthatják a tülkjeidet, valamint nem kerülsz rá nyilvános idővonalakra. Ugyanakkor mások manuálisan még követhetnek. suspend: A fiókodat felfüggesztették, így minden tülköd és feltöltött fájlod menthetetlenül elveszett erről a szerverről és minden olyanról is, ahol voltak követőid. + get_in_touch: Válaszolhatsz erre az emailre, hogy kapcsolatba lépj a %{instance} csapatával. review_server_policies: Szerver szabályzat átnézése + statuses: 'Különösen hozzá:' subject: disable: A fiókodat %{acct} befagyasztották none: Figyelmeztetés a %{acct} fióknak diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 2649fb2a34..4b850a8a81 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -238,8 +238,10 @@ ja: disabled_msg: 絵文字を無効化しました emoji: 絵文字 enable: 有効化 + enabled: 有効 enabled_msg: 絵文字を有効化しました image_hint: 50KBまでのPNG画像を利用できます + list: 表示 listed: 収載 new: title: 新規カスタム絵文字の追加 @@ -248,6 +250,7 @@ ja: shortcode_hint: 2文字以上の半角英数字とアンダーバーのみ利用できます title: カスタム絵文字 uncategorized: 未分類 + unlist: 非表示 unlisted: 未収載 update_failed_msg: 絵文字を更新できませんでした updated_msg: 絵文字の更新に成功しました! @@ -377,6 +380,7 @@ ja: pending: リレーサーバーの承認待ちです save_and_enable: 保存して有効にする setup: リレー接続を設定する + signatures_not_enabled: セキュアモードまたはホワイトリストモードが有効の場合、リレーは正常に動作しません status: ステータス title: リレー report_notes: @@ -646,9 +650,22 @@ ja: x_months: "%{count}月" x_seconds: "%{count}秒" deletes: + challenge_not_passed: 入力された情報は正しくありません confirm_password: 本人確認のため、現在のパスワードを入力してください + confirm_username: 確認のためユーザー名を入力してください proceed: アカウントを削除する success_msg: アカウントは正常に削除されました + warning: + before: '続行する前に、次の点を再度確認してください:' + caches: 削除しても他のサーバーに残り続ける場合があります + data_removal: あなたの投稿やその他のデータはこのサーバーから完全に削除されます + email_change_html: アカウントを削除しなくてもメールアドレスを変更できます + email_contact_html: それでも届かない場合、%{email} までメールで問い合わせてください + email_reconfirmation_html: 確認のメールが届かない場合、もう一度申請できます。 + irreversible: アカウントを元に戻したり復活させることはできません + more_details_html: 詳しくはプライバシーポリシーをご覧ください。 + username_available: あなたのユーザー名は再利用できるようになります + username_unavailable: あなたのユーザー名は引き続き利用できません directories: directory: ディレクトリ explanation: 関心を軸にユーザーを発見しよう @@ -718,6 +735,7 @@ ja: all: すべて changes_saved_msg: 正常に変更されました! copy: コピー + no_batch_actions_available: 利用可能なバッチアクションはありません order_by: 並び順 save_changes: 変更を保存 validation_errors: @@ -787,6 +805,31 @@ ja: too_many: 追加できるファイルは4つまでです migrations: acct: 引っ越し先の ユーザー名@ドメイン + cancel: 引っ越しを取り消す + cancel_explanation: 引っ越しを取り消すと現在のアカウントが再度有効化されますが、引き継がれたフォロワーは戻されません。 + cancelled_msg: 引っ越し設定を取り消しました。 + errors: + already_moved: は既に引っ越したアカウントと同じです + missing_also_known_as: はこのアカウントとエイリアスの設定がされていません + move_to_self: 同じアカウントに引っ越すことはできません + not_found: 見つかりませんでした + on_cooldown: クールダウン期間中です + followers_count: 引き継がれるフォロワー + incoming_migrations: 別のアカウントから引っ越す + incoming_migrations_html: 別のアカウントからこのアカウントに引っ越すには、まずアカウントエイリアスを作成する必要があります。 + moved_msg: アカウントは %{acct} に引っ越し設定されており、フォロワーは引っ越し先に引き継がれています。 + not_redirecting: アカウントは現在引っ越し設定されていません。 + on_cooldown: あなたは最近アカウントを引っ越ししています。この機能は %{count} 日後に再度利用できるようになります。 + past_migrations: 過去の引っ越し + proceed_with_move: フォロワーを引き継ぐ + redirecting_to: アカウントは %{acct} に引っ越し設定されています。 + warning: + backreference_required: まずは引っ越し先のアカウントでこのアカウントに対しエイリアスを作成する必要があります + before: '続行する前に、次の点を再度確認してください:' + cooldown: 引っ越し後はクールダウン期間があります。その間再度引っ越すことはできません + disabled_account: 引っ越すと現在のアカウントの機能は完全には利用できなくなります。ただしデータのエクスポートと再有効化は利用できます。 + followers: この操作により、すべてのフォロワーを現在のアカウントから新しいアカウントに引き継ぎます。 + other_data: その他のデータは自動的に引き継がれません moderation: title: モデレーション notification_mailer: @@ -929,6 +972,7 @@ ja: settings: account: アカウント account_settings: セキュリティ + aliases: アカウントエイリアス appearance: 外観 authorized_apps: 認証済みアプリ back: Mastodon に戻る @@ -1079,7 +1123,7 @@ ja: default: "%Y年%m月%d日 %H:%M" month: "%Y年 %b" two_factor_authentication: - code_hint: 確認するには認証アプリで表示されたコードを入力してください + code_hint: 続行するには認証アプリで表示されたコードを入力してください description_html: "二段階認証を有効にするとログイン時、認証アプリからコードを入力する必要があります。" disable: 無効 enable: 有効 diff --git a/config/locales/ko.yml b/config/locales/ko.yml index fb32552da0..303c462fdf 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -37,6 +37,10 @@ ko: unavailable_content: 이용 불가능한 컨텐츠 unavailable_content_description: reason: '이유:' + rejecting_media: 이 서버의 미디어 파일들은 처리되지 않고 썸네일또한 보이지 않게 됩니다. 수동으로 클릭하여 해당 서버로 가게 됩니다. + silenced: 이 서버의 게시물은 작성자를 팔로우 한 경우에만 홈 피드에 나타나며 이를 제외한 어디에도 나타나지 않습니다. + suspended: 이 서버의 아무도 팔로우 할 수 없으며, 어떤 데이터도 처리되거나 저장 되지 않고 데이터가 교환 되지도 않습니다. + unavailable_content_html: 마스토돈은 일반적으로 연합우주에 있는 어떤 서버의 유저와도 게시물을 보고 응답을 할 수 있도록 허용합니다. 다음 항목들은 특정한 서버에 대해 만들어 진 예외사항입니다. user_count_after: other: 명 user_count_before: 사용자 수 @@ -525,7 +529,7 @@ ko: reviewed: 심사 됨 title: 해시태그 trending_right_now: 지금 유행 중 - unique_uses_today: 오늘 %{count}개의 포스팅 + unique_uses_today: 오늘 %{count}명이 포스팅 unreviewed: 심사 되지 않음 updated_msg: 해시태그 설정이 성공적으로 갱신되었습니다 title: 관리 @@ -546,6 +550,12 @@ ko: new_trending_tag: body: "#%{name}가 오늘 유행하고 있습니다, 하지만 심사 된 적이 없습니다. 허용하지 않는 한 공개적으로 나타나지 않습니다. 또는 그냥 저장을 눌러 더이상 나타나지 않게 할 수 있습니다." subject: 새 해시태그가 %{instance}에서 심사 대기 중입니다(#%{name}) + aliases: + add_new: 별칭 만들기 + created_msg: 새 별칭이 성공적으로 만들어졌습니다. 이제 기존 계정에서 이주를 시작할 수 있습니다. + deleted_msg: 성공적으로 별칭을 삭제했습니다. 해당 계정에서 이 계정으로의 이주는 더이상 가능하지 않습니다. + hint_html: 다른 계정에서 이 계정으로 옮기길 원하는 경우, 여기에서 별칭을 만들 수 있습니다, 기존 계정의 팔로워를 이쪽으로 옮기고 싶은 경우 필요한 과정입니다. 이 행동 자체는 해롭지 않고 되돌리기가 가능합니다.계정 이주는 이전 계정에서 착수하게 됩니다 + remove: 별칭 연결 끊기 appearance: advanced_web_interface: 고급 웹 인터페이스 advanced_web_interface_hint: '화면의 가로폭을 가득 채우고 싶다면, 고급 웹 인터페이스는 한 번에 여러 정보를 볼 수 있도록 여러 컬럼을 설정할 수 있도록 합니다: 홈, 알림, 연합타임라인, 리스트, 해시태그 등' @@ -605,6 +615,7 @@ ko: confirming: 이메일 확인 과정이 완료되기를 기다리는 중. functional: 계정이 완벽이 작동합니다. pending: 당신의 가입 신청은 스태프의 검사를 위해 대기중입니다. 이것은 시간이 다소 소요됩니다. 가입 신청이 승인 될 경우 이메일을 받게 됩니다. + redirecting_to: 계정이 %{acct}로 리다이렉트 중이기 때문에 비활성 상태입니다. trouble_logging_in: 로그인 하는데 문제가 있나요? authorize_follow: already_following: 이미 이 계정을 팔로우 하고 있습니다 @@ -793,15 +804,28 @@ ko: migrations: acct: 새 계정의 username@domain cancel: 리디렉션 취소 + cancel_explanation: 리다이렉트를 취소하면 현재 계정이 다시 활성화 됩니다, 새 계정으로 이동한 팔로워를 되찾을 수는 없습니다. + cancelled_msg: 리다이렉트를 성공적으로 취소했습니다. errors: + already_moved: 이미 이동한 계정과 동일합니다 + missing_also_known_as: 이 계정을 역으로 참조하지 않고 있습니다 + move_to_self: 현재 계정은 사용할 수 없습니다 not_found: 찾을 수 없습니다 + on_cooldown: 쿨다운 기간입니다 + followers_count: 이주 될 팔로워들 incoming_migrations: 다른 계정으로부터 옮기기 + incoming_migrations_html: 다른 계정을 이 계정으로 이주하고 싶은 경우, 먼저 계정 별칭을 만들어야 합니다. + moved_msg: 당신의 계정은 %{acct}로 리다이렉트 되고 있으며 팔로워들은 이주 될 것입니다. + not_redirecting: 현재 이 계정은 어디로도 리다이렉트 되고 있지 않습니다. on_cooldown: 당신은 최근에 이미 계정을 이동했습니다. 이 기능은 %{count} 일 후에 다시 이용 가능합니다. past_migrations: 이전 마이그레이션 proceed_with_move: 팔로워 이동 redirecting_to: 당신의 계정은 %{acct} 로 리다이렉트됩니다. warning: + backreference_required: 새 계정은 이 계정으로 역참조를 하도록 설정되어 있어야 합니다 before: '진행하기 전, 주의사항을 꼼꼼히 읽어보세요:' + cooldown: 이주 뒤에는 새로운 이주를 하지 못하는 쿨다운 기간이 존재합니다 + disabled_account: 이 계정은 완전한 사용이 불가능하게 됩니다. 하지만, 데이터 내보내기나 재활성화를 위해 접근할 수 있습니다. followers: 이 행동은 현재 계정의 모든 팔로워를 새 계정으로 이동시킵니다 other_data: 다른 어떤 데이터도 자동적으로 옮겨지지 않을 것입니다 moderation: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 213d213c34..bbffde053b 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -41,6 +41,7 @@ nl: rejecting_media: Mediabestanden van deze server worden niet verwerkt en er worden geen thumbnails getoond. Je moet handmatig naar deze server doorklikken om de mediabestanden te kunnen bekijken. silenced: Toots van deze server worden nergens weergegeven, behalve op jouw eigen starttijdlijn wanneer je het account volgt. suspended: Je bent niet in staat om iemand van deze server te volgen, en er worden geen gegevens van deze server verwerkt of opgeslagen, en met deze server uitgewisseld. + unavailable_content_html: Met Mastodon kun je in het algemeen berichten bekijken van en communiceren met gebruikers van elke andere server in de fediverse. Dit zijn de uitzonderingen die door deze server zijn gemaakt en expliciet alleen hier gelden. user_count_after: one: gebruiker other: gebruikers @@ -48,6 +49,8 @@ nl: what_is_mastodon: Wat is Mastodon? accounts: choices_html: 'Aanbevelingen van %{name}:' + endorsements_hint: Je kunt mensen die je volgt in de webomgeving aanbevelen, waarna ze dan hier zullen verschijnen. + featured_tags_hint: Je kunt specifieke hashtags uitlichten, waarna ze dan hier zullen verschijnen. follow: Volgen followers: one: Volger @@ -428,6 +431,9 @@ nl: custom_css: desc_html: Het uiterlijk van deze server met CSS aanpassen title: Aangepaste CSS + default_noindex: + desc_html: Heeft invloed op alle gebruikers die deze instelling niet zelf hebben veranderd + title: Toots van gebruikers standaard niet door zoekmachines laten indexeren domain_blocks: all: Naar iedereen disabled: Naar niemand @@ -486,6 +492,7 @@ nl: title: Aangepaste gebruiksvoorwaarden site_title: Naam Mastodonserver spam_check_enabled: + desc_html: Mastodon kan accounts die herhaaldelijk ongevraagde berichten versturen automatisch negeren of rapporteren. Het is mogelijk dat er foutpositieven tussen zitten. title: Automatische spambestrijding thumbnail: desc_html: Gebruikt als voorvertoning voor OpenGraph en de API. 1200x630px aanbevolen @@ -495,6 +502,7 @@ nl: title: Tijdlijn op de voorpagina tonen title: Server-instellingen trends: + desc_html: Eerder beoordeelde hashtags die op dit moment trending zijn openbaar tonen title: Trending hashtags statuses: back_to_account: Terug naar accountpagina @@ -543,10 +551,14 @@ nl: body: "%{reporter} heeft %{target} gerapporteerd" body_remote: Iemand van %{domain} heeft %{target} gerapporteerd subject: Nieuwe rapportage op %{instance} (#%{id}) + new_trending_tag: + body: 'De hashtag #%{name} is vandaag trending, maar is nog niet beoordeeld. Het wordt niet in het openbaar getoond alvorens je de hashtag goedkeurt. Je kunt ook het formulier zoals het nu is opslaan, waarna je er niks meer over zult horen.' + subject: Nieuwe hashtag te beoordelen op %{instance} (#%{name}) aliases: add_new: Alias aanmaken created_msg: Succesvol een nieuwe alias aangemaakt. Je kunt nu met de verhuizing vanaf het oude account beginnen. deleted_msg: De alias is succesvol verwijderd. Verhuizen vanaf dat account naar dit account is niet meer mogelijk. + hint_html: Wanneer je vanaf een ander account naar dit account wilt verhuizen, kun je hier een alias aanmaken. Dit is nodig voordat je verder kunt gaan met het verhuizen van volgers van het oude naar dit nieuwe account. Deze actie is op zich ongevaarlijk en omkeerbaar. De accountmigratie wordt gestart vanaf het oude account. remove: Alias ontkoppelen appearance: advanced_web_interface: Geavanceerde webomgeving @@ -574,10 +586,13 @@ nl: apply_for_account: Een uitnodiging aanvragen change_password: Wachtwoord checkbox_agreement_html: Ik ga akkoord met de regels van deze server en de gebruiksvoorwaarden + checkbox_agreement_without_rules_html: Ik ga akkoord met de gebruiksvoorwaarden delete_account: Account verwijderen delete_account_html: Wanneer je jouw account graag wilt verwijderen, kun je dat hier doen. We vragen jou daar om een bevestiging. description: + prefix_invited_by_user: "@%{name} nodigt je hierbij uit om een account aan te maken op deze Mastodonserver!" prefix_sign_up: Registreer je vandaag nog op Mastodon! + suffix: Met een account ben je in staat om mensen te volgen, berichten te plaatsen en uit te wisselen met mensen die zich op andere Mastodonservers bevinden en meer! didnt_get_confirmation: Geen bevestigingsinstructies ontvangen? forgot_password: Wachtwoord vergeten? invalid_reset_password_token: De code om jouw wachtwoord opnieuw in te stellen is verlopen. Vraag een nieuwe aan. @@ -596,10 +611,15 @@ nl: security: Beveiliging set_new_password: Nieuw wachtwoord instellen setup: + email_below_hint_html: Wanneer onderstaand e-mailadres niet klopt, kun je dat hier veranderen. Je ontvangt dan hierna een bevestigingsmail. + email_settings_hint_html: De bevestigingsmail is verzonden naar %{email}. Wanneer dat e-mailadres niet klopt, kun je dat veranderen in je accountinstellingen. title: Instellen status: account_status: Accountstatus + confirming: Aan het wachten totdat de e-mail is bevestigd. functional: Jouw account is volledig operationeel. + pending: Jouw aanvraag moet nog worden beoordeeld door een van onze medewerkers. Dit kan misschien eventjes duren. Je ontvangt een e-mail wanneer jouw aanvraag is goedgekeurd. + redirecting_to: Jouw account is inactief omdat het momenteel wordt doorverwezen naar %{acct}. trouble_logging_in: Problemen met inloggen? authorize_follow: already_following: Je volgt dit account al @@ -614,6 +634,7 @@ nl: title: Volg %{acct} challenge: confirm: Doorgaan + hint_html: "Tip: We vragen jou het komende uur niet meer naar jouw wachtwoord." invalid_password: Ongeldig wachtwoord prompt: Bevestig wachtwoord om door te gaan datetime: @@ -637,6 +658,10 @@ nl: proceed: Account verwijderen success_msg: Jouw account is succesvol verwijderd warning: + before: 'Lees deze tekst zorgvuldig voordat je verder gaat:' + 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 username_available: Jouw gebruikersnaam zal weer beschikbaar komen username_unavailable: Jouw gebruikersnaam zal onbeschikbaar blijven directories: @@ -788,7 +813,7 @@ nl: on_cooldown: Jouw laatste migratie is nog te kort geleden followers_count: Volgers op het moment van verhuizing incoming_migrations: Verhuizen vanaf een ander account - incoming_migrations_html: Om te vanaf een ander account naar dit account te verhuizen, moet je eerst een accountalias aanmaken. + incoming_migrations_html: Om vanaf een ander account naar dit account te verhuizen, dien je eerst een accountalias aan te maken. moved_msg: Jouw account wordt nu naar %{acct} doorverwezen en jouw volgers worden verhuisd. not_redirecting: Jouw account wordt momenteel niet naar een ander account doorverwezen. on_cooldown: Je hebt recentelijk jouw account verhuisd. Deze mogelijkheid is weer beschikbaar over %{count} dagen. diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 101483c3ea..793b755319 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -53,6 +53,7 @@ oc: media: Mèdias moved_html: "%{name} a mudat a %{new_profile_link} :" network_hidden: Aquesta informacion es pas disponibla + never_active: Jamai nothing_here: I a pas res aquí ! people_followed_by: Lo monde que %{name} sèc people_who_follow: Lo monde que sègon %{name} @@ -219,10 +220,12 @@ oc: deleted_status: "(estatut suprimit)" title: Audit dels jornals custom_emojis: + assign_category: Atribuir una categoria by_domain: Domeni copied_msg: Còpia locala de l’emoji ben creada copy: Copiar copy_failed_msg: Fracàs de la còpia locala de l’emoji + create_new_category: Crear una nòva categoria created_msg: Emoji ben creat ! delete: Suprimir destroyed_msg: Emoji ben suprimit ! @@ -244,6 +247,7 @@ oc: updated_msg: Emoji ben mes a jorn ! upload: Enviar dashboard: + authorized_fetch_mode: Mòde recuperacion autorizat backlog: Accions en retard config: Configuracion feature_deletions: Supressions de comptes @@ -472,12 +476,15 @@ oc: desc_html: Mostrar lo flux public sus la pagina d’acuèlh title: Apercebut flux public title: Paramètres del site + trends: + title: Etiquetas tendéncia statuses: back_to_account: Tornar a la pagina Compte batch: delete: Suprimir nsfw_off: Marcar coma pas sensible nsfw_on: Marcar coma sensible + deleted: Suprimits failed_to_execute: Fracàs media: title: Mèdia @@ -572,6 +579,7 @@ oc: title: Sègre %{acct} challenge: confirm: Contunhar + hint_html: "Asutúcia : vos demandarem pas vòstre senhal de nòu d’aquí unas oras." invalid_password: Senhal invalid prompt: Confirmatz lo senhal per dire de contunhar datetime: @@ -589,9 +597,15 @@ oc: x_months: "%{count} meses" x_seconds: "%{count}s" deletes: + challenge_not_passed: Las informacions qu’avètz fornidas son pas corrèctas confirm_password: Picatz vòstre senhal actual per verificar vòstra identitat + confirm_username: Picatz vòstre nom d’utilizaire per confirmar la procedura proceed: Suprimir lo compte success_msg: Compte ben suprimit + 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 + username_unavailable: Vòstre nom d’utilizaire demorarà pas disponible directories: directory: Annuari de perfils explanation: Trobar d’utilizaires segon lor interèsses @@ -731,6 +745,8 @@ oc: too_many: Se pòt pas ajustar mai de 4 fichièrs migrations: acct: nomutilizaire@domeni del nòu compte + cancel: Anullar la redireccion + cancelled_msg: Redireccion corrèctament anullada. errors: move_to_self: pòt pas èsser lo compte actual not_found: impossible de trobar @@ -1056,6 +1072,7 @@ oc: disable: Quand vòstre compte es gelat, las donadas d’aqueste demòran senceras, mas podètz pas realizar cap d’accion fins que siá desblocat. silence: Del temps que vòstre compte es limitat, solament lo monde que vos sègon veiràn vòstres tuts sus aqueste servidor, e poiriatz èsser tirat de mantunas listas publicas. Pasmens, d’autres vos pòdon sègre manualament. suspend: Vòstre compte es suspendut e totes vòstres tuts e fichièrs enviats son estats suprimits sens retorn possible d’aqueste servidor e los de vòstres seguidors. + get_in_touch: Podètz respondre a aqueste corrièl per contactar la còla de %{instance}. review_server_policies: Repassar las politicas del servidor statuses: 'Especificament per :' subject: diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index e09f92205a..548d275ba6 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -15,7 +15,7 @@ ar: context: واحد أو أكثر من السياقات التي يجب أن ينطبق عليها عامل التصفية digest: تُرسَل إليك بعد مُضيّ مدة مِن خمول نشاطك و فقط إذا ما تلقيت رسائل شخصية مباشِرة أثناء فترة غيابك مِن الشبكة email: سوف تتلقى رسالة إلكترونية للتأكيد - fields: يُمكنك عرض 4 عناصر على شكل جدول في ملفك الشخصي + fields: يُمكنك عرض 4 عناصر على شكل جدول في صفحتك التعريفية header: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير %{size}. سيتم تصغيره إلى %{dimensions}px inbox_url: نسخ العنوان الذي تريد استخدامه مِن صفحة الاستقبال للمُرحَّل irreversible: التبويقات التي تم تصفيتها ستختفي لا محالة حتى و إن تمت إزالة عامِل التصفية لاحقًا @@ -28,11 +28,13 @@ ar: setting_display_media_default: إخفاء الوسائط المُعيَّنة كحساسة setting_display_media_hide_all: إخفاء كافة الوسائط دائمًا setting_display_media_show_all: دائمًا عرض الوسائط المُعيَّنة كحساسة - setting_hide_network: الحسابات التي تُتابعها و التي تُتابِعك على حد سواء لن تُعرَض على صفحتك الشخصية - setting_noindex: ذلك يؤثر على حالة ملفك الشخصي و صفحاتك + setting_hide_network: الحسابات التي تُتابعها و التي تُتابِعك على حد سواء لن تُعرَض على صفحتك التعريفية + setting_noindex: ذلك يؤثر على صفحتك التعريفية وصفحات المنشورات username: اسم المستخدم الخاص بك سوف يكون فريدا مِن نوعه على %{domain} featured_tag: - name: 'رُبَّما تريد/ي استخدام أحد هؤلاء:' + name: 'رُبَّما تريد·ين استخدام واحد مِن هذه:' + form_challenge: + current_password: إنك بصدد الدخول إلى منطقة آمنة imports: data: ملف CSV تم تصديره مِن خادوم ماستدون آخر invite_request: @@ -46,6 +48,8 @@ ar: fields: name: التسمية value: المحتوى + account_alias: + acct: مُعرّف الحساب القديم account_warning_preset: text: نموذج نصي admin_account_action: @@ -72,7 +76,7 @@ ar: display_name: الاسم المعروض email: عنوان البريد الإلكتروني expires_in: تنتهي مدة صلاحيته بعد - fields: البيانات الوصفية للصفحة الشخصية + fields: البيانات الوصفية للصفحة التعريفية header: الرأسية inbox_url: عنوان رابط صندوق المُرَحِّل irreversible: إسقاط بدلا من إخفائها @@ -128,6 +132,7 @@ ar: reblog: ابعث بريداً إلكترونيًا عندما يقوم أحدهم بترقية منشورك report: إرسال رسالة إلكترونية عند تلقّي إبلاغ جديد tag: + listable: اسمح لهذا الوسم بالظهور في البحث وفي دليل الصفحات التعريفية name: الوسم usable: اسمح للتبويقات باستخدام هذا الوسم 'no': لا diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index fbf6813a49..245bcea08a 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -2,6 +2,10 @@ co: simple_form: hints: + account_alias: + acct: Entrate u cugnome@duminiu di u contu attuale + account_migration: + acct: Entrate u cugnome@duminiu di u contu induve vulete traslucà account_warning_preset: text: Pudete utilizà a sintassa di i statuti, per esempiu l'URL, hashtag, minzione admin_account_action: @@ -15,6 +19,8 @@ co: avatar: Furmatu PNG, GIF o JPG. %{size} o menu. Sarà ridottu à %{dimensions}px bot: Stu contu hè autumatizatu è ùn hè forse micca survegliatu context: Cuntestu·i induve u filtru deve esse applicatu + current_password: Per ragione di sicurità, entrate a chjave d'accessu di stu contu + current_username: Per cunfirmà, entrate u cugnome di questu contu digest: Solu mandatu dopu à una longa perioda d’inattività, è solu s’elli ci sò novi missaghji diretti discoverable: L'annuariu di i prufili hè un'altra manera per u vostru contu di tuccà un'audienza più larga email: Avete da riceve un'e-mail di cunfirmazione @@ -60,6 +66,10 @@ co: fields: name: Marcu value: Cuntinutu + account_alias: + acct: Cugnome di l'anzianu contu + account_migration: + acct: Cugnome di u novu contu account_warning_preset: text: Testu preselezziunatu admin_account_action: diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 93e052f271..9b06bf473a 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -57,6 +57,8 @@ cy: text: Bydd hyn yn helpu ni adolygu eich cais sessions: otp: 'Mewnbynnwch y cod dau gam a gynhyrchwyd gan eich ap ffôn neu defnyddiwch un o''ch codau adfer:' + tag: + name: Dim ond er mwyn ei gwneud yn fwy darllenadwy y gallwch chi newid y llythrennau, er enghraifft user: chosen_languages: Wedi eu dewis, dim ond tŵtiau yn yr ieithoedd hyn bydd yn cael eu harddangos mewn ffrydiau cyhoeddus labels: @@ -64,9 +66,14 @@ cy: fields: name: Label value: Cynnwys + account_alias: + acct: Enw'r hen gyfrif + account_migration: + acct: Enw'r cyfrif newydd account_warning_preset: text: Testun rhagosodedig admin_account_action: + include_statuses: Cynhwyswch tŵtiau yr adroddwyd amdanynt yn yr e-bost send_email_notification: Hysbysu'r defnyddiwr trwy e-bost text: Rhybudd wedi'i addasu type: Gweithredu @@ -121,6 +128,7 @@ cy: setting_show_application: Datguddio'r offer defnyddwyd i anfon tŵtiau setting_system_font_ui: Defnyddio ffont rhagosodedig y system setting_theme: Thema'r wefan + setting_trends: Dangos tueddiadau o heddiw ymlaen setting_unfollow_modal: Dangos deialog cadarnhau cyn dad-ddilyn rhywun setting_use_blurhash: Dangoswch raddiannau lliwgar ar gyfer cyfryngau cudd setting_use_pending_items: Modd araf @@ -148,6 +156,7 @@ cy: pending_account: Anfon ebost pan mae cyfrif newydd angen adolygiad reblog: Anfon e-bost pan mae rhywun yn bŵstio eich statws report: Anfon e-bost pan y cyflwynir adroddiad newydd + trending_tag: Anfonwch e-bost pan fydd hashnod heb ei adolygu yn tueddu tag: listable: Gadewch i'r hashnod hwn ymddangos mewn chwiliadau ac ar y cyfeiriadur proffil name: Hashnod diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 2fb33dbc3c..515d5c1ed9 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -1,170 +1 @@ ---- -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í +es-AR: diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index b9f0e93727..70ad0c66ab 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -45,14 +45,20 @@ fa: setting_use_pending_items: به جای پیش‌رفتن خودکار در فهرست، به‌روزرسانی فهرست نوشته‌ها را پشت یک کلیک پنهان کن username: نام کاربری شما روی %{domain} یکتا خواهد بود whole_word: اگر کلیدواژه فقط دارای حروف و اعداد باشد، تنها وقتی پیدا می‌شود که با کل یک واژه در متن منطبق باشد، نه با بخشی از یک واژه + domain_allow: + domain: این دامین خواهد توانست داده‌ها از این سرور را دریافت کند و داده‌های از این دامین در این‌جا پردازش و ذخیره خواهند شد featured_tag: name: 'شاید بخواهید چنین چیزهایی را به کار ببرید:' + form_challenge: + current_password: شما در حال ورود به یک منطقهٔ‌ حفاظت‌شده هستید imports: data: پروندهٔ CSV که از سرور ماستدون دیگری برون‌سپاری شده invite_request: text: این برای بررسی درخواست شما به ما کمک خواهد کرد sessions: otp: 'کد تأیید دومرحله‌ای که اپ روی تلفن شما ساخته را وارد کنید یا یکی از کدهای بازیابی را به کار ببرید:' + tag: + name: شما تنها می‌توانید بزرگی و کوچکی حروف را تغییر دهید تا مثلاً آن را خواناتر کنید user: chosen_languages: اگر انتخاب کنید، تنها نوشته‌هایی که به زبان‌های برگزیدهٔ شما نوشته شده‌اند در فهرست نوشته‌های عمومی نشان داده می‌شوند labels: @@ -60,9 +66,14 @@ fa: fields: name: برچسب value: محتوا + account_alias: + acct: نشانی حساب قدیمی + account_migration: + acct: نشانی حساب تازه account_warning_preset: text: متن از پیش آماده‌شده admin_account_action: + include_statuses: بوق‌های گزارش‌شده را در ایمیل بگنجان send_email_notification: اطلاع‌رسانی به کاربر از راه ایمیل text: هشدار موردی type: نوع کنش @@ -117,6 +128,7 @@ fa: setting_show_application: برنامه‌ای که به کار می‌برید آشکار شود setting_system_font_ui: به‌کاربردن قلم پیش‌فرض سیستم setting_theme: تم سایت + setting_trends: نشان‌دادن موضوعات پرطرفدار روز setting_unfollow_modal: نمایش پیغام تأیید پیش از لغو پیگیری دیگران setting_use_blurhash: به جای تصویرهای پنهان‌شده، سایه‌های رنگی نشان بده setting_use_pending_items: حالت آهسته @@ -131,6 +143,8 @@ fa: must_be_follower: مسدودکردن اعلان‌های همه به جز پیگیران must_be_following: مسدودکردن اعلان‌های کسانی که شما پی نمی‌گیرید must_be_following_dm: مسدودکردن پیغام‌های خصوصی کسانی که شما پی نمی‌گیرید + invite: + comment: توضیح invite_request: text: چرا می‌خواهید عضو شوید؟ notification_emails: @@ -142,6 +156,12 @@ fa: pending_account: وقتی حساب تازه‌ای نیاز به بازبینی داشت ایمیل بفرست reblog: وقتی کسی نوشتهٔ شما را بازبوقید ایمیل بفرست report: وقتی گزارش تازه‌ای فرستاده شد ایمیل بفرست + trending_tag: وقتی یک برچسب بازبینی‌نشده پرطرفدار شد ایمیل بفرست + tag: + listable: بگذارید که این برچسب در جستجوها و در فهرست گزیدهٔ کاربران نمایش داده شود + name: برچسب + trendable: بگذارید که این برچسب در موضوعات پرطرفدار دیده شود + usable: بگذارید که این برچسب در بوق‌ها به کار بروند 'no': خیر recommended: توصیه می‌شود required: diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index e3875cd6bc..de1830f5d5 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -2,9 +2,14 @@ hu: simple_form: hints: + account_alias: + acct: Adjad meg annak a fióknak a felhasználóneve@domainjét, ahonnan át szeretnéd mozgatni + account_migration: + acct: Add meg a fióknév@domain fiókot, melybe költözni szeretnél account_warning_preset: text: Használhatod a tülkökben szokásos szintaxist, URL-eket, hashtageket, megemlítéseket admin_account_action: + include_statuses: A felhasználó látni fogja, melyik tülk okozta a moderációt vagy figyelmeztetést send_email_notification: A felhasználó magyarázatot kap arra, mi történt a fiókjával text_html: Opcionális. A tülk szintaxis használható. Egyszerűsítés végett létre is hozhatsz figyelmeztetéseket type_html: Megmondhatod, mi legyen vele %{acct} @@ -14,7 +19,10 @@ hu: avatar: PNG, GIF vagy JPG. Maximum %{size}. Átméretezzük %{dimensions} pixelre bot: Ez a fiók automatikus műveleteket végez és valószínűleg nem figyeljük context: Kontextusok, ahol a szűrőnek működnie kell + current_password: Biztonsági okok miatt kérlek, írd be a jelenlegi fiók jelszavát + current_username: A jóváhagyáshoz írd be a jelenlegi fiók felhasználói nevét digest: Csak hosszú távollét esetén küldődik és csak ha személyes üzenetet kaptál távollétedben + discoverable: A profil adatbázis egy újabb mód, ahogyan a fiókod szélesebb tömegeket érhet el email: Kapsz egy megerősítő e-mailt fields: A profilodon legfeljebb 4 bejegyzés szerepelhet táblázatos formában header: PNG, GIF vagy JPG. Maximum %{size}. Átméretezzük %{dimensions} pixelre @@ -41,6 +49,8 @@ hu: domain: Ez a domain adatot kérhet le a szerverünkről és az ettől érkező adatokat feldolgozzuk és mentjük featured_tag: name: 'Ezeket esetleg használhatod:' + form_challenge: + current_password: Beléptél egy biztonsági térben imports: data: Egy másik Mastodon szerverről exportált CSV fájl invite_request: @@ -56,9 +66,14 @@ hu: fields: name: Címke value: Tartalom + account_alias: + acct: Régi fiók kezelése + account_migration: + acct: Új fiók kezelése account_warning_preset: text: Figyelmeztető szöveg admin_account_action: + include_statuses: Helyezd az e-mailbe a jelentett tülköket send_email_notification: Figyelmeztessük a felhasználót e-mailben text: Egyedi figyelmeztetés type: Művelet @@ -128,6 +143,8 @@ hu: must_be_follower: Nem követőidtől érkező értesítések tiltása must_be_following: Nem követettjeidtől érkező értesítések tiltása must_be_following_dm: Nem követettjeidtől érkező üzenetek tiltása + invite: + comment: Hozzászólás invite_request: text: Miért akarsz csatlakozni? notification_emails: @@ -142,6 +159,7 @@ hu: trending_tag: E-mail küldése, ha egy még nem látott hashtag trendi lett tag: listable: A hashtag megjelenhet a profiladatbázisban + name: Címke trendable: A hashtag megjelenhet a trendek között usable: Tülkök használhatják ezt a hashtaget 'no': Nem diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 2205dcf8fb..b936c8e9a9 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -2,6 +2,10 @@ ja: simple_form: hints: + account_alias: + acct: 引っ越し元のユーザー名@ドメインを指定してください + account_migration: + acct: 引っ越し先のユーザー名@ドメインを指定してください account_warning_preset: text: URL、ハッシュタグ、メンションなど、投稿に用いる構文が使用できます admin_account_action: @@ -15,6 +19,8 @@ ja: avatar: "%{size}までのPNG、GIF、JPGが利用可能です。%{dimensions}pxまで縮小されます" bot: このアカウントは主に自動で動作し、人が見ていない可能性があります context: フィルターを適用する対象 (複数選択可) + current_password: 現在のアカウントのパスワードを入力してください + current_username: 確認のため、現在のアカウントのユーザー名を入力してください digest: 長期間使用していない場合と不在時に返信を受けた場合のみ送信されます discoverable: ディレクトリはあなたのアカウントをより多くの人に見つけてもらうためのひとつの手段です email: 確認のメールが送信されます @@ -43,6 +49,8 @@ ja: domain: 登録するとこのサーバーからデータを受信したり、このドメインから受信するデータを処理して保存できるようになります featured_tag: name: 'これらを使うといいかもしれません:' + form_challenge: + current_password: セキュリティ上重要なエリアにアクセスしています imports: data: 他の Mastodon サーバーからエクスポートしたCSVファイルを選択して下さい invite_request: @@ -58,6 +66,10 @@ ja: fields: name: ラベル value: 内容 + account_alias: + acct: 引っ越し元のユーザー ID + account_migration: + acct: 引っ越し先のユーザー ID account_warning_preset: text: プリセット警告文 admin_account_action: @@ -131,6 +143,8 @@ ja: must_be_follower: フォロワー以外からの通知をブロック must_be_following: フォローしていないユーザーからの通知をブロック must_be_following_dm: フォローしていないユーザーからのダイレクトメッセージをブロック + invite: + comment: コメント invite_request: text: 意気込みをお聞かせください notification_emails: diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 7c0a81558b..d96eafb8b8 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -2,6 +2,10 @@ ko: simple_form: hints: + account_alias: + acct: 이동하고자 하는 계정의 사용자이름@도메인을 설정하세요 + account_migration: + acct: 이동하고자 하는 목적지 계정의 사용자이름@도메인을 설정하세요 account_warning_preset: text: URL, 해시태그, 멘션과 같은 툿 문법을 사용할 수 있습니다 admin_account_action: @@ -62,6 +66,10 @@ ko: fields: name: 라벨 value: 내용 + account_alias: + acct: 기존 계정의 핸들 + account_migration: + acct: 새 계정의 핸들 account_warning_preset: text: 프리셋 텍스트 admin_account_action: diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index 50a8efab16..220f944ce9 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -2,9 +2,14 @@ oc: simple_form: hints: + account_alias: + acct: Donatz l’utilizaire@domeni del compte que volètz desplaçar + account_migration: + acct: Donatz l’utilizaire@domeni del compte ont volètz anar account_warning_preset: text: Podètz utilizar la sintaxi dels tuts, coma las URL, las etiquetas e las mencions admin_account_action: + include_statuses: L’utilizaire veiràs quals tuts a provocat l’accion de moderacion o avertiment send_email_notification: L’utilizaire recebrà una explicacion de çò qu’arribèt a son compte text_html: Opcional. Podètz utilizar la sintaxi dels tuts. Podètz ajustar un avertiment personalizat per estalviar de temps type_html: Causir de qué far amb %{acct} @@ -14,7 +19,10 @@ oc: avatar: PNG, GIF o JPG. Maximum %{size}. Serà retalhat en %{dimensions}px bot: Avisar lo monde qu’aqueste compte es pas d’una persona context: Un o mai de contèxtes ont lo filtre deuriá s’aplicar + current_password: Per de rasons de seguretat volgatz picar lo senhal del compte actual + current_username: Per confirmar, volgatz picar lo nom d’utilizaire del compte actual digest: Solament enviat aprèp un long moment d’inactivitat e solament s’avètz recebut de messatges personals pendent vòstra abséncia + discoverable: L’annuari de perfiles es un biais mai per que vòstre compte aja una audiéncia mai granda email: Vos mandarem un corrièl de confirmacion fields: Podètz far veire cap a 4 elements sus vòstre perfil header: PNG, GIF o JPG. Maximum %{size}. Serà retalhada en %{dimensions}px @@ -39,12 +47,16 @@ oc: whole_word: Quand lo mot-clau o frasa es solament alfranumeric, serà pas qu’aplicat se correspond al mot complèt featured_tag: name: 'Benlèu que volètz utilizar una d’aquestas causas :' + form_challenge: + current_password: Dintratz dins una zòna segura imports: data: Fichièr CSV exportat d’un autre servidor Mastodon invite_request: text: Aquò nos ajudarà per validar vòstra demanda sessions: otp: 'Picatz lo còdi d’autentificacion en dos temps (Two factor code) de vòstra aplicacion mobil o utilizatz un de vòstres còdis de recuperacion :' + tag: + name: Podètz pas que cambiar la talha de las letras, per exemple, per que sián de melhor legir user: chosen_languages: Quand seleccionadas, solament los tuts dins las lengas triadas seràn mostrats dins vòstre flux d’actualitat labels: @@ -52,9 +64,14 @@ oc: fields: name: Nom value: Contengut + account_alias: + acct: Identificant de l’ancian compte + account_migration: + acct: Identificant del nòu compte account_warning_preset: text: Tèxt predefinit admin_account_action: + include_statuses: Inclure los tuts senhalats dins lo corrièl send_email_notification: Avisar l’utilizaire per corrièl text: Avertiment personalizat type: Accions @@ -137,6 +154,7 @@ oc: pending_account: Enviar un corrièl quand cal validar un compte novèl reblog: Enviar un corrièl quand qualqu’un tòrna partejar vòstre estatut report: Enviar un corrièl pels nòus senhalaments + trending_tag: Enviar un corrièl quand una etiqueta pas repassada es en tendéncia tag: listable: Permetre a aquesta etiqueta d’aparéisser a las recèrcas e a l’annuari de perfils name: Etiqueta diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 8400951f03..3f3f78180b 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -2,9 +2,14 @@ pt-BR: simple_form: hints: + account_alias: + acct: Especifique o usuário@domínio da conta da qual você deseja mover + account_migration: + acct: Especifique o usuário@domínio da conta para o qual você deseja mover account_warning_preset: text: Você pode usar a sintaxe de um toot, como URLs, hashtags e menções admin_account_action: + include_statuses: O usuário verá quais toots causaram o aviso ou ação da moderação send_email_notification: O usuário vai receber uma explicação do que aconteceu com a sua conta text_html: Opcional. Você pode usar a sintaxe de toots. Você pode adicionar avisos pré-definidos para ganhar tempo type_html: Escolha o que fazer com %{acct} @@ -14,6 +19,8 @@ pt-BR: avatar: PNG, GIF or JPG. Arquivos de até %{size}. Eles serão diminuídos para %{dimensions}px bot: Essa conta executa principalmente ações automatizadas e pode não ser monitorada context: Um ou mais contextos onde o filtro deve ser aplicado + current_password: Para fins de segurança digite a senha da conta atual + current_username: Para confirmar, por favor, digite o usuário da conta atual digest: Enviado após um longo período de inatividade com um resumo das menções que você recebeu em sua ausência email: Você receberá um email de confirmação fields: Você pode ter até 4 itens exibidos em forma de tabela no seu perfil @@ -26,16 +33,21 @@ pt-BR: phrase: Vai coincidir, independente de maiúsculas ou minúsculas, no texto ou no aviso de conteúdo de um toot scopes: Quais APIs a aplicação vai ter permissão de acessar. Se você selecionar um escopo de alto nível, você não precisa selecionar individualmente os outros. setting_aggregate_reblogs: Não mostrar novos compartilhamentos para toots que foram compartilhados recentemente (afeta somente novos compartilhamentos recebidos) + setting_default_sensitive: Mídia sensível está oculta por padrão e pode ser revelada com um clique setting_display_media_default: Esconder mídia marcada como sensível setting_display_media_hide_all: Sempre esconder todas as mídias setting_display_media_show_all: Sempre mostrar mídia marcada como sensível setting_hide_network: Quem você segue e quem segue você não serão exibidos no seu perfil setting_noindex: Afeta seu perfil público e as páginas de suas postagens setting_show_application: A aplicação que você usar para enviar seus toots vai aparecer na visão detalhada dos seus toots + setting_use_blurhash: Os gradientes são baseados nas cores das imagens escondidas, mas ofuscam quaisquer detalhes + setting_use_pending_items: Ocultar atualizações de linha de tempo atrás de um clique ao invés de rolar automaticamente o feed username: Seu nome de usuário será único em %{domain} whole_word: Quando a palavra ou frase é inteiramente alfanumérica, ela será aplicada somente se corresponder a palavra inteira featured_tag: name: 'Você pode querer usar um destes:' + form_challenge: + current_password: Você está entrando em uma área segura imports: data: Arquivo CSV exportado de outra instância do Mastodon invite_request: @@ -52,6 +64,7 @@ pt-BR: account_warning_preset: text: Texto pré-definido admin_account_action: + include_statuses: Incluir toots reportados no e-mail send_email_notification: Notificar o usuário por e-mail text: Aviso customizado type: Ação @@ -63,6 +76,7 @@ pt-BR: warning_preset_id: Usar um aviso pré-definido defaults: autofollow: Convite para seguir a sua conta + avatar: Imagem de Perfil bot: Esta é uma conta-robô chosen_languages: Filtros de idioma confirm_new_password: Confirmar nova senha @@ -82,6 +96,7 @@ pt-BR: locked: Trancar conta max_uses: Número máximo de usos new_password: Nova senha + note: Biografia otp_attempt: Código de autenticação em dois passos password: Senha phrase: Palavra-chave ou frase @@ -109,10 +124,14 @@ pt-BR: username: Nome de usuário username_or_email: Nome de usuário ou e-mail whole_word: Palavra inteira + featured_tag: + name: Hashtag interactions: must_be_follower: Bloquear notificações de não-seguidores must_be_following: Bloquear notificações de pessoas que você não segue must_be_following_dm: Bloquear mensagens diretas de pessoas que você não segue + invite: + comment: Comentário invite_request: text: Por que você quer se cadastrar? notification_emails: @@ -124,7 +143,15 @@ pt-BR: pending_account: Mandar um -mail quando uma nova conta precisar ser revisada reblog: Mandar um e-mail quando alguém compartilhar suas postagens report: Mandar um e-mail quando uma nova denúncia é submetida + trending_tag: Enviar e-mail quando uma hashtag não revisada estiver em alta + tag: + listable: Permitir que esta hashtag apareça em pesquisas e no diretório de perfis + name: Hashtag + trendable: Permitir que esta hashtag apareça em alta + usable: Permitir que toots usem esta hastag 'no': Não + recommended: Recomendado required: + mark: "*" text: obrigatório 'yes': Sim diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 0ac31f8c2b..57acde4d96 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -2,9 +2,14 @@ pt-PT: simple_form: hints: + account_alias: + acct: Especifique o nome de usuário@domínio da conta de onde você deseja mover + account_migration: + acct: Especifique o nome de usuário@domínio da conta para onde você deseja mover account_warning_preset: text: Tu podes usar sintaxe de escrita, como URLs, hashtags e referências admin_account_action: + include_statuses: O usuário verá quais ferramentas causaram a ação de moderação ou aviso send_email_notification: O utilizador receberá uma explicação sobre o que aconteceu com a sua conta text_html: Opcional. Tu podes usar sintaxe de escrita. Tu podes adicionar predefinições de aviso para poupar tempo type_html: Escolhe o que fazer com %{acct} @@ -14,6 +19,7 @@ pt-PT: avatar: PNG, GIF or JPG. Arquivos até %{size}. Vão ser reduzidos para %{dimensions}px bot: Esta conta executa essencialmente acções automáticas e pode não poder ser monitorizada context: Um ou múltiplos contextos nos quais o filtro deve ser aplicado + current_password: Para fins de segurança, por favor, digite a senha da conta atual digest: Enviado após um longo período de inatividade e apenas se foste mencionado na tua ausência email: Será enviado um e-mail de confirmação fields: Podes ter até 4 itens expostos, em forma de tabela, no teu perfil diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 8caae951c6..869231bdfe 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -123,6 +123,8 @@ th: must_be_follower: ปิดกั้นการแจ้งเตือนจากที่ไม่ใช่ผู้ติดตาม must_be_following: ปิดกั้นการแจ้งเตือนจากผู้คนที่คุณไม่ได้ติดตาม must_be_following_dm: ปิดกั้นข้อความโดยตรงจากผู้คนที่คุณไม่ได้ติดตาม + invite: + comment: ความคิดเห็น invite_request: text: ทำไมคุณจึงต้องการเข้าร่วม? notification_emails: diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index 1e4a262e71..a6ae14f6de 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -82,6 +82,7 @@ uk: discoverable: Оприлюднити обліковий запис у каталозі display_name: Ім'я email: Email адреса + expires_in: Закінчується після fields: Метадані профіля header: Заголовок inbox_url: URL поштової скриньки ретранслятора diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 01f5bf7504..729573d927 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -246,8 +246,10 @@ sk: disabled_msg: Emoji bolo úspešne zakázané emoji: Emotikony enable: Povoľ + enabled: Povolené enabled_msg: Emoji bolo úspešne povolené image_hint: PNG do 50KB + list: Zoznam listed: V zozname new: title: Pridaj nové, vlastné emoji @@ -256,11 +258,13 @@ sk: shortcode_hint: Aspoň 2 znaky, povolené sú alfanumerické, alebo podčiarkovník title: Vlastné emoji uncategorized: Nezaradené + unlist: Nezaraď unlisted: Nie je na zozname update_failed_msg: Nebolo možné aktualizovať toto emoji updated_msg: Emoji bolo úspešne aktualizované! upload: Nahraj dashboard: + authorized_fetch_mode: Autorizovaný režim backlog: odložené aktivity config: Nastavenia feature_deletions: Vymazanie účtov @@ -557,6 +561,7 @@ sk: subject: Nový haštag očakáva preverenie na %{instance} (#%{name}) aliases: add_new: Vytvor alias + remove: Odpoj alias appearance: advanced_web_interface: Pokročilé webové rozhranie advanced_web_interface_hint: 'Ak chceš využiť celkovú šírku tvojej obrazovky, pokročilé webové rozhranie ti umožňuje nastaviť mnoho rôznych stĺpcov, aby si videl/a toľko informácií naraz, koľko chceš: Domov, oboznámenia, federovanú časovú os, a ľubovolný počet zoznamov, či haštagov.' @@ -613,6 +618,7 @@ sk: confirming: Čaká sa na dokončenie potvrdenia emailom. functional: Tvoj účet je plne funkčný. pending: Tvoja žiadosť čaká na schvílenie od nášho týmu. Môže to chviľu potrvať. Ak bude tvoja žiadosť schválená, dostaneš o tom email. + redirecting_to: Tvoj účet je neaktívny, lebo v súčasnosti presmerováva na %{acct}. trouble_logging_in: Problém s prihlásením? authorize_follow: already_following: Tento účet už následuješ @@ -645,6 +651,7 @@ sk: x_seconds: "%{count}sek" deletes: confirm_password: Napíšte svoje terajšie heslo pre overenie vašej identity + confirm_username: Zadaj svoju prezývku, na potvrdenie úkonu proceed: Vymaž účet success_msg: Tvoj účet bol úspešne vymazaný warning: @@ -801,11 +808,19 @@ sk: migrations: acct: prezývka@doména nového účtu cancel: Zruš presmerovanie + cancelled_msg: Presmerovanie úspešne zrušené. errors: + missing_also_known_as: neodkazuje spätne na tento účet move_to_self: nemôže to byť tvoj súčasný účet not_found: nebolo možné nájsť + followers_count: Následovatelia v čase presunu + incoming_migrations: Presúvam sa z iného účtu + not_redirecting: Tvoj účet v súčasnosti nepresmerováva na žiaden iný účet. past_migrations: Predošlé presuny proceed_with_move: Presuň sledovateľov + redirecting_to: Tvoj účet presmerováva na %{acct}. + warning: + other_data: Žiadne iné dáta nebudú presunuté automaticky moderation: title: Moderovanie notification_mailer: diff --git a/config/locales/th.yml b/config/locales/th.yml index e1056d0c25..09d81c7521 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -30,6 +30,8 @@ th: other: สถานะ status_count_before: ผู้ใช้เหล่านั้นได้สร้าง terms: เงื่อนไขการให้บริการ + unavailable_content_description: + reason: 'เหตุผล:' user_count_after: other: ผู้ใช้ user_count_before: บ้านของ @@ -174,6 +176,7 @@ th: custom_emojis: by_domain: โดเมน copy: คัดลอก + create_new_category: สร้างหมวดหมู่ใหม่ created_msg: สร้างอีโมจิสำเร็จ! delete: ลบ destroyed_msg: ทำลายอีโมโจสำเร็จ! @@ -217,6 +220,7 @@ th: created_msg: กำลังประมวลผลการปิดกั้นโดเมน destroyed_msg: เลิกทำการปิดกั้นโดเมนแล้ว domain: โดเมน + edit: แก้ไขการปิดกั้นโดเมน new: create: สร้างการปิดกั้น hint: การปิดกั้นโดเมนจะไม่ป้องกันการสร้างรายการบัญชีในฐานข้อมูล แต่จะใช้วิธีการควบคุมเฉพาะกับบัญชีเหล่านั้นย้อนหลังและโดยอัตโนมัติ @@ -226,6 +230,8 @@ th: silence: เงียบ suspend: ระงับ title: การปิดกั้นโดเมนใหม่ + private_comment: ความคิดเห็นส่วนตัว + public_comment: ความคิดเห็นสาธารณะ reject_media: ปฏิเสธไฟล์สื่อ reject_media_hint: เอาไฟล์สื่อที่จัดเก็บไว้ในเว็บออกและปฏิเสธที่จะดาวน์โหลดไฟล์ใด ๆ ในอนาคต ไม่เกี่ยวข้องกับการระงับ reject_reports: ปฏิเสธรายงาน @@ -241,6 +247,7 @@ th: title: เลิกทำการปิดกั้นโดเมนสำหรับ %{domain} undo: เลิกทำ undo: เลิกทำการปิดกั้นโดเมน + view: ดูการปิดกั้นโดเมน email_domain_blocks: add_new: เพิ่มใหม่ delete: ลบ @@ -348,11 +355,14 @@ th: delete: ลบ nsfw_off: ทำเครื่องหมายว่าไม่ละเอียดอ่อน nsfw_on: ทำเครื่องหมายว่าละเอียดอ่อน + deleted: ลบแล้ว media: title: สื่อ no_media: ไม่มีสื่อ title: สถานะบัญชี tags: + in_directory: "%{count} ในไดเรกทอรี" + name: แฮชแท็ก title: แฮชแท็ก title: การดูแล warning_presets: @@ -405,6 +415,9 @@ th: return: แสดงโปรไฟล์ของผู้ใช้ web: ไปยังเว็บ title: ติดตาม %{acct} + challenge: + invalid_password: รหัสผ่านไม่ถูกต้อง + prompt: ยืนยันรหัสผ่านเพื่อดำเนินการต่อ datetime: distance_in_words: about_x_hours: "%{count} ชั่วโมง" @@ -641,6 +654,7 @@ th: video: other: "%{count} วิดีโอ" content_warning: 'คำเตือนเนื้อหา: %{warning}' + language_detection: ตรวจหาภาษาโดยอัตโนมัติ open_in_web: เปิดในเว็บ pin_errors: reblog: ไม่สามารถปักหมุดการดัน From ab33c4df942ec3fdc4d891f3db7ac8cdd3436945 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 28 Sep 2019 01:02:21 +0200 Subject: [PATCH 061/107] Add `exclude_unreviewed` param to `GET /api/v2/search` REST API (#11977) Make it so normal search returns even unreviewed matches, but autosuggestions do not. Fix #11960 --- app/controllers/api/v2/search_controller.rb | 2 +- app/javascript/mastodon/actions/compose.js | 1 + app/models/tag.rb | 13 ++++++------- app/services/search_service.rb | 3 ++- app/services/tag_search_service.rb | 16 ++++++++++------ spec/services/search_service_spec.rb | 4 ++-- 6 files changed, 22 insertions(+), 17 deletions(-) diff --git a/app/controllers/api/v2/search_controller.rb b/app/controllers/api/v2/search_controller.rb index c14cd22d7b..cbd9b551d0 100644 --- a/app/controllers/api/v2/search_controller.rb +++ b/app/controllers/api/v2/search_controller.rb @@ -22,7 +22,7 @@ class Api::V2::SearchController < Api::BaseController params[:q], current_account, limit_param(RESULTS_LIMIT), - search_params.merge(resolve: truthy_param?(:resolve)) + search_params.merge(resolve: truthy_param?(:resolve), exclude_unreviewed: truthy_param?(:exclude_unreviewed)) ) end diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 79d64dc3e8..8e7906c738 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -369,6 +369,7 @@ const fetchComposeSuggestionsTags = throttle((dispatch, getState, token) => { q: token.slice(1), resolve: false, limit: 4, + exclude_unreviewed: true, }, }).then(({ data }) => { dispatch(readyComposeSuggestionsTags(token, data.hashtags)); diff --git a/app/models/tag.rb b/app/models/tag.rb index b52b9bc9fa..9aca3983f2 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -124,16 +124,15 @@ class Tag < ApplicationRecord end end - def search_for(term, limit = 5, offset = 0) + def search_for(term, limit = 5, offset = 0, options = {}) normalized_term = normalize(term.strip).mb_chars.downcase.to_s pattern = sanitize_sql_like(normalized_term) + '%' + query = Tag.listable.where(arel_table[:name].lower.matches(pattern)) + query = query.where(arel_table[:name].lower.eq(normalized_term).or(arel_table[:reviewed_at].not_eq(nil))) if options[:exclude_unreviewed] - Tag.listable - .where(arel_table[:name].lower.matches(pattern)) - .where(arel_table[:name].lower.eq(normalized_term).or(arel_table[:reviewed_at].not_eq(nil))) - .order(Arel.sql('length(name) ASC, name ASC')) - .limit(limit) - .offset(offset) + query.order(Arel.sql('length(name) ASC, name ASC')) + .limit(limit) + .offset(offset) end def find_normalized(name) diff --git a/app/services/search_service.rb b/app/services/search_service.rb index a5ba5dd11c..3a498dcf47 100644 --- a/app/services/search_service.rb +++ b/app/services/search_service.rb @@ -60,7 +60,8 @@ class SearchService < BaseService TagSearchService.new.call( @query, limit: @limit, - offset: @offset + offset: @offset, + exclude_unreviewed: @options[:exclude_unreviewed] ) end diff --git a/app/services/tag_search_service.rb b/app/services/tag_search_service.rb index 47b0e876e8..b78d65625d 100644 --- a/app/services/tag_search_service.rb +++ b/app/services/tag_search_service.rb @@ -2,11 +2,12 @@ class TagSearchService < BaseService def call(query, options = {}) - @query = query.strip.gsub(/\A#/, '') - @offset = options[:offset].to_i - @limit = options[:limit].to_i + @query = query.strip.gsub(/\A#/, '') + @offset = options.delete(:offset).to_i + @limit = options.delete(:limit).to_i + @options = options - results = from_elasticsearch if Chewy.enabled? + results = from_elasticsearch if Chewy.enabled? results ||= from_database results @@ -72,12 +73,15 @@ class TagSearchService < BaseService }, } - TagsIndex.query(query).filter(filter).limit(@limit).offset(@offset).objects.compact + definition = TagsIndex.query(query) + definition = definition.filter(filter) if @options[:exclude_unreviewed] + + definition.limit(@limit).offset(@offset).objects.compact rescue Faraday::ConnectionFailed, Parslet::ParseFailed nil end def from_database - Tag.search_for(@query, @limit, @offset) + Tag.search_for(@query, @limit, @offset, @options) end end diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb index ade306ed28..739bb9cf5d 100644 --- a/spec/services/search_service_spec.rb +++ b/spec/services/search_service_spec.rb @@ -77,10 +77,10 @@ describe SearchService, type: :service do it 'includes the tag in the results' do query = '#tag' tag = Tag.new - allow(Tag).to receive(:search_for).with('tag', 10, 0).and_return([tag]) + allow(Tag).to receive(:search_for).with('tag', 10, 0, exclude_unreviewed: nil).and_return([tag]) results = subject.call(query, nil, 10) - expect(Tag).to have_received(:search_for).with('tag', 10, 0) + expect(Tag).to have_received(:search_for).with('tag', 10, 0, exclude_unreviewed: nil) expect(results).to eq empty_results.merge(hashtags: [tag]) end it 'does not include tag when starts with @ character' do From 27719a4001db8b4804ae301f0f262c7bce8cbcfa Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 28 Sep 2019 01:05:26 +0200 Subject: [PATCH 062/107] Fix older migrations not working due to new default scope (#11983) Fix #11952, regression from #11623 --- .../20161202132159_add_in_reply_to_account_id_to_statuses.rb | 2 +- db/migrate/20170209184350_add_reply_to_statuses.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/db/migrate/20161202132159_add_in_reply_to_account_id_to_statuses.rb b/db/migrate/20161202132159_add_in_reply_to_account_id_to_statuses.rb index 2c24b53d09..3a559ccd6d 100644 --- a/db/migrate/20161202132159_add_in_reply_to_account_id_to_statuses.rb +++ b/db/migrate/20161202132159_add_in_reply_to_account_id_to_statuses.rb @@ -3,7 +3,7 @@ class AddInReplyToAccountIdToStatuses < ActiveRecord::Migration[5.0] add_column :statuses, :in_reply_to_account_id, :integer, null: true, default: nil ActiveRecord::Base.transaction do - Status.where.not(in_reply_to_id: nil).includes(:thread).find_each do |status| + Status.unscoped.where.not(in_reply_to_id: nil).includes(:thread).find_each do |status| next if status.thread.nil? status.in_reply_to_account_id = status.thread.account_id diff --git a/db/migrate/20170209184350_add_reply_to_statuses.rb b/db/migrate/20170209184350_add_reply_to_statuses.rb index c5074728bf..b8b5c13068 100644 --- a/db/migrate/20170209184350_add_reply_to_statuses.rb +++ b/db/migrate/20170209184350_add_reply_to_statuses.rb @@ -1,7 +1,7 @@ class AddReplyToStatuses < ActiveRecord::Migration[5.0] def up add_column :statuses, :reply, :boolean, nil: false, default: false - Status.update_all('reply = (in_reply_to_id IS NOT NULL)') + Status.unscoped.update_all('reply = (in_reply_to_id IS NOT NULL)') end def down From 32ff78f7496012d9fca5b1ad13cddb650184b5ec Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 28 Sep 2019 01:33:02 +0200 Subject: [PATCH 063/107] Fix index not being used in Status.reblogs_map (#11982) Regression from #11623 --- app/models/status.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/status.rb b/app/models/status.rb index 471bb03b47..6afaa14d14 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -305,7 +305,7 @@ class Status < ApplicationRecord end def reblogs_map(status_ids, account_id) - select('reblog_of_id').where(reblog_of_id: status_ids).where(account_id: account_id).reorder(nil).each_with_object({}) { |s, h| h[s.reblog_of_id] = true } + select('reblog_of_id').where(reblog_of_id: status_ids).where(account_id: account_id).unscoped.each_with_object({}) { |s, h| h[s.reblog_of_id] = true } end def mutes_map(conversation_ids, account_id) From 3ec80c7aec4c95c64c4cafb511610eab5fa31b1e Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 28 Sep 2019 01:33:16 +0200 Subject: [PATCH 064/107] Fix preview card image not being re-fetched even if link is re-posted (#11981) Fix #11956 --- app/models/preview_card.rb | 4 ++++ app/services/fetch_link_card_service.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb index 9d6c1938a0..4e89fbf851 100644 --- a/app/models/preview_card.rb +++ b/app/models/preview_card.rb @@ -47,6 +47,10 @@ class PreviewCard < ApplicationRecord before_save :extract_dimensions, if: :link? + def missing_image? + width.present? && height.present? && image_file_name.blank? + end + def save_with_optional_image! save! rescue ActiveRecord::RecordInvalid diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index 4e75c370fa..ac5503d466 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -22,7 +22,7 @@ class FetchLinkCardService < BaseService RedisLock.acquire(lock_options) do |lock| if lock.acquired? @card = PreviewCard.find_by(url: @url) - process_url if @card.nil? || @card.updated_at <= 2.weeks.ago + process_url if @card.nil? || @card.updated_at <= 2.weeks.ago || @card.missing_image? else raise Mastodon::RaceConditionError end From de5305a3a5b2c2c3e92f6e92ad8c72742c501e73 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 28 Sep 2019 01:33:27 +0200 Subject: [PATCH 065/107] Fix redirecting non-functional accounts on public pages (#11978) Fix #11969 --- app/controllers/accounts_controller.rb | 1 + app/controllers/custom_css_controller.rb | 1 + app/controllers/directories_controller.rb | 2 ++ app/controllers/follower_accounts_controller.rb | 1 + app/controllers/following_accounts_controller.rb | 1 + app/controllers/manifests_controller.rb | 1 + app/controllers/media_controller.rb | 1 + app/controllers/media_proxy_controller.rb | 1 + app/controllers/remote_follow_controller.rb | 2 ++ app/controllers/remote_interaction_controller.rb | 2 ++ app/controllers/statuses_controller.rb | 1 + app/controllers/tags_controller.rb | 2 ++ 12 files changed, 16 insertions(+) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 0f6f5e3a6f..1dab5d5f26 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -10,6 +10,7 @@ class AccountsController < ApplicationController before_action :set_body_classes skip_around_action :set_locale, if: -> { request.format == :json } + skip_before_action :require_functional! def show respond_to do |format| diff --git a/app/controllers/custom_css_controller.rb b/app/controllers/custom_css_controller.rb index e3f67bd144..0a667a6a66 100644 --- a/app/controllers/custom_css_controller.rb +++ b/app/controllers/custom_css_controller.rb @@ -2,6 +2,7 @@ class CustomCssController < ApplicationController skip_before_action :store_current_location + skip_before_action :require_functional! before_action :set_cache_headers diff --git a/app/controllers/directories_controller.rb b/app/controllers/directories_controller.rb index 7da975a23f..750c835dda 100644 --- a/app/controllers/directories_controller.rb +++ b/app/controllers/directories_controller.rb @@ -9,6 +9,8 @@ class DirectoriesController < ApplicationController before_action :set_tag, only: :show before_action :set_accounts + skip_before_action :require_functional! + def index render :index end diff --git a/app/controllers/follower_accounts_controller.rb b/app/controllers/follower_accounts_controller.rb index 892c51cf49..705ff41226 100644 --- a/app/controllers/follower_accounts_controller.rb +++ b/app/controllers/follower_accounts_controller.rb @@ -8,6 +8,7 @@ class FollowerAccountsController < ApplicationController before_action :set_cache_headers skip_around_action :set_locale, if: -> { request.format == :json } + skip_before_action :require_functional! def index respond_to do |format| diff --git a/app/controllers/following_accounts_controller.rb b/app/controllers/following_accounts_controller.rb index 653d9a486e..968de980d1 100644 --- a/app/controllers/following_accounts_controller.rb +++ b/app/controllers/following_accounts_controller.rb @@ -8,6 +8,7 @@ class FollowingAccountsController < ApplicationController before_action :set_cache_headers skip_around_action :set_locale, if: -> { request.format == :json } + skip_before_action :require_functional! def index respond_to do |format| diff --git a/app/controllers/manifests_controller.rb b/app/controllers/manifests_controller.rb index 491cde7459..960510f601 100644 --- a/app/controllers/manifests_controller.rb +++ b/app/controllers/manifests_controller.rb @@ -2,6 +2,7 @@ class ManifestsController < ApplicationController skip_before_action :store_current_location + skip_before_action :require_functional! def show expires_in 3.minutes, public: true diff --git a/app/controllers/media_controller.rb b/app/controllers/media_controller.rb index 1f693de320..05cf09c28a 100644 --- a/app/controllers/media_controller.rb +++ b/app/controllers/media_controller.rb @@ -4,6 +4,7 @@ class MediaController < ApplicationController include Authorization skip_before_action :store_current_location + skip_before_action :require_functional! before_action :authenticate_user!, if: :whitelist_mode? before_action :set_media_attachment diff --git a/app/controllers/media_proxy_controller.rb b/app/controllers/media_proxy_controller.rb index 47544f21c9..014b89de10 100644 --- a/app/controllers/media_proxy_controller.rb +++ b/app/controllers/media_proxy_controller.rb @@ -4,6 +4,7 @@ class MediaProxyController < ApplicationController include RoutingHelper skip_before_action :store_current_location + skip_before_action :require_functional! before_action :authenticate_user!, if: :whitelist_mode? diff --git a/app/controllers/remote_follow_controller.rb b/app/controllers/remote_follow_controller.rb index ba963a7a06..db1604644f 100644 --- a/app/controllers/remote_follow_controller.rb +++ b/app/controllers/remote_follow_controller.rb @@ -7,6 +7,8 @@ class RemoteFollowController < ApplicationController before_action :set_body_classes + skip_before_action :require_functional! + def new @remote_follow = RemoteFollow.new(session_params) end diff --git a/app/controllers/remote_interaction_controller.rb b/app/controllers/remote_interaction_controller.rb index 15224e8535..4073e7ac3f 100644 --- a/app/controllers/remote_interaction_controller.rb +++ b/app/controllers/remote_interaction_controller.rb @@ -10,6 +10,8 @@ class RemoteInteractionController < ApplicationController before_action :set_status before_action :set_body_classes + skip_before_action :require_functional! + def new @remote_follow = RemoteFollow.new(session_params) end diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index 83131f484e..57bbeca643 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -19,6 +19,7 @@ class StatusesController < ApplicationController before_action :set_autoplay, only: :embed skip_around_action :set_locale, if: -> { request.format == :json } + skip_before_action :require_functional!, only: [:show, :embed] content_security_policy only: :embed do |p| p.frame_ancestors(false) diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 4dfa052641..77d5661b8d 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -13,6 +13,8 @@ class TagsController < ApplicationController before_action :set_body_classes before_action :set_instance_presenter + skip_before_action :require_functional! + def show respond_to do |format| format.html do From 50af41a00daaa99150b0fa92be0c9bde44ced273 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 28 Sep 2019 05:23:32 +0200 Subject: [PATCH 066/107] Fix unscoped being used in the wrong place (#11987) Regression from #11982 --- app/models/status.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/status.rb b/app/models/status.rb index 6afaa14d14..5e74745775 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -305,7 +305,7 @@ class Status < ApplicationRecord end def reblogs_map(status_ids, account_id) - select('reblog_of_id').where(reblog_of_id: status_ids).where(account_id: account_id).unscoped.each_with_object({}) { |s, h| h[s.reblog_of_id] = true } + unscoped.select('reblog_of_id').where(reblog_of_id: status_ids).where(account_id: account_id).each_with_object({}) { |s, h| h[s.reblog_of_id] = true } end def mutes_map(conversation_ids, account_id) From b0cda7a504655f6ced33802af67cabb6f3e46e19 Mon Sep 17 00:00:00 2001 From: ThibG Date: Sat, 28 Sep 2019 19:41:36 +0200 Subject: [PATCH 067/107] Fix vote checkmark in poll results (#11990) --- app/javascript/mastodon/components/poll.js | 13 +++++++------ app/javascript/styles/mastodon/polls.scss | 6 +++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/javascript/mastodon/components/poll.js b/app/javascript/mastodon/components/poll.js index 4c9b23b770..dd7e2fcd3f 100644 --- a/app/javascript/mastodon/components/poll.js +++ b/app/javascript/mastodon/components/poll.js @@ -14,6 +14,7 @@ import Icon from 'mastodon/components/icon'; const messages = defineMessages({ closed: { id: 'poll.closed', defaultMessage: 'Closed' }, + voted: { id: 'poll.voted', defaultMessage: 'You voted for this answer', description: 'Tooltip of the "voted" checkmark in polls' }, }); const makeEmojiMap = record => record.get('emojis').reduce((obj, emoji) => { @@ -100,11 +101,11 @@ class Poll extends ImmutablePureComponent { }; renderOption (option, optionIndex, showResults) { - const { poll, disabled } = 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 active = !!this.state.selected[`${optionIndex}`]; - const voted = option.get('voted') || (poll.get('own_votes') && poll.get('own_votes').includes(optionIndex)); + 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 active = !!this.state.selected[`${optionIndex}`]; + const voted = option.get('voted') || (poll.get('own_votes') && poll.get('own_votes').includes(optionIndex)); let titleEmojified = option.get('title_emojified'); if (!titleEmojified) { @@ -134,7 +135,7 @@ class Poll extends ImmutablePureComponent { {!showResults && } {showResults && - {!!voted && } + {!!voted && } {Math.round(percent)}% } diff --git a/app/javascript/styles/mastodon/polls.scss b/app/javascript/styles/mastodon/polls.scss index 85ba138b41..f59a9d693a 100644 --- a/app/javascript/styles/mastodon/polls.scss +++ b/app/javascript/styles/mastodon/polls.scss @@ -95,18 +95,18 @@ &__number { display: inline-block; - width: 48px; + width: 52px; font-weight: 700; padding: 0 10px; + padding-left: 8px; text-align: right; margin-top: auto; margin-bottom: auto; - flex: 0 0 48px; + flex: 0 0 52px; } &__vote__mark { float: left; - color: $valid-value-color; line-height: 18px; } From 163ed91af381d86bb6c52546c983effa4c9a18c3 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 29 Sep 2019 05:03:19 +0200 Subject: [PATCH 068/107] Add (back) option to set redirect notice on account without moving followers (#11994) Fix #11913 --- .../migration/redirects_controller.rb | 45 ++++++++++++++++++ .../settings/migrations_controller.rb | 9 ---- app/models/account_migration.rb | 3 +- app/models/form/redirect.rb | 47 +++++++++++++++++++ app/views/auth/registrations/edit.html.haml | 11 +++++ .../migration/redirects/new.html.haml | 27 +++++++++++ app/views/settings/migrations/show.html.haml | 10 ++-- config/locales/en.yml | 3 ++ config/routes.rb | 7 ++- 9 files changed, 144 insertions(+), 18 deletions(-) create mode 100644 app/controllers/settings/migration/redirects_controller.rb create mode 100644 app/models/form/redirect.rb create mode 100644 app/views/settings/migration/redirects/new.html.haml diff --git a/app/controllers/settings/migration/redirects_controller.rb b/app/controllers/settings/migration/redirects_controller.rb new file mode 100644 index 0000000000..6e5b72ffba --- /dev/null +++ b/app/controllers/settings/migration/redirects_controller.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +class Settings::Migration::RedirectsController < Settings::BaseController + layout 'admin' + + before_action :authenticate_user! + before_action :require_not_suspended! + + skip_before_action :require_functional! + + def new + @redirect = Form::Redirect.new + end + + def create + @redirect = Form::Redirect.new(resource_params.merge(account: current_account)) + + if @redirect.valid_with_challenge?(current_user) + current_account.update!(moved_to_account: @redirect.target_account) + ActivityPub::UpdateDistributionWorker.perform_async(current_account.id) + redirect_to settings_migration_path, notice: I18n.t('migrations.moved_msg', acct: current_account.moved_to_account.acct) + else + render :new + end + end + + def destroy + if current_account.moved_to_account_id.present? + current_account.update!(moved_to_account: nil) + ActivityPub::UpdateDistributionWorker.perform_async(current_account.id) + end + + redirect_to settings_migration_path, notice: I18n.t('migrations.cancelled_msg') + end + + private + + def resource_params + params.require(:form_redirect).permit(:acct, :current_password, :current_username) + end + + def require_not_suspended! + forbidden if current_account.suspended? + end +end diff --git a/app/controllers/settings/migrations_controller.rb b/app/controllers/settings/migrations_controller.rb index 90092c6925..00bde1d616 100644 --- a/app/controllers/settings/migrations_controller.rb +++ b/app/controllers/settings/migrations_controller.rb @@ -27,15 +27,6 @@ class Settings::MigrationsController < Settings::BaseController end end - def cancel - if current_account.moved_to_account_id.present? - current_account.update!(moved_to_account: nil) - ActivityPub::UpdateDistributionWorker.perform_async(current_account.id) - end - - redirect_to settings_migration_path, notice: I18n.t('migrations.cancelled_msg') - end - helper_method :on_cooldown? private diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb index e2c2cb0850..681b5b2cd0 100644 --- a/app/models/account_migration.rb +++ b/app/models/account_migration.rb @@ -47,8 +47,7 @@ class AccountMigration < ApplicationRecord end def acct=(val) - val = val.to_s.strip - super(val.start_with?('@') ? val[1..-1] : val) + super(val.to_s.strip.gsub(/\A@/, '')) end private diff --git a/app/models/form/redirect.rb b/app/models/form/redirect.rb new file mode 100644 index 0000000000..a7961f8e8a --- /dev/null +++ b/app/models/form/redirect.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +class Form::Redirect + include ActiveModel::Model + + attr_accessor :account, :target_account, :current_password, + :current_username + + attr_reader :acct + + validates :acct, presence: true, domain: { acct: true } + validate :validate_target_account + + def valid_with_challenge?(current_user) + if current_user.encrypted_password.present? + errors.add(:current_password, :invalid) unless current_user.valid_password?(current_password) + else + errors.add(:current_username, :invalid) unless account.username == current_username + end + + return false unless errors.empty? + + set_target_account + valid? + end + + def acct=(val) + @acct = val.to_s.strip.gsub(/\A@/, '') + end + + private + + def set_target_account + @target_account = ResolveAccountService.new.call(acct) + rescue Goldfinger::Error, HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error + # Validation will take care of it + end + + def validate_target_account + if target_account.nil? + errors.add(:acct, I18n.t('migrations.errors.not_found')) + else + errors.add(:acct, I18n.t('migrations.errors.already_moved')) if account.moved_to_account_id.present? && account.moved_to_account_id == target_account.id + errors.add(:acct, I18n.t('migrations.errors.move_to_self')) if account.id == target_account.id + end + end +end diff --git a/app/views/auth/registrations/edit.html.haml b/app/views/auth/registrations/edit.html.haml index 885171c58b..a155c75c98 100644 --- a/app/views/auth/registrations/edit.html.haml +++ b/app/views/auth/registrations/edit.html.haml @@ -30,7 +30,18 @@ = render 'sessions' +%hr.spacer/ + +%h3= t('auth.migrate_account') +%p.muted-hint= t('auth.migrate_account_html', path: settings_migration_path) + +%hr.spacer/ + +%h3= t('migrations.incoming_migrations') +%p.muted-hint= t('migrations.incoming_migrations_html', path: settings_aliases_path) + - if open_deletion? && !current_account.suspended? %hr.spacer/ + %h3= t('auth.delete_account') %p.muted-hint= t('auth.delete_account_html', path: settings_delete_path) diff --git a/app/views/settings/migration/redirects/new.html.haml b/app/views/settings/migration/redirects/new.html.haml new file mode 100644 index 0000000000..017450f4b9 --- /dev/null +++ b/app/views/settings/migration/redirects/new.html.haml @@ -0,0 +1,27 @@ +- content_for :page_title do + = t('settings.migrate') + += simple_form_for @redirect, url: settings_migration_redirect_path do |f| + %p.hint= t('migrations.warning.before') + + %ul.hint + %li.warning-hint= t('migrations.warning.redirect') + %li.warning-hint= t('migrations.warning.other_data') + %li.warning-hint= t('migrations.warning.disabled_account') + + %hr.spacer/ + + = render 'shared/error_messages', object: @redirect + + .fields-row + .fields-row__column.fields-group.fields-row__column-6 + = f.input :acct, wrapper: :with_block_label, input_html: { autocapitalize: 'none', autocorrect: 'off' }, label: t('simple_form.labels.account_migration.acct'), hint: t('simple_form.hints.account_migration.acct') + + .fields-row__column.fields-group.fields-row__column-6 + - if current_user.encrypted_password.present? + = f.input :current_password, wrapper: :with_block_label, input_html: { :autocomplete => 'off' }, required: true + - else + = f.input :current_username, wrapper: :with_block_label, input_html: { :autocomplete => 'off' }, required: true + + .actions + = f.button :button, t('migrations.set_redirect'), type: :submit, class: 'button button--destructive' diff --git a/app/views/settings/migrations/show.html.haml b/app/views/settings/migrations/show.html.haml index 1e5c47726f..078eaebc6c 100644 --- a/app/views/settings/migrations/show.html.haml +++ b/app/views/settings/migrations/show.html.haml @@ -12,28 +12,32 @@ %p.hint= t('migrations.cancel_explanation') - %p.hint= link_to t('migrations.cancel'), cancel_settings_migration_path, data: { method: :post } + %p.hint= link_to t('migrations.cancel'), settings_migration_redirect_path, data: { method: :delete } - else %p.hint %span.positive-hint= t('migrations.not_redirecting') %hr.spacer/ -%h3= t 'migrations.proceed_with_move' +%h3= t('auth.migrate_account') = simple_form_for @migration, url: settings_migration_path do |f| - if on_cooldown? - %span.warning-hint= t('migrations.on_cooldown', count: ((@cooldown.cooldown_at - Time.now.utc) / 1.day.seconds).ceil) + %p.hint + %span.warning-hint= t('migrations.on_cooldown', count: ((@cooldown.cooldown_at - Time.now.utc) / 1.day.seconds).ceil) - else %p.hint= t('migrations.warning.before') %ul.hint %li.warning-hint= t('migrations.warning.followers') + %li.warning-hint= t('migrations.warning.redirect') %li.warning-hint= t('migrations.warning.other_data') %li.warning-hint= t('migrations.warning.backreference_required') %li.warning-hint= t('migrations.warning.cooldown') %li.warning-hint= t('migrations.warning.disabled_account') + %p.hint= t('migrations.warning.only_redirect_html', path: new_settings_migration_redirect_path) + %hr.spacer/ = render 'shared/error_messages', object: @migration diff --git a/config/locales/en.yml b/config/locales/en.yml index ee798e87f1..1e7d0701b5 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -831,13 +831,16 @@ en: past_migrations: Past migrations proceed_with_move: Move followers redirecting_to: Your account is redirecting to %{acct}. + set_redirect: Set redirect warning: backreference_required: The new account must first be configured to back-reference this one before: 'Before proceeding, please read these notes carefully:' cooldown: After moving there is a cooldown period during which you will not be able to move again disabled_account: Your current account will not be fully usable afterwards. However, you will have access to data export as well as re-activation. followers: This action will move all followers from the current account to the new account + only_redirect_html: Alternatively, you can only put up a redirect on your profile. other_data: No other data will be moved automatically + redirect: Your current account's profile will be updated with a redirect notice and be excluded from searches moderation: title: Moderation notification_mailer: diff --git a/config/routes.rb b/config/routes.rb index 37e0cbdee8..f1a69cf5c5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -134,11 +134,10 @@ Rails.application.routes.draw do end resource :delete, only: [:show, :destroy] + resource :migration, only: [:show, :create] - resource :migration, only: [:show, :create] do - collection do - post :cancel - end + namespace :migration do + resource :redirect, only: [:new, :create, :destroy] end resources :aliases, only: [:index, :create, :destroy] From 0a49b26793d467589be09305e15ff9cc97cdd200 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sun, 29 Sep 2019 21:30:58 +0900 Subject: [PATCH 069/107] Do not add margin light when opening modal on mobile (#11830) --- .../mastodon/containers/media_container.js | 16 ++++----- .../features/ui/components/modal_root.js | 25 ++----------- app/javascript/mastodon/utils/scrollbar.js | 36 +++++++++++++++++++ 3 files changed, 46 insertions(+), 31 deletions(-) create mode 100644 app/javascript/mastodon/utils/scrollbar.js diff --git a/app/javascript/mastodon/containers/media_container.js b/app/javascript/mastodon/containers/media_container.js index db340032ae..ba55ecbc7b 100644 --- a/app/javascript/mastodon/containers/media_container.js +++ b/app/javascript/mastodon/containers/media_container.js @@ -2,17 +2,17 @@ import React, { PureComponent, Fragment } from 'react'; import ReactDOM from 'react-dom'; import PropTypes from 'prop-types'; import { IntlProvider, addLocaleData } from 'react-intl'; -import { getLocale } from '../locales'; -import MediaGallery from '../components/media_gallery'; -import Video from '../features/video'; -import Card from '../features/status/components/card'; +import { List as ImmutableList, fromJS } from 'immutable'; +import { getLocale } from 'mastodon/locales'; +import { getScrollbarWidth } from 'mastodon/utils/scrollbar'; +import MediaGallery from 'mastodon/components/media_gallery'; import Poll from 'mastodon/components/poll'; import Hashtag from 'mastodon/components/hashtag'; +import ModalRoot from 'mastodon/components/modal_root'; +import MediaModal from 'mastodon/features/ui/components/media_modal'; +import Video from 'mastodon/features/video'; +import Card from 'mastodon/features/status/components/card'; import Audio from 'mastodon/features/audio'; -import ModalRoot from '../components/modal_root'; -import { getScrollbarWidth } from '../features/ui/components/modal_root'; -import MediaModal from '../features/ui/components/media_modal'; -import { List as ImmutableList, fromJS } from 'immutable'; const { localeData, messages } = getLocale(); addLocaleData(localeData); diff --git a/app/javascript/mastodon/features/ui/components/modal_root.js b/app/javascript/mastodon/features/ui/components/modal_root.js index 06f9e1bc4d..5fc37368bd 100644 --- a/app/javascript/mastodon/features/ui/components/modal_root.js +++ b/app/javascript/mastodon/features/ui/components/modal_root.js @@ -1,6 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Base from '../../../components/modal_root'; +import { getScrollbarWidth } from 'mastodon/utils/scrollbar'; +import Base from 'mastodon/components/modal_root'; import BundleContainer from '../containers/bundle_container'; import BundleModalError from './bundle_modal_error'; import ModalLoading from './modal_loading'; @@ -32,28 +33,6 @@ const MODAL_COMPONENTS = { 'LIST_ADDER':ListAdder, }; -let cachedScrollbarWidth = null; - -export const getScrollbarWidth = () => { - if (cachedScrollbarWidth !== null) { - return cachedScrollbarWidth; - } - - const outer = document.createElement('div'); - outer.style.visibility = 'hidden'; - outer.style.overflow = 'scroll'; - document.body.appendChild(outer); - - const inner = document.createElement('div'); - outer.appendChild(inner); - - const scrollbarWidth = outer.offsetWidth - inner.offsetWidth; - cachedScrollbarWidth = scrollbarWidth; - outer.parentNode.removeChild(outer); - - return scrollbarWidth; -}; - export default class ModalRoot extends React.PureComponent { static propTypes = { diff --git a/app/javascript/mastodon/utils/scrollbar.js b/app/javascript/mastodon/utils/scrollbar.js new file mode 100644 index 0000000000..6f0ee010b5 --- /dev/null +++ b/app/javascript/mastodon/utils/scrollbar.js @@ -0,0 +1,36 @@ +import { isMobile } from '../is_mobile'; + +/** @type {number | null} */ +let cachedScrollbarWidth = null; + +/** + * @return {number} + */ +const getActualScrollbarWidth = () => { + const outer = document.createElement('div'); + outer.style.visibility = 'hidden'; + outer.style.overflow = 'scroll'; + document.body.appendChild(outer); + + const inner = document.createElement('div'); + outer.appendChild(inner); + + const scrollbarWidth = outer.offsetWidth - inner.offsetWidth; + outer.parentNode.removeChild(outer); + + return scrollbarWidth; +}; + +/** + * @return {number} + */ +export const getScrollbarWidth = () => { + if (cachedScrollbarWidth !== null) { + return cachedScrollbarWidth; + } + + const scrollbarWidth = isMobile(window.innerWidth) ? 0 : getActualScrollbarWidth(); + cachedScrollbarWidth = scrollbarWidth; + + return scrollbarWidth; +}; From bd9685f7980838ecc675af20cf52ef1e686d98d6 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 29 Sep 2019 16:23:01 +0200 Subject: [PATCH 070/107] Fix public list of domain blocks being too verbose on about page (#11967) --- app/javascript/styles/mastodon/about.scss | 41 +++++++++++++ app/javascript/styles/mastodon/tables.scss | 67 ---------------------- app/views/about/_domain_blocks.html.haml | 10 ++++ app/views/about/more.html.haml | 22 +++---- config/locales/en.yml | 9 +-- 5 files changed, 65 insertions(+), 84 deletions(-) create mode 100644 app/views/about/_domain_blocks.html.haml diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index c056ef85dc..1dd8b79541 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -136,6 +136,47 @@ $small-breakpoint: 960px; } } + table { + width: 100%; + border-collapse: collapse; + break-inside: auto; + margin-top: 24px; + margin-bottom: 32px; + + thead tr, + tbody tr { + break-after: auto; + break-inside: avoid; + border-bottom: 1px solid lighten($ui-base-color, 4%); + font-size: 1em; + line-height: 1.625; + font-weight: 400; + text-align: left; + color: $darker-text-color; + } + + thead tr { + border-bottom-width: 2px; + line-height: 1.5; + font-weight: 500; + color: $dark-text-color; + } + + th, + td { + padding: 8px; + align-self: start; + align-items: start; + + &.nowrap { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 25%; + } + } + } + & > :first-child { margin-top: 0; } diff --git a/app/javascript/styles/mastodon/tables.scss b/app/javascript/styles/mastodon/tables.scss index d6403986fa..5a6e10aa49 100644 --- a/app/javascript/styles/mastodon/tables.scss +++ b/app/javascript/styles/mastodon/tables.scss @@ -292,70 +292,3 @@ a.table-action-link { } } } - -.blocks-table { - width: 100%; - max-width: 100%; - border-spacing: 0; - border-collapse: collapse; - table-layout: fixed; - border: 1px solid darken($ui-base-color, 8%); - - thead { - border: 1px solid darken($ui-base-color, 8%); - background: darken($ui-base-color, 4%); - font-weight: 500; - - th.severity-column { - width: 120px; - } - - th.button-column { - width: 23px; - } - } - - tbody > tr { - border: 1px solid darken($ui-base-color, 8%); - border-bottom: 0; - background: darken($ui-base-color, 4%); - - &:hover { - background: darken($ui-base-color, 2%); - } - - &.even { - background: $ui-base-color; - - &:hover { - background: lighten($ui-base-color, 2%); - } - } - - &.rationale { - background: lighten($ui-base-color, 4%); - border-top: 0; - - &:hover { - background: lighten($ui-base-color, 6%); - } - - &.hidden { - display: none; - } - } - - td:first-child { - overflow: hidden; - text-overflow: ellipsis; - } - } - - th, - td { - padding: 8px; - line-height: 18px; - vertical-align: top; - text-align: left; - } -} diff --git a/app/views/about/_domain_blocks.html.haml b/app/views/about/_domain_blocks.html.haml new file mode 100644 index 0000000000..940bcb9344 --- /dev/null +++ b/app/views/about/_domain_blocks.html.haml @@ -0,0 +1,10 @@ +%table + %thead + %tr + %th= t('about.unavailable_content_description.domain') + %th= t('about.unavailable_content_description.reason') + %tbody + - domain_blocks.each do |domain_block| + %tr + %td.nowrap= domain_block.domain + %td= domain_block.public_comment if display_blocks_rationale? diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index cba2fe657e..7e156db61b 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -55,19 +55,15 @@ %p= t('about.unavailable_content_html') - - @blocks.each do |domain_block| - %p - %strong= "#{domain_block.domain}:" - - - if domain_block.suspend? - = t('about.unavailable_content_description.suspended') - - else - = t('about.unavailable_content_description.silenced') if domain_block.silence? - = t('about.unavailable_content_description.rejecting_media') if domain_block.reject_media? - - - if display_blocks_rationale? && domain_block.public_comment.present? - %strong= t('about.unavailable_content_description.reason') - = domain_block.public_comment + - if (blocks = @blocks.select(&:reject_media?)) && !blocks.empty? + %p= t('about.unavailable_content_description.rejecting_media') + = render partial: 'domain_blocks', locals: { domain_blocks: blocks } + - if (blocks = @blocks.select(&:silence?)) && !blocks.empty? + %p= t('about.unavailable_content_description.silenced') + = render partial: 'domain_blocks', locals: { domain_blocks: blocks } + - if (blocks = @blocks.select(&:suspend?)) && !blocks.empty? + %p= t('about.unavailable_content_description.suspended') + = render partial: 'domain_blocks', locals: { domain_blocks: blocks } .column-4 %ul.table-of-contents diff --git a/config/locales/en.yml b/config/locales/en.yml index 1e7d0701b5..dbdfe0ca03 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -37,10 +37,11 @@ en: terms: Terms of service unavailable_content: Unavailable content unavailable_content_description: - reason: 'Reason:' - rejecting_media: Media files from this server will not be processed and and no thumbnails will be displayed, requiring manual click-through to the other server. - silenced: Posts from this server will not show up anywhere except your home feed if you follow the author. - suspended: You won't be able to follow anyone from this server, and no data from it will be processed or stored, and no data exchanged. + domain: Server + reason: Reason + rejecting_media: 'Media files from these servers will not be processed or stored, and and no thumbnails will be displayed, requiring manual click-through to the original file:' + silenced: 'Posts from these servers will be hidden in public timelines and conversations, and no notifications will be generated from their users'' interactions, unless you are following them:' + suspended: 'No data from these servers will be processed, stored or exchanged, making any interaction or communication with users from these servers impossible:' unavailable_content_html: Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server. user_count_after: one: user From 368a87755b4b12c37deb415e10e03c709012f698 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 29 Sep 2019 16:23:13 +0200 Subject: [PATCH 071/107] Fix account migration not affecting followers on origin server (#11980) --- .../settings/migrations_controller.rb | 4 +-- app/lib/activitypub/activity/move.rb | 6 +--- app/services/move_service.rb | 32 ++++++++++++++++++ app/workers/move_worker.rb | 33 +++++++++++++++++++ 4 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 app/services/move_service.rb create mode 100644 app/workers/move_worker.rb diff --git a/app/controllers/settings/migrations_controller.rb b/app/controllers/settings/migrations_controller.rb index 00bde1d616..68304bb513 100644 --- a/app/controllers/settings/migrations_controller.rb +++ b/app/controllers/settings/migrations_controller.rb @@ -18,9 +18,7 @@ class Settings::MigrationsController < Settings::BaseController @migration = current_account.migrations.build(resource_params) if @migration.save_with_challenge(current_user) - current_account.update!(moved_to_account: @migration.target_account) - ActivityPub::UpdateDistributionWorker.perform_async(current_account.id) - ActivityPub::MoveDistributionWorker.perform_async(@migration.id) + MoveService.new.call(@migration) redirect_to settings_migration_path, notice: I18n.t('migrations.moved_msg', acct: current_account.moved_to_account.acct) else render :show diff --git a/app/lib/activitypub/activity/move.rb b/app/lib/activitypub/activity/move.rb index 6c6a2b9678..12bb82d259 100644 --- a/app/lib/activitypub/activity/move.rb +++ b/app/lib/activitypub/activity/move.rb @@ -19,11 +19,7 @@ class ActivityPub::Activity::Move < ActivityPub::Activity origin_account.update(moved_to_account: target_account) # Initiate a re-follow for each follower - origin_account.followers.local.select(:id).find_in_batches do |follower_accounts| - UnfollowFollowWorker.push_bulk(follower_accounts.map(&:id)) do |follower_account_id| - [follower_account_id, origin_account.id, target_account.id] - end - end + MoveWorker.perform_async(origin_account.id, target_account.id) end private diff --git a/app/services/move_service.rb b/app/services/move_service.rb new file mode 100644 index 0000000000..da0c62c4eb --- /dev/null +++ b/app/services/move_service.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +class MoveService < BaseService + def call(migration) + @migration = migration + @source_account = migration.account + @target_account = migration.target_account + + update_redirect! + process_local_relationships! + distribute_update! + distribute_move! + end + + private + + def update_redirect! + @source_account.update!(moved_to_account: @target_account) + end + + def process_local_relationships! + MoveWorker.perform_async(@source_account.id, @target_account.id) + end + + def distribute_update! + ActivityPub::UpdateDistributionWorker.perform_async(@source_account.id) + end + + def distribute_move! + ActivityPub::MoveDistributionWorker.perform_async(@migration.id) + end +end diff --git a/app/workers/move_worker.rb b/app/workers/move_worker.rb new file mode 100644 index 0000000000..22788716f4 --- /dev/null +++ b/app/workers/move_worker.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +class MoveWorker + include Sidekiq::Worker + + def perform(source_account_id, target_account_id) + @source_account = Account.find(source_account_id) + @target_account = Account.find(target_account_id) + + if @target_account.local? + rewrite_follows! + else + queue_follow_unfollows! + end + rescue ActiveRecord::RecordNotFound + true + end + + private + + def rewrite_follows! + @source_account.passive_relationships + .where(account: Account.local) + .in_batches + .update_all(target_account: @target_account) + end + + def queue_follow_unfollows! + @source_account.followers.local.select(:id).find_in_batches do |accounts| + UnfollowFollowWorker.push_bulk(accounts.map(&:id)) { |follower_id| [follower_id, @source_account.id, @target_account.id] } + end + end +end From 9683e1dcf8bbddb07b818960abf254248be3575c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 29 Sep 2019 16:27:00 +0200 Subject: [PATCH 072/107] Fix follower/following lists resetting on back-navigation in web UI (#11986) Fix #11452 --- app/javascript/mastodon/features/favourites/index.js | 4 +++- app/javascript/mastodon/features/followers/index.js | 6 ++++-- app/javascript/mastodon/features/following/index.js | 6 ++++-- app/javascript/mastodon/features/reblogs/index.js | 4 +++- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/features/favourites/index.js b/app/javascript/mastodon/features/favourites/index.js index 62d3c2f067..90c26f0c32 100644 --- a/app/javascript/mastodon/features/favourites/index.js +++ b/app/javascript/mastodon/features/favourites/index.js @@ -27,7 +27,9 @@ class Favourites extends ImmutablePureComponent { }; componentWillMount () { - this.props.dispatch(fetchFavourites(this.props.params.statusId)); + if (!this.props.accountIds) { + this.props.dispatch(fetchFavourites(this.props.params.statusId)); + } } componentWillReceiveProps (nextProps) { diff --git a/app/javascript/mastodon/features/followers/index.js b/app/javascript/mastodon/features/followers/index.js index 3913bf8d07..9e635d2501 100644 --- a/app/javascript/mastodon/features/followers/index.js +++ b/app/javascript/mastodon/features/followers/index.js @@ -40,8 +40,10 @@ class Followers extends ImmutablePureComponent { }; componentWillMount () { - this.props.dispatch(fetchAccount(this.props.params.accountId)); - this.props.dispatch(fetchFollowers(this.props.params.accountId)); + if (!this.props.accountIds) { + this.props.dispatch(fetchAccount(this.props.params.accountId)); + this.props.dispatch(fetchFollowers(this.props.params.accountId)); + } } componentWillReceiveProps (nextProps) { diff --git a/app/javascript/mastodon/features/following/index.js b/app/javascript/mastodon/features/following/index.js index 8e126f4c39..284ae2c11e 100644 --- a/app/javascript/mastodon/features/following/index.js +++ b/app/javascript/mastodon/features/following/index.js @@ -40,8 +40,10 @@ class Following extends ImmutablePureComponent { }; componentWillMount () { - this.props.dispatch(fetchAccount(this.props.params.accountId)); - this.props.dispatch(fetchFollowing(this.props.params.accountId)); + if (!this.props.accountIds) { + this.props.dispatch(fetchAccount(this.props.params.accountId)); + this.props.dispatch(fetchFollowing(this.props.params.accountId)); + } } componentWillReceiveProps (nextProps) { diff --git a/app/javascript/mastodon/features/reblogs/index.js b/app/javascript/mastodon/features/reblogs/index.js index 229f626b3e..7edcf1968d 100644 --- a/app/javascript/mastodon/features/reblogs/index.js +++ b/app/javascript/mastodon/features/reblogs/index.js @@ -27,7 +27,9 @@ class Reblogs extends ImmutablePureComponent { }; componentWillMount () { - this.props.dispatch(fetchReblogs(this.props.params.statusId)); + if (!this.props.accountIds) { + this.props.dispatch(fetchReblogs(this.props.params.statusId)); + } } componentWillReceiveProps(nextProps) { From d51201a75ac47ac90615ee8987534c5772274779 Mon Sep 17 00:00:00 2001 From: trwnh Date: Sun, 29 Sep 2019 09:54:24 -0500 Subject: [PATCH 073/107] Fix muted text color not applying to all text (#11996) Pleroma generates polls without p tag --- app/javascript/styles/mastodon/components.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 7562cc709c..398522afbc 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1529,6 +1529,7 @@ a.account__display-name { } .muted { + .status__content, .status__content p, .status__content a { color: $dark-text-color; From 3582fa5c1755a7b92443d4cd8bcd71723d325891 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 29 Sep 2019 16:54:35 +0200 Subject: [PATCH 074/107] Bump set-value from 2.0.0 to 2.0.1 (#11997) --- yarn.lock | 515 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 312 insertions(+), 203 deletions(-) diff --git a/yarn.lock b/yarn.lock index f8314e4d95..b45fcc6bef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1130,9 +1130,9 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "10.12.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" - integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== + version "12.7.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.8.tgz#cb1bf6800238898bc2ff6ffa5702c3cadd350708" + integrity sha512-FMdVn84tJJdV+xe+53sYiZS4R5yn1mAIxfj+DVoNiQjTYz1+OYmjwEZr1ev9nU0axXwda0QDbYl06QHanRVH3A== "@types/q@^1.5.1": version "1.5.1" @@ -1409,9 +1409,9 @@ ajv-keywords@^1.0.0: integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw= ajv-keywords@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" - integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== ajv@^4.7.0: version "4.11.8" @@ -1437,9 +1437,9 @@ alphanum-sort@^1.0.0: integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= ansi-colors@^3.0.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== ansi-escapes@^1.1.0: version "1.4.0" @@ -1673,9 +1673,9 @@ async-each@^1.0.1: integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== async@^1.5.2: version "1.5.2" @@ -1947,9 +1947,9 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^1.0.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" - integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== binary-extensions@^2.0.0: version "2.0.0" @@ -2394,7 +2394,7 @@ cheerio@^1.0.0-rc.2: optionalDependencies: fsevents "^2.0.6" -chokidar@^2.0.2, chokidar@^2.1.6: +chokidar@^2.0.2: version "2.1.6" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== @@ -2413,10 +2413,29 @@ chokidar@^2.0.2, chokidar@^2.1.6: optionalDependencies: fsevents "^1.2.7" +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + chownr@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== chrome-trace-event@^1.0.0: version "1.0.0" @@ -2588,9 +2607,9 @@ commondir@^1.0.1: integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== compressible@~2.0.16: version "2.0.17" @@ -3139,7 +3158,7 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@2.6.9, debug@^2.1.1, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3153,7 +3172,7 @@ debug@=3.1.0: dependencies: ms "2.0.0" -debug@^3.2.5: +debug@^3.0.0, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -3178,9 +3197,16 @@ decode-uri-component@^0.2.0: integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + version "1.1.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.0.tgz#3103cdf8ab6d32cf4a8df7865458f2b8d33f3745" + integrity sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" deep-extend@^0.5.1: version "0.5.1" @@ -3530,13 +3556,20 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== dependencies: once "^1.4.0" +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" @@ -3991,10 +4024,10 @@ event-emitter@~0.3.5: d "1" es5-ext "~0.10.14" -eventemitter3@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" - integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== +eventemitter3@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== events@^1.0.0: version "1.1.1" @@ -4193,9 +4226,9 @@ faye-websocket@^0.10.0: websocket-driver ">=0.5.1" faye-websocket@~0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" - integrity sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg= + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== dependencies: websocket-driver ">=0.5.1" @@ -4397,11 +4430,11 @@ follow-redirects@1.5.10: debug "=3.1.0" follow-redirects@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.6.0.tgz#d12452c031e8c67eb6637d861bfc7a8090167933" - integrity sha512-4Oh4eI3S9OueVV41AgJ1oLjpaJUhbJ7JDGOMhe0AFqoSejl5Q2nn3eGglAzRUKVKZE8jG5MNn66TjCJMAnpsWA== + version "1.9.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f" + integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A== dependencies: - debug "=3.1.0" + debug "^3.0.0" font-awesome@^4.7.0: version "4.7.0" @@ -4490,11 +4523,11 @@ fs-extra@^8.0.1: universalify "^0.1.0" fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: - minipass "^2.2.1" + minipass "^2.6.0" fs-write-stream-atomic@^1.0.8: version "1.0.10" @@ -4717,7 +4750,12 @@ gonzales-pe-sl@^4.2.3: dependencies: minimist "1.1.x" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: +graceful-fs@^4.1.11: + version "4.2.2" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" + integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== + +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== @@ -4998,10 +5036,10 @@ http-link-header@^1.0.2: resolved "https://registry.yarnpkg.com/http-link-header/-/http-link-header-1.0.2.tgz#bea50f02e1c7996021f1013b428c63f77e0f4e11" integrity sha512-z6YOZ8ZEnejkcCWlGZzYXNa6i+ZaTfiTg3WhlV/YvnNya3W/RbX1bMVUMTuCrg/DrtTCQxaFCkXCz4FtLpcebg== -http-parser-js@>=0.4.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" - integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== +"http-parser-js@>=0.4.0 <0.4.11": + version "0.4.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= http-proxy-middleware@^0.19.1: version "0.19.1" @@ -5014,11 +5052,11 @@ http-proxy-middleware@^0.19.1: micromatch "^3.1.10" http-proxy@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" - integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== + version "1.18.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" + integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== dependencies: - eventemitter3 "^3.0.0" + eventemitter3 "^4.0.0" follow-redirects "^1.0.0" requires-port "^1.0.0" @@ -5066,9 +5104,9 @@ iferr@^0.1.5: integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + version "3.0.2" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.2.tgz#99d83a246c196ea5c93ef9315ad7b0819c35069b" + integrity sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw== dependencies: minimatch "^3.0.4" @@ -5161,16 +5199,21 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= +inherits@2.0.3, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -5293,20 +5336,25 @@ ip@^1.1.0, ip@^1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -ipaddr.js@1.9.0, ipaddr.js@^1.9.0: +ipaddr.js@1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== +ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= -is-absolute-url@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.0.tgz#eb21d69df2ed8ef72a3e6f243e216563036a0913" - integrity sha512-3OkP8XrM2Xq4/IxsJnClfMp3OaM3TAatLPLKPeWcxLBTrpe6hihwtX+XZfJTcXg/FTRi4qjy0y/C5qiyNxY24g== +is-absolute-url@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== is-accessor-descriptor@^0.1.6: version "0.1.6" @@ -5322,6 +5370,11 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -5528,9 +5581,9 @@ is-obj@^1.0.0: integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-path-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.1.0.tgz#2e0c7e463ff5b7a0eb60852d851a6809347a124c" - integrity sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== is-path-in-cwd@^2.0.0: version "2.1.0" @@ -5551,7 +5604,7 @@ is-plain-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -6194,9 +6247,9 @@ json-stringify-safe@~5.0.1: integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json3@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== json5@^0.5.0: version "0.5.1" @@ -6475,10 +6528,10 @@ lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -loglevel@^1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.3.tgz#77f2eb64be55a404c9fd04ad16d57c1d6d6b1280" - integrity sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA== +loglevel@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.4.tgz#f408f4f006db8354d0577dcf6d33485b3cb90d56" + integrity sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" @@ -6577,13 +6630,13 @@ media-typer@0.3.0: integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= mem@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" - integrity sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== dependencies: map-age-cleaner "^0.1.1" - mimic-fn "^1.0.0" - p-is-promise "^1.1.0" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" memoize-one@^5.0.0: version "5.0.4" @@ -6652,24 +6705,29 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.40.0, "mime-db@>= 1.40.0 < 2": +mime-db@1.40.0: version "1.40.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== +"mime-db@>= 1.40.0 < 2": + version "1.42.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" + integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== + mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19: +mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.21" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== dependencies: mime-db "~1.37.0" -mime-types@~2.1.24: +mime-types@~2.1.17, mime-types@~2.1.24: version "2.1.24" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== @@ -6681,16 +6739,21 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.2: - version "2.4.3" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.3.tgz#229687331e86f68924e6cb59e1cdd937f18275fe" - integrity sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw== +mime@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mini-css-extract-plugin@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz#81d41ec4fe58c713a96ad7c723cdb2d0bd4d70e1" @@ -6738,20 +6801,28 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== +minipass@^2.6.0, minipass@^2.8.6: + version "2.8.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.8.6.tgz#620d889ace26356391d010ecb9458749df9b6db5" + integrity sha512-lFG7d6g3+/UaFDCOtqPiKAC9zngWWsQZl1g5q6gaONqrjq61SX2xFqXMleQiFVyDpYwa018E9hmlAFY22PCb+A== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" - integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== +minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== dependencies: - minipass "^2.2.1" + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.2.tgz#5d24764998f98112586f7e566bd4c0999769dad4" + integrity sha512-lsNFqSHdJ21EwKzCp12HHJGxSMtHkCW1EMA9cceG3MkMNARjuWotZnMe3NKNshAvFXpm4loZqmYsCmRwhS2JMw== + dependencies: + minipass "^2.9.0" mississippi@^3.0.0: version "3.0.0" @@ -6819,11 +6890,16 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.1, ms@^2.1.1: +ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" @@ -6886,11 +6962,11 @@ nearley@^2.7.10: semver "^5.4.1" needle@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== dependencies: - debug "^2.1.2" + debug "^3.2.6" iconv-lite "^0.4.4" sax "^1.2.4" @@ -6927,10 +7003,10 @@ node-fetch@^2.3.0: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== -node-forge@0.7.5: - version "0.7.5" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" - integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== +node-forge@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.8.2.tgz#b4bcc59fb12ce77a8825fc6a783dfe3182499c5a" + integrity sha512-mXQ9GBq1N3uDCyV1pdSzgIguwgtVpM7f5/5J4ipz12PKWElmPpVWLDuWl8iXmhysr21+WmX/OJ5UKx82wjomgg== node-int64@^0.4.0: version "0.4.0" @@ -7063,14 +7139,14 @@ normalize-url@^3.0.0: integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== npm-bundled@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" - integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== npm-packlist@^1.1.6: - version "1.1.12" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" - integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== + version "1.4.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" + integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -7158,6 +7234,11 @@ object-keys@^1.0.11, object-keys@^1.0.12: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -7360,10 +7441,10 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-is-promise@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" - integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== p-limit@^1.1.0: version "1.3.0" @@ -7373,9 +7454,9 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" - integrity sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g== + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== dependencies: p-try "^2.0.0" @@ -7430,9 +7511,9 @@ p-try@^1.0.0: integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== packet-reader@0.3.1: version "0.3.1" @@ -7740,10 +7821,10 @@ pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== -portfinder@^1.0.21: - version "1.0.21" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.21.tgz#60e1397b95ac170749db70034ece306b9a27e324" - integrity sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA== +portfinder@^1.0.24: + version "1.0.24" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.24.tgz#11efbc6865f12f37624b6531ead1d809ed965cfa" + integrity sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg== dependencies: async "^1.5.2" debug "^2.2.0" @@ -8171,9 +8252,9 @@ private@^0.1.6: integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@^0.11.10: version "0.11.10" @@ -8339,10 +8420,10 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -querystringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" - integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg== +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== quote@^0.4.0: version "0.4.0" @@ -8736,9 +8817,9 @@ read-pkg@^3.0.0: util-deprecate "~1.0.1" readable-stream@^3.0.6: - version "3.1.1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz#ed6bbc6c5ba58b090039ff18ce670515795aeb06" - integrity sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA== + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -8865,6 +8946,13 @@ regexp-tree@^0.1.13: resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.13.tgz#5b19ab9377edc68bc3679256840bb29afc158d7f" integrity sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw== +regexp.prototype.flags@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" + integrity sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA== + dependencies: + define-properties "^1.1.2" + regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -9097,13 +9185,20 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2: +rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" +rimraf@^2.6.1, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" @@ -9165,11 +9260,16 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -9279,14 +9379,14 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selfsigned@^1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" - integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw== +selfsigned@^1.10.6: + version "1.10.6" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.6.tgz#7b3cd37ed9c2034261a173af1a1aae27d8169b67" + integrity sha512-i3+CeqxL7DpAazgVpAGdKMwHuL63B5nhJMh9NQ7xmChGkA3jNFflq6Jyo1LLJYcr3idWiNOPWHCrm4zMayLG4w== dependencies: - node-forge "0.7.5" + node-forge "0.8.2" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: version "5.7.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== @@ -9296,6 +9396,11 @@ semver@4.3.2: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= +semver@^5.3.0, semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -9353,20 +9458,10 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -9498,10 +9593,10 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sockjs-client@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177" - integrity sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg== +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== dependencies: debug "^3.2.5" eventsource "^1.0.7" @@ -9775,13 +9870,20 @@ string.prototype.trim@^1.1.2: es-abstract "^1.5.0" function-bind "^1.0.2" -string_decoder@^1.0.0, string_decoder@^1.1.1: +string_decoder@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== dependencies: safe-buffer "~5.1.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -9950,17 +10052,17 @@ tapable@^1.0.0, tapable@^1.1.0: integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== tar@^4: - version "4.4.8" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== dependencies: chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.4" - minizlib "^1.1.1" + minipass "^2.8.6" + minizlib "^1.2.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" - yallist "^3.0.2" + yallist "^3.0.3" tcomb@^2.5.0: version "2.7.0" @@ -10282,14 +10384,14 @@ unicode-property-aliases-ecmascript@^1.0.4: integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^0.4.3" + set-value "^2.0.1" uniq@^1.0.1: version "1.0.1" @@ -10339,9 +10441,9 @@ unset-value@^1.0.0: isobject "^3.0.0" upath@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" - integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-js@^4.2.2: version "4.2.2" @@ -10356,11 +10458,11 @@ urix@^0.1.0: integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-parse@^1.4.3: - version "1.4.4" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8" - integrity sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg== + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== dependencies: - querystringify "^2.0.0" + querystringify "^2.1.1" requires-port "^1.0.0" url@^0.11.0: @@ -10415,7 +10517,12 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: +uuid@^3.0.1, uuid@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + +uuid@^3.1.0: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== @@ -10572,24 +10679,25 @@ webpack-cli@^3.3.7: v8-compile-cache "2.0.3" yargs "13.2.4" -webpack-dev-middleware@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz#ef751d25f4e9a5c8a35da600c5fda3582b5c6cff" - integrity sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA== +webpack-dev-middleware@^3.7.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== dependencies: memory-fs "^0.4.1" - mime "^2.4.2" + mime "^2.4.4" + mkdirp "^0.5.1" range-parser "^1.2.1" webpack-log "^2.0.0" webpack-dev-server@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz#06cc4fc2f440428508d0e9770da1fef10e5ef28d" - integrity sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ== + version "3.8.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.8.1.tgz#485b64c4aadc23f601e72114b40c1b1fea31d9f1" + integrity sha512-9F5DnfFA9bsrhpUCAfQic/AXBVHvq+3gQS+x6Zj0yc1fVVE0erKh2MV4IV12TBewuTrYeeTIRwCH9qLMvdNvTw== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" - chokidar "^2.1.6" + chokidar "^2.1.8" compression "^1.7.4" connect-history-api-fallback "^1.6.0" debug "^4.1.1" @@ -10600,23 +10708,23 @@ webpack-dev-server@^3.8.0: import-local "^2.0.0" internal-ip "^4.3.0" ip "^1.1.5" - is-absolute-url "^3.0.0" + is-absolute-url "^3.0.2" killable "^1.0.1" - loglevel "^1.6.3" + loglevel "^1.6.4" opn "^5.5.0" p-retry "^3.0.1" - portfinder "^1.0.21" + portfinder "^1.0.24" schema-utils "^1.0.0" - selfsigned "^1.10.4" + selfsigned "^1.10.6" semver "^6.3.0" serve-index "^1.9.1" sockjs "0.3.19" - sockjs-client "1.3.0" + sockjs-client "1.4.0" spdy "^4.0.1" strip-ansi "^3.0.1" supports-color "^6.1.0" url "^0.11.0" - webpack-dev-middleware "^3.7.0" + webpack-dev-middleware "^3.7.1" webpack-log "^2.0.0" ws "^6.2.1" yargs "12.0.5" @@ -10674,11 +10782,12 @@ webpack@^4.35.3: webpack-sources "^1.3.0" websocket-driver@>=0.5.1: - version "0.7.0" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" - integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= + version "0.7.3" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== dependencies: - http-parser-js ">=0.4.0" + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: @@ -10838,10 +10947,10 @@ xtend@^4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.0.tgz#906cc2100972dc2625ae78f566a2577230a1d6f7" + integrity sha512-6gpP93MR+VOOehKbCPchro3wFZNSNmek8A2kbkOAZLIZAYx1KP/zAqwO0sOHi3xJEb+UBz8NaYt/17UNit1Q9w== yargs-parser@^11.1.1: version "11.1.1" From 9d22ad80932fc6493854a33209d5de6d6b42b235 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 29 Sep 2019 17:10:01 +0200 Subject: [PATCH 075/107] New Crowdin translations (#11985) * New translations en.yml (German) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.json (Spanish, Argentina) [ci skip] * New translations en.json (Spanish, Argentina) [ci skip] * New translations en.json (Spanish, Argentina) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations simple_form.en.yml (Occitan) [ci skip] * New translations en.json (Spanish, Argentina) [ci skip] * New translations en.json (Spanish, Argentina) [ci skip] * New translations simple_form.en.yml (Greek) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.json (Italian) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.json (Italian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations devise.en.yml (Italian) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations simple_form.en.yml (Dutch) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations simple_form.en.yml (Dutch) [ci skip] * New translations simple_form.en.yml (Dutch) [ci skip] * New translations simple_form.en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.json (Polish) [ci skip] * New translations simple_form.en.yml (Dutch) [ci skip] * New translations simple_form.en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations simple_form.en.yml (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 (Dutch) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations devise.en.yml (Greek) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations simple_form.en.yml (Korean) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations simple_form.en.yml (Japanese) [ci skip] * New translations doorkeeper.en.yml (Greek) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations simple_form.en.yml (Hungarian) [ci skip] * New translations doorkeeper.en.yml (Hungarian) [ci skip] * New translations simple_form.en.yml (Italian) [ci skip] * New translations doorkeeper.en.yml (Italian) [ci skip] * New translations en.yml (Japanese) [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 en.json (Finnish) [ci skip] * New translations doorkeeper.en.yml (Dutch) [ci skip] * New translations en.yml (Esperanto) [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 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 en.yml (Thai) [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 (Thai) [ci skip] * New translations simple_form.en.yml (Thai) [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 en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations doorkeeper.en.yml (Welsh) [ci skip] * New translations en.yml (Spanish, Argentina) [ci skip] * New translations simple_form.en.yml (Spanish, Argentina) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations doorkeeper.en.yml (Persian) [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 simple_form.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 simple_form.en.yml (Portuguese, Brazilian) [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 simple_form.en.yml (Corsican) [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 en.json (Slovak) [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 simple_form.en.yml (Ukrainian) [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 (Arabic) [ci skip] * New translations en.yml (Arabic) [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 simple_form.en.yml (Arabic) [ci skip] * New translations doorkeeper.en.yml (Arabic) [ci skip] * New translations doorkeeper.en.yml (Spanish, Argentina) [ci skip] * New translations en.json (Spanish, Argentina) [ci skip] * New translations en.json (Spanish, Argentina) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (French) [ci skip] * i18n-tasks normalize * yarn manage:translations --- app/javascript/mastodon/locales/ar.json | 1 + app/javascript/mastodon/locales/ast.json | 1 + app/javascript/mastodon/locales/bg.json | 1 + app/javascript/mastodon/locales/bn.json | 1 + app/javascript/mastodon/locales/br.json | 1 + app/javascript/mastodon/locales/ca.json | 1 + app/javascript/mastodon/locales/co.json | 1 + app/javascript/mastodon/locales/cs.json | 1 + app/javascript/mastodon/locales/cy.json | 1 + app/javascript/mastodon/locales/da.json | 1 + app/javascript/mastodon/locales/de.json | 1 + .../mastodon/locales/defaultMessages.json | 5 + app/javascript/mastodon/locales/el.json | 1 + app/javascript/mastodon/locales/en.json | 1 + app/javascript/mastodon/locales/eo.json | 1 + app/javascript/mastodon/locales/es-AR.json | 419 ++++++ app/javascript/mastodon/locales/es.json | 651 +++++----- app/javascript/mastodon/locales/et.json | 1 + app/javascript/mastodon/locales/eu.json | 1 + app/javascript/mastodon/locales/fa.json | 1 + app/javascript/mastodon/locales/fi.json | 1 + app/javascript/mastodon/locales/fr.json | 1 + app/javascript/mastodon/locales/ga.json | 1 + app/javascript/mastodon/locales/gl.json | 1 + app/javascript/mastodon/locales/he.json | 1 + app/javascript/mastodon/locales/hi.json | 1 + app/javascript/mastodon/locales/hr.json | 1 + app/javascript/mastodon/locales/hu.json | 1 + app/javascript/mastodon/locales/hy.json | 1 + app/javascript/mastodon/locales/id.json | 1 + app/javascript/mastodon/locales/io.json | 1 + app/javascript/mastodon/locales/it.json | 33 +- app/javascript/mastodon/locales/ja.json | 3 +- app/javascript/mastodon/locales/ka.json | 1 + app/javascript/mastodon/locales/kk.json | 1 + app/javascript/mastodon/locales/ko.json | 1 + app/javascript/mastodon/locales/lt.json | 1 + app/javascript/mastodon/locales/lv.json | 1 + app/javascript/mastodon/locales/ms.json | 1 + app/javascript/mastodon/locales/nl.json | 1 + app/javascript/mastodon/locales/nn.json | 1 + app/javascript/mastodon/locales/no.json | 1 + app/javascript/mastodon/locales/oc.json | 1 + app/javascript/mastodon/locales/pl.json | 15 +- app/javascript/mastodon/locales/pt-BR.json | 1 + app/javascript/mastodon/locales/pt-PT.json | 1 + app/javascript/mastodon/locales/ro.json | 1 + app/javascript/mastodon/locales/ru.json | 1 + app/javascript/mastodon/locales/sk.json | 1 + app/javascript/mastodon/locales/sl.json | 1 + app/javascript/mastodon/locales/sq.json | 1 + app/javascript/mastodon/locales/sr-Latn.json | 1 + app/javascript/mastodon/locales/sr.json | 1 + app/javascript/mastodon/locales/sv.json | 1 + app/javascript/mastodon/locales/ta.json | 1 + app/javascript/mastodon/locales/te.json | 1 + app/javascript/mastodon/locales/th.json | 1 + app/javascript/mastodon/locales/tr.json | 1 + app/javascript/mastodon/locales/uk.json | 1 + .../mastodon/locales/whitelist_es-AR.json | 2 + app/javascript/mastodon/locales/zh-CN.json | 1 + app/javascript/mastodon/locales/zh-HK.json | 1 + app/javascript/mastodon/locales/zh-TW.json | 1 + config/locales/co.yml | 7 + config/locales/cs.yml | 3 + config/locales/de.yml | 7 + config/locales/devise.el.yml | 2 + config/locales/devise.it.yml | 11 + config/locales/doorkeeper.es-AR.yml | 1 + config/locales/doorkeeper.es.yml | 149 ++- config/locales/el.yml | 4 +- config/locales/es-AR.yml | 20 + config/locales/es.yml | 1135 ++++++++++++++++- config/locales/fa.yml | 4 + config/locales/it.yml | 25 + config/locales/ko.yml | 4 + config/locales/nl.yml | 21 +- config/locales/oc.yml | 46 +- config/locales/simple_form.el.yml | 10 +- config/locales/simple_form.es-AR.yml | 1 + config/locales/simple_form.es.yml | 171 ++- config/locales/simple_form.ko.yml | 4 +- config/locales/simple_form.nl.yml | 29 + config/locales/simple_form.oc.yml | 2 + config/locales/sk.yml | 2 + 85 files changed, 2476 insertions(+), 366 deletions(-) create mode 100644 app/javascript/mastodon/locales/es-AR.json create mode 100644 app/javascript/mastodon/locales/whitelist_es-AR.json create mode 100644 config/locales/doorkeeper.es-AR.yml create mode 100644 config/locales/es-AR.yml create mode 100644 config/locales/simple_form.es-AR.yml diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 3b0adb20a8..8e2efe136a 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -299,6 +299,7 @@ "poll.refresh": "تحديث", "poll.total_votes": "{count, plural, one {# صوت} other {# أصوات}}", "poll.vote": "صَوّت", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "إضافة استطلاع للرأي", "poll_button.remove_poll": "إزالة استطلاع الرأي", "privacy.change": "اضبط خصوصية المنشور", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index c636e313be..76721749cf 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Adjust status privacy", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 10f493b26d..b230d1863c 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Adjust status privacy", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 8d67a93dac..8109d97ebc 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -299,6 +299,7 @@ "poll.refresh": "বদলেছে কিনা দেখতে", "poll.total_votes": "{count, plural, one {# ভোট} other {# ভোট}}", "poll.vote": "ভোট", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "একটা নির্বাচন যোগ করতে", "poll_button.remove_poll": "নির্বাচন বাদ দিতে", "privacy.change": "লেখার গোপনীয়তা অবস্থা ঠিক করতে", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 4104534af0..fbe8020bdf 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Adjust status privacy", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index b3afb0d5b3..5b05c09d57 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -299,6 +299,7 @@ "poll.refresh": "Actualitza", "poll.total_votes": "{count, plural, one {# vot} other {# vots}}", "poll.vote": "Vota", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Afegeix una enquesta", "poll_button.remove_poll": "Elimina l'enquesta", "privacy.change": "Ajusta l'estat de privacitat", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index aba3f59c75..7ebe08cf58 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -299,6 +299,7 @@ "poll.refresh": "Attualizà", "poll.total_votes": "{count, plural, one {# votu} other {# voti}}", "poll.vote": "Vutà", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Aghjunghje", "poll_button.remove_poll": "Toglie u scandagliu", "privacy.change": "Mudificà a cunfidenzialità di u statutu", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index e566d46caf..94a659435f 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -299,6 +299,7 @@ "poll.refresh": "Obnovit", "poll.total_votes": "{count, plural, one {# hlas} few {# hlasy} many {# hlasu} other {# hlasů}}", "poll.vote": "Hlasovat", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Přidat anketu", "poll_button.remove_poll": "Odstranit anketu", "privacy.change": "Změnit soukromí tootu", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 69205d90e8..c7f679b22f 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -299,6 +299,7 @@ "poll.refresh": "Adnewyddu", "poll.total_votes": "{count, plural, one {# bleidlais} other {# o bleidleisiau}}", "poll.vote": "Pleidleisio", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Ychwanegu pleidlais", "poll_button.remove_poll": "Tynnu pleidlais", "privacy.change": "Addasu preifatrwdd y tŵt", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index aef26dbf02..852b6d1578 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -299,6 +299,7 @@ "poll.refresh": "Opdatér", "poll.total_votes": "{count, plural, one {# stemme} other {# stemmer}}", "poll.vote": "Stem", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Tilføj en afstemning", "poll_button.remove_poll": "Fjern afstemning", "privacy.change": "Skift status visningsindstillinger", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 58392eecab..08b75c9eca 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -299,6 +299,7 @@ "poll.refresh": "Aktualisieren", "poll.total_votes": "{count, plural, one {# Stimme} other {# Stimmen}}", "poll.vote": "Abstimmen", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Eine Umfrage erstellen", "poll_button.remove_poll": "Umfrage entfernen", "privacy.change": "Sichtbarkeit des Beitrags anpassen", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 887952190e..e2caf18d37 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -233,6 +233,11 @@ "defaultMessage": "Closed", "id": "poll.closed" }, + { + "defaultMessage": "You voted for this answer", + "description": "Tooltip of the \"voted\" checkmark in polls", + "id": "poll.voted" + }, { "defaultMessage": "Vote", "id": "poll.vote" diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index d083dbdc80..9425c3f12c 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -299,6 +299,7 @@ "poll.refresh": "Ανανέωση", "poll.total_votes": "{count, plural, one {# ψήφος} other {# ψήφοι}}", "poll.vote": "Ψήφισε", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Προσθήκη δημοσκόπησης", "poll_button.remove_poll": "Αφαίρεση δημοσκόπησης", "privacy.change": "Προσαρμογή ιδιωτικότητας δημοσίευσης", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 0b95118003..82b2a94405 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Adjust status privacy", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index ee224e9fb1..bf08a08fb0 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -299,6 +299,7 @@ "poll.refresh": "Aktualigi", "poll.total_votes": "{count, plural, one {# voĉdono} other {# voĉdonoj}}", "poll.vote": "Voĉdoni", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Aldoni balotenketon", "poll_button.remove_poll": "Forigi balotenketon", "privacy.change": "Agordi mesaĝan privatecon", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json new file mode 100644 index 0000000000..89ddcbf510 --- /dev/null +++ b/app/javascript/mastodon/locales/es-AR.json @@ -0,0 +1,419 @@ +{ + "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}", + "account.blocked": "Bloqueado", + "account.cancel_follow_request": "Cancelar la solicitud de seguimiento", + "account.direct": "Mensaje directo a @{name}", + "account.domain_blocked": "Dominio oculto", + "account.edit_profile": "Editar 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": "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": "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 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": "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 {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, reintentá después de las {retry_time, time, medium}.", + "alert.rate_limited.title": "Tarifa limitada", + "alert.unexpected.message": "Ocurrió un error inesperado.", + "alert.unexpected.title": "¡Epa!", + "autosuggest_hashtag.per_week": "{count} por semana", + "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": "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": "Intentá de nuevo", + "column.blocks": "Usuarios bloqueados", + "column.community": "Línea temporal local", + "column.direct": "Mensajes directos", + "column.directory": "Explorar perfiles", + "column.domain_blocks": "Dominios ocultos", + "column.favourites": "Favoritos", + "column.follow_requests": "Solicitudes de seguimiento", + "column.home": "Principal", + "column.lists": "Listas", + "column.mutes": "Usuarios silenciados", + "column.notifications": "Notificaciones", + "column.pins": "Toots fijados", + "column.public": "Línea temporal federada", + "column.status": "Toot", + "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 configuración", + "column_header.unpin": "Dejar de fijar", + "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á {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": "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 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 denunciar", + "confirmations.block.confirm": "Bloquear", + "confirmations.block.message": "¿Estás seguro que querés bloquear a {name}?", + "confirmations.delete.confirm": "Eliminar", + "confirmations.delete.message": "¿Estás seguro que querés eliminar este estado?", + "confirmations.delete_list.confirm": "Eliminar", + "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": "¿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 que querés cerrar la sesión?", + "confirmations.mute.confirm": "Silenciar", + "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 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 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 fediverso conocido", + "directory.local": "Sólo de {domain}", + "directory.new_arrivals": "Recién llegados", + "directory.recently_active": "Recientemente activo", + "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": "Banderas", + "emoji_button.food": "Comida y bebida", + "emoji_button.label": "Insertar emoji", + "emoji_button.nature": "Naturaleza", + "emoji_button.not_found": "¡¡No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Objetos", + "emoji_button.people": "Gente", + "emoji_button.recent": "Usados frecuentemente", + "emoji_button.search": "Buscar…", + "emoji_button.search_results": "Resultados de búsqueda", + "emoji_button.symbols": "Símbolos", + "emoji_button.travel": "Viajes y lugares", + "empty_column.account_timeline": "¡No hay toots aquí!", + "empty_column.account_unavailable": "Perfil no disponible", + "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": "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": "Todavía no silenciaste a ningún usuario.", + "empty_column.notifications": "Todavía no tenés ninguna notificación. Interactuá con otros para iniciar la conversación.", + "empty_column.public": "¡Naranja! Escribí algo públicamente, o seguí usuarios manualmente de otros servidores para ir llenando esta línea temporal.", + "follow_request.authorize": "Autorizar", + "follow_request.reject": "Rechazar", + "getting_started.developers": "Desarrolladores", + "getting_started.directory": "Directorio de perfiles", + "getting_started.documentation": "Documentación", + "getting_started.heading": "Introducción", + "getting_started.invite": "Invitar usuarios", + "getting_started.open_source_notice": "Mastodon es software libre. Podés contribuir o informar errores en {github}.", + "getting_started.security": "Seguridad", + "getting_started.terms": "Términos del 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": "Introducí etiquetas…", + "hashtag.column_settings.tag_mode.all": "Todas estas", + "hashtag.column_settings.tag_mode.any": "Cualquiera de estas", + "hashtag.column_settings.tag_mode.none": "Ninguna de estas", + "hashtag.column_settings.tag_toggle": "Incluir etiquetas adicionales para esta columna", + "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 toots públicos de otros servidores del fediverso aparecerán en la línea temporal federada.", + "introduction.federation.home.headline": "Principal", + "introduction.federation.home.text": "Los toots de las personas que seguíss aparecerán en tu línea temporal principal. ¡Podés seguir a cualquiera en cualquier servidor!", + "introduction.federation.local.headline": "Local", + "introduction.federation.local.text": "Los toots públicos de las personas en el mismo servidor aparecerán en la línea temporal local.", + "introduction.interactions.action": "¡Terminar tutorial!", + "introduction.interactions.favourite.headline": "Favorito", + "introduction.interactions.favourite.text": "Podés guardar un toot para más tarde, y hacerle saber al autor que te gustó, marcándolo como favorito.", + "introduction.interactions.reblog.headline": "Retootear", + "introduction.interactions.reblog.text": "Podés compartir los toots de otras personas con tus seguidores retooteando los mismos.", + "introduction.interactions.reply.headline": "Responder", + "introduction.interactions.reply.text": "Podés responder a tus propios toots y los de otras personas, que se encadenarán juntos en una conversación.", + "introduction.welcome.action": "¡Dale!", + "introduction.welcome.headline": "Primeros pasos", + "introduction.welcome.text": "¡Bienvenido al fediverso! En unos pocos minutos, vas a poder transmitir mensajes y hablar con tus amigos a través de una amplia variedad de servidores. Pero este servidor, {domain}, es especial: aloja tu perfil, así que acordate de su nombre.", + "keyboard_shortcuts.back": "para volver", + "keyboard_shortcuts.blocked": "para abrir la lista de usuarios bloqueados", + "keyboard_shortcuts.boost": "para retootear", + "keyboard_shortcuts.column": "para enfocar un estado en una de las columnas", + "keyboard_shortcuts.compose": "para enfocar el área de texto de redacción", + "keyboard_shortcuts.description": "Descripción", + "keyboard_shortcuts.direct": "para abrir columna de mensajes directos", + "keyboard_shortcuts.down": "para bajar en la lista", + "keyboard_shortcuts.enter": "para abrir el estado", + "keyboard_shortcuts.favourite": "para marcar como favorito", + "keyboard_shortcuts.favourites": "para abrir la lista de favoritos", + "keyboard_shortcuts.federated": "para abrir la línea temporal federada", + "keyboard_shortcuts.heading": "Atajos de teclado", + "keyboard_shortcuts.home": "para abrir la línea temporal principal", + "keyboard_shortcuts.hotkey": "Combinación", + "keyboard_shortcuts.legend": "para mostrar este texto", + "keyboard_shortcuts.local": "para abrir la línea temporal local", + "keyboard_shortcuts.mention": "para mencionar al autor", + "keyboard_shortcuts.muted": "abrir la lista de usuarios silenciados", + "keyboard_shortcuts.my_profile": "para abrir tu perfil", + "keyboard_shortcuts.notifications": "para abrir la columna de notificaciones", + "keyboard_shortcuts.pinned": "para abrir lista de toots fijados", + "keyboard_shortcuts.profile": "para abrir el perfil del autor", + "keyboard_shortcuts.reply": "para responder", + "keyboard_shortcuts.requests": "para abrir la lista de solicitudes de seguimiento", + "keyboard_shortcuts.search": "para enfocar la búsqueda", + "keyboard_shortcuts.start": "para abrir la columna \"Introducción\"", + "keyboard_shortcuts.toggle_hidden": "para mostrar/ocultar el texto detrás de la advertencia de contenido", + "keyboard_shortcuts.toggle_sensitivity": "para mostrar/ocultar los medios", + "keyboard_shortcuts.toot": "para comenzar un toot nuevo", + "keyboard_shortcuts.unfocus": "para quitar el enfoque del área de texto de redacción o de búsqueda", + "keyboard_shortcuts.up": "para subir en la lista", + "lightbox.close": "Cerrar", + "lightbox.next": "Siguiente", + "lightbox.previous": "Anterior", + "lightbox.view_context": "Ver contexto", + "lists.account.add": "Agregar a lista", + "lists.account.remove": "Quitar de lista", + "lists.delete": "Eliminar lista", + "lists.edit": "Editar lista", + "lists.edit.submit": "Cambiar título", + "lists.new.create": "Agregar lista", + "lists.new.title_placeholder": "Nuevo título de lista", + "lists.search": "Buscar entre la gente que seguís", + "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 se encontró", + "missing_indicator.sublabel": "No se encontró este recurso", + "mute_modal.hide_notifications": "¿Querés ocultar las notificaciones de este usuario?", + "navigation_bar.apps": "Aplicaciones móviles", + "navigation_bar.blocks": "Usuarios bloqueados", + "navigation_bar.community_timeline": "Línea temporal local", + "navigation_bar.compose": "Redactar 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 de seguimiento", + "navigation_bar.follows_and_followers": "Personas seguidas y seguidores", + "navigation_bar.info": "Acerca de este servidor", + "navigation_bar.keyboard_shortcuts": "Atajos", + "navigation_bar.lists": "Listas", + "navigation_bar.logout": "Cerrar sesión", + "navigation_bar.mutes": "Usuarios silenciados", + "navigation_bar.personal": "Personal", + "navigation_bar.pins": "Toots fijados", + "navigation_bar.preferences": "Configuración", + "navigation_bar.public_timeline": "Línea temporal 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 mencionó", + "notification.poll": "Finalizó una encuesta en la que votaste", + "notification.reblog": "{name} retooteó tu estado", + "notifications.clear": "Limpiar notificaciones", + "notifications.clear_confirmation": "¿Estás seguro que querés limpiar todas tus notificaciones permanentemente?", + "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 encuesta:", + "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": "Todas", + "notifications.filter.boosts": "Retoots", + "notifications.filter.favourites": "Favoritos", + "notifications.filter.follows": "Seguidores", + "notifications.filter.mentions": "Menciones", + "notifications.filter.polls": "Resultados de la encuesta", + "notifications.group": "{count} notificaciones", + "poll.closed": "Cerrada", + "poll.refresh": "Refrescar", + "poll.total_votes": "{count, plural, one {# voto} other {# votos}}", + "poll.vote": "Votar", + "poll.voted": "You voted for this answer", + "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": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Cancel", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "report.hint": "The report will be sent to your 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": "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": "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/es.json b/app/javascript/mastodon/locales/es.json index 101be4b1de..63be0e4c3c 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 quitar de las listas", + "account.add_or_remove_from_list": "Agregar o eliminar de 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": "Destacar en el perfil", + "account.endorse": "Mostrar en perfil", "account.follow": "Seguir", "account.followers": "Seguidores", "account.followers.empty": "Todavía nadie sigue a este usuario.", "account.follows": "Sigue", - "account.follows.empty": "Todavía este usuario no sigue a nadie.", + "account.follows.empty": "Este usuario todavía 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": "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.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.mention": "Mencionar a @{name}", - "account.moved_to": "{name} se ha muó a:", + "account.moved_to": "{name} se ha mudado 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": "Denunciar a @{name}", - "account.requested": "Esperando aprobación. Hacé clic para cancelar la solicitud de seguimiento.", + "account.report": "Reportar a @{name}", + "account.requested": "Esperando aprobación", "account.share": "Compartir el perfil de @{name}", "account.show_reblogs": "Mostrar retoots de @{name}", "account.unblock": "Desbloquear a @{name}", - "account.unblock_domain": "Mostrar {domain}", - "account.unendorse": "No destacar en el perfil", + "account.unblock_domain": "Mostrar a {domain}", + "account.unendorse": "No mostrar 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, reintentá después de las {retry_time, time, medium}.", + "alert.rate_limited.message": "Por favor reintente después de {retry_time, time, medium}.", "alert.rate_limited.title": "Tarifa limitada", - "alert.unexpected.message": "Ocurrió un error inesperado.", - "alert.unexpected.title": "¡Epa!", + "alert.unexpected.message": "Hubo un error inesperado.", + "alert.unexpected.title": "¡Ups!", "autosuggest_hashtag.per_week": "{count} por semana", - "boost_modal.combo": "Podés hacer clic en {combo} para saltar esto la próxima vez", + "boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez", "bundle_column_error.body": "Algo salió mal al cargar este componente.", - "bundle_column_error.retry": "Intentá de nuevo", + "bundle_column_error.retry": "Inténtalo 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": "Intentá de nuevo", + "bundle_modal_error.retry": "Inténtalo de nuevo", "column.blocks": "Usuarios bloqueados", - "column.community": "Línea temporal local", + "column.community": "Línea de tiempo local", "column.direct": "Mensajes directos", - "column.directory": "Explorar perfiles", - "column.domain_blocks": "Dominios ocultos", + "column.directory": "Buscar perfiles", + "column.domain_blocks": "Dominios ocultados", "column.favourites": "Favoritos", "column.follow_requests": "Solicitudes de seguimiento", - "column.home": "Principal", + "column.home": "Inicio", "column.lists": "Listas", "column.mutes": "Usuarios silenciados", "column.notifications": "Notificaciones", "column.pins": "Toots fijados", - "column.public": "Línea temporal federada", + "column.public": "Línea de tiempo federada", "column.status": "Toot", - "column_back_button.label": "Volver", + "column_back_button.label": "Atrás", "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 configuración", + "column_header.show_settings": "Mostrar ajustes", "column_header.unpin": "Dejar de fijar", - "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", + "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", "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á {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.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.poll.duration": "Duración de la encuesta", - "compose_form.poll.option_placeholder": "Opción {number}", - "compose_form.poll.remove_option": "Quitá esta opción", + "compose_form.poll.option_placeholder": "Elección {number}", + "compose_form.poll.remove_option": "Eliminar esta opción", "compose_form.publish": "Tootear", - "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á", + "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", "confirmation_modal.cancel": "Cancelar", - "confirmations.block.block_and_report": "Bloquear y denunciar", + "confirmations.block.block_and_report": "Bloquear y Reportar", "confirmations.block.confirm": "Bloquear", - "confirmations.block.message": "¿Estás seguro que querés bloquear a {name}?", + "confirmations.block.message": "¿Estás seguro de que quieres bloquear a {name}?", "confirmations.delete.confirm": "Eliminar", - "confirmations.delete.message": "¿Estás seguro que querés eliminar este estado?", + "confirmations.delete.message": "¿Estás seguro de que quieres borrar este toot?", "confirmations.delete_list.confirm": "Eliminar", - "confirmations.delete_list.message": "¿Estás seguro que querés eliminar permanentemente esta lista?", + "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?", "confirmations.domain_block.confirm": "Ocultar dominio entero", - "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.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.logout.confirm": "Cerrar sesión", - "confirmations.logout.message": "¿Estás seguro que querés cerrar la sesión?", + "confirmations.logout.message": "¿Estás seguro de querer cerrar la sesión?", "confirmations.mute.confirm": "Silenciar", - "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.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.reply.confirm": "Responder", - "confirmations.reply.message": "Responder ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?", + "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", "confirmations.unfollow.confirm": "Dejar de seguir", - "confirmations.unfollow.message": "¿Estás seguro que querés dejar de seguir a {name}?", - "conversation.delete": "Eliminar conversación", + "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", + "conversation.delete": "Borrar conversación", "conversation.mark_as_read": "Marcar como leído", "conversation.open": "Ver conversación", "conversation.with": "Con {names}", - "directory.federated": "Desde fediverso conocido", + "directory.federated": "Desde el fediverso conocido", "directory.local": "Sólo de {domain}", "directory.new_arrivals": "Recién llegados", "directory.recently_active": "Recientemente activo", - "embed.instructions": "Insertá este toot a tu sitio web copiando el código de abajo.", - "embed.preview": "Así es cómo se verá:", + "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.", + "embed.preview": "Así es como se verá:", "emoji_button.activity": "Actividad", "emoji_button.custom": "Personalizado", - "emoji_button.flags": "Banderas", + "emoji_button.flags": "Marcas", "emoji_button.food": "Comida y bebida", "emoji_button.label": "Insertar emoji", "emoji_button.nature": "Naturaleza", - "emoji_button.not_found": "¡¡No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "No hay emojos!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "Objetos", "emoji_button.people": "Gente", "emoji_button.recent": "Usados frecuentemente", @@ -137,282 +137,283 @@ "emoji_button.travel": "Viajes y lugares", "empty_column.account_timeline": "¡No hay toots aquí!", "empty_column.account_unavailable": "Perfil no disponible", - "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.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.domain_blocks": "Todavía no hay dominios ocultos.", - "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", + "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", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", - "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!", + "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!", "introduction.federation.local.headline": "Local", - "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", - "introduction.interactions.action": "Finish 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", + "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", "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.home": "to open home timeline", - "keyboard_shortcuts.hotkey": "Hotkey", - "keyboard_shortcuts.legend": "to display this legend", - "keyboard_shortcuts.local": "to open local timeline", - "keyboard_shortcuts.mention": "to mention author", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", - "keyboard_shortcuts.reply": "to reply", - "keyboard_shortcuts.requests": "to open follow requests list", - "keyboard_shortcuts.search": "to focus search", - "keyboard_shortcuts.start": "to open \"get started\" column", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", - "keyboard_shortcuts.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", + "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", "navigation_bar.personal": "Personal", - "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!", + "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.voted": "You voted for this answer", + "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!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", - "relative_time.just_now": "now", + "relative_time.just_now": "ahora", "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", - "reply_indicator.cancel": "Cancel", - "report.forward": "Forward to {target}", - "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", - "report.hint": "The report will be sent to your 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", + "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", "search_results.statuses": "Toots", - "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", + "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", "tabs_bar.local_timeline": "Local", - "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" + "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" } diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 7a7f6bec27..5d3b080de5 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -299,6 +299,7 @@ "poll.refresh": "Värskenda", "poll.total_votes": "{count, plural, one {# hääl} other {# hääli}}", "poll.vote": "Hääleta", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Lisa küsitlus", "poll_button.remove_poll": "Eemalda küsitlus", "privacy.change": "Muuda staatuse privaatsust", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 5ec03c3bab..0d272c2237 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -299,6 +299,7 @@ "poll.refresh": "Berritu", "poll.total_votes": "{count, plural, one {boto #} other {# boto}}", "poll.vote": "Bozkatu", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Gehitu inkesta bat", "poll_button.remove_poll": "Kendu inkesta", "privacy.change": "Doitu mezuaren pribatutasuna", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 54ab420090..70c1734cb8 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -299,6 +299,7 @@ "poll.refresh": "به‌روزرسانی", "poll.total_votes": "{count, plural, one {# رأی} other {# رأی}}", "poll.vote": "رأی", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "افزودن نظرسنجی", "poll_button.remove_poll": "حذف نظرسنجی", "privacy.change": "تنظیم حریم خصوصی نوشته‌ها", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index ff11915c39..93b770fca4 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Säädä tuuttauksen näkyvyyttä", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 9a516859cf..5120d6bcce 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -299,6 +299,7 @@ "poll.refresh": "Actualiser", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Voter", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Ajouter un sondage", "poll_button.remove_poll": "Supprimer le sondage", "privacy.change": "Ajuster la confidentialité du message", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 560fa3bca0..35639893ee 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Adjust status privacy", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index be1b23870d..c5f670b91d 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -299,6 +299,7 @@ "poll.refresh": "Actualizar", "poll.total_votes": "{count, plural, one {# voto} outros {# votos}}", "poll.vote": "Votar", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Engadir sondaxe", "poll_button.remove_poll": "Eliminar sondaxe", "privacy.change": "Axustar a intimidade do estado", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 7d1ec33aa5..80a072dcce 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "שינוי פרטיות ההודעה", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 79b918f9d4..18e68ce7c7 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Adjust status privacy", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 9a95995e37..dcfb92df56 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Podesi status privatnosti", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 9069597a5b..3dd88c078f 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -299,6 +299,7 @@ "poll.refresh": "Frissítés", "poll.total_votes": "{count, plural, one {# szavazat} other {# szavazat}}", "poll.vote": "Szavazás", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Új szavazás", "poll_button.remove_poll": "Szavazás törlése", "privacy.change": "Tülk láthatóságának módosítása", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 52588f089b..54077dc059 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Կարգավորել թթի գաղտնիությունը", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 23cca64f75..21fe401b86 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Tentukan privasi status", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index a38730c60e..092b163fb0 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Aranjar privateso di mesaji", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index d21dd88b1f..1f2f6e0e6a 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -16,7 +16,7 @@ "account.follows.empty": "Questo utente non segue ancora nessuno.", "account.follows_you": "Ti segue", "account.hide_reblogs": "Nascondi condivisioni da @{name}", - "account.last_status": "Last active", + "account.last_status": "Ultima attività", "account.link_verified_on": "La proprietà di questo link è stata controllata il {date}", "account.locked_info": "Il livello di privacy di questo account è impostato a \"bloccato\". Il proprietario esamina manualmente le richieste di seguirlo.", "account.media": "Media", @@ -25,7 +25,7 @@ "account.mute": "Silenzia @{name}", "account.mute_notifications": "Silenzia notifiche da @{name}", "account.muted": "Silenziato", - "account.never_active": "Never", + "account.never_active": "Mai", "account.posts": "Toot", "account.posts_with_replies": "Toot e risposte", "account.report": "Segnala @{name}", @@ -53,7 +53,7 @@ "column.blocks": "Utenti bloccati", "column.community": "Timeline locale", "column.direct": "Messaggi diretti", - "column.directory": "Browse profiles", + "column.directory": "Sfoglia profili", "column.domain_blocks": "Domini nascosti", "column.favourites": "Apprezzati", "column.follow_requests": "Richieste di amicizia", @@ -101,8 +101,8 @@ "confirmations.delete_list.message": "Sei sicuro di voler cancellare definitivamente questa lista?", "confirmations.domain_block.confirm": "Nascondi intero dominio", "confirmations.domain_block.message": "Sei davvero sicuro che vuoi bloccare l'intero {domain}? Nella maggior parte dei casi, pochi blocchi o silenziamenti mirati sono sufficienti e preferibili. Non vedrai nessun contenuto di quel dominio né nelle timeline pubbliche né nelle notifiche. I tuoi seguaci di quel dominio saranno eliminati.", - "confirmations.logout.confirm": "Log out", - "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.confirm": "Esci", + "confirmations.logout.message": "Sei sicuro di voler uscire?", "confirmations.mute.confirm": "Silenzia", "confirmations.mute.message": "Sei sicuro di voler silenziare {name}?", "confirmations.redraft.confirm": "Cancella e riscrivi", @@ -111,14 +111,14 @@ "confirmations.reply.message": "Se rispondi ora, il messaggio che stai componendo sarà sovrascritto. Sei sicuro di voler continuare?", "confirmations.unfollow.confirm": "Smetti di seguire", "confirmations.unfollow.message": "Sei sicuro che non vuoi più seguire {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", - "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "conversation.delete": "Elimina conversazione", + "conversation.mark_as_read": "Segna come letto", + "conversation.open": "Visualizza conversazione", + "conversation.with": "Con {names}", + "directory.federated": "Da un fediverso noto", + "directory.local": "Solo da {domain}", + "directory.new_arrivals": "Nuovi arrivi", + "directory.recently_active": "Attivo di recente", "embed.instructions": "Inserisci questo status nel tuo sito copiando il codice qui sotto.", "embed.preview": "Ecco come apparirà:", "emoji_button.activity": "Attività", @@ -174,7 +174,7 @@ "home.column_settings.basic": "Semplice", "home.column_settings.show_reblogs": "Mostra post condivisi", "home.column_settings.show_replies": "Mostra risposte", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Aggiorna in tempo reale", "intervals.full.days": "{number, plural, one {# giorno} other {# giorni}}", "intervals.full.hours": "{number, plural, one {# ora} other {# ore}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minuti}}", @@ -268,7 +268,7 @@ "navigation_bar.preferences": "Impostazioni", "navigation_bar.public_timeline": "Timeline federata", "navigation_bar.security": "Sicurezza", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "e {count, plural, one {# other} other {# others}}", "notification.favourite": "{name} ha apprezzato il tuo post", "notification.follow": "{name} ha iniziato a seguirti", "notification.mention": "{name} ti ha menzionato", @@ -299,6 +299,7 @@ "poll.refresh": "Aggiorna", "poll.total_votes": "{count, plural, one {# voto} other {# voti}}", "poll.vote": "Vota", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Aggiungi un sondaggio", "poll_button.remove_poll": "Rimuovi sondaggio", "privacy.change": "Modifica privacy del post", @@ -373,7 +374,7 @@ "status.show_more": "Mostra di più", "status.show_more_all": "Mostra di più per tutti", "status.show_thread": "Mostra thread", - "status.uncached_media_warning": "Not available", + "status.uncached_media_warning": "Non disponibile", "status.unmute_conversation": "Annulla silenzia conversazione", "status.unpin": "Non fissare in cima al profilo", "suggestions.dismiss": "Elimina suggerimento", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 40c88d6941..ee31d3ae32 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -113,7 +113,7 @@ "confirmations.unfollow.message": "本当に{name}さんのフォローを解除しますか?", "conversation.delete": "このやりとりを削除", "conversation.mark_as_read": "既読にする", - "conversation.open": "会話を表示する", + "conversation.open": "会話を表示", "conversation.with": "{names}", "directory.federated": "既知の連合より", "directory.local": "{domain} のみ", @@ -299,6 +299,7 @@ "poll.refresh": "更新", "poll.total_votes": "{count}票", "poll.vote": "投票", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "アンケートを追加", "poll_button.remove_poll": "アンケートを削除", "privacy.change": "公開範囲を変更", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index d70cf0ed27..51b7deb5e2 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "სტატუსის კონფიდენციალურობის მითითება", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index e38aac621b..13f2d23d25 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -299,6 +299,7 @@ "poll.refresh": "Жаңарту", "poll.total_votes": "{count, plural, one {# дауыс} other {# дауыс}}", "poll.vote": "Дауыс беру", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Сауалнама қосу", "poll_button.remove_poll": "Сауалнаманы өшіру", "privacy.change": "Құпиялылықты реттеу", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index def02860bb..60a1971268 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -299,6 +299,7 @@ "poll.refresh": "새로고침", "poll.total_votes": "{count} 표", "poll.vote": "투표", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "투표 추가", "poll_button.remove_poll": "투표 삭제", "privacy.change": "포스트의 프라이버시 설정을 변경", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 560fa3bca0..35639893ee 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Adjust status privacy", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 031f758e6c..b837cc42b3 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Adjust status privacy", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index e2bf6e1d21..da7ddfc80a 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Adjust status privacy", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 83dba6bd3a..edba374343 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -299,6 +299,7 @@ "poll.refresh": "Vernieuwen", "poll.total_votes": "{count, plural, one {# stem} other {# stemmen}}", "poll.vote": "Stemmen", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Poll toevoegen", "poll_button.remove_poll": "Poll verwijderen", "privacy.change": "Zichtbaarheid toot aanpassen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index a98fd9522d..c4003193e1 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Adjust status privacy", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 82794684b0..8fe7c9cfde 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Justér synlighet", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index e3322baf4b..550057f23e 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -299,6 +299,7 @@ "poll.refresh": "Actualizar", "poll.total_votes": "{count, plural, one {# vòte} other {# vòtes}}", "poll.vote": "Votar", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Ajustar un sondatge", "poll_button.remove_poll": "Levar lo sondatge", "privacy.change": "Ajustar la confidencialitat del messatge", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 9aca1d27f2..fd5fe4fc3e 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -101,8 +101,8 @@ "confirmations.delete_list.message": "Czy na pewno chcesz bezpowrotnie usunąć tą listę?", "confirmations.domain_block.confirm": "Ukryj wszysyko z domeny", "confirmations.domain_block.message": "Czy na pewno chcesz zablokować całą domenę {domain}? Zwykle lepszym rozwiązaniem jest blokada lub wyciszenie kilku użytkowników.", - "confirmations.logout.confirm": "Log out", - "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.confirm": "Wyloguj", + "confirmations.logout.message": "Czy na pewno chcesz się wylogować?", "confirmations.mute.confirm": "Wycisz", "confirmations.mute.message": "Czy na pewno chcesz wyciszyć {name}?", "confirmations.redraft.confirm": "Usuń i przeredaguj", @@ -111,10 +111,10 @@ "confirmations.reply.message": "W ten sposób utracisz wpis który obecnie tworzysz. Czy na pewno chcesz to zrobić?", "confirmations.unfollow.confirm": "Przestań śledzić", "confirmations.unfollow.message": "Czy na pewno zamierzasz przestać śledzić {name}?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Usuń rozmowę", + "conversation.mark_as_read": "Oznacz jako przeczytane", + "conversation.open": "Zobacz rozmowę", + "conversation.with": "Z {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", @@ -299,6 +299,7 @@ "poll.refresh": "Odśwież", "poll.total_votes": "{count, plural, one {# głos} few {# głosy} many {# głosów} other {# głosów}}", "poll.vote": "Zagłosuj", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Dodaj głosowanie", "poll_button.remove_poll": "Usuń głosowanie", "privacy.change": "Dostosuj widoczność wpisów", @@ -396,7 +397,7 @@ "upload_error.limit": "Przekroczono limit plików do wysłania.", "upload_error.poll": "Dołączanie plików nie dozwolone z głosowaniami.", "upload_form.description": "Wprowadź opis dla niewidomych i niedowidzących", - "upload_form.edit": "Edit", + "upload_form.edit": "Edytuj", "upload_form.undo": "Usuń", "upload_modal.analyzing_picture": "Analyzing picture…", "upload_modal.apply": "Zastosuj", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index b35d19deea..4bc703206f 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -299,6 +299,7 @@ "poll.refresh": "Atualizar", "poll.total_votes": "{count, plural, one {# voto} other {# votos}}", "poll.vote": "Votar", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Adicionar uma enquete", "poll_button.remove_poll": "Remover enquete", "privacy.change": "Ajustar a privacidade da mensagem", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 4b1e11aa42..b286dd6220 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -299,6 +299,7 @@ "poll.refresh": "Recarregar", "poll.total_votes": "{contar, plural, um {# vote} outro {# votes}}", "poll.vote": "Votar", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Adicionar votação", "poll_button.remove_poll": "Remover votação", "privacy.change": "Ajustar a privacidade da mensagem", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 6f5c572500..8bda8c0601 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Cine vede asta", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index eb2d91725b..82194d2c6b 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -299,6 +299,7 @@ "poll.refresh": "Обновить", "poll.total_votes": "{count, plural, one {# голос} few {# голоса} many {# голосов} other {# голосов}}", "poll.vote": "Голосовать", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Добавить опрос", "poll_button.remove_poll": "Удалить опрос", "privacy.change": "Изменить видимость статуса", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 04968e59a9..07616931f5 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -299,6 +299,7 @@ "poll.refresh": "Obnov", "poll.total_votes": "{count, plural, one {# hlas} few {# hlasov} many {# hlasov} other {# hlasov}}", "poll.vote": "Hlasuj", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Pridaj anketu", "poll_button.remove_poll": "Odstráň anketu", "privacy.change": "Uprav súkromie príspevku", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 9999dcd8b9..86091e4a73 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -299,6 +299,7 @@ "poll.refresh": "Osveži", "poll.total_votes": "{count, plural,one {# glas} other {# glasov}}", "poll.vote": "Glasuj", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Dodaj anketo", "poll_button.remove_poll": "Odstrani anketo", "privacy.change": "Prilagodi zasebnost statusa", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 9fe768173f..66b9396825 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Rregulloni privatësi gjendje", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 5232265e36..f9144348d8 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Podesi status privatnosti", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index cc8d9d89ca..c7adda11a6 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Подеси статус приватности", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 3c3c62f3a2..449b226f07 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -299,6 +299,7 @@ "poll.refresh": "Ladda om", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Rösta", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Justera sekretess", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index fb51b46b4d..c020bafb3b 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -299,6 +299,7 @@ "poll.refresh": "பத்துயிர்ப்ப?ட்டு", "poll.total_votes": "{count, plural, one {# vote} மற்ற {# votes}}", "poll.vote": "வாக்களி", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "வாக்கெடுப்பைச் சேர்க்கவும்", "poll_button.remove_poll": "வாக்கெடுப்பை அகற்று", "privacy.change": "நிலை தனியுரிமை", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 5af35a04dc..ad99afcf4f 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -299,6 +299,7 @@ "poll.refresh": "నవీకరించు", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "ఎన్నుకోండి", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "ఒక ఎన్నికను చేర్చు", "poll_button.remove_poll": "ఎన్నికను తొలగించు", "privacy.change": "స్టేటస్ గోప్యతను సర్దుబాటు చేయండి", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index fcd2d30168..da57280ce2 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -299,6 +299,7 @@ "poll.refresh": "รีเฟรช", "poll.total_votes": "{count, plural, other {# การลงคะแนน}}", "poll.vote": "ลงคะแนน", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "เพิ่มโพล", "poll_button.remove_poll": "เอาโพลออก", "privacy.change": "ปรับเปลี่ยนความเป็นส่วนตัวของสถานะ", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 772b55ee18..1b5ce07d52 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -299,6 +299,7 @@ "poll.refresh": "Yenile", "poll.total_votes": "{count, plural, one {# oy} other {# oy}}", "poll.vote": "Oy ver", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Bir anket ekleyin", "poll_button.remove_poll": "Anket kaldır", "privacy.change": "Gönderi gizliliğini ayarla", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 515ffdd83e..9a64b857fc 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -299,6 +299,7 @@ "poll.refresh": "Оновити", "poll.total_votes": "{count, plural, one {# голос} few {# голоси} many {# голосів} other {# голосів}}", "poll.vote": "Проголосувати", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Додати опитування", "poll_button.remove_poll": "Видалити опитування", "privacy.change": "Змінити видимість допису", diff --git a/app/javascript/mastodon/locales/whitelist_es-AR.json b/app/javascript/mastodon/locales/whitelist_es-AR.json new file mode 100644 index 0000000000..0d4f101c7a --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_es-AR.json @@ -0,0 +1,2 @@ +[ +] diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 28f35313c1..4057fefa94 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -299,6 +299,7 @@ "poll.refresh": "刷新", "poll.total_votes": "{count} 票", "poll.vote": "投票", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "发起投票", "poll_button.remove_poll": "移除投票", "privacy.change": "设置嘟文可见范围", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 845c2c9564..93439a3a12 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -299,6 +299,7 @@ "poll.refresh": "Refresh", "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", "poll.vote": "Vote", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "調整私隱設定", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 8cb6017867..b88d1b60d2 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -299,6 +299,7 @@ "poll.refresh": "重新整理", "poll.total_votes": "{count, plural, one {# 個投票} other {# 個投票}}", "poll.vote": "投票", + "poll.voted": "You voted for this answer", "poll_button.add_poll": "建立投票", "poll_button.remove_poll": "移除投票", "privacy.change": "調整隱私狀態", diff --git a/config/locales/co.yml b/config/locales/co.yml index f1733ad2ba..40c97ec257 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -242,8 +242,10 @@ co: disabled_msg: L’emoji hè stata disattivata emoji: Emoji enable: Attivà + enabled: Attivate enabled_msg: L’emoji hè stata attivata image_hint: PNG di 50Ko o menu + list: Listà listed: Listata new: title: Aghjunghje una nov’emoji @@ -252,6 +254,7 @@ co: shortcode_hint: 2 caratteri o più, solu lettere, numeri è liniette basse title: Emoji parsunalizate uncategorized: Micca categurizatu + unlist: Slistà unlisted: Micca listata update_failed_msg: Ùn s’hè micca pussutu mette à ghjornu l’emoji updated_msg: L’emoji hè stata messa à ghjornu! @@ -383,6 +386,7 @@ co: pending: In attesa di l'apprubazione di u ripetitore save_and_enable: Salvà è attivà setup: Creà una cunnessione cù un ripetitore + signatures_not_enabled: I ripetitori ùn marchjeranu micca currettamente mentre chì u modu sicurizatu o à lista bianca hè attivatu status: Statutu title: Ripetitori report_notes: @@ -827,13 +831,16 @@ co: past_migrations: Anziane migrazione proceed_with_move: Trasferì l'abbunati redirecting_to: U vostru contu riindirizza versu à %{acct}. + set_redirect: Creà ridirezzione 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 + only_redirect_html: Pudete ancu mette solu una ridirezzione nant'à u vostru prufile. other_data: L'altri dati ùn saranu micca autumaticamente trasferiti + redirect: U prufile di u vostru contu attuale sarà messu à ghjornu cù una nutificazione di ridirezzione è sarà sclusu di e ricerche moderation: title: Muderazione notification_mailer: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 21b3497996..eee4623320 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -847,13 +847,16 @@ cs: past_migrations: Předchozí přesuny proceed_with_move: Přesunout sledující redirecting_to: Váš účet přesměrovává na účet %{acct}. + set_redirect: Nastavit přesměrování warning: backreference_required: Nový účet musí být nejprve nastaven, aby odkazoval zpátky na tento before: 'Před pokračováním si prosím pečlivě přečtěte tyto poznámky:' cooldown: Po přesunu nastane období odpočinku, kdy se nebudete moci opět přesunout disabled_account: Váš aktuální účet nebude poté zcela použitelný. Budete však mít přístup k datovým exportům a budete ho moci znovu aktivovat. followers: Touto akcí přesunete všechny sledující z aktuálního účtu na nový účet + only_redirect_html: Alternativně můžete nastavit pouze přesměrování na váš profil. other_data: Žádná další data nebudou přesunuta automaticky + redirect: Profil vašeho aktuálního účtu bude aktualizován s oznámením o přesměrování a bude vyloučen z hledání moderation: title: Moderování notification_mailer: diff --git a/config/locales/de.yml b/config/locales/de.yml index 785face331..6b0d132e37 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -242,8 +242,10 @@ de: disabled_msg: Das Emoji wurde deaktiviert emoji: Emoji enable: Aktivieren + enabled: Aktiviert enabled_msg: Das Emoji wurde aktiviert image_hint: PNG bis zu 50 kB + list: Liste listed: Gelistet new: title: Eigenes Emoji hinzufügen @@ -252,6 +254,7 @@ de: shortcode_hint: Mindestens 2 Zeichen, nur Buchstaben, Ziffern und Unterstriche title: Eigene Emojis uncategorized: Nicht kategorisiert + unlist: Nicht listen unlisted: Ungelistet update_failed_msg: Konnte dieses Emoji nicht aktualisieren updated_msg: Emoji erfolgreich aktualisiert! @@ -383,6 +386,7 @@ de: pending: Warte auf Zustimmung des Relays save_and_enable: Speichern und aktivieren setup: Relaisverbindung einrichten + signatures_not_enabled: Relais funktionieren nicht korrekt, während der sichere Modus oder der Whitelist-Modus aktiviert ist status: Zustand title: Relais report_notes: @@ -827,13 +831,16 @@ de: past_migrations: Vorherige Migrationen proceed_with_move: Folger_innen verschieben redirecting_to: Dein Konto wird zu %{acct} weitergeleitet. + set_redirect: Umleitung einrichten warning: backreference_required: Das neue Konto muss zuerst so konfiguriert werden, dass es auf das alte Konto referenziert before: 'Bevor du fortfährst, lese bitte diese Hinweise sorgfältig durch:' cooldown: Nach dem Migrieren wird es eine Abklingzeit geben, in der du das Konto nicht noch einmal migrieren kannst disabled_account: Dein aktuelles Konto wird nachher nicht vollständig nutzbar sein. Du hast jedoch Zugriff auf den Datenexport sowie die Reaktivierung. followers: Diese Aktion wird alle Folger_innen vom aktuellen Konto auf das neue Konto verschieben + only_redirect_html: Alternativ kannst du nur eine Weiterleitung auf dein Profil erstellen. other_data: Keine anderen Daten werden automatisch verschoben + redirect: Das Profil deines aktuellen Kontos wird mit einer Weiterleitungsnachricht versehen und von Suchanfragen ausgeschlossen moderation: title: Moderation notification_mailer: diff --git a/config/locales/devise.el.yml b/config/locales/devise.el.yml index 75f68c2814..f064cbe830 100644 --- a/config/locales/devise.el.yml +++ b/config/locales/devise.el.yml @@ -50,6 +50,8 @@ el: explanation: Ο έλεγχος ταυτότητας δυο παραγόντων (2FA) έχει απενεργοποιηθεί για το λογαριασμό σου. Η σύνδεση γίνεται απλά με το email και το συνθηματικό. subject: 'Mastodon: Απενεργοποιήθηκε ο έλεγχος ταυτότητας δύο παραγόντων' title: Απενεργοποιημένο 2FA + two_factor_enabled: + title: Επαλήθευση δύο βημάτων ενεργή unlock_instructions: subject: 'Mastodon: Οδηγίες ξεκλειδώματος' omniauth_callbacks: diff --git a/config/locales/devise.it.yml b/config/locales/devise.it.yml index b603e12c68..dca5e3caa3 100644 --- a/config/locales/devise.it.yml +++ b/config/locales/devise.it.yml @@ -46,6 +46,17 @@ it: extra: Se questo cambiamento non è stato chiesto da te, ignora questa email. La tua password non verrà cambiata finché non accedi tramite il link qui sopra e ne crei una nuova. subject: 'Mastodon: Istruzioni per il reset della password' title: Ripristino password + two_factor_disabled: + explanation: L'autenticazione a due fattori per il tuo account è stata disattivata. Il login è ora possibile utilizzando solo l'indirizzo e-mail e la password. + subject: 'Mastodon: Autenticazione a due fattori disattivata' + title: 2FA disabilitata + two_factor_enabled: + explanation: L'autenticazione a due fattori è stata attivata per il tuo account. Un token generato dall'app TOTP collegata sarà richiesto per il login. + subject: 'Mastodon: Autenticazione a due fattori attivata' + title: 2FA abilitata + two_factor_recovery_codes_changed: + subject: 'Mastodon: codici di recupero a due fattori ri-generati' + title: Codici di recupero 2FA modificati unlock_instructions: subject: 'Mastodon: Istruzioni di sblocco' omniauth_callbacks: diff --git a/config/locales/doorkeeper.es-AR.yml b/config/locales/doorkeeper.es-AR.yml new file mode 100644 index 0000000000..515d5c1ed9 --- /dev/null +++ b/config/locales/doorkeeper.es-AR.yml @@ -0,0 +1 @@ +es-AR: diff --git a/config/locales/doorkeeper.es.yml b/config/locales/doorkeeper.es.yml index 515d5c1ed9..1b03e33f2f 100644 --- a/config/locales/doorkeeper.es.yml +++ b/config/locales/doorkeeper.es.yml @@ -1 +1,148 @@ -es-AR: +--- +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 diff --git a/config/locales/el.yml b/config/locales/el.yml index 5975e1b53a..2cafb101df 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -728,7 +728,7 @@ el: copy: Αντιγραφή no_batch_actions_available: Δεν υπάρχουν ομαδικές ενέργειες σε αυτή τη σελίδα order_by: Ταξινόμηση κατά - save_changes: Αποθήκευσε τις αλλαγές + save_changes: Αποθήκευση αλλαγών validation_errors: one: Κάτι δεν είναι εντάξει ακόμα! Για κοίταξε το παρακάτω σφάλμα other: Κάτι δεν είναι εντάξει ακόμα! Για κοίταξε τα παρακάτω %{count} σφάλματα @@ -865,7 +865,7 @@ el: too_few_options: πρέπει να έχει περισσότερες από μια επιλογές too_many_options: δεν μπορεί να έχει περισσότερες από %{max} επιλογές preferences: - other: Άλλο + other: Άλλες posting_defaults: Προεπιλογές δημοσίευσης public_timelines: Δημόσιες ροές relationships: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml new file mode 100644 index 0000000000..fe61b69c42 --- /dev/null +++ b/config/locales/es-AR.yml @@ -0,0 +1,20 @@ +--- +es-AR: + errors: + '400': The request you submitted was invalid or malformed. + '403': You don't have permission to view this page. + '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. + '410': The page you were looking for doesn't exist here anymore. + '422': + '429': Throttled + '500': + '503': The page could not be served due to a temporary server failure. + invites: + expires_in: + '1800': 30 minutes + '21600': 6 hours + '3600': 1 hour + '43200': 12 hours + '604800': 1 week + '86400': 1 day diff --git a/config/locales/es.yml b/config/locales/es.yml index 2fbf0ffd71..ef22c7b827 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1 +1,1134 @@ ---- {} +--- +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.

+ +

Adaptado originalmente desde la política de privacidad de Discourse.

+ 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 8dbeb3ade2..0aa8b7a513 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 9681609103..447ac4a1ef 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 303c462fdf..5e6d878695 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 bbffde053b..f4501a8651 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 793b755319..819ea3ef67 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 7ff5fbf77f..53ff05de1f 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 0000000000..515d5c1ed9 --- /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 515d5c1ed9..2fb33dbc3c 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 d96eafb8b8..e89f9be002 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 cda4e9ead0..77445b0cbc 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 220f944ce9..59651d9de3 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 729573d927..08f144c253 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 076/107] 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 a170c3ecd5..4e9ccdc8c0 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 bd49f0a173..9c5686ed20 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 077/107] 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 dd7e2fcd3f..f88d260f24 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 078/107] 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 0000000000..11a699ebc8 --- /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 ae3c11b6af..81303b7158 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 0000000000..1b48dcb98f --- /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 becc92c2d1..c4caeaa8c1 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 0000000000..07ab2a6eee --- /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 0000000000..1a7d7a9113 --- /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 bf0cb52a30..c65153b0a7 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 f1a69cf5c5..e43e201a5d 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 0000000000..12e1fa4159 --- /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 079/107] 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 7000f5a71c..fd9881302a 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 7b0906b396..fb22676e04 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 4d4ae6e824..8728b48068 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 61e0c428a1..333c295dc6 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 f78a9489ab..029057d407 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 0000000000..a07baeaa64 --- /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 ( +
+
+

+ @{account.get('acct')} }} + /> +

+
+ +
+ + + +
+
+ ); + } + +} diff --git a/app/javascript/mastodon/features/ui/components/modal_root.js b/app/javascript/mastodon/features/ui/components/modal_root.js index 5fc37368bd..58d3ba8db1 100644 --- a/app/javascript/mastodon/features/ui/components/modal_root.js +++ b/app/javascript/mastodon/features/ui/components/modal_root.js @@ -13,6 +13,7 @@ import ConfirmationModal from './confirmation_modal'; import FocalPointModal from './focal_point_modal'; import { MuteModal, + BlockModal, ReportModal, EmbedModal, ListEditor, @@ -25,6 +26,7 @@ const MODAL_COMPONENTS = { 'BOOST': () => Promise.resolve({ default: BoostModal }), 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }), 'MUTE': MuteModal, + 'BLOCK': BlockModal, 'REPORT': ReportModal, 'ACTIONS': () => Promise.resolve({ default: ActionsModal }), 'EMBED': EmbedModal, diff --git a/app/javascript/mastodon/features/ui/components/mute_modal.js b/app/javascript/mastodon/features/ui/components/mute_modal.js index ac356b42a7..c364c5ba21 100644 --- a/app/javascript/mastodon/features/ui/components/mute_modal.js +++ b/app/javascript/mastodon/features/ui/components/mute_modal.js @@ -11,7 +11,6 @@ import { toggleHideNotifications } from '../../../actions/mutes'; const mapStateToProps = state => { return { - isSubmitting: state.getIn(['reports', 'new', 'isSubmitting']), account: state.getIn(['mutes', 'new', 'account']), notifications: state.getIn(['mutes', 'new', 'notifications']), }; @@ -38,7 +37,6 @@ export default @connect(mapStateToProps, mapDispatchToProps) class MuteModal extends React.PureComponent { static propTypes = { - isSubmitting: PropTypes.bool.isRequired, account: PropTypes.object.isRequired, notifications: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, @@ -81,11 +79,16 @@ class MuteModal extends React.PureComponent { values={{ name: @{account.get('acct')} }} />

-
-
diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js index 0084c15103..bb0fcb8593 100644 --- a/app/javascript/mastodon/features/ui/util/async-components.js +++ b/app/javascript/mastodon/features/ui/util/async-components.js @@ -106,6 +106,10 @@ export function MuteModal () { return import(/* webpackChunkName: "modals/mute_modal" */'../components/mute_modal'); } +export function BlockModal () { + return import(/* webpackChunkName: "modals/block_modal" */'../components/block_modal'); +} + export function ReportModal () { return import(/* webpackChunkName: "modals/report_modal" */'../components/report_modal'); } diff --git a/app/javascript/mastodon/reducers/blocks.js b/app/javascript/mastodon/reducers/blocks.js new file mode 100644 index 0000000000..1b65071634 --- /dev/null +++ b/app/javascript/mastodon/reducers/blocks.js @@ -0,0 +1,22 @@ +import Immutable from 'immutable'; + +import { + BLOCKS_INIT_MODAL, +} from '../actions/blocks'; + +const initialState = Immutable.Map({ + new: Immutable.Map({ + account_id: null, + }), +}); + +export default function mutes(state = initialState, action) { + switch (action.type) { + case BLOCKS_INIT_MODAL: + return state.withMutations((state) => { + state.setIn(['new', 'account_id'], action.account.get('id')); + }); + default: + return state; + } +} diff --git a/app/javascript/mastodon/reducers/index.js b/app/javascript/mastodon/reducers/index.js index 0f4b209d45..b8d6088881 100644 --- a/app/javascript/mastodon/reducers/index.js +++ b/app/javascript/mastodon/reducers/index.js @@ -15,6 +15,7 @@ import settings from './settings'; import push_notifications from './push_notifications'; import status_lists from './status_lists'; import mutes from './mutes'; +import blocks from './blocks'; import reports from './reports'; import contexts from './contexts'; import compose from './compose'; @@ -51,6 +52,7 @@ const reducers = { settings, push_notifications, mutes, + blocks, reports, contexts, compose, diff --git a/app/javascript/mastodon/reducers/mutes.js b/app/javascript/mastodon/reducers/mutes.js index a96232dbd2..4672e50974 100644 --- a/app/javascript/mastodon/reducers/mutes.js +++ b/app/javascript/mastodon/reducers/mutes.js @@ -7,7 +7,6 @@ import { const initialState = Immutable.Map({ new: Immutable.Map({ - isSubmitting: false, account: null, notifications: true, }), @@ -17,7 +16,6 @@ export default function mutes(state = initialState, action) { switch (action.type) { case MUTES_INIT_MODAL: return state.withMutations((state) => { - state.setIn(['new', 'isSubmitting'], false); state.setIn(['new', 'account'], action.account); state.setIn(['new', 'notifications'], true); }); diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index e7114ed077..45305d696f 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -310,6 +310,7 @@ html { .boost-modal, .confirmation-modal, .mute-modal, +.block-modal, .report-modal, .embed-modal, .error-modal, @@ -326,6 +327,7 @@ html { .boost-modal__action-bar, .confirmation-modal__action-bar, .mute-modal__action-bar, +.block-modal__action-bar, .onboarding-modal__paginator, .error-modal__footer { background: darken($ui-base-color, 6%); diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 398522afbc..64d40f8240 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -4533,7 +4533,8 @@ a.status-card.compact:hover { .confirmation-modal, .report-modal, .actions-modal, -.mute-modal { +.mute-modal, +.block-modal { background: lighten($ui-secondary-color, 8%); color: $inverted-text-color; border-radius: 8px; @@ -4587,7 +4588,8 @@ a.status-card.compact:hover { .boost-modal__action-bar, .confirmation-modal__action-bar, -.mute-modal__action-bar { +.mute-modal__action-bar, +.block-modal__action-bar { display: flex; justify-content: space-between; background: $ui-secondary-color; @@ -4615,11 +4617,13 @@ a.status-card.compact:hover { font-size: 14px; } -.mute-modal { +.mute-modal, +.block-modal { line-height: 24px; } -.mute-modal .react-toggle { +.mute-modal .react-toggle, +.block-modal .react-toggle { vertical-align: middle; } @@ -4830,33 +4834,35 @@ a.status-card.compact:hover { } .confirmation-modal__action-bar, -.mute-modal__action-bar { - .confirmation-modal__secondary-button, - .confirmation-modal__cancel-button, - .mute-modal__cancel-button { - background-color: transparent; - color: $lighter-text-color; - font-size: 14px; - font-weight: 500; - - &:hover, - &:focus, - &:active { - color: darken($lighter-text-color, 4%); - } - } - +.mute-modal__action-bar, +.block-modal__action-bar { .confirmation-modal__secondary-button { flex-shrink: 1; } } +.confirmation-modal__secondary-button, +.confirmation-modal__cancel-button, +.mute-modal__cancel-button, +.block-modal__cancel-button { + background-color: transparent; + color: $lighter-text-color; + font-size: 14px; + font-weight: 500; + + &:hover, + &:focus, + &:active { + color: darken($lighter-text-color, 4%); + } +} + .confirmation-modal__container, .mute-modal__container, +.block-modal__container, .report-modal__target { padding: 30px; font-size: 16px; - text-align: center; strong { font-weight: 500; @@ -4869,6 +4875,31 @@ a.status-card.compact:hover { } } +.confirmation-modal__container, +.report-modal__target { + text-align: center; +} + +.block-modal, +.mute-modal { + &__explanation { + margin-top: 20px; + } + + .setting-toggle { + margin-top: 20px; + margin-bottom: 24px; + display: flex; + align-items: center; + + &__label { + color: $inverted-text-color; + margin: 0; + margin-left: 8px; + } + } +} + .report-modal__target { padding: 15px; From cfe2d1cc4a3c531741fd769241593ebbe03b6711 Mon Sep 17 00:00:00 2001 From: koyu Date: Sun, 29 Sep 2019 22:20:56 +0200 Subject: [PATCH 080/107] Change at icon in notification filter to reply-all (#11995) --- .../mastodon/features/notifications/components/filter_bar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/notifications/components/filter_bar.js b/app/javascript/mastodon/features/notifications/components/filter_bar.js index 3f3e6ab7d2..2fd28d8326 100644 --- a/app/javascript/mastodon/features/notifications/components/filter_bar.js +++ b/app/javascript/mastodon/features/notifications/components/filter_bar.js @@ -64,7 +64,7 @@ class FilterBar extends React.PureComponent { onClick={this.onClick('mention')} title={intl.formatMessage(tooltips.mentions)} > - + } {showResults && !this.props.disabled && · } - + {votesCount} {poll.get('expires_at') && · {timeRemaining}} diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index e69193b710..76bf9b2e55 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -232,25 +232,40 @@ class ActivityPub::Activity::Create < ActivityPub::Activity items = @object['oneOf'] end + voters_count = @object['votersCount'] + @account.polls.new( multiple: multiple, expires_at: expires_at, options: items.map { |item| item['name'].presence || item['content'] }.compact, - cached_tallies: items.map { |item| item.dig('replies', 'totalItems') || 0 } + cached_tallies: items.map { |item| item.dig('replies', 'totalItems') || 0 }, + voters_count: voters_count ) end def poll_vote? return false if replied_to_status.nil? || replied_to_status.preloadable_poll.nil? || !replied_to_status.local? || !replied_to_status.preloadable_poll.options.include?(@object['name']) - unless replied_to_status.preloadable_poll.expired? - replied_to_status.preloadable_poll.votes.create!(account: @account, choice: replied_to_status.preloadable_poll.options.index(@object['name']), uri: @object['id']) - ActivityPub::DistributePollUpdateWorker.perform_in(3.minutes, replied_to_status.id) unless replied_to_status.preloadable_poll.hide_totals? - end + poll_vote! unless replied_to_status.preloadable_poll.expired? true end + def poll_vote! + poll = replied_to_status.preloadable_poll + already_voted = true + RedisLock.acquire(poll_lock_options) do |lock| + if lock.acquired? + already_voted = poll.votes.where(account: @account).exists? + poll.votes.create!(account: @account, choice: poll.options.index(@object['name']), uri: @object['id']) + else + raise Mastodon::RaceConditionError + end + end + increment_voters_count! unless already_voted + ActivityPub::DistributePollUpdateWorker.perform_in(3.minutes, replied_to_status.id) unless replied_to_status.preloadable_poll.hide_totals? + end + def resolve_thread(status) return unless status.reply? && status.thread.nil? && Request.valid_url?(in_reply_to_uri) ThreadResolveWorker.perform_async(status.id, in_reply_to_uri) @@ -416,7 +431,22 @@ class ActivityPub::Activity::Create < ActivityPub::Activity ActivityPub::RawDistributionWorker.perform_async(Oj.dump(@json), replied_to_status.account_id, [@account.preferred_inbox_url]) end + def increment_voters_count! + poll = replied_to_status.preloadable_poll + unless poll.voters_count.nil? + poll.voters_count = poll.voters_count + 1 + poll.save + end + rescue ActiveRecord::StaleObjectError + poll.reload + retry + end + def lock_options { redis: Redis.current, key: "create:#{@object['id']}" } end + + def poll_lock_options + { redis: Redis.current, key: "vote:#{replied_to_status.poll_id}:#{@account.id}" } + end end diff --git a/app/lib/activitypub/adapter.rb b/app/lib/activitypub/adapter.rb index cb2ac72d45..2a8f723334 100644 --- a/app/lib/activitypub/adapter.rb +++ b/app/lib/activitypub/adapter.rb @@ -21,6 +21,7 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base identity_proof: { 'toot' => 'http://joinmastodon.org/ns#', 'IdentityProof' => 'toot:IdentityProof' }, blurhash: { 'toot' => 'http://joinmastodon.org/ns#', 'blurhash' => 'toot:blurhash' }, discoverable: { 'toot' => 'http://joinmastodon.org/ns#', 'discoverable' => 'toot:discoverable' }, + voters_count: { 'toot' => 'http://joinmastodon.org/ns#', 'votersCount' => 'toot:votersCount' }, }.freeze def self.default_key_transform diff --git a/app/models/poll.rb b/app/models/poll.rb index 55a8f13a65..5427368fd0 100644 --- a/app/models/poll.rb +++ b/app/models/poll.rb @@ -16,6 +16,7 @@ # created_at :datetime not null # updated_at :datetime not null # lock_version :integer default(0), not null +# voters_count :bigint(8) # class Poll < ApplicationRecord diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb index 364d3eda59..110621a28b 100644 --- a/app/serializers/activitypub/note_serializer.rb +++ b/app/serializers/activitypub/note_serializer.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class ActivityPub::NoteSerializer < ActivityPub::Serializer - context_extensions :atom_uri, :conversation, :sensitive + context_extensions :atom_uri, :conversation, :sensitive, :voters_count attributes :id, :type, :summary, :in_reply_to, :published, :url, @@ -23,6 +23,8 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer attribute :end_time, if: :poll_and_expires? attribute :closed, if: :poll_and_expired? + attribute :voters_count, if: :poll_and_voters_count? + def id ActivityPub::TagManager.instance.uri_for(object) end @@ -141,6 +143,10 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer alias end_time closed + def voters_count + object.preloadable_poll.voters_count + end + def poll_and_expires? object.preloadable_poll&.expires_at&.present? end @@ -149,6 +155,10 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer object.preloadable_poll&.expired? end + def poll_and_voters_count? + object.preloadable_poll&.voters_count + end + class MediaAttachmentSerializer < ActivityPub::Serializer context_extensions :blurhash, :focal_point diff --git a/app/serializers/rest/poll_serializer.rb b/app/serializers/rest/poll_serializer.rb index eb98bb2d23..df6ebd0d44 100644 --- a/app/serializers/rest/poll_serializer.rb +++ b/app/serializers/rest/poll_serializer.rb @@ -2,7 +2,7 @@ class REST::PollSerializer < ActiveModel::Serializer attributes :id, :expires_at, :expired, - :multiple, :votes_count + :multiple, :votes_count, :voters_count has_many :loaded_options, key: :options has_many :emojis, serializer: REST::CustomEmojiSerializer diff --git a/app/services/activitypub/process_poll_service.rb b/app/services/activitypub/process_poll_service.rb index 2fbce65b9c..cb4a0d4602 100644 --- a/app/services/activitypub/process_poll_service.rb +++ b/app/services/activitypub/process_poll_service.rb @@ -28,6 +28,8 @@ class ActivityPub::ProcessPollService < BaseService end end + voters_count = @json['votersCount'] + latest_options = items.map { |item| item['name'].presence || item['content'] } # If for some reasons the options were changed, it invalidates all previous @@ -39,7 +41,8 @@ class ActivityPub::ProcessPollService < BaseService last_fetched_at: Time.now.utc, expires_at: expires_at, options: latest_options, - cached_tallies: items.map { |item| item.dig('replies', 'totalItems') || 0 } + cached_tallies: items.map { |item| item.dig('replies', 'totalItems') || 0 }, + voters_count: voters_count ) rescue ActiveRecord::StaleObjectError poll.reload diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 34ec6d5048..a0a650d624 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -174,7 +174,7 @@ class PostStatusService < BaseService def poll_attributes return if @options[:poll].blank? - @options[:poll].merge(account: @account) + @options[:poll].merge(account: @account, voters_count: 0) end def scheduled_options diff --git a/app/services/vote_service.rb b/app/services/vote_service.rb index 0eeb8fd56a..cb7dce6e8a 100644 --- a/app/services/vote_service.rb +++ b/app/services/vote_service.rb @@ -12,12 +12,24 @@ class VoteService < BaseService @choices = choices @votes = [] - ApplicationRecord.transaction do - @choices.each do |choice| - @votes << @poll.votes.create!(account: @account, choice: choice) + already_voted = true + + RedisLock.acquire(lock_options) do |lock| + if lock.acquired? + already_voted = @poll.votes.where(account: @account).exists? + + ApplicationRecord.transaction do + @choices.each do |choice| + @votes << @poll.votes.create!(account: @account, choice: choice) + end + end + else + raise Mastodon::RaceConditionError end end + increment_voters_count! unless already_voted + ActivityTracker.increment('activity:interactions') if @poll.account.local? @@ -53,4 +65,18 @@ class VoteService < BaseService def build_json(vote) Oj.dump(serialize_payload(vote, ActivityPub::VoteSerializer)) end + + def increment_voters_count! + unless @poll.voters_count.nil? + @poll.voters_count = @poll.voters_count + 1 + @poll.save + end + rescue ActiveRecord::StaleObjectError + @poll.reload + retry + end + + def lock_options + { redis: Redis.current, key: "vote:#{@poll.id}:#{@account.id}" } + end end diff --git a/app/views/statuses/_poll.html.haml b/app/views/statuses/_poll.html.haml index d6b36a5d12..d1aba6ef9c 100644 --- a/app/views/statuses/_poll.html.haml +++ b/app/views/statuses/_poll.html.haml @@ -1,12 +1,13 @@ - show_results = (user_signed_in? && poll.voted?(current_account)) || poll.expired? - own_votes = user_signed_in? ? poll.own_votes(current_account) : [] +- total_votes_count = poll.voters_count || poll.votes_count .poll %ul - poll.loaded_options.each_with_index do |option, index| %li - if show_results - - percent = poll.votes_count > 0 ? 100 * option.votes_count / poll.votes_count : 0 + - percent = total_votes_count > 0 ? 100 * option.votes_count / total_votes_count : 0 %span.poll__chart{ style: "width: #{percent}%" } %label.poll__text>< @@ -24,7 +25,10 @@ %button.button.button-secondary{ disabled: true } = t('statuses.poll.vote') - %span= t('statuses.poll.total_votes', count: poll.votes_count) + - if poll.voters_count.nil? + %span= t('statuses.poll.total_votes', count: poll.votes_count) + - else + %span= t('statuses.poll.total_people', count: poll.voters_count) - unless poll.expires_at.nil? · diff --git a/config/locales/en.yml b/config/locales/en.yml index dbdfe0ca03..82e20cb1fd 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1030,6 +1030,9 @@ en: private: Non-public toot cannot be pinned reblog: A boost cannot be pinned poll: + total_people: + one: "%{count} person" + other: "%{count} people" total_votes: one: "%{count} vote" other: "%{count} votes" diff --git a/db/migrate/20190927232842_add_voters_count_to_polls.rb b/db/migrate/20190927232842_add_voters_count_to_polls.rb new file mode 100644 index 0000000000..8463857009 --- /dev/null +++ b/db/migrate/20190927232842_add_voters_count_to_polls.rb @@ -0,0 +1,5 @@ +class AddVotersCountToPolls < ActiveRecord::Migration[5.2] + def change + add_column :polls, :voters_count, :bigint + end +end diff --git a/db/schema.rb b/db/schema.rb index 8eeaf48a08..557b777e01 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_27_124642) do +ActiveRecord::Schema.define(version: 2019_09_27_232842) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -529,6 +529,7 @@ ActiveRecord::Schema.define(version: 2019_09_27_124642) do t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "lock_version", default: 0, null: false + t.bigint "voters_count" t.index ["account_id"], name: "index_polls_on_account_id" t.index ["status_id"], name: "index_polls_on_status_id" end From 7fd54178d0ca7b2589fc44e24174b505801dddfb Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Mon, 30 Sep 2019 13:37:13 +0200 Subject: [PATCH 082/107] glitch-soc theme engine fixes for the challenges controller --- app/controllers/auth/challenges_controller.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/controllers/auth/challenges_controller.rb b/app/controllers/auth/challenges_controller.rb index 060944240a..41827b21c1 100644 --- a/app/controllers/auth/challenges_controller.rb +++ b/app/controllers/auth/challenges_controller.rb @@ -5,6 +5,7 @@ class Auth::ChallengesController < ApplicationController layout 'auth' + before_action :set_pack before_action :authenticate_user! skip_before_action :require_functional! @@ -19,4 +20,10 @@ class Auth::ChallengesController < ApplicationController render_challenge end end + + private + + def set_pack + use_pack 'auth' + end end From 40677e1793082c0535225198027af60921bee2ad Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 22 Jul 2019 10:48:50 +0200 Subject: [PATCH 083/107] [Glitch] Change unconfirmed user login behaviour Port SCSS changes from 964ae8eee593687f922c873fa7b378bb6e3e39bb Signed-off-by: Thibaut Girka --- .../flavours/glitch/styles/admin.scss | 58 +++++++++++-------- .../flavours/glitch/styles/forms.scss | 7 +++ 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss index 089ae68c0b..f4b913680f 100644 --- a/app/javascript/flavours/glitch/styles/admin.scss +++ b/app/javascript/flavours/glitch/styles/admin.scss @@ -204,29 +204,6 @@ $content-width: 840px; border: 0; } } - - .muted-hint { - color: $darker-text-color; - - a { - color: $highlight-text-color; - } - } - - .positive-hint { - color: $valid-value-color; - font-weight: 500; - } - - .negative-hint { - color: $error-value-color; - font-weight: 500; - } - - .neutral-hint { - color: $dark-text-color; - font-weight: 500; - } } @media screen and (max-width: $no-columns-breakpoint) { @@ -249,6 +226,41 @@ $content-width: 840px; } } +hr.spacer { + width: 100%; + border: 0; + margin: 20px 0; + height: 1px; +} + +.muted-hint { + color: $darker-text-color; + + a { + color: $highlight-text-color; + } +} + +.positive-hint { + color: $valid-value-color; + font-weight: 500; +} + +.negative-hint { + color: $error-value-color; + font-weight: 500; +} + +.neutral-hint { + color: $dark-text-color; + font-weight: 500; +} + +.warning-hint { + color: $gold-star; + font-weight: 500; +} + .filters { display: flex; flex-wrap: wrap; diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss index dae29a003f..14fb46c2c1 100644 --- a/app/javascript/flavours/glitch/styles/forms.scss +++ b/app/javascript/flavours/glitch/styles/forms.scss @@ -300,6 +300,13 @@ code { } } + .input.static .label_input__wrapper { + font-size: 16px; + padding: 10px; + border: 1px solid $dark-text-color; + border-radius: 4px; + } + input[type=text], input[type=number], input[type=email], From dd2a303a9b5404556873545bd20378549f50e386 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 18 Sep 2019 16:37:27 +0200 Subject: [PATCH 084/107] [Glitch] Add password challenge to 2FA settings, e-mail notifications Port SCSS changes from e1066cd4319a220d5be16e51ffaf5236a2f6e866 to glitch-soc Signed-off-by: Thibaut Girka --- .../flavours/glitch/styles/admin.scss | 43 ++++++++++--------- .../flavours/glitch/styles/forms.scss | 4 ++ 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss index f4b913680f..bdd6686f6c 100644 --- a/app/javascript/flavours/glitch/styles/admin.scss +++ b/app/javascript/flavours/glitch/styles/admin.scss @@ -233,32 +233,35 @@ hr.spacer { height: 1px; } -.muted-hint { - color: $darker-text-color; +body, +.admin-wrapper .content { + .muted-hint { + color: $darker-text-color; - a { - color: $highlight-text-color; + a { + color: $highlight-text-color; + } } -} -.positive-hint { - color: $valid-value-color; - font-weight: 500; -} + .positive-hint { + color: $valid-value-color; + font-weight: 500; + } -.negative-hint { - color: $error-value-color; - font-weight: 500; -} + .negative-hint { + color: $error-value-color; + font-weight: 500; + } -.neutral-hint { - color: $dark-text-color; - font-weight: 500; -} + .neutral-hint { + color: $dark-text-color; + font-weight: 500; + } -.warning-hint { - color: $gold-star; - font-weight: 500; + .warning-hint { + color: $gold-star; + font-weight: 500; + } } .filters { diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss index 14fb46c2c1..c93464cede 100644 --- a/app/javascript/flavours/glitch/styles/forms.scss +++ b/app/javascript/flavours/glitch/styles/forms.scss @@ -245,6 +245,10 @@ code { &-6 { max-width: 50%; } + + .actions { + margin-top: 27px; + } } .fields-group:last-child, From dbb8d9308bf7c78ac22c88365d3e2f7bd1789311 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 19 Sep 2019 11:09:05 +0200 Subject: [PATCH 085/107] [Glitch] Add table of contents to about page Port SCSS changes from d930eb88b671fa6e5573fe7342bcdda87501bdb7 to glitch-soc Signed-off-by: Thibaut Girka --- .../flavours/glitch/styles/about.scss | 150 ++++++++---------- .../flavours/glitch/styles/containers.scss | 62 ++++++++ .../flavours/glitch/styles/widgets.scss | 83 +++++++--- 3 files changed, 189 insertions(+), 106 deletions(-) diff --git a/app/javascript/flavours/glitch/styles/about.scss b/app/javascript/flavours/glitch/styles/about.scss index 0e910693dd..994e80280c 100644 --- a/app/javascript/flavours/glitch/styles/about.scss +++ b/app/javascript/flavours/glitch/styles/about.scss @@ -17,117 +17,86 @@ $small-breakpoint: 960px; .rich-formatting { font-family: $font-sans-serif, sans-serif; - font-size: 16px; + font-size: 14px; font-weight: 400; - font-size: 16px; - line-height: 30px; + line-height: 1.7; + word-wrap: break-word; color: $darker-text-color; - padding-right: 10px; a { color: $highlight-text-color; text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } } p, li { - font-family: $font-sans-serif, sans-serif; - font-size: 16px; - font-weight: 400; - font-size: 16px; - line-height: 30px; - margin-bottom: 12px; color: $darker-text-color; + } - a { - color: $highlight-text-color; - text-decoration: underline; - } + p { + margin-top: 0; + margin-bottom: .85em; &:last-child { margin-bottom: 0; } } - strong, - em { + strong { font-weight: 700; - color: lighten($darker-text-color, 10%); + color: $secondary-text-color; + } + + em { + font-style: italic; + color: $secondary-text-color; + } + + code { + font-size: 0.85em; + background: darken($ui-base-color, 8%); + border-radius: 4px; + padding: 0.2em 0.3em; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + font-family: $font-display, sans-serif; + margin-top: 1.275em; + margin-bottom: .85em; + font-weight: 500; + color: $secondary-text-color; } h1 { - font-family: $font-display, sans-serif; - font-size: 26px; - line-height: 30px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; - - small { - font-family: $font-sans-serif, sans-serif; - display: block; - font-size: 18px; - font-weight: 400; - color: lighten($darker-text-color, 10%); - } + font-size: 2em; } h2 { - font-family: $font-display, sans-serif; - font-size: 22px; - line-height: 26px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; + font-size: 1.75em; } h3 { - font-family: $font-display, sans-serif; - font-size: 18px; - line-height: 24px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; + font-size: 1.5em; } h4 { - font-family: $font-display, sans-serif; - font-size: 16px; - line-height: 24px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; - } - - h5 { - font-family: $font-display, sans-serif; - font-size: 14px; - line-height: 24px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; + font-size: 1.25em; } + h5, h6 { - font-family: $font-display, sans-serif; - font-size: 12px; - line-height: 24px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; - } - - ul, - ol { - margin-left: 20px; - - &[type='a'] { - list-style-type: lower-alpha; - } - - &[type='i'] { - list-style-type: lower-roman; - } + font-size: 1em; } ul { @@ -138,23 +107,38 @@ $small-breakpoint: 960px; list-style: decimal; } - li > ol, - li > ul { - margin-top: 6px; + ul, + ol { + margin: 0; + padding: 0; + padding-left: 2em; + margin-bottom: 0.85em; + + &[type='a'] { + list-style-type: lower-alpha; + } + + &[type='i'] { + list-style-type: lower-roman; + } } hr { width: 100%; height: 0; border: 0; - border-bottom: 1px solid rgba($ui-base-lighter-color, .6); - margin: 20px 0; + border-bottom: 1px solid lighten($ui-base-color, 4%); + margin: 1.7em 0; &.spacer { height: 1px; border: 0; } } + + & > :first-child { + margin-top: 0; + } } .information-board { @@ -418,7 +402,7 @@ $small-breakpoint: 960px; } &__call-to-action { - background: darken($ui-base-color, 4%); + background: $ui-base-color; border-radius: 4px; padding: 25px 40px; overflow: hidden; diff --git a/app/javascript/flavours/glitch/styles/containers.scss b/app/javascript/flavours/glitch/styles/containers.scss index 17455ca581..b391c5c3bb 100644 --- a/app/javascript/flavours/glitch/styles/containers.scss +++ b/app/javascript/flavours/glitch/styles/containers.scss @@ -143,6 +143,63 @@ grid-row: 3; } + @media screen and (max-width: $no-gap-breakpoint) { + grid-gap: 0; + grid-template-columns: minmax(0, 100%); + + .column-0 { + grid-column: 1; + } + + .column-1 { + grid-column: 1; + grid-row: 3; + } + + .column-2 { + grid-column: 1; + grid-row: 2; + } + + .column-3 { + grid-column: 1; + grid-row: 4; + } + } +} + +.grid-4 { + display: grid; + grid-gap: 10px; + grid-template-columns: 1fr 1fr 1fr 1fr; + grid-auto-columns: 25%; + grid-auto-rows: max-content; + + .column-0 { + grid-column: 1 / 5; + grid-row: 1; + } + + .column-1 { + grid-column: 1 / 4; + grid-row: 2; + } + + .column-2 { + grid-column: 4; + grid-row: 2; + } + + .column-3 { + grid-column: 2 / 5; + grid-row: 3; + } + + .column-4 { + grid-column: 1; + grid-row: 3; + } + .landing-page__call-to-action { min-height: 100%; } @@ -191,6 +248,11 @@ } .column-3 { + grid-column: 1; + grid-row: 5; + } + + .column-4 { grid-column: 1; grid-row: 4; } diff --git a/app/javascript/flavours/glitch/styles/widgets.scss b/app/javascript/flavours/glitch/styles/widgets.scss index 9e9c6eb587..a6f7fc0bec 100644 --- a/app/javascript/flavours/glitch/styles/widgets.scss +++ b/app/javascript/flavours/glitch/styles/widgets.scss @@ -128,41 +128,43 @@ margin-bottom: 10px; } -.contact-widget, -.landing-page__information.contact-widget { - box-sizing: border-box; - padding: 20px; - min-height: 100%; - border-radius: 4px; - background: $ui-base-color; - box-shadow: 0 0 15px rgba($base-shadow-color, 0.2); -} - .contact-widget { + min-height: 100%; font-size: 15px; color: $darker-text-color; line-height: 20px; word-wrap: break-word; font-weight: 400; + padding: 0; - strong { - font-weight: 500; + h4 { + padding: 10px; + text-transform: uppercase; + font-weight: 700; + font-size: 13px; + color: $darker-text-color; } - p { - margin-bottom: 10px; - - &:last-child { - margin-bottom: 0; - } + .account { + border-bottom: 0; + padding: 10px 0; + padding-top: 5px; } - &__mail { - margin-top: 10px; + & > a { + display: inline-block; + padding: 10px; + padding-top: 0; + color: $darker-text-color; + text-decoration: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; - a { - color: $primary-text-color; - text-decoration: none; + &:hover, + &:focus, + &:active { + text-decoration: underline; } } } @@ -557,3 +559,38 @@ $fluid-breakpoint: $maximum-width + 20px; } } } + +.table-of-contents { + background: darken($ui-base-color, 4%); + min-height: 100%; + font-size: 14px; + border-radius: 4px; + + li a { + display: block; + font-weight: 500; + padding: 15px; + overflow: hidden; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-decoration: none; + color: $primary-text-color; + border-bottom: 1px solid lighten($ui-base-color, 4%); + + &:hover, + &:focus, + &:active { + text-decoration: underline; + } + } + + li:last-child a { + border-bottom: 0; + } + + li ul { + padding-left: 20px; + border-bottom: 1px solid lighten($ui-base-color, 4%); + } +} From 6c8fefb0c9a0b968c7ab524b94a64056bf604823 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 19 Sep 2019 19:58:40 +0200 Subject: [PATCH 086/107] [Glitch] Fix placeholder colors for inputs not being explicitly defined Port b6df9c10671cd7bf48de3dbd7a94a92fb0a148ec to glitch-soc Signed-off-by: Thibaut Girka --- .../flavours/glitch/styles/_mixins.scss | 18 --------------- .../glitch/styles/components/accounts.scss | 22 +++++++++++++++++++ .../glitch/styles/components/composer.scss | 8 +++++++ .../glitch/styles/components/search.scss | 22 +++++++++++++++++++ .../flavours/glitch/styles/forms.scss | 4 ++++ 5 files changed, 56 insertions(+), 18 deletions(-) diff --git a/app/javascript/flavours/glitch/styles/_mixins.scss b/app/javascript/flavours/glitch/styles/_mixins.scss index d542b1083c..088b41e76a 100644 --- a/app/javascript/flavours/glitch/styles/_mixins.scss +++ b/app/javascript/flavours/glitch/styles/_mixins.scss @@ -62,24 +62,6 @@ color: $darker-text-color; font-size: 14px; margin: 0; - - &::-moz-focus-inner { - border: 0; - } - - &::-moz-focus-inner, - &:focus, - &:active { - outline: 0 !important; - } - - &:focus { - background: lighten($ui-base-color, 4%); - } - - @media screen and (max-width: 600px) { - font-size: 16px; - } } @mixin search-popout() { diff --git a/app/javascript/flavours/glitch/styles/components/accounts.scss b/app/javascript/flavours/glitch/styles/components/accounts.scss index dc49e083c5..b5a07239fd 100644 --- a/app/javascript/flavours/glitch/styles/components/accounts.scss +++ b/app/javascript/flavours/glitch/styles/components/accounts.scss @@ -245,6 +245,28 @@ .column-select { &__control { @include search-input(); + + &::placeholder { + color: lighten($darker-text-color, 4%); + } + + &::-moz-focus-inner { + border: 0; + } + + &::-moz-focus-inner, + &:focus, + &:active { + outline: 0 !important; + } + + &:focus { + background: lighten($ui-base-color, 4%); + } + + @media screen and (max-width: 600px) { + font-size: 16px; + } } &__placeholder { diff --git a/app/javascript/flavours/glitch/styles/components/composer.scss b/app/javascript/flavours/glitch/styles/components/composer.scss index 656615f4f2..4369749199 100644 --- a/app/javascript/flavours/glitch/styles/components/composer.scss +++ b/app/javascript/flavours/glitch/styles/components/composer.scss @@ -44,6 +44,10 @@ font-family: inherit; resize: vertical; + &::placeholder { + color: $dark-text-color; + } + &:focus { outline: 0 } @include single-column('screen and (max-width: 630px)') { font-size: 16px } } @@ -263,6 +267,10 @@ resize: none; scrollbar-color: initial; + &::placeholder { + color: $dark-text-color; + } + &::-webkit-scrollbar { all: unset; } diff --git a/app/javascript/flavours/glitch/styles/components/search.scss b/app/javascript/flavours/glitch/styles/components/search.scss index c3ea47eb03..30d69d05cc 100644 --- a/app/javascript/flavours/glitch/styles/components/search.scss +++ b/app/javascript/flavours/glitch/styles/components/search.scss @@ -10,6 +10,28 @@ padding-right: 30px; line-height: 18px; font-size: 16px; + + &::placeholder { + color: lighten($darker-text-color, 4%); + } + + &::-moz-focus-inner { + border: 0; + } + + &::-moz-focus-inner, + &:focus, + &:active { + outline: 0 !important; + } + + &:focus { + background: lighten($ui-base-color, 4%); + } + + @media screen and (max-width: 600px) { + font-size: 16px; + } } .search__icon { diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss index c93464cede..747c5309d7 100644 --- a/app/javascript/flavours/glitch/styles/forms.scss +++ b/app/javascript/flavours/glitch/styles/forms.scss @@ -329,6 +329,10 @@ code { border-radius: 4px; padding: 10px; + &::placeholder { + color: lighten($darker-text-color, 4%); + } + &:invalid { box-shadow: none; } From 27f922168ad828a990d2e73facc84935158df1a6 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 20 Sep 2019 10:52:14 +0200 Subject: [PATCH 087/107] [Glitch] Fix page body not being scrollable in admin layout Port SCSS changes from b9a8b38844278f26b9d1d1d53256e0781ba3575a to glitch-soc Signed-off-by: Thibaut Girka --- .../flavours/glitch/packs/public.js | 10 ++ .../flavours/glitch/styles/admin.scss | 138 +++++++++++++++--- .../flavours/glitch/styles/basics.scss | 3 - 3 files changed, 126 insertions(+), 25 deletions(-) diff --git a/app/javascript/flavours/glitch/packs/public.js b/app/javascript/flavours/glitch/packs/public.js index 019de2167e..5a15830df9 100644 --- a/app/javascript/flavours/glitch/packs/public.js +++ b/app/javascript/flavours/glitch/packs/public.js @@ -114,6 +114,16 @@ function main() { this.parentElement.parentElement.nextElementSibling.classList.toggle('hidden'); }); }); + + delegate(document, '.sidebar__toggle__icon', 'click', () => { + const target = document.querySelector('.sidebar ul'); + + if (target.style.display === 'block') { + target.style.display = 'none'; + } else { + target.style.display = 'block'; + } + }); } loadPolyfills().then(main).catch(error => { diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss index bdd6686f6c..1d25d01290 100644 --- a/app/javascript/flavours/glitch/styles/admin.scss +++ b/app/javascript/flavours/glitch/styles/admin.scss @@ -5,21 +5,66 @@ $content-width: 840px; .admin-wrapper { display: flex; justify-content: center; - height: 100%; + width: 100%; + min-height: 100vh; .sidebar-wrapper { - flex: 1 1 $sidebar-width; - height: 100%; - background: $ui-base-color; - display: flex; - justify-content: flex-end; + min-height: 100vh; + overflow: hidden; + pointer-events: none; + flex: 1 1 auto; + + &__inner { + display: flex; + justify-content: flex-end; + background: $ui-base-color; + height: 100%; + } } .sidebar { width: $sidebar-width; - height: 100%; padding: 0; - overflow-y: auto; + pointer-events: auto; + + &__toggle { + display: none; + background: lighten($ui-base-color, 8%); + height: 48px; + + &__logo { + flex: 1 1 auto; + + a { + display: inline-block; + padding: 15px; + } + + svg { + fill: $primary-text-color; + height: 20px; + position: relative; + bottom: -2px; + } + } + + &__icon { + display: block; + color: $darker-text-color; + text-decoration: none; + flex: 0 0 auto; + font-size: 20px; + padding: 15px; + } + + a { + &:hover, + &:focus, + &:active { + background: lighten($ui-base-color, 12%); + } + } + } .logo { display: block; @@ -52,6 +97,9 @@ $content-width: 840px; transition: all 200ms linear; transition-property: color, background-color; border-radius: 4px 0 0 4px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; i.fa { margin-right: 5px; @@ -99,12 +147,30 @@ $content-width: 840px; } .content-wrapper { - flex: 2 1 $content-width; - overflow: auto; + box-sizing: border-box; + width: 100%; + max-width: $content-width; + flex: 1 1 auto; + } + + @media screen and (max-width: $content-width + $sidebar-width) { + .sidebar-wrapper--empty { + display: none; + } + + .sidebar-wrapper { + width: $sidebar-width; + flex: 0 0 auto; + } + } + + @media screen and (max-width: $no-columns-breakpoint) { + .sidebar-wrapper { + width: 100%; + } } .content { - max-width: $content-width; padding: 20px 15px; padding-top: 60px; padding-left: 25px; @@ -123,6 +189,12 @@ $content-width: 840px; padding-bottom: 40px; border-bottom: 1px solid lighten($ui-base-color, 8%); margin-bottom: 40px; + + @media screen and (max-width: $no-columns-breakpoint) { + border-bottom: 0; + padding-bottom: 0; + font-weight: 700; + } } h3 { @@ -147,7 +219,7 @@ $content-width: 840px; font-size: 16px; color: $secondary-text-color; line-height: 28px; - font-weight: 400; + font-weight: 500; } .fields-group h6 { @@ -176,7 +248,7 @@ $content-width: 840px; & > p { font-size: 14px; - line-height: 18px; + line-height: 21px; color: $secondary-text-color; margin-bottom: 20px; @@ -208,20 +280,42 @@ $content-width: 840px; @media screen and (max-width: $no-columns-breakpoint) { display: block; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - .sidebar-wrapper, - .content-wrapper { - flex: 0 0 auto; - height: auto; - overflow: initial; + .sidebar-wrapper { + min-height: 0; } .sidebar { width: 100%; padding: 0; height: auto; + + &__toggle { + display: flex; + } + + & > ul { + display: none; + } + + ul a, + ul ul a { + border-radius: 0; + border-bottom: 1px solid lighten($ui-base-color, 4%); + transition: none; + + &:hover { + transition: none; + } + } + + ul ul { + border-radius: 0; + } + + ul .simple-navigation-active-leaf a { + border-bottom-color: $ui-highlight-color; + } } } } @@ -270,10 +364,10 @@ body, .filter-subset { flex: 0 0 auto; - margin: 0 40px 10px 0; + margin: 0 40px 20px 0; &:last-child { - margin-bottom: 20px; + margin-bottom: 30px; } ul { diff --git a/app/javascript/flavours/glitch/styles/basics.scss b/app/javascript/flavours/glitch/styles/basics.scss index 4de3955a61..64e543b78e 100644 --- a/app/javascript/flavours/glitch/styles/basics.scss +++ b/app/javascript/flavours/glitch/styles/basics.scss @@ -74,9 +74,6 @@ body { &.admin { background: darken($ui-base-color, 4%); - position: fixed; - width: 100%; - height: 100%; padding: 0; } From 2441d07cd5d62aeea7bfa76f5ea4294e863b4bf9 Mon Sep 17 00:00:00 2001 From: Jeong Arm Date: Sun, 22 Sep 2019 19:58:29 +0900 Subject: [PATCH 088/107] [Glitch] Fix ugly TOC when title is too long Port 26b810561a5b7cfd1766699358d998b5882a5876 to glitch-soc Signed-off-by: Thibaut Girka --- app/javascript/flavours/glitch/styles/containers.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/styles/containers.scss b/app/javascript/flavours/glitch/styles/containers.scss index b391c5c3bb..6a48ff3549 100644 --- a/app/javascript/flavours/glitch/styles/containers.scss +++ b/app/javascript/flavours/glitch/styles/containers.scss @@ -171,7 +171,7 @@ .grid-4 { display: grid; grid-gap: 10px; - grid-template-columns: 1fr 1fr 1fr 1fr; + grid-template-columns: repeat(4, minmax(0, 1fr)); grid-auto-columns: 25%; grid-auto-rows: max-content; From e25b7feb72d0abc5e411fd32749c968041ade182 Mon Sep 17 00:00:00 2001 From: ThibG Date: Sun, 22 Sep 2019 14:15:18 +0200 Subject: [PATCH 089/107] [Glitch] Show user what options they have voted Port front-end changes from b359974d9b356bb723fe046466b178328cf9bbaf to glitch-soc Signed-off-by: Thibaut Girka --- .../flavours/glitch/actions/importer/normalizer.js | 3 ++- app/javascript/flavours/glitch/components/poll.js | 7 ++++++- app/javascript/flavours/glitch/styles/polls.scss | 10 ++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/javascript/flavours/glitch/actions/importer/normalizer.js b/app/javascript/flavours/glitch/actions/importer/normalizer.js index 52d85c059c..b35c4d7bd4 100644 --- a/app/javascript/flavours/glitch/actions/importer/normalizer.js +++ b/app/javascript/flavours/glitch/actions/importer/normalizer.js @@ -71,8 +71,9 @@ export function normalizePoll(poll) { const emojiMap = makeEmojiMap(normalPoll); - normalPoll.options = poll.options.map(option => ({ + normalPoll.options = poll.options.map((option, index) => ({ ...option, + voted: poll.own_votes && poll.own_votes.includes(index), title_emojified: emojify(escapeTextContentForBrowser(option.title), emojiMap), })); diff --git a/app/javascript/flavours/glitch/components/poll.js b/app/javascript/flavours/glitch/components/poll.js index 905aa54c13..e6cc809e06 100644 --- a/app/javascript/flavours/glitch/components/poll.js +++ b/app/javascript/flavours/glitch/components/poll.js @@ -10,6 +10,7 @@ import spring from 'react-motion/lib/spring'; import escapeTextContentForBrowser from 'escape-html'; import emojify from 'flavours/glitch/util/emoji'; import RelativeTimestamp from './relative_timestamp'; +import Icon from 'flavours/glitch/components/icon'; const messages = defineMessages({ closed: { id: 'poll.closed', defaultMessage: 'Closed' }, @@ -103,6 +104,7 @@ class Poll extends ImmutablePureComponent { 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 active = !!this.state.selected[`${optionIndex}`]; + const voted = option.get('voted') || (poll.get('own_votes') && poll.get('own_votes').includes(optionIndex)); let titleEmojified = option.get('title_emojified'); if (!titleEmojified) { @@ -131,7 +133,10 @@ class Poll extends ImmutablePureComponent { /> {!showResults && } - {showResults && {Math.round(percent)}%} + {showResults && + {!!voted && } + {Math.round(percent)}% + } diff --git a/app/javascript/flavours/glitch/styles/polls.scss b/app/javascript/flavours/glitch/styles/polls.scss index 06f60408dc..d1f69cd690 100644 --- a/app/javascript/flavours/glitch/styles/polls.scss +++ b/app/javascript/flavours/glitch/styles/polls.scss @@ -102,13 +102,19 @@ &__number { display: inline-block; - width: 36px; + width: 48px; font-weight: 700; padding: 0 10px; text-align: right; margin-top: auto; margin-bottom: auto; - flex: 0 0 36px; + flex: 0 0 48px; + } + + &__vote__mark { + float: left; + color: $valid-value-color; + line-height: 18px; } &__footer { From 5c9ba9177a87d007135b63f79ded4329c49083e2 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 23 Sep 2019 00:48:31 +0200 Subject: [PATCH 090/107] [Glitch] Revert "Change timelines to add new items to pending items when scrolled down #11867" Port 8c4b5f7cef60700af7ae64c7b524d899a1d033c5 to glitch-soc Signed-off-by: Thibaut Girka --- app/javascript/flavours/glitch/reducers/notifications.js | 4 ++-- app/javascript/flavours/glitch/reducers/timelines.js | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/javascript/flavours/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js index 8dc7a4aba3..8d5c6785c5 100644 --- a/app/javascript/flavours/glitch/reducers/notifications.js +++ b/app/javascript/flavours/glitch/reducers/notifications.js @@ -52,7 +52,7 @@ const notificationToMap = (state, notification) => ImmutableMap({ const normalizeNotification = (state, notification, usePendingItems) => { const top = !shouldCountUnreadNotifications(state); - if (usePendingItems || !top || !state.get('pendingItems').isEmpty()) { + if (usePendingItems || !state.get('pendingItems').isEmpty()) { return state.update('pendingItems', list => list.unshift(notificationToMap(state, notification))).update('unread', unread => unread + 1); } @@ -82,7 +82,7 @@ const expandNormalizedNotifications = (state, notifications, next, isLoadingRece return state.withMutations(mutable => { if (!items.isEmpty()) { - usePendingItems = isLoadingRecent && (usePendingItems || !mutable.get('top') || !mutable.get('pendingItems').isEmpty()); + usePendingItems = isLoadingRecent && (usePendingItems || !mutable.get('pendingItems').isEmpty()); mutable.update(usePendingItems ? 'pendingItems' : 'items', list => { const lastIndex = 1 + list.findLastIndex( diff --git a/app/javascript/flavours/glitch/reducers/timelines.js b/app/javascript/flavours/glitch/reducers/timelines.js index e6bef18e99..df88a6c23e 100644 --- a/app/javascript/flavours/glitch/reducers/timelines.js +++ b/app/javascript/flavours/glitch/reducers/timelines.js @@ -40,7 +40,8 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is if (timeline.endsWith(':pinned')) { mMap.set('items', statuses.map(status => status.get('id'))); } else if (!statuses.isEmpty()) { - usePendingItems = isLoadingRecent && (usePendingItems || !mMap.get('top') || !mMap.get('pendingItems').isEmpty()); + usePendingItems = isLoadingRecent && (usePendingItems || !mMap.get('pendingItems').isEmpty()); + mMap.update(usePendingItems ? 'pendingItems' : 'items', ImmutableList(), oldIds => { const newIds = statuses.map(status => status.get('id')); const lastIndex = oldIds.findLastIndex(id => id !== null && compareId(id, newIds.last()) >= 0) + 1; @@ -62,7 +63,7 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is const updateTimeline = (state, timeline, status, usePendingItems) => { const top = state.getIn([timeline, 'top']); - if (usePendingItems || !top || !state.getIn([timeline, 'pendingItems']).isEmpty()) { + if (usePendingItems || !state.getIn([timeline, 'pendingItems']).isEmpty()) { if (state.getIn([timeline, 'pendingItems'], ImmutableList()).includes(status.get('id')) || state.getIn([timeline, 'items'], ImmutableList()).includes(status.get('id'))) { return state; } From 4b7c436ae9f2d8bcd274252a41c195f44da5ee26 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 23 Sep 2019 00:48:43 +0200 Subject: [PATCH 091/107] [Glitch] Fix emoji search not showing custom emoji when none are uncategorized Port 0d2b60ab8b13a28e99a83e1104e7208de2025304 to glitch-soc Signed-off-by: Thibaut Girka --- app/javascript/flavours/glitch/util/emoji/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/util/emoji/index.js b/app/javascript/flavours/glitch/util/emoji/index.js index b2d13cc959..e1a244127d 100644 --- a/app/javascript/flavours/glitch/util/emoji/index.js +++ b/app/javascript/flavours/glitch/util/emoji/index.js @@ -100,4 +100,4 @@ export const buildCustomEmojis = (customEmojis) => { return emojis; }; -export const categoriesFromEmojis = customEmojis => customEmojis.reduce((set, emoji) => set.add(emoji.get('category') ? `custom-${emoji.get('category')}` : 'custom'), new Set()); +export const categoriesFromEmojis = customEmojis => customEmojis.reduce((set, emoji) => set.add(emoji.get('category') ? `custom-${emoji.get('category')}` : 'custom'), new Set(['custom'])); From 74af56b9cd269ce431b9fbfa85901e5bfe773161 Mon Sep 17 00:00:00 2001 From: ThibG Date: Fri, 27 Sep 2019 02:16:11 +0200 Subject: [PATCH 092/107] [Glitch] Use blob URL for Tesseract to avoid CORS issues Port 7baedcb61e15200478f3ad6deb96d452cd63499a to glitch-soc Signed-off-by: Thibaut Girka --- app/javascript/flavours/glitch/actions/compose.js | 5 +++-- .../features/ui/components/focal_point_modal.js | 12 +++++++++++- app/javascript/flavours/glitch/reducers/compose.js | 6 +++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index e1da037451..69cf65b5a9 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -261,7 +261,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))); }; }; @@ -316,10 +316,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/flavours/glitch/features/ui/components/focal_point_modal.js b/app/javascript/flavours/glitch/features/ui/components/focal_point_modal.js index 8bded391a8..d5c9e66aeb 100644 --- a/app/javascript/flavours/glitch/features/ui/components/focal_point_modal.js +++ b/app/javascript/flavours/glitch/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/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js index adad205c07..3699ec1ad0 100644 --- a/app/javascript/flavours/glitch/reducers/compose.js +++ b/app/javascript/flavours/glitch/reducers/compose.js @@ -190,11 +190,11 @@ function continueThread (state, status) { }); } -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()); @@ -422,7 +422,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 0349c4d1cfd26b5d4c70990c0a1b7ddb9d6b6d60 Mon Sep 17 00:00:00 2001 From: ThibG Date: Fri, 27 Sep 2019 15:22:11 +0200 Subject: [PATCH 093/107] [Glitch] Avoid storing audio and video file data in memory Port 860a77d45ee9d17117364868f0932b4fcbe07d3d to glitch-soc Signed-off-by: Thibaut Girka --- app/javascript/flavours/glitch/reducers/compose.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js index 3699ec1ad0..17ce5de3cc 100644 --- a/app/javascript/flavours/glitch/reducers/compose.js +++ b/app/javascript/flavours/glitch/reducers/compose.js @@ -194,7 +194,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 8a63d659acea217abc3dbfc5b9b277ac77f648df Mon Sep 17 00:00:00 2001 From: ThibG Date: Fri, 27 Sep 2019 21:13:51 +0200 Subject: [PATCH 094/107] [Glitch] Change silences to always require approval on follow Port front-end changes from 18b451c0e6cf6a927a22084f94b423982de0ee8b to glitch-soc Signed-off-by: Thibaut Girka --- .../flavours/glitch/features/getting_started/index.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/javascript/flavours/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js index 68b5209dcd..a5095fbd99 100644 --- a/app/javascript/flavours/glitch/features/getting_started/index.js +++ b/app/javascript/flavours/glitch/features/getting_started/index.js @@ -104,16 +104,14 @@ const NAVIGATION_PANEL_BREAKPOINT = 600 + (285 * 2) + (10 * 2); } 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 () { @@ -148,7 +146,7 @@ const NAVIGATION_PANEL_BREAKPOINT = 600 + (285 * 2) + (10 * 2); navItems.push(); } - if (myAccount.get('locked')) { + if (myAccount.get('locked') || unreadFollowRequests > 0) { navItems.push(); } From 98cc81c0e28144eda90a2d18198e7708b5e3d4b7 Mon Sep 17 00:00:00 2001 From: ThibG Date: Sat, 28 Sep 2019 19:41:36 +0200 Subject: [PATCH 095/107] [Glitch] Fix vote checkmark in poll results Port b0cda7a504655f6ced33802af67cabb6f3e46e19 to glitch-soc Signed-off-by: Thibaut Girka --- app/javascript/flavours/glitch/components/poll.js | 13 +++++++------ app/javascript/flavours/glitch/styles/polls.scss | 6 +++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/javascript/flavours/glitch/components/poll.js b/app/javascript/flavours/glitch/components/poll.js index e6cc809e06..2128bff611 100644 --- a/app/javascript/flavours/glitch/components/poll.js +++ b/app/javascript/flavours/glitch/components/poll.js @@ -14,6 +14,7 @@ import Icon from 'flavours/glitch/components/icon'; const messages = defineMessages({ closed: { id: 'poll.closed', defaultMessage: 'Closed' }, + voted: { id: 'poll.voted', defaultMessage: 'You voted for this answer', description: 'Tooltip of the "voted" checkmark in polls' }, }); const makeEmojiMap = record => record.get('emojis').reduce((obj, emoji) => { @@ -100,11 +101,11 @@ class Poll extends ImmutablePureComponent { }; renderOption (option, optionIndex, showResults) { - const { poll, disabled } = 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 active = !!this.state.selected[`${optionIndex}`]; - const voted = option.get('voted') || (poll.get('own_votes') && poll.get('own_votes').includes(optionIndex)); + 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 active = !!this.state.selected[`${optionIndex}`]; + const voted = option.get('voted') || (poll.get('own_votes') && poll.get('own_votes').includes(optionIndex)); let titleEmojified = option.get('title_emojified'); if (!titleEmojified) { @@ -134,7 +135,7 @@ class Poll extends ImmutablePureComponent { {!showResults && } {showResults && - {!!voted && } + {!!voted && } {Math.round(percent)}% } diff --git a/app/javascript/flavours/glitch/styles/polls.scss b/app/javascript/flavours/glitch/styles/polls.scss index d1f69cd690..95d8e510c5 100644 --- a/app/javascript/flavours/glitch/styles/polls.scss +++ b/app/javascript/flavours/glitch/styles/polls.scss @@ -102,18 +102,18 @@ &__number { display: inline-block; - width: 48px; + width: 52px; font-weight: 700; padding: 0 10px; + padding-left: 8px; text-align: right; margin-top: auto; margin-bottom: auto; - flex: 0 0 48px; + flex: 0 0 52px; } &__vote__mark { float: left; - color: $valid-value-color; line-height: 18px; } From 15973b77d6c7fc071e00c59713bff831ffb10bdb Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 29 Sep 2019 16:23:01 +0200 Subject: [PATCH 096/107] [Glitch] Fix public list of domain blocks being too verbose on about page Port SCSS from bd9685f7980838ecc675af20cf52ef1e686d98d6 to glitch-soc Signed-off-by: Thibaut Girka --- .../flavours/glitch/styles/about.scss | 41 ++++++++++++ .../flavours/glitch/styles/tables.scss | 67 ------------------- 2 files changed, 41 insertions(+), 67 deletions(-) diff --git a/app/javascript/flavours/glitch/styles/about.scss b/app/javascript/flavours/glitch/styles/about.scss index 994e80280c..7c129674d1 100644 --- a/app/javascript/flavours/glitch/styles/about.scss +++ b/app/javascript/flavours/glitch/styles/about.scss @@ -136,6 +136,47 @@ $small-breakpoint: 960px; } } + table { + width: 100%; + border-collapse: collapse; + break-inside: auto; + margin-top: 24px; + margin-bottom: 32px; + + thead tr, + tbody tr { + break-after: auto; + break-inside: avoid; + border-bottom: 1px solid lighten($ui-base-color, 4%); + font-size: 1em; + line-height: 1.625; + font-weight: 400; + text-align: left; + color: $darker-text-color; + } + + thead tr { + border-bottom-width: 2px; + line-height: 1.5; + font-weight: 500; + color: $dark-text-color; + } + + th, + td { + padding: 8px; + align-self: start; + align-items: start; + + &.nowrap { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 25%; + } + } + } + & > :first-child { margin-top: 0; } diff --git a/app/javascript/flavours/glitch/styles/tables.scss b/app/javascript/flavours/glitch/styles/tables.scss index 669f72787d..b84f6a708d 100644 --- a/app/javascript/flavours/glitch/styles/tables.scss +++ b/app/javascript/flavours/glitch/styles/tables.scss @@ -288,70 +288,3 @@ a.table-action-link { } } } - -.blocks-table { - width: 100%; - max-width: 100%; - border-spacing: 0; - border-collapse: collapse; - table-layout: fixed; - border: 1px solid darken($ui-base-color, 8%); - - thead { - border: 1px solid darken($ui-base-color, 8%); - background: darken($ui-base-color, 4%); - font-weight: 500; - - th.severity-column { - width: 120px; - } - - th.button-column { - width: 23px; - } - } - - tbody > tr { - border: 1px solid darken($ui-base-color, 8%); - border-bottom: 0; - background: darken($ui-base-color, 4%); - - &:hover { - background: darken($ui-base-color, 2%); - } - - &.even { - background: $ui-base-color; - - &:hover { - background: lighten($ui-base-color, 2%); - } - } - - &.rationale { - background: lighten($ui-base-color, 4%); - border-top: 0; - - &:hover { - background: lighten($ui-base-color, 6%); - } - - &.hidden { - display: none; - } - } - - td:first-child { - overflow: hidden; - text-overflow: ellipsis; - } - } - - th, - td { - padding: 8px; - line-height: 18px; - vertical-align: top; - text-align: left; - } -} From a2bf1f9f5698f5fb06267d9708e2d356a2a7786f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 29 Sep 2019 16:27:00 +0200 Subject: [PATCH 097/107] [Glitch] Fix follower/following lists resetting on back-navigation in web UI Port 9683e1dcf8bbddb07b818960abf254248be3575c to glitch-soc Signed-off-by: Thibaut Girka --- app/javascript/flavours/glitch/features/favourites/index.js | 4 +++- app/javascript/flavours/glitch/features/followers/index.js | 6 ++++-- app/javascript/flavours/glitch/features/following/index.js | 6 ++++-- app/javascript/flavours/glitch/features/reblogs/index.js | 4 +++- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/javascript/flavours/glitch/features/favourites/index.js b/app/javascript/flavours/glitch/features/favourites/index.js index 5c33c8677b..7afadf12ee 100644 --- a/app/javascript/flavours/glitch/features/favourites/index.js +++ b/app/javascript/flavours/glitch/features/favourites/index.js @@ -31,7 +31,9 @@ class Favourites extends ImmutablePureComponent { }; componentWillMount () { - this.props.dispatch(fetchFavourites(this.props.params.statusId)); + if (!this.props.accountIds) { + this.props.dispatch(fetchFavourites(this.props.params.statusId)); + } } componentWillReceiveProps (nextProps) { diff --git a/app/javascript/flavours/glitch/features/followers/index.js b/app/javascript/flavours/glitch/features/followers/index.js index b12efa7749..2bd0e6e2f4 100644 --- a/app/javascript/flavours/glitch/features/followers/index.js +++ b/app/javascript/flavours/glitch/features/followers/index.js @@ -36,8 +36,10 @@ class Followers extends ImmutablePureComponent { }; componentWillMount () { - this.props.dispatch(fetchAccount(this.props.params.accountId)); - this.props.dispatch(fetchFollowers(this.props.params.accountId)); + if (!this.props.accountIds) { + this.props.dispatch(fetchAccount(this.props.params.accountId)); + this.props.dispatch(fetchFollowers(this.props.params.accountId)); + } } componentWillReceiveProps (nextProps) { diff --git a/app/javascript/flavours/glitch/features/following/index.js b/app/javascript/flavours/glitch/features/following/index.js index 9ea008e614..f03da0c941 100644 --- a/app/javascript/flavours/glitch/features/following/index.js +++ b/app/javascript/flavours/glitch/features/following/index.js @@ -36,8 +36,10 @@ class Following extends ImmutablePureComponent { }; componentWillMount () { - this.props.dispatch(fetchAccount(this.props.params.accountId)); - this.props.dispatch(fetchFollowing(this.props.params.accountId)); + if (!this.props.accountIds) { + this.props.dispatch(fetchAccount(this.props.params.accountId)); + this.props.dispatch(fetchFollowing(this.props.params.accountId)); + } } componentWillReceiveProps (nextProps) { diff --git a/app/javascript/flavours/glitch/features/reblogs/index.js b/app/javascript/flavours/glitch/features/reblogs/index.js index 1fc26b0d79..a8e9db7f5a 100644 --- a/app/javascript/flavours/glitch/features/reblogs/index.js +++ b/app/javascript/flavours/glitch/features/reblogs/index.js @@ -31,7 +31,9 @@ class Reblogs extends ImmutablePureComponent { }; componentWillMount () { - this.props.dispatch(fetchReblogs(this.props.params.statusId)); + if (!this.props.accountIds) { + this.props.dispatch(fetchReblogs(this.props.params.statusId)); + } } componentWillReceiveProps(nextProps) { From ec244f6c883181275329bc8a5dda526cc9e90628 Mon Sep 17 00:00:00 2001 From: trwnh Date: Sun, 29 Sep 2019 09:54:24 -0500 Subject: [PATCH 098/107] [Glitch] Fix muted text color not applying to all text Port d51201a75ac47ac90615ee8987534c5772274779 to glitch-soc Signed-off-by: Thibaut Girka --- app/javascript/flavours/glitch/styles/components/status.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss index 24ab719691..ae89ac0a84 100644 --- a/app/javascript/flavours/glitch/styles/components/status.scss +++ b/app/javascript/flavours/glitch/styles/components/status.scss @@ -673,6 +673,7 @@ a.status__display-name, } .muted { + .status__content, .status__content p, .status__content a, .status__content__text { From 332be562eab78975fdbf1e928cddbe7528d93468 Mon Sep 17 00:00:00 2001 From: ThibG Date: Sun, 29 Sep 2019 21:23:40 +0200 Subject: [PATCH 099/107] [Glitch] Change vote results to display ex-aequo leading options as leading Port 15b3eeb326d7e6a026235ece25c3be75250de92f to glitch-soc Signed-off-by: Thibaut Girka --- app/javascript/flavours/glitch/components/poll.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/components/poll.js b/app/javascript/flavours/glitch/components/poll.js index 2128bff611..b431d2d8d1 100644 --- a/app/javascript/flavours/glitch/components/poll.js +++ b/app/javascript/flavours/glitch/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 88481c965334e28615b353253380255973f4aaa5 Mon Sep 17 00:00:00 2001 From: ThibG Date: Sun, 29 Sep 2019 21:46:05 +0200 Subject: [PATCH 100/107] [Glitch] Add explanation to mute dialog, refactor and clean up mute/block UI Port 9027bfff0c25a6da1bcef7ce880e5d8211062d1d to glitch-soc Signed-off-by: Thibaut Girka --- .../flavours/glitch/actions/blocks.js | 14 +++ .../glitch/containers/status_container.js | 16 +-- .../containers/header_container.js | 15 +-- .../containers/detailed_status_container.js | 18 +-- .../flavours/glitch/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 ++- .../flavours/glitch/reducers/blocks.js | 22 ++++ .../flavours/glitch/reducers/index.js | 2 + .../flavours/glitch/reducers/mutes.js | 2 - .../glitch/styles/components/modal.scss | 73 +++++++++---- .../glitch/styles/mastodon-light/diff.scss | 2 + .../flavours/glitch/util/async-components.js | 4 + 14 files changed, 221 insertions(+), 87 deletions(-) create mode 100644 app/javascript/flavours/glitch/features/ui/components/block_modal.js create mode 100644 app/javascript/flavours/glitch/reducers/blocks.js diff --git a/app/javascript/flavours/glitch/actions/blocks.js b/app/javascript/flavours/glitch/actions/blocks.js index 498ce519fb..adae9d83c2 100644 --- a/app/javascript/flavours/glitch/actions/blocks.js +++ b/app/javascript/flavours/glitch/actions/blocks.js @@ -1,6 +1,7 @@ import api, { getLinks } from 'flavours/glitch/util/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/flavours/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js index 15eb4f85f0..647ddf2764 100644 --- a/app/javascript/flavours/glitch/containers/status_container.js +++ b/app/javascript/flavours/glitch/containers/status_container.js @@ -1,4 +1,3 @@ -import React from 'react'; import { connect } from 'react-redux'; import Status from 'flavours/glitch/components/status'; import { List as ImmutableList } from 'immutable'; @@ -18,9 +17,9 @@ import { pin, unpin, } from 'flavours/glitch/actions/interactions'; -import { blockAccount } from 'flavours/glitch/actions/accounts'; import { muteStatus, unmuteStatus, deleteStatus } from 'flavours/glitch/actions/statuses'; import { initMuteModal } from 'flavours/glitch/actions/mutes'; +import { initBlockModal } from 'flavours/glitch/actions/blocks'; import { initReport } from 'flavours/glitch/actions/reports'; import { openModal } from 'flavours/glitch/actions/modal'; import { changeLocalSetting } from 'flavours/glitch/actions/local_settings'; @@ -37,10 +36,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? You will lose all replies, boosts and favourites to it.' }, - 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' }, unfilterConfirm: { id: 'confirmations.unfilter.confirm', defaultMessage: 'Show' }, author: { id: 'confirmations.unfilter.author', defaultMessage: 'Author' }, matchingFilters: { id: 'confirmations.unfilter.filters', defaultMessage: 'Matching {count, plural, one {filter} other {filters}}' }, @@ -186,16 +183,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ 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)); }, onUnfilter (status, onConfirm) { diff --git a/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js index 787a366582..fff5e097f7 100644 --- a/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js +++ b/app/javascript/flavours/glitch/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 'flavours/glitch/actions/compose'; import { initMuteModal } from 'flavours/glitch/actions/mutes'; +import { initBlockModal } from 'flavours/glitch/actions/blocks'; import { initReport } from 'flavours/glitch/actions/reports'; import { openModal } from 'flavours/glitch/actions/modal'; import { blockDomain, unblockDomain } from 'flavours/glitch/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/flavours/glitch/features/status/containers/detailed_status_container.js b/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js index e6c3905371..e718033284 100644 --- a/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js +++ b/app/javascript/flavours/glitch/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 'flavours/glitch/selectors'; @@ -15,7 +14,6 @@ import { pin, unpin, } from 'flavours/glitch/actions/interactions'; -import { blockAccount } from 'flavours/glitch/actions/accounts'; import { muteStatus, unmuteStatus, @@ -24,9 +22,10 @@ import { revealStatus, } from 'flavours/glitch/actions/statuses'; import { initMuteModal } from 'flavours/glitch/actions/mutes'; +import { initBlockModal } from 'flavours/glitch/actions/blocks'; import { initReport } from 'flavours/glitch/actions/reports'; import { openModal } from 'flavours/glitch/actions/modal'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, injectIntl } from 'react-intl'; import { boostModal, deleteModal } from 'flavours/glitch/util/initial_state'; import { showAlertForError } from 'flavours/glitch/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 = () => { @@ -139,16 +136,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/flavours/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js index e91ab5f3aa..dd17823ada 100644 --- a/app/javascript/flavours/glitch/features/status/index.js +++ b/app/javascript/flavours/glitch/features/status/index.js @@ -26,9 +26,9 @@ import { directCompose, } from 'flavours/glitch/actions/compose'; import { changeLocalSetting } from 'flavours/glitch/actions/local_settings'; -import { blockAccount } from 'flavours/glitch/actions/accounts'; import { muteStatus, unmuteStatus, deleteStatus } from 'flavours/glitch/actions/statuses'; import { initMuteModal } from 'flavours/glitch/actions/mutes'; +import { initBlockModal } from 'flavours/glitch/actions/blocks'; import { initReport } from 'flavours/glitch/actions/reports'; import { makeGetStatus } from 'flavours/glitch/selectors'; import { ScrollContainer } from 'react-router-scroll-4'; @@ -36,7 +36,7 @@ import ColumnBackButton from 'flavours/glitch/components/column_back_button'; import ColumnHeader from '../../components/column_header'; import StatusContainer from 'flavours/glitch/containers/status_container'; import { openModal } from 'flavours/glitch/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, favouriteModal, deleteModal } from 'flavours/glitch/util/initial_state'; @@ -50,13 +50,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? You will lose all replies, boosts and favourites to it.' }, - 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' }, tootHeading: { id: 'column.toot', defaultMessage: 'Toots and replies' }, }); @@ -339,19 +337,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/flavours/glitch/features/ui/components/block_modal.js b/app/javascript/flavours/glitch/features/ui/components/block_modal.js new file mode 100644 index 0000000000..a07baeaa64 --- /dev/null +++ b/app/javascript/flavours/glitch/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 ( +
+
+

+ @{account.get('acct')} }} + /> +

+
+ +
+ + + +
+
+ ); + } + +} diff --git a/app/javascript/flavours/glitch/features/ui/components/modal_root.js b/app/javascript/flavours/glitch/features/ui/components/modal_root.js index 303e05db66..0941ce9c84 100644 --- a/app/javascript/flavours/glitch/features/ui/components/modal_root.js +++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.js @@ -15,6 +15,7 @@ import FocalPointModal from './focal_point_modal'; import { OnboardingModal, MuteModal, + BlockModal, ReportModal, SettingsModal, EmbedModal, @@ -32,6 +33,7 @@ const MODAL_COMPONENTS = { 'DOODLE': () => Promise.resolve({ default: DoodleModal }), 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }), 'MUTE': MuteModal, + 'BLOCK': BlockModal, 'REPORT': ReportModal, 'SETTINGS': SettingsModal, 'ACTIONS': () => Promise.resolve({ default: ActionsModal }), diff --git a/app/javascript/flavours/glitch/features/ui/components/mute_modal.js b/app/javascript/flavours/glitch/features/ui/components/mute_modal.js index 3492eca697..dec6413c3c 100644 --- a/app/javascript/flavours/glitch/features/ui/components/mute_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/mute_modal.js @@ -11,7 +11,6 @@ import { toggleHideNotifications } from 'flavours/glitch/actions/mutes'; const mapStateToProps = state => { return { - isSubmitting: state.getIn(['reports', 'new', 'isSubmitting']), account: state.getIn(['mutes', 'new', 'account']), notifications: state.getIn(['mutes', 'new', 'notifications']), }; @@ -38,7 +37,6 @@ export default @connect(mapStateToProps, mapDispatchToProps) class MuteModal extends React.PureComponent { static propTypes = { - isSubmitting: PropTypes.bool.isRequired, account: PropTypes.object.isRequired, notifications: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, @@ -81,11 +79,16 @@ class MuteModal extends React.PureComponent { values={{ name: @{account.get('acct')} }} />

-
-
diff --git a/app/javascript/flavours/glitch/reducers/blocks.js b/app/javascript/flavours/glitch/reducers/blocks.js new file mode 100644 index 0000000000..1b65071634 --- /dev/null +++ b/app/javascript/flavours/glitch/reducers/blocks.js @@ -0,0 +1,22 @@ +import Immutable from 'immutable'; + +import { + BLOCKS_INIT_MODAL, +} from '../actions/blocks'; + +const initialState = Immutable.Map({ + new: Immutable.Map({ + account_id: null, + }), +}); + +export default function mutes(state = initialState, action) { + switch (action.type) { + case BLOCKS_INIT_MODAL: + return state.withMutations((state) => { + state.setIn(['new', 'account_id'], action.account.get('id')); + }); + default: + return state; + } +} diff --git a/app/javascript/flavours/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js index b035901947..7dbca3a29a 100644 --- a/app/javascript/flavours/glitch/reducers/index.js +++ b/app/javascript/flavours/glitch/reducers/index.js @@ -16,6 +16,7 @@ import local_settings from './local_settings'; import push_notifications from './push_notifications'; import status_lists from './status_lists'; import mutes from './mutes'; +import blocks from './blocks'; import reports from './reports'; import contexts from './contexts'; import compose from './compose'; @@ -53,6 +54,7 @@ const reducers = { local_settings, push_notifications, mutes, + blocks, reports, contexts, compose, diff --git a/app/javascript/flavours/glitch/reducers/mutes.js b/app/javascript/flavours/glitch/reducers/mutes.js index 8f52a7704a..7111bb710e 100644 --- a/app/javascript/flavours/glitch/reducers/mutes.js +++ b/app/javascript/flavours/glitch/reducers/mutes.js @@ -7,7 +7,6 @@ import { const initialState = Immutable.Map({ new: Immutable.Map({ - isSubmitting: false, account: null, notifications: true, }), @@ -17,7 +16,6 @@ export default function mutes(state = initialState, action) { switch (action.type) { case MUTES_INIT_MODAL: return state.withMutations((state) => { - state.setIn(['new', 'isSubmitting'], false); state.setIn(['new', 'account'], action.account); state.setIn(['new', 'notifications'], true); }); diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss index ec32c9114a..4f3e5babff 100644 --- a/app/javascript/flavours/glitch/styles/components/modal.scss +++ b/app/javascript/flavours/glitch/styles/components/modal.scss @@ -405,7 +405,8 @@ .confirmation-modal, .report-modal, .actions-modal, -.mute-modal { +.mute-modal, +.block-modal { background: lighten($ui-secondary-color, 8%); color: $inverted-text-color; border-radius: 8px; @@ -465,7 +466,8 @@ .boost-modal__action-bar, .favourite-modal__action-bar, .confirmation-modal__action-bar, -.mute-modal__action-bar { +.mute-modal__action-bar, +.block-modal__action-bar { display: flex; justify-content: space-between; background: $ui-secondary-color; @@ -495,11 +497,13 @@ font-size: 14px; } -.mute-modal { +.mute-modal, +.block-modal { line-height: 24px; } -.mute-modal .react-toggle { +.mute-modal .react-toggle, +.block-modal .react-toggle { vertical-align: middle; } @@ -712,27 +716,29 @@ } .confirmation-modal__action-bar, -.mute-modal__action-bar { - .confirmation-modal__secondary-button, - .confirmation-modal__cancel-button, - .mute-modal__cancel-button { - background-color: transparent; - color: $lighter-text-color; - font-size: 14px; - font-weight: 500; - - &:hover, - &:focus, - &:active { - color: darken($lighter-text-color, 4%); - } - } - +.mute-modal__action-bar, +.block-modal__action-bar { .confirmation-modal__secondary-button { flex-shrink: 1; } } +.confirmation-modal__secondary-button, +.confirmation-modal__cancel-button, +.mute-modal__cancel-button, +.block-modal__cancel-button { + background-color: transparent; + color: $lighter-text-color; + font-size: 14px; + font-weight: 500; + + &:hover, + &:focus, + &:active { + color: darken($lighter-text-color, 4%); + } +} + .confirmation-modal__do_not_ask_again { padding-left: 20px; padding-right: 20px; @@ -747,10 +753,10 @@ .confirmation-modal__container, .mute-modal__container, +.block-modal__container, .report-modal__target { padding: 30px; font-size: 16px; - text-align: center; strong { font-weight: 500; @@ -763,6 +769,31 @@ } } +.confirmation-modal__container, +.report-modal__target { + text-align: center; +} + +.block-modal, +.mute-modal { + &__explanation { + margin-top: 20px; + } + + .setting-toggle { + margin-top: 20px; + margin-bottom: 24px; + display: flex; + align-items: center; + + &__label { + color: $inverted-text-color; + margin: 0; + margin-left: 8px; + } + } +} + .report-modal__target { padding: 15px; diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss index 4c2b76a21d..5c7fa87da2 100644 --- a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss +++ b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss @@ -226,6 +226,7 @@ .boost-modal, .confirmation-modal, .mute-modal, +.block-modal, .report-modal, .embed-modal, .error-modal, @@ -236,6 +237,7 @@ .boost-modal__action-bar, .confirmation-modal__action-bar, .mute-modal__action-bar, +.block-modal__action-bar, .onboarding-modal__paginator, .error-modal__footer { background: darken($ui-base-color, 6%); diff --git a/app/javascript/flavours/glitch/util/async-components.js b/app/javascript/flavours/glitch/util/async-components.js index 6c0acdb275..26255bbb71 100644 --- a/app/javascript/flavours/glitch/util/async-components.js +++ b/app/javascript/flavours/glitch/util/async-components.js @@ -122,6 +122,10 @@ export function MuteModal () { return import(/* webpackChunkName: "flavours/glitch/async/mute_modal" */'flavours/glitch/features/ui/components/mute_modal'); } +export function BlockModal () { + return import(/* webpackChunkName: "flavours/glitch/async/block_modal" */'flavours/glitch/features/ui/components/block_modal'); +} + export function ReportModal () { return import(/* webpackChunkName: "flavours/glitch/async/report_modal" */'flavours/glitch/features/ui/components/report_modal'); } From 1bfa9149ee64f86ca62031ed4d84b70f2a9e86e8 Mon Sep 17 00:00:00 2001 From: koyu Date: Sun, 29 Sep 2019 22:20:56 +0200 Subject: [PATCH 101/107] [Glitch] Change at icon in notification filter to reply-all Port cfe2d1cc4a3c531741fd769241593ebbe03b6711 to glitch-soc Signed-off-by: Thibaut Girka --- .../glitch/features/notifications/components/filter_bar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/features/notifications/components/filter_bar.js b/app/javascript/flavours/glitch/features/notifications/components/filter_bar.js index 356ca47218..6118305d66 100644 --- a/app/javascript/flavours/glitch/features/notifications/components/filter_bar.js +++ b/app/javascript/flavours/glitch/features/notifications/components/filter_bar.js @@ -64,7 +64,7 @@ class FilterBar extends React.PureComponent { onClick={this.onClick('mention')} title={intl.formatMessage(tooltips.mentions)} > - + } {showResults && !this.props.disabled && · } - + {votesCount} {poll.get('expires_at') && · {timeRemaining}} From 4d6ef02203bb5c198c9a6574601c8664271ad44d Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Mon, 30 Sep 2019 15:22:28 +0200 Subject: [PATCH 103/107] Fix using wrong component in ColumnBackButtonSlim --- .../flavours/glitch/components/column_back_button_slim.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/components/column_back_button_slim.js b/app/javascript/flavours/glitch/components/column_back_button_slim.js index b57e3a057b..faa0c23a82 100644 --- a/app/javascript/flavours/glitch/components/column_back_button_slim.js +++ b/app/javascript/flavours/glitch/components/column_back_button_slim.js @@ -1,7 +1,7 @@ import React from 'react'; import { FormattedMessage } from 'react-intl'; import PropTypes from 'prop-types'; -import Icon from 'mastodon/components/icon'; +import Icon from 'flavours/glitch/components/icon'; export default class ColumnBackButtonSlim extends React.PureComponent { From 13bc2cd4afb3928a5a4380b4c3b035298f595bf7 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 21 Sep 2019 20:01:16 +0200 Subject: [PATCH 104/107] [Glitch] Change conversations UI Port bc5678d0151dd96e0ec5f3d4084ac6356c1d02f5 to glitch-soc Signed-off-by: Thibaut Girka --- .../flavours/glitch/actions/conversations.js | 28 +++ .../glitch/components/avatar_composite.js | 28 +-- .../glitch/containers/status_container.js | 1 + .../components/conversation.js | 159 ++++++++++++++++-- .../containers/conversation_container.js | 75 +++++++-- .../glitch/styles/components/accounts.scss | 14 ++ .../glitch/styles/components/index.scss | 83 +++++---- 7 files changed, 314 insertions(+), 74 deletions(-) diff --git a/app/javascript/flavours/glitch/actions/conversations.js b/app/javascript/flavours/glitch/actions/conversations.js index 856f8f10fe..e5c85c65d9 100644 --- a/app/javascript/flavours/glitch/actions/conversations.js +++ b/app/javascript/flavours/glitch/actions/conversations.js @@ -15,6 +15,10 @@ export const CONVERSATIONS_UPDATE = 'CONVERSATIONS_UPDATE'; export const CONVERSATIONS_READ = 'CONVERSATIONS_READ'; +export const CONVERSATIONS_DELETE_REQUEST = 'CONVERSATIONS_DELETE_REQUEST'; +export const CONVERSATIONS_DELETE_SUCCESS = 'CONVERSATIONS_DELETE_SUCCESS'; +export const CONVERSATIONS_DELETE_FAIL = 'CONVERSATIONS_DELETE_FAIL'; + export const mountConversations = () => ({ type: CONVERSATIONS_MOUNT, }); @@ -82,3 +86,27 @@ export const updateConversations = conversation => dispatch => { conversation, }); }; + +export const deleteConversation = conversationId => (dispatch, getState) => { + dispatch(deleteConversationRequest(conversationId)); + + api(getState).delete(`/api/v1/conversations/${conversationId}`) + .then(() => dispatch(deleteConversationSuccess(conversationId))) + .catch(error => dispatch(deleteConversationFail(conversationId, error))); +}; + +export const deleteConversationRequest = id => ({ + type: CONVERSATIONS_DELETE_REQUEST, + id, +}); + +export const deleteConversationSuccess = id => ({ + type: CONVERSATIONS_DELETE_SUCCESS, + id, +}); + +export const deleteConversationFail = (id, error) => ({ + type: CONVERSATIONS_DELETE_FAIL, + id, + error, +}); diff --git a/app/javascript/flavours/glitch/components/avatar_composite.js b/app/javascript/flavours/glitch/components/avatar_composite.js index c52df043a5..125b51c449 100644 --- a/app/javascript/flavours/glitch/components/avatar_composite.js +++ b/app/javascript/flavours/glitch/components/avatar_composite.js @@ -35,35 +35,35 @@ export default class AvatarComposite extends React.PureComponent { if (size === 2) { if (index === 0) { - right = '2px'; + right = '1px'; } else { - left = '2px'; + left = '1px'; } } else if (size === 3) { if (index === 0) { - right = '2px'; + right = '1px'; } else if (index > 0) { - left = '2px'; + left = '1px'; } if (index === 1) { - bottom = '2px'; + bottom = '1px'; } else if (index > 1) { - top = '2px'; + top = '1px'; } } else if (size === 4) { if (index === 0 || index === 2) { - right = '2px'; + right = '1px'; } if (index === 1 || index === 3) { - left = '2px'; + left = '1px'; } if (index < 2) { - bottom = '2px'; + bottom = '1px'; } else { - top = '2px'; + top = '1px'; } } @@ -96,7 +96,13 @@ export default class AvatarComposite extends React.PureComponent { return (
- {accounts.take(4).map((account, i) => this.renderItem(account, accounts.size, i))} + {accounts.take(4).map((account, i) => this.renderItem(account, Math.min(accounts.size, 4), i))} + + {accounts.size > 4 && ( + + +{accounts.size - 4} + + )}
); } diff --git a/app/javascript/flavours/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js index 647ddf2764..4c3555dea4 100644 --- a/app/javascript/flavours/glitch/containers/status_container.js +++ b/app/javascript/flavours/glitch/containers/status_container.js @@ -80,6 +80,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({ onReply (status, router) { dispatch((_, getState) => { let state = getState(); + if (state.getIn(['local_settings', 'confirm_before_clearing_draft']) && state.getIn(['compose', 'text']).trim().length !== 0) { dispatch(openModal('CONFIRM', { message: intl.formatMessage(messages.replyMessage), diff --git a/app/javascript/flavours/glitch/features/direct_timeline/components/conversation.js b/app/javascript/flavours/glitch/features/direct_timeline/components/conversation.js index 9ddeabe752..17487b2021 100644 --- a/app/javascript/flavours/glitch/features/direct_timeline/components/conversation.js +++ b/app/javascript/flavours/glitch/features/direct_timeline/components/conversation.js @@ -2,9 +2,28 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import StatusContainer from 'flavours/glitch/containers/status_container'; +import StatusContent from 'flavours/glitch/components/status_content'; +import AttachmentList from 'flavours/glitch/components/attachment_list'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; +import AvatarComposite from 'flavours/glitch/components/avatar_composite'; +import Permalink from 'flavours/glitch/components/permalink'; +import IconButton from 'flavours/glitch/components/icon_button'; +import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp'; +import { HotKeys } from 'react-hotkeys'; -export default class Conversation extends ImmutablePureComponent { +const messages = defineMessages({ + more: { id: 'status.more', defaultMessage: 'More' }, + open: { id: 'conversation.open', defaultMessage: 'View conversation' }, + reply: { id: 'status.reply', defaultMessage: 'Reply' }, + markAsRead: { id: 'conversation.mark_as_read', defaultMessage: 'Mark as read' }, + delete: { id: 'conversation.delete', defaultMessage: 'Delete conversation' }, + muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' }, + unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' }, +}); + +export default @injectIntl +class Conversation extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, @@ -13,25 +32,61 @@ export default class Conversation extends ImmutablePureComponent { static propTypes = { conversationId: PropTypes.string.isRequired, accounts: ImmutablePropTypes.list.isRequired, - lastStatusId: PropTypes.string, + lastStatus: ImmutablePropTypes.map, unread:PropTypes.bool.isRequired, onMoveUp: PropTypes.func, onMoveDown: PropTypes.func, markRead: PropTypes.func.isRequired, + intl: PropTypes.object.isRequired, }; + state = { + isExpanded: undefined, + }; + + parseClick = (e, destination) => { + const { router } = this.context; + const { lastStatus, unread, markRead } = this.props; + if (!router) return; + + if (e.button === 0 && !(e.ctrlKey || e.altKey || e.metaKey)) { + if (destination === undefined) { + if (unread) { + markRead(); + } + destination = `/statuses/${lastStatus.get('id')}`; + } + let state = {...router.history.location.state}; + state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1; + router.history.push(destination, state); + e.preventDefault(); + } + } + handleClick = () => { if (!this.context.router) { return; } - const { lastStatusId, unread, markRead } = this.props; + const { lastStatus, unread, markRead } = this.props; if (unread) { markRead(); } - this.context.router.history.push(`/statuses/${lastStatusId}`); + this.context.router.history.push(`/statuses/${lastStatus.get('id')}`); + } + + handleMarkAsRead = () => { + this.props.markRead(); + } + + handleReply = () => { + this.props.reply(this.props.lastStatus, this.context.router.history); + } + + handleDelete = () => { + this.props.delete(); } handleHotkeyMoveUp = () => { @@ -42,22 +97,94 @@ export default class Conversation extends ImmutablePureComponent { this.props.onMoveDown(this.props.conversationId); } - render () { - const { accounts, lastStatusId, unread } = this.props; + handleConversationMute = () => { + this.props.onMute(this.props.lastStatus); + } - if (lastStatusId === null) { + handleShowMore = () => { + if (this.props.lastStatus.get('spoiler_text')) { + this.setExpansion(!this.state.isExpanded); + } + }; + + setExpansion = value => { + this.setState({ isExpanded: value }); + } + + render () { + const { accounts, lastStatus, unread, intl } = this.props; + const { isExpanded } = this.state; + + if (lastStatus === null) { return null; } + const menu = [ + { text: intl.formatMessage(messages.open), action: this.handleClick }, + null, + ]; + + menu.push({ text: intl.formatMessage(lastStatus.get('muted') ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMute }); + + if (unread) { + menu.push({ text: intl.formatMessage(messages.markAsRead), action: this.handleMarkAsRead }); + menu.push(null); + } + + menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDelete }); + + const names = accounts.map(a => ).reduce((prev, cur) => [prev, ', ', cur]); + + const handlers = { + reply: this.handleReply, + open: this.handleClick, + moveUp: this.handleHotkeyMoveUp, + moveDown: this.handleHotkeyMoveDown, + toggleHidden: this.handleShowMore, + }; + + let media = null; + if (lastStatus.get('media_attachments').size > 0) { + media = ; + } + return ( - + +
+
+ +
+ +
+
+
+ +
+ +
+ {names} }} /> +
+
+ + + +
+ + +
+ +
+
+
+
+
); } diff --git a/app/javascript/flavours/glitch/features/direct_timeline/containers/conversation_container.js b/app/javascript/flavours/glitch/features/direct_timeline/containers/conversation_container.js index bd6f6bfb01..b15ce9f0f6 100644 --- a/app/javascript/flavours/glitch/features/direct_timeline/containers/conversation_container.js +++ b/app/javascript/flavours/glitch/features/direct_timeline/containers/conversation_container.js @@ -1,19 +1,74 @@ import { connect } from 'react-redux'; import Conversation from '../components/conversation'; -import { markConversationRead } from '../../../actions/conversations'; +import { markConversationRead, deleteConversation } from 'flavours/glitch/actions/conversations'; +import { makeGetStatus } from 'flavours/glitch/selectors'; +import { replyCompose } from 'flavours/glitch/actions/compose'; +import { openModal } from 'flavours/glitch/actions/modal'; +import { muteStatus, unmuteStatus, hideStatus, revealStatus } from 'flavours/glitch/actions/statuses'; +import { defineMessages, injectIntl } from 'react-intl'; -const mapStateToProps = (state, { conversationId }) => { - const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId); +const messages = defineMessages({ + 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?' }, +}); - return { - accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)), - unread: conversation.get('unread'), - lastStatusId: conversation.get('last_status', null), +const mapStateToProps = () => { + const getStatus = makeGetStatus(); + + return (state, { conversationId }) => { + const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId); + const lastStatusId = conversation.get('last_status', null); + + return { + accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)), + unread: conversation.get('unread'), + lastStatus: lastStatusId && getStatus(state, { id: lastStatusId }), + }; }; }; -const mapDispatchToProps = (dispatch, { conversationId }) => ({ - markRead: () => dispatch(markConversationRead(conversationId)), +const mapDispatchToProps = (dispatch, { intl, conversationId }) => ({ + + markRead () { + dispatch(markConversationRead(conversationId)); + }, + + reply (status, router) { + dispatch((_, getState) => { + let state = getState(); + + if (state.getIn(['compose', 'text']).trim().length !== 0) { + dispatch(openModal('CONFIRM', { + message: intl.formatMessage(messages.replyMessage), + confirm: intl.formatMessage(messages.replyConfirm), + onConfirm: () => dispatch(replyCompose(status, router)), + })); + } else { + dispatch(replyCompose(status, router)); + } + }); + }, + + delete () { + dispatch(deleteConversation(conversationId)); + }, + + onMute (status) { + if (status.get('muted')) { + dispatch(unmuteStatus(status.get('id'))); + } else { + dispatch(muteStatus(status.get('id'))); + } + }, + + onToggleHidden (status) { + if (status.get('hidden')) { + dispatch(revealStatus(status.get('id'))); + } else { + dispatch(hideStatus(status.get('id'))); + } + }, + }); -export default connect(mapStateToProps, mapDispatchToProps)(Conversation); +export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(Conversation)); diff --git a/app/javascript/flavours/glitch/styles/components/accounts.scss b/app/javascript/flavours/glitch/styles/components/accounts.scss index b5a07239fd..5be4da48a8 100644 --- a/app/javascript/flavours/glitch/styles/components/accounts.scss +++ b/app/javascript/flavours/glitch/styles/components/accounts.scss @@ -50,6 +50,8 @@ &-composite { @include avatar-radius; overflow: hidden; + position: relative; + cursor: default; & div { @include avatar-radius; @@ -57,6 +59,18 @@ position: relative; box-sizing: border-box; } + + &__label { + display: block; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: $primary-text-color; + text-shadow: 1px 1px 2px $base-shadow-color; + font-weight: 700; + font-size: 15px; + } } } diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss index 97c5255659..8ebcde5efd 100644 --- a/app/javascript/flavours/glitch/styles/components/index.scss +++ b/app/javascript/flavours/glitch/styles/components/index.scss @@ -1433,50 +1433,59 @@ height: 1em; } -.layout-toggle { +.conversation { display: flex; + border-bottom: 1px solid lighten($ui-base-color, 8%); padding: 5px; + padding-bottom: 0; - button { - box-sizing: border-box; - flex: 0 0 50%; - background: transparent; - padding: 5px; - border: 0; - position: relative; + &:focus { + background: lighten($ui-base-color, 2%); + outline: 0; + } - &:hover, - &:focus, - &:active { - svg path:first-child { - fill: lighten($ui-base-color, 16%); + &__avatar { + flex: 0 0 auto; + padding: 10px; + padding-top: 12px; + } + + &__content { + flex: 1 1 auto; + padding: 10px 5px; + padding-right: 15px; + + &__info { + overflow: hidden; + } + + &__relative-time { + float: right; + font-size: 15px; + color: $darker-text-color; + padding-left: 15px; + } + + &__names { + color: $darker-text-color; + font-size: 15px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-bottom: 4px; + + a { + color: $primary-text-color; + text-decoration: none; + + &:hover, + &:focus, + &:active { + text-decoration: underline; + } } } } - - svg { - width: 100%; - height: auto; - - path:first-child { - fill: lighten($ui-base-color, 12%); - } - - path:last-child { - fill: darken($ui-base-color, 14%); - } - } - - &__active { - color: $ui-highlight-color; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background: lighten($ui-base-color, 12%); - border-radius: 50%; - padding: 0.35rem; - } } ::-webkit-scrollbar-thumb { From ddee0dd3821746fb999a3459480e7507f03dc559 Mon Sep 17 00:00:00 2001 From: Cutls Date: Fri, 27 Sep 2019 09:14:49 +0900 Subject: [PATCH 105/107] [Glitch] Fix overflow on conversations Port f31530b74d0f2ab77845db26babc25f5de337bd4 to glitch-soc Signed-off-by: Thibaut Girka --- .../flavours/glitch/styles/components/index.scss | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss index 8ebcde5efd..071e066069 100644 --- a/app/javascript/flavours/glitch/styles/components/index.scss +++ b/app/javascript/flavours/glitch/styles/components/index.scss @@ -1454,13 +1454,17 @@ 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; @@ -1473,6 +1477,8 @@ overflow: hidden; text-overflow: ellipsis; margin-bottom: 4px; + flex-basis: 170px; + flex-shrink: 1000; a { color: $primary-text-color; From 14f797873d86aed085dad2ff60c8dad2ab3d4b7b Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Mon, 30 Sep 2019 16:38:12 +0200 Subject: [PATCH 106/107] Fix menu in settings/admin pages --- .../flavours/glitch/packs/settings.js | 20 +++++++++++++++++++ app/javascript/flavours/glitch/theme.yml | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 app/javascript/flavours/glitch/packs/settings.js diff --git a/app/javascript/flavours/glitch/packs/settings.js b/app/javascript/flavours/glitch/packs/settings.js new file mode 100644 index 0000000000..b32f38226c --- /dev/null +++ b/app/javascript/flavours/glitch/packs/settings.js @@ -0,0 +1,20 @@ +import loadPolyfills from 'flavours/glitch/util/load_polyfills'; +import ready from 'flavours/glitch/util/ready'; + +function main() { + const { delegate } = require('rails-ujs'); + + delegate(document, '.sidebar__toggle__icon', 'click', () => { + const target = document.querySelector('.sidebar ul'); + + if (target.style.display === 'block') { + target.style.display = 'none'; + } else { + target.style.display = 'block'; + } + }); +} + +loadPolyfills().then(main).catch(error => { + console.error(error); +}); diff --git a/app/javascript/flavours/glitch/theme.yml b/app/javascript/flavours/glitch/theme.yml index 06e26ade26..0fd627f194 100644 --- a/app/javascript/flavours/glitch/theme.yml +++ b/app/javascript/flavours/glitch/theme.yml @@ -18,7 +18,7 @@ pack: mailer: modal: public: packs/public.js - settings: + settings: packs/settings.js share: packs/share.js # (OPTIONAL) The directory which contains localization files for From 3b855b5c82362783969f748ad78bcaf85f938c9f Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Mon, 30 Sep 2019 17:00:42 +0200 Subject: [PATCH 107/107] Improve styling of DM view in glitch-soc --- app/javascript/flavours/glitch/styles/components/index.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss index 071e066069..848ef78df3 100644 --- a/app/javascript/flavours/glitch/styles/components/index.scss +++ b/app/javascript/flavours/glitch/styles/components/index.scss @@ -1491,6 +1491,10 @@ } } } + + .status__content { + margin: 0; + } } }