Merge pull request #794 from ThibG/glitch-soc/merge-upstream
Merge upstream changes
This commit is contained in:
		
						commit
						f945bbac81
					
				
					 146 changed files with 594 additions and 691 deletions
				
			
		|  | @ -178,6 +178,8 @@ jobs: | |||
|       - *attach_workspace | ||||
|       - run: bundle exec i18n-tasks check-normalized | ||||
|       - run: bundle exec i18n-tasks unused | ||||
|       - run: bundle exec i18n-tasks missing -t plural | ||||
|       - run: bundle exec i18n-tasks check-consistent-interpolations | ||||
| 
 | ||||
| workflows: | ||||
|   version: 2 | ||||
|  |  | |||
|  | @ -43,6 +43,8 @@ All notable changes to this project will be documented in this file. | |||
| - Add `description` meta tag (#8941) | ||||
| - Add `Content-Security-Policy` header (#8957) | ||||
| - Add cache for the instance info API (#8765) | ||||
| - Add suggested follows to search screen in mobile layout (#9010) | ||||
| - Add CORS header to `/.well-known/*` routes (#9083) | ||||
| 
 | ||||
| ### Changed | ||||
| 
 | ||||
|  | @ -57,6 +59,7 @@ All notable changes to this project will be documented in this file. | |||
| - Change style of success and failure messages (#8973) | ||||
| - Change DM filtering to always allow DMs from staff (#8993) | ||||
| - Change recommended Ruby version to 2.5.3 (#9003) | ||||
| - Change docker-compose default to persist volumes in current directory (#9055) | ||||
| 
 | ||||
| ### Deprecated | ||||
| 
 | ||||
|  | @ -85,6 +88,8 @@ All notable changes to this project will be documented in this file. | |||
| - Fix crash in streaming API when tag param missing (#8955) | ||||
| - Fix hotkeys not working when no element is focused (#8998) | ||||
| - Fix some hotkeys not working on detailed status view (#9006) | ||||
| - Fix og:url on status pages (#9047) | ||||
| - Fix upload option buttons only being visible on hover (#9074) | ||||
| 
 | ||||
| ## [2.5.2] - 2018-10-12 | ||||
| ### Security | ||||
|  |  | |||
							
								
								
									
										8
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								Gemfile
									
									
									
									
									
								
							|  | @ -15,7 +15,7 @@ gem 'makara', '~> 0.4' | |||
| gem 'pghero', '~> 2.2' | ||||
| gem 'dotenv-rails', '~> 2.5' | ||||
| 
 | ||||
| gem 'aws-sdk-s3', '~> 1.21', require: false | ||||
| gem 'aws-sdk-s3', '~> 1.23', require: false | ||||
| gem 'fog-core', '<= 2.1.0' | ||||
| gem 'fog-openstack', '~> 0.3', require: false | ||||
| gem 'paperclip', '~> 6.0' | ||||
|  | @ -96,7 +96,7 @@ gem 'rdf-normalize', '~> 0.3' | |||
| group :development, :test do | ||||
|   gem 'fabrication', '~> 2.20' | ||||
|   gem 'fuubar', '~> 2.3' | ||||
|   gem 'i18n-tasks', '~> 0.9', require: false | ||||
|   gem 'i18n-tasks', '~> 0.9', require: false, git: 'https://github.com/Gargron/i18n-tasks.git', ref: 'ab6e10878ccdb6243f934f30372276d260c14251' | ||||
|   gem 'pry-byebug', '~> 3.6' | ||||
|   gem 'pry-rails', '~> 0.3' | ||||
|   gem 'rspec-rails', '~> 3.8' | ||||
|  | @ -107,7 +107,7 @@ group :production, :test do | |||
| end | ||||
| 
 | ||||
| group :test do | ||||
|   gem 'capybara', '~> 3.9' | ||||
|   gem 'capybara', '~> 3.10' | ||||
|   gem 'climate_control', '~> 0.2' | ||||
|   gem 'faker', '~> 1.9' | ||||
|   gem 'microformats', '~> 4.0' | ||||
|  | @ -115,7 +115,7 @@ group :test do | |||
|   gem 'rspec-sidekiq', '~> 3.0' | ||||
|   gem 'simplecov', '~> 0.16', require: false | ||||
|   gem 'webmock', '~> 3.4' | ||||
|   gem 'parallel_tests', '~> 2.24' | ||||
|   gem 'parallel_tests', '~> 2.25' | ||||
| end | ||||
| 
 | ||||
| group :development do | ||||
|  |  | |||
							
								
								
									
										55
									
								
								Gemfile.lock
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								Gemfile.lock
									
									
									
									
									
								
							|  | @ -1,3 +1,19 @@ | |||
| GIT | ||||
|   remote: https://github.com/Gargron/i18n-tasks.git | ||||
|   revision: ab6e10878ccdb6243f934f30372276d260c14251 | ||||
|   ref: ab6e10878ccdb6243f934f30372276d260c14251 | ||||
|   specs: | ||||
|     i18n-tasks (0.9.27) | ||||
|       activesupport (>= 4.0.2) | ||||
|       ast (>= 2.1.0) | ||||
|       erubi | ||||
|       highline (>= 2.0.0) | ||||
|       i18n | ||||
|       parser (>= 2.2.3.0) | ||||
|       rails-i18n | ||||
|       rainbow (>= 2.2.2, < 4.0) | ||||
|       terminal-table (>= 1.5.1) | ||||
| 
 | ||||
| GIT | ||||
|   remote: https://github.com/rtomayko/posix-spawn | ||||
|   revision: 58465d2e213991f8afb13b984854a49fcdcc980c | ||||
|  | @ -76,16 +92,16 @@ GEM | |||
|     av (0.9.0) | ||||
|       cocaine (~> 0.5.3) | ||||
|     aws-eventstream (1.0.1) | ||||
|     aws-partitions (1.105.0) | ||||
|     aws-sdk-core (3.30.0) | ||||
|     aws-partitions (1.106.0) | ||||
|     aws-sdk-core (3.35.0) | ||||
|       aws-eventstream (~> 1.0) | ||||
|       aws-partitions (~> 1.0) | ||||
|       aws-sigv4 (~> 1.0) | ||||
|       jmespath (~> 1.0) | ||||
|     aws-sdk-kms (1.9.0) | ||||
|     aws-sdk-kms (1.11.0) | ||||
|       aws-sdk-core (~> 3, >= 3.26.0) | ||||
|       aws-sigv4 (~> 1.0) | ||||
|     aws-sdk-s3 (1.21.0) | ||||
|     aws-sdk-s3 (1.23.0) | ||||
|       aws-sdk-core (~> 3, >= 3.26.0) | ||||
|       aws-sdk-kms (~> 1) | ||||
|       aws-sigv4 (~> 1.0) | ||||
|  | @ -126,13 +142,14 @@ GEM | |||
|       sshkit (~> 1.3) | ||||
|     capistrano-yarn (2.0.2) | ||||
|       capistrano (~> 3.0) | ||||
|     capybara (3.9.0) | ||||
|     capybara (3.10.0) | ||||
|       addressable | ||||
|       mini_mime (>= 0.1.3) | ||||
|       nokogiri (~> 1.8) | ||||
|       rack (>= 1.6.0) | ||||
|       rack-test (>= 0.6.3) | ||||
|       xpath (~> 3.1) | ||||
|       regexp_parser (~> 1.2) | ||||
|       xpath (~> 3.2) | ||||
|     case_transform (0.2) | ||||
|       activesupport | ||||
|     charlock_holmes (0.7.6) | ||||
|  | @ -273,15 +290,6 @@ GEM | |||
|       rainbow (>= 2.0.0) | ||||
|     i18n (1.1.1) | ||||
|       concurrent-ruby (~> 1.0) | ||||
|     i18n-tasks (0.9.25) | ||||
|       activesupport (>= 4.0.2) | ||||
|       ast (>= 2.1.0) | ||||
|       erubi | ||||
|       highline (>= 2.0.0) | ||||
|       i18n | ||||
|       parser (>= 2.2.3.0) | ||||
|       rainbow (>= 2.2.2, < 4.0) | ||||
|       terminal-table (>= 1.5.1) | ||||
|     idn-ruby (0.1.0) | ||||
|     ipaddress (0.8.3) | ||||
|     iso-639 (0.2.8) | ||||
|  | @ -387,7 +395,7 @@ GEM | |||
|       av (~> 0.9.0) | ||||
|       paperclip (>= 2.5.2) | ||||
|     parallel (1.12.1) | ||||
|     parallel_tests (2.24.0) | ||||
|     parallel_tests (2.25.0) | ||||
|       parallel | ||||
|     parser (2.5.1.2) | ||||
|       ast (~> 2.4.0) | ||||
|  | @ -492,6 +500,7 @@ GEM | |||
|       redis-store (>= 1.2, < 2) | ||||
|     redis-store (1.5.0) | ||||
|       redis (>= 2.2, < 5) | ||||
|     regexp_parser (1.2.0) | ||||
|     request_store (1.4.1) | ||||
|       rack (>= 1.4) | ||||
|     responders (2.4.0) | ||||
|  | @ -503,13 +512,13 @@ GEM | |||
|       chunky_png (~> 1.0) | ||||
|     rspec-core (3.8.0) | ||||
|       rspec-support (~> 3.8.0) | ||||
|     rspec-expectations (3.8.1) | ||||
|     rspec-expectations (3.8.2) | ||||
|       diff-lcs (>= 1.2.0, < 2.0) | ||||
|       rspec-support (~> 3.8.0) | ||||
|     rspec-mocks (3.8.0) | ||||
|       diff-lcs (>= 1.2.0, < 2.0) | ||||
|       rspec-support (~> 3.8.0) | ||||
|     rspec-rails (3.8.0) | ||||
|     rspec-rails (3.8.1) | ||||
|       actionpack (>= 3.0) | ||||
|       activesupport (>= 3.0) | ||||
|       railties (>= 3.0) | ||||
|  | @ -642,7 +651,7 @@ GEM | |||
|       websocket-extensions (>= 0.1.0) | ||||
|     websocket-extensions (0.1.3) | ||||
|     wisper (2.0.0) | ||||
|     xpath (3.1.0) | ||||
|     xpath (3.2.0) | ||||
|       nokogiri (~> 1.8) | ||||
| 
 | ||||
| PLATFORMS | ||||
|  | @ -653,7 +662,7 @@ DEPENDENCIES | |||
|   active_record_query_trace (~> 1.5) | ||||
|   addressable (~> 2.5) | ||||
|   annotate (~> 2.7) | ||||
|   aws-sdk-s3 (~> 1.21) | ||||
|   aws-sdk-s3 (~> 1.23) | ||||
|   better_errors (~> 2.5) | ||||
|   binding_of_caller (~> 0.7) | ||||
|   bootsnap (~> 1.3) | ||||
|  | @ -665,7 +674,7 @@ DEPENDENCIES | |||
|   capistrano-rails (~> 1.4) | ||||
|   capistrano-rbenv (~> 2.1) | ||||
|   capistrano-yarn (~> 2.0) | ||||
|   capybara (~> 3.9) | ||||
|   capybara (~> 3.10) | ||||
|   charlock_holmes (~> 0.7.6) | ||||
|   chewy (~> 5.0) | ||||
|   cld3 (~> 3.2.0) | ||||
|  | @ -692,7 +701,7 @@ DEPENDENCIES | |||
|   http_accept_language (~> 2.1) | ||||
|   http_parser.rb (~> 0.6)! | ||||
|   httplog (~> 1.1) | ||||
|   i18n-tasks (~> 0.9) | ||||
|   i18n-tasks (~> 0.9)! | ||||
|   idn-ruby | ||||
|   iso-639 | ||||
|   json-ld (~> 2.2) | ||||
|  | @ -717,7 +726,7 @@ DEPENDENCIES | |||
|   ox (~> 2.10) | ||||
|   paperclip (~> 6.0) | ||||
|   paperclip-av-transcoder (~> 0.6) | ||||
|   parallel_tests (~> 2.24) | ||||
|   parallel_tests (~> 2.25) | ||||
|   pg (~> 1.1) | ||||
|   pghero (~> 2.2) | ||||
|   pkg-config (~> 1.3) | ||||
|  |  | |||
|  | @ -36,6 +36,6 @@ class ActivityPub::InboxesController < Api::BaseController | |||
|   end | ||||
| 
 | ||||
|   def process_payload | ||||
|     ActivityPub::ProcessingWorker.perform_async(signed_request_account.id, body.force_encoding('UTF-8')) | ||||
|     ActivityPub::ProcessingWorker.perform_async(signed_request_account.id, body.force_encoding('UTF-8'), @account&.id) | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -9,6 +9,13 @@ module Admin | |||
| 
 | ||||
|     before_action :require_staff! | ||||
|     before_action :set_pack | ||||
|     before_action :set_body_classes | ||||
| 
 | ||||
|     private | ||||
| 
 | ||||
|     def set_body_classes | ||||
|       @body_classes = 'admin' | ||||
|     end | ||||
| 
 | ||||
|     def set_pack | ||||
|       use_pack 'admin' | ||||
|  |  | |||
|  | @ -201,6 +201,7 @@ class ApplicationController < ActionController::Base | |||
|   def respond_with_error(code) | ||||
|     respond_to do |format| | ||||
|       format.any  { head code } | ||||
| 
 | ||||
|       format.html do | ||||
|         set_locale | ||||
|         use_pack 'error' | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController | |||
|   before_action :set_pack | ||||
|   before_action :set_sessions, only: [:edit, :update] | ||||
|   before_action :set_instance_presenter, only: [:new, :create, :update] | ||||
|   before_action :set_body_classes, only: [:new, :create] | ||||
|   before_action :set_body_classes, only: [:new, :create, :edit, :update] | ||||
| 
 | ||||
|   def destroy | ||||
|     not_found | ||||
|  | @ -86,7 +86,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController | |||
|   end | ||||
| 
 | ||||
|   def set_body_classes | ||||
|     @body_classes = 'lighter' | ||||
|     @body_classes = %w(edit update).include?(action_name) ? 'admin' : 'lighter' | ||||
|   end | ||||
| 
 | ||||
|   def set_invite | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ class FiltersController < ApplicationController | |||
|   before_action :set_filters, only: :index | ||||
|   before_action :set_filter, only: [:edit, :update, :destroy] | ||||
|   before_action :set_pack | ||||
|   before_action :set_body_classes | ||||
| 
 | ||||
|   def index | ||||
|     @filters = current_account.custom_filters | ||||
|  | @ -59,4 +60,8 @@ class FiltersController < ApplicationController | |||
|   def resource_params | ||||
|     params.require(:custom_filter).permit(:phrase, :expires_in, :irreversible, :whole_word, context: []) | ||||
|   end | ||||
| 
 | ||||
|   def set_body_classes | ||||
|     @body_classes = 'admin' | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ class InvitesController < ApplicationController | |||
| 
 | ||||
|   before_action :authenticate_user! | ||||
|   before_action :set_pack | ||||
|   before_action :set_body_classes | ||||
| 
 | ||||
|   def index | ||||
|     authorize :invite, :create? | ||||
|  | @ -49,4 +50,8 @@ class InvitesController < ApplicationController | |||
|   def resource_params | ||||
|     params.require(:invite).permit(:max_uses, :expires_in, :autofollow) | ||||
|   end | ||||
| 
 | ||||
|   def set_body_classes | ||||
|     @body_classes = 'admin' | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -5,8 +5,13 @@ class Settings::BaseController < ApplicationController | |||
| 
 | ||||
|   before_action :authenticate_user! | ||||
|   before_action :set_pack | ||||
|   before_action :set_body_classes | ||||
| 
 | ||||
|   def set_pack | ||||
|     use_pack 'settings' | ||||
|   end | ||||
| 
 | ||||
|   def set_body_classes | ||||
|     @body_classes = 'admin' | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -1,7 +1,5 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| require 'sidekiq-bulk' | ||||
| 
 | ||||
| class Settings::FollowerDomainsController < Settings::BaseController | ||||
|   def show | ||||
|     @account = current_account | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| #  Intentionally does not inherit from BaseController | ||||
| class Settings::SessionsController < ApplicationController | ||||
|   before_action :set_session, only: :destroy | ||||
|   before_action :set_body_classes | ||||
| 
 | ||||
|   def destroy | ||||
|     @session.destroy! | ||||
|  | @ -15,4 +16,8 @@ class Settings::SessionsController < ApplicationController | |||
|   def set_session | ||||
|     @session = current_user.session_activations.find(params[:id]) | ||||
|   end | ||||
| 
 | ||||
|   def set_body_classes | ||||
|     @body_classes = 'admin' | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -1,30 +1,16 @@ | |||
| //  This file will be loaded on settings pages, regardless of theme.
 | ||||
| 
 | ||||
| const { length } = require('stringz'); | ||||
| const { delegate } = require('rails-ujs'); | ||||
| import emojify from '../mastodon/features/emoji/emoji'; | ||||
| 
 | ||||
| delegate(document, '#account_display_name', 'input', ({ target }) => { | ||||
|   const nameCounter = document.querySelector('.name-counter'); | ||||
|   const name = document.querySelector('.card .display-name strong'); | ||||
| 
 | ||||
|   if (nameCounter) { | ||||
|     nameCounter.textContent = 30 - length(target.value); | ||||
|   } | ||||
| 
 | ||||
|   if (name) { | ||||
|     name.innerHTML = emojify(target.value); | ||||
|   } | ||||
| }); | ||||
| 
 | ||||
| delegate(document, '#account_note', 'input', ({ target }) => { | ||||
|   const noteCounter = document.querySelector('.note-counter'); | ||||
| 
 | ||||
|   if (noteCounter) { | ||||
|     noteCounter.textContent = 500 - length(target.value); | ||||
|   } | ||||
| }); | ||||
| 
 | ||||
| delegate(document, '#account_avatar', 'change', ({ target }) => { | ||||
|   const avatar = document.querySelector('.card .avatar img'); | ||||
|   const [file] = target.files || []; | ||||
|  |  | |||
|  | @ -363,4 +363,22 @@ body.rtl { | |||
|     margin-right: 15px; | ||||
|     text-align: right; | ||||
|   } | ||||
| 
 | ||||
|   .fa-chevron-left::before { | ||||
|     content: "\F054"; | ||||
|   } | ||||
| 
 | ||||
|   .fa-chevron-right::before { | ||||
|     content: "\F053"; | ||||
|   } | ||||
| 
 | ||||
|   .column-back-button__icon { | ||||
|     margin-right: 0; | ||||
|     margin-left: 5px; | ||||
|   } | ||||
| 
 | ||||
|   .column-header__setting-arrows .column-header__setting-btn:last-child { | ||||
|     padding-left: 0; | ||||
|     padding-right: 10px; | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -142,7 +142,7 @@ export function submitCompose(routerHistory) { | |||
|         } | ||||
|       }; | ||||
| 
 | ||||
|       if (response.data.visibility === 'direct' && getState().getIn(['conversations', 'mounted']) <= 0) { | ||||
|       if (response.data.visibility === 'direct' && getState().getIn(['conversations', 'mounted']) <= 0 && routerHistory) { | ||||
|         routerHistory.push('/timelines/direct'); | ||||
|       } else if (response.data.visibility !== 'direct') { | ||||
|         insertIfOnline('home'); | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ import DisplayName from './display_name'; | |||
| import StatusContent from './status_content'; | ||||
| import StatusActionBar from './status_action_bar'; | ||||
| import AttachmentList from './attachment_list'; | ||||
| import Card from '../features/status/components/card'; | ||||
| import { injectIntl, FormattedMessage } from 'react-intl'; | ||||
| import ImmutablePureComponent from 'react-immutable-pure-component'; | ||||
| import { MediaGallery, Video } from '../features/ui/util/async-components'; | ||||
|  | @ -256,6 +257,14 @@ class Status extends ImmutablePureComponent { | |||
|           </Bundle> | ||||
|         ); | ||||
|       } | ||||
|     } else if (status.get('spoiler_text').length === 0 && status.get('card')) { | ||||
|       media = ( | ||||
|         <Card | ||||
|           onOpenMedia={this.props.onOpenMedia} | ||||
|           card={status.get('card')} | ||||
|           compact | ||||
|         /> | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|     if (otherAccounts) { | ||||
|  |  | |||
|  | @ -89,7 +89,7 @@ class ComposeForm extends ImmutablePureComponent { | |||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     this.props.onSubmit(this.context.router.history); | ||||
|     this.props.onSubmit(this.context.router ? this.context.router.history : null); | ||||
|   } | ||||
| 
 | ||||
|   onSuggestionsClearRequested = () => { | ||||
|  |  | |||
|  | @ -44,11 +44,13 @@ class Upload extends ImmutablePureComponent { | |||
|     this.props.onSubmit(this.context.router.history); | ||||
|   } | ||||
| 
 | ||||
|   handleUndoClick = () => { | ||||
|   handleUndoClick = e => { | ||||
|     e.stopPropagation(); | ||||
|     this.props.onUndo(this.props.media.get('id')); | ||||
|   } | ||||
| 
 | ||||
|   handleFocalPointClick = () => { | ||||
|   handleFocalPointClick = e => { | ||||
|     e.stopPropagation(); | ||||
|     this.props.onOpenFocalPoint(this.props.media.get('id')); | ||||
|   } | ||||
| 
 | ||||
|  | @ -68,6 +70,10 @@ class Upload extends ImmutablePureComponent { | |||
|     this.setState({ focused: true }); | ||||
|   } | ||||
| 
 | ||||
|   handleClick = () => { | ||||
|     this.setState({ focused: true }); | ||||
|   } | ||||
| 
 | ||||
|   handleInputBlur = () => { | ||||
|     const { dirtyDescription } = this.state; | ||||
| 
 | ||||
|  | @ -88,7 +94,7 @@ class Upload extends ImmutablePureComponent { | |||
|     const y = ((focusY / -2) + .5) * 100; | ||||
| 
 | ||||
|     return ( | ||||
|       <div className='compose-form__upload' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> | ||||
|       <div className='compose-form__upload' tabIndex='0' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} onClick={this.handleClick} role='button'> | ||||
|         <Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}> | ||||
|           {({ scale }) => ( | ||||
|             <div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}> | ||||
|  |  | |||
|  | @ -56,6 +56,7 @@ export default class Conversation extends ImmutablePureComponent { | |||
|         otherAccounts={accounts} | ||||
|         onMoveUp={this.handleHotkeyMoveUp} | ||||
|         onMoveDown={this.handleHotkeyMoveDown} | ||||
|         onClick={this.handleClick} | ||||
|       /> | ||||
|     ); | ||||
|   } | ||||
|  |  | |||
|  | @ -9,14 +9,14 @@ import { debounce } from 'lodash'; | |||
| export default class ConversationsList extends ImmutablePureComponent { | ||||
| 
 | ||||
|   static propTypes = { | ||||
|     conversationIds: ImmutablePropTypes.list.isRequired, | ||||
|     conversations: ImmutablePropTypes.list.isRequired, | ||||
|     hasMore: PropTypes.bool, | ||||
|     isLoading: PropTypes.bool, | ||||
|     onLoadMore: PropTypes.func, | ||||
|     shouldUpdateScroll: PropTypes.func, | ||||
|   }; | ||||
| 
 | ||||
|   getCurrentIndex = id => this.props.conversationIds.indexOf(id) | ||||
|   getCurrentIndex = id => this.props.conversations.findIndex(x => x.get('id') === id) | ||||
| 
 | ||||
|   handleMoveUp = id => { | ||||
|     const elementIndex = this.getCurrentIndex(id) - 1; | ||||
|  | @ -41,22 +41,22 @@ export default class ConversationsList extends ImmutablePureComponent { | |||
|   } | ||||
| 
 | ||||
|   handleLoadOlder = debounce(() => { | ||||
|     const last = this.props.conversationIds.last(); | ||||
|     const last = this.props.conversations.last(); | ||||
| 
 | ||||
|     if (last) { | ||||
|       this.props.onLoadMore(last); | ||||
|     if (last && last.get('last_status')) { | ||||
|       this.props.onLoadMore(last.get('last_status')); | ||||
|     } | ||||
|   }, 300, { leading: true }) | ||||
| 
 | ||||
|   render () { | ||||
|     const { conversationIds, onLoadMore, ...other } = this.props; | ||||
|     const { conversations, onLoadMore, ...other } = this.props; | ||||
| 
 | ||||
|     return ( | ||||
|       <ScrollableList {...other} onLoadMore={onLoadMore && this.handleLoadOlder} scrollKey='direct' ref={this.setRef}> | ||||
|         {conversationIds.map(item => ( | ||||
|         {conversations.map(item => ( | ||||
|           <ConversationContainer | ||||
|             key={item} | ||||
|             conversationId={item} | ||||
|             key={item.get('id')} | ||||
|             conversationId={item.get('id')} | ||||
|             onMoveUp={this.handleMoveUp} | ||||
|             onMoveDown={this.handleMoveDown} | ||||
|           /> | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ import ConversationsList from '../components/conversations_list'; | |||
| import { expandConversations } from '../../../actions/conversations'; | ||||
| 
 | ||||
| const mapStateToProps = state => ({ | ||||
|   conversationIds: state.getIn(['conversations', 'items']).map(x => x.get('id')), | ||||
|   conversations: state.getIn(['conversations', 'items']), | ||||
|   isLoading: state.getIn(['conversations', 'isLoading'], true), | ||||
|   hasMore: state.getIn(['conversations', 'hasMore'], false), | ||||
| }); | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| // https://github.com/missive/emoji-mart/blob/5f2ffcc/src/utils/emoji-index.js
 | ||||
| 
 | ||||
| import data from './emoji_mart_data_light'; | ||||
| import { getData, getSanitizedData, intersect } from './emoji_utils'; | ||||
| import { getData, getSanitizedData, uniq, intersect } from './emoji_utils'; | ||||
| 
 | ||||
| let originalPool = {}; | ||||
| let index = {}; | ||||
|  | @ -103,7 +103,7 @@ function search(value, { emojisToShowFilter, maxResults, include, exclude, custo | |||
|       } | ||||
|     } | ||||
| 
 | ||||
|     allResults = values.map((value) => { | ||||
|     const searchValue = (value) => { | ||||
|       let aPool = pool, | ||||
|         aIndex = index, | ||||
|         length = 0; | ||||
|  | @ -150,15 +150,23 @@ function search(value, { emojisToShowFilter, maxResults, include, exclude, custo | |||
|       } | ||||
| 
 | ||||
|       return aIndex.results; | ||||
|     }).filter(a => a); | ||||
|     }; | ||||
| 
 | ||||
|     if (allResults.length > 1) { | ||||
|       results = intersect.apply(null, allResults); | ||||
|     } else if (allResults.length) { | ||||
|       results = allResults[0]; | ||||
|     if (values.length > 1) { | ||||
|       results = searchValue(value); | ||||
|     } else { | ||||
|       results = []; | ||||
|     } | ||||
| 
 | ||||
|     allResults = values.map(searchValue).filter(a => a); | ||||
| 
 | ||||
|     if (allResults.length > 1) { | ||||
|       allResults = intersect.apply(null, allResults); | ||||
|     } else if (allResults.length) { | ||||
|       allResults = allResults[0]; | ||||
|     } | ||||
| 
 | ||||
|     results = uniq(results.concat(allResults)); | ||||
|   } | ||||
| 
 | ||||
|   if (results) { | ||||
|  |  | |||
|  | @ -59,10 +59,12 @@ export default class Card extends React.PureComponent { | |||
|     card: ImmutablePropTypes.map, | ||||
|     maxDescription: PropTypes.number, | ||||
|     onOpenMedia: PropTypes.func.isRequired, | ||||
|     compact: PropTypes.boolean, | ||||
|   }; | ||||
| 
 | ||||
|   static defaultProps = { | ||||
|     maxDescription: 50, | ||||
|     compact: false, | ||||
|   }; | ||||
| 
 | ||||
|   state = { | ||||
|  | @ -131,7 +133,7 @@ export default class Card extends React.PureComponent { | |||
|   } | ||||
| 
 | ||||
|   render () { | ||||
|     const { card, maxDescription } = this.props; | ||||
|     const { card, maxDescription, compact } = this.props; | ||||
|     const { width, embedded } = this.state; | ||||
| 
 | ||||
|     if (card === null) { | ||||
|  | @ -139,17 +141,17 @@ export default class Card extends React.PureComponent { | |||
|     } | ||||
| 
 | ||||
|     const provider    = card.get('provider_name').length === 0 ? decodeIDNA(getHostname(card.get('url'))) : card.get('provider_name'); | ||||
|     const horizontal  = card.get('width') > card.get('height') && (card.get('width') + 100 >= width) || card.get('type') !== 'link'; | ||||
|     const className   = classnames('status-card', { horizontal }); | ||||
|     const horizontal  = (!compact && card.get('width') > card.get('height') && (card.get('width') + 100 >= width)) || card.get('type') !== 'link' || embedded; | ||||
|     const interactive = card.get('type') !== 'link'; | ||||
|     const className   = classnames('status-card', { horizontal, compact, interactive }); | ||||
|     const title       = interactive ? <a className='status-card__title' href={card.get('url')} title={card.get('title')} rel='noopener' target='_blank'><strong>{card.get('title')}</strong></a> : <strong className='status-card__title' title={card.get('title')}>{card.get('title')}</strong>; | ||||
|     const ratio       = card.get('width') / card.get('height'); | ||||
|     const ratio       = compact ? 16 / 9 : card.get('width') / card.get('height'); | ||||
|     const height      = card.get('width') > card.get('height') ? (width / ratio) : (width * ratio); | ||||
| 
 | ||||
|     const description = ( | ||||
|       <div className='status-card__content'> | ||||
|         {title} | ||||
|         {!horizontal && <p className='status-card__description'>{trim(card.get('description') || '', maxDescription)}</p>} | ||||
|         {!(horizontal || compact) && <p className='status-card__description'>{trim(card.get('description') || '', maxDescription)}</p>} | ||||
|         <span className='status-card__host'>{provider}</span> | ||||
|       </div> | ||||
|     ); | ||||
|  | @ -174,7 +176,7 @@ export default class Card extends React.PureComponent { | |||
|             <div className='status-card__actions'> | ||||
|               <div> | ||||
|                 <button onClick={this.handleEmbedClick}><i className={`fa fa-${iconVariant}`} /></button> | ||||
|                 <a href={card.get('url')} target='_blank' rel='noopener'><i className='fa fa-external-link' /></a> | ||||
|                 {horizontal && <a href={card.get('url')} target='_blank' rel='noopener'><i className='fa fa-external-link' /></a>} | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|  | @ -184,7 +186,7 @@ export default class Card extends React.PureComponent { | |||
|       return ( | ||||
|         <div className={className} ref={this.setRef}> | ||||
|           {embed} | ||||
|           {description} | ||||
|           {!compact && description} | ||||
|         </div> | ||||
|       ); | ||||
|     } else if (card.get('image')) { | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ import { connect } from 'react-redux'; | |||
| import Card from '../components/card'; | ||||
| 
 | ||||
| const mapStateToProps = (state, { statusId }) => ({ | ||||
|   card: state.getIn(['cards', statusId], null), | ||||
|   card: state.getIn(['statuses', statusId, 'card'], null), | ||||
| }); | ||||
| 
 | ||||
| export default connect(mapStateToProps)(Card); | ||||
|  |  | |||
|  | @ -14,7 +14,6 @@ import relationships from './relationships'; | |||
| import settings from './settings'; | ||||
| import push_notifications from './push_notifications'; | ||||
| import status_lists from './status_lists'; | ||||
| import cards from './cards'; | ||||
| import mutes from './mutes'; | ||||
| import reports from './reports'; | ||||
| import contexts from './contexts'; | ||||
|  | @ -46,7 +45,6 @@ const reducers = { | |||
|   relationships, | ||||
|   settings, | ||||
|   push_notifications, | ||||
|   cards, | ||||
|   mutes, | ||||
|   reports, | ||||
|   contexts, | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ import { | |||
|   STATUS_REVEAL, | ||||
|   STATUS_HIDE, | ||||
| } from '../actions/statuses'; | ||||
| import { STATUS_CARD_FETCH_SUCCESS } from '../actions/cards'; | ||||
| import { TIMELINE_DELETE } from '../actions/timelines'; | ||||
| import { STATUS_IMPORT, STATUSES_IMPORT } from '../actions/importer'; | ||||
| import { Map as ImmutableMap, fromJS } from 'immutable'; | ||||
|  | @ -65,6 +66,8 @@ export default function statuses(state = initialState, action) { | |||
|     }); | ||||
|   case TIMELINE_DELETE: | ||||
|     return deleteStatus(state, action.id, action.references); | ||||
|   case STATUS_CARD_FETCH_SUCCESS: | ||||
|     return state.setIn([action.id, 'card'], fromJS(action.card)); | ||||
|   default: | ||||
|     return state; | ||||
|   } | ||||
|  |  | |||
|  | @ -5,7 +5,6 @@ import { start } from '../mastodon/common'; | |||
| start(); | ||||
| 
 | ||||
| function main() { | ||||
|   const { length } = require('stringz'); | ||||
|   const IntlMessageFormat = require('intl-messageformat').default; | ||||
|   const { timeAgoString } = require('../mastodon/components/relative_timestamp'); | ||||
|   const { delegate } = require('rails-ujs'); | ||||
|  |  | |||
|  | @ -1669,6 +1669,7 @@ a.account__display-name { | |||
|   padding: 4px 0; | ||||
|   border-radius: 4px; | ||||
|   box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); | ||||
|   z-index: 9999; | ||||
| 
 | ||||
|   ul { | ||||
|     list-style: none; | ||||
|  | @ -2560,6 +2561,9 @@ a.status-card { | |||
|   display: block; | ||||
|   margin-top: 5px; | ||||
|   font-size: 13px; | ||||
|   overflow: hidden; | ||||
|   text-overflow: ellipsis; | ||||
|   white-space: nowrap; | ||||
| } | ||||
| 
 | ||||
| .status-card__image { | ||||
|  | @ -2584,6 +2588,31 @@ a.status-card { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| .status-card.compact { | ||||
|   border-color: lighten($ui-base-color, 4%); | ||||
| 
 | ||||
|   &.interactive { | ||||
|     border: 0; | ||||
|   } | ||||
| 
 | ||||
|   .status-card__content { | ||||
|     padding: 8px; | ||||
|     padding-top: 10px; | ||||
|   } | ||||
| 
 | ||||
|   .status-card__title { | ||||
|     white-space: nowrap; | ||||
|   } | ||||
| 
 | ||||
|   .status-card__image { | ||||
|     flex: 0 0 60px; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| a.status-card.compact:hover { | ||||
|   background-color: lighten($ui-base-color, 4%); | ||||
| } | ||||
| 
 | ||||
| .status-card__image-image { | ||||
|   border-radius: 4px 0 0 4px; | ||||
|   display: block; | ||||
|  |  | |||
|  | @ -130,17 +130,6 @@ body.rtl { | |||
|     float: left; | ||||
|   } | ||||
| 
 | ||||
|   .activity-stream .detailed-status.light .detailed-status__display-name > div { | ||||
|     float: right; | ||||
|     margin-right: 0; | ||||
|     margin-left: 10px; | ||||
|   } | ||||
| 
 | ||||
|   .activity-stream .detailed-status.light .detailed-status__meta span > span { | ||||
|     margin-left: 0; | ||||
|     margin-right: 6px; | ||||
|   } | ||||
| 
 | ||||
|   .status__action-bar { | ||||
| 
 | ||||
|     &__counter { | ||||
|  | @ -174,6 +163,10 @@ body.rtl { | |||
|     margin-right: 0; | ||||
|   } | ||||
| 
 | ||||
|   .detailed-status__display-name .display-name { | ||||
|     text-align: right; | ||||
|   } | ||||
| 
 | ||||
|   .detailed-status__display-avatar { | ||||
|     margin-right: 0; | ||||
|     margin-left: 10px; | ||||
|  | @ -359,4 +352,22 @@ body.rtl { | |||
|     margin-right: 15px; | ||||
|     text-align: right; | ||||
|   } | ||||
| 
 | ||||
|   .fa-chevron-left::before { | ||||
|     content: "\F054"; | ||||
|   } | ||||
| 
 | ||||
|   .fa-chevron-right::before { | ||||
|     content: "\F053"; | ||||
|   } | ||||
| 
 | ||||
|   .column-back-button__icon { | ||||
|     margin-right: 0; | ||||
|     margin-left: 5px; | ||||
|   } | ||||
| 
 | ||||
|   .column-header__setting-arrows .column-header__setting-btn:last-child { | ||||
|     padding-left: 0; | ||||
|     padding-right: 10px; | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -81,11 +81,22 @@ class ActivityPub::Activity::Create < ActivityPub::Activity | |||
|       @mentions << Mention.new(account: account, silent: true) | ||||
| 
 | ||||
|       # If there is at least one silent mention, then the status can be considered | ||||
|       # as a limited-audience status, and not strictly a direct message | ||||
|       # as a limited-audience status, and not strictly a direct message, but only | ||||
|       # if we considered a direct message in the first place | ||||
|       next unless @params[:visibility] == :direct | ||||
| 
 | ||||
|       @params[:visibility] = :limited | ||||
|     end | ||||
| 
 | ||||
|     # If the payload was delivered to a specific inbox, the inbox owner must have | ||||
|     # access to it, unless they already have access to it anyway | ||||
|     return if @options[:delivered_to_account_id].nil? || @mentions.any? { |mention| mention.account_id == @options[:delivered_to_account_id] } | ||||
| 
 | ||||
|     @mentions << Mention.new(account_id: @options[:delivered_to_account_id], silent: true) | ||||
| 
 | ||||
|     return unless @params[:visibility] == :direct | ||||
| 
 | ||||
|     @params[:visibility] = :limited | ||||
|   end | ||||
| 
 | ||||
|   def attach_tags(status) | ||||
|  | @ -118,7 +129,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity | |||
|     return if tag['name'].blank? | ||||
| 
 | ||||
|     hashtag = tag['name'].gsub(/\A#/, '').mb_chars.downcase | ||||
|     hashtag = Tag.where(name: hashtag).first_or_create(name: hashtag) | ||||
|     hashtag = Tag.where(name: hashtag).first_or_create!(name: hashtag) | ||||
| 
 | ||||
|     return if @tags.include?(hashtag) | ||||
| 
 | ||||
|  |  | |||
|  | @ -58,6 +58,9 @@ class AccountConversation < ApplicationRecord | |||
| 
 | ||||
|     def add_status(recipient, status) | ||||
|       conversation = find_or_initialize_by(account: recipient, conversation_id: status.conversation_id, participant_account_ids: participants_from_status(recipient, status)) | ||||
| 
 | ||||
|       return conversation if conversation.status_ids.include?(status.id) | ||||
| 
 | ||||
|       conversation.status_ids << status.id | ||||
|       conversation.unread = status.account_id != recipient.id | ||||
|       conversation.save | ||||
|  |  | |||
|  | @ -148,6 +148,7 @@ class MediaAttachment < ApplicationRecord | |||
|     "#{x},#{y}" | ||||
|   end | ||||
| 
 | ||||
|   after_commit :reset_parent_cache, on: :update | ||||
|   before_create :prepare_description, unless: :local? | ||||
|   before_create :set_shortcode | ||||
|   before_post_process :set_type_and_extension | ||||
|  | @ -252,4 +253,9 @@ class MediaAttachment < ApplicationRecord | |||
|       bitrate: movie.bitrate, | ||||
|     } | ||||
|   end | ||||
| 
 | ||||
|   def reset_parent_cache | ||||
|     return if status_id.nil? | ||||
|     Rails.cache.delete("statuses/#{status_id}") | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -94,6 +94,7 @@ class Status < ApplicationRecord | |||
|                    :conversation, | ||||
|                    :status_stat, | ||||
|                    :tags, | ||||
|                    :preview_cards, | ||||
|                    :stream_entry, | ||||
|                    active_mentions: :account, | ||||
|                    reblog: [ | ||||
|  | @ -101,6 +102,7 @@ class Status < ApplicationRecord | |||
|                      :application, | ||||
|                      :stream_entry, | ||||
|                      :tags, | ||||
|                      :preview_cards, | ||||
|                      :media_attachments, | ||||
|                      :conversation, | ||||
|                      :status_stat, | ||||
|  | @ -168,6 +170,10 @@ class Status < ApplicationRecord | |||
|     reblog | ||||
|   end | ||||
| 
 | ||||
|   def preview_card | ||||
|     preview_cards.first | ||||
|   end | ||||
| 
 | ||||
|   def title | ||||
|     if destroyed? | ||||
|       "#{account.acct} deleted status" | ||||
|  | @ -241,10 +247,6 @@ class Status < ApplicationRecord | |||
|   before_validation :set_local | ||||
| 
 | ||||
|   class << self | ||||
|     def cache_ids | ||||
|       left_outer_joins(:status_stat).select('statuses.id, greatest(statuses.updated_at, status_stats.updated_at) AS updated_at') | ||||
|     end | ||||
| 
 | ||||
|     def selectable_visibilities | ||||
|       visibilities.keys - %w(direct limited) | ||||
|     end | ||||
|  |  | |||
|  | @ -14,4 +14,12 @@ | |||
| 
 | ||||
| class StatusStat < ApplicationRecord | ||||
|   belongs_to :status, inverse_of: :status_stat | ||||
| 
 | ||||
|   after_commit :reset_parent_cache | ||||
| 
 | ||||
|   private | ||||
| 
 | ||||
|   def reset_parent_cache | ||||
|     Rails.cache.delete("statuses/#{status_id}") | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -21,6 +21,8 @@ class REST::StatusSerializer < ActiveModel::Serializer | |||
|   has_many :tags | ||||
|   has_many :emojis, serializer: REST::CustomEmojiSerializer | ||||
| 
 | ||||
|   has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer | ||||
| 
 | ||||
|   def id | ||||
|     object.id.to_s | ||||
|   end | ||||
|  |  | |||
|  | @ -5,9 +5,10 @@ class ActivityPub::FetchRemoteAccountService < BaseService | |||
| 
 | ||||
|   SUPPORTED_TYPES = %w(Application Group Organization Person Service).freeze | ||||
| 
 | ||||
|   # Should be called when uri has already been checked for locality | ||||
|   # Does a WebFinger roundtrip on each call | ||||
|   def call(uri, id: true, prefetched_body: nil, break_on_redirect: false) | ||||
|     return ActivityPub::TagManager.instance.uri_to_resource(uri, Account) if ActivityPub::TagManager.instance.local_uri?(uri) | ||||
| 
 | ||||
|     @json = if prefetched_body.nil? | ||||
|               fetch_resource(uri, id) | ||||
|             else | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ class FetchLinkCardService < BaseService | |||
| 
 | ||||
|     return if @url.nil? || @status.preview_cards.any? | ||||
| 
 | ||||
|     @mentions = status.mentions | ||||
|     @url      = @url.to_s | ||||
| 
 | ||||
|     RedisLock.acquire(lock_options) do |lock| | ||||
|  | @ -62,6 +63,7 @@ class FetchLinkCardService < BaseService | |||
| 
 | ||||
|   def attach_card | ||||
|     @status.preview_cards << @card | ||||
|     Rails.cache.delete(@status) | ||||
|   end | ||||
| 
 | ||||
|   def parse_urls | ||||
|  | @ -81,9 +83,16 @@ class FetchLinkCardService < BaseService | |||
|     uri.host.blank? || TagManager.instance.local_url?(uri.to_s) || !%w(http https).include?(uri.scheme) | ||||
|   end | ||||
| 
 | ||||
|   def mention_link?(a) | ||||
|     return false if @mentions.nil? | ||||
|     @mentions.any? do |mention| | ||||
|       a['href'] == TagManager.instance.url_for(mention.target) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def skip_link?(a) | ||||
|     # Avoid links for hashtags and mentions (microformats) | ||||
|     a['rel']&.include?('tag') || a['class']&.include?('u-url') | ||||
|     a['rel']&.include?('tag') || a['class']&.include?('u-url') || mention_link?(a) | ||||
|   end | ||||
| 
 | ||||
|   def attempt_oembed | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ class VerifyLinkService < BaseService | |||
|   end | ||||
| 
 | ||||
|   def link_back_present? | ||||
|     return false if @body.empty? | ||||
|     return false if @body.blank? | ||||
| 
 | ||||
|     links = Nokogiri::HTML(@body).xpath('//a[contains(concat(" ", normalize-space(@rel), " "), " me ")]|//link[contains(concat(" ", normalize-space(@rel), " "), " me ")]') | ||||
| 
 | ||||
|  |  | |||
|  | @ -14,4 +14,4 @@ | |||
| 
 | ||||
|         = yield | ||||
| 
 | ||||
| = render template: 'layouts/application', locals: { body_classes: 'admin' } | ||||
| = render template: 'layouts/application' | ||||
|  |  | |||
|  | @ -6,8 +6,8 @@ | |||
| 
 | ||||
|   .fields-row | ||||
|     .fields-row__column.fields-group.fields-row__column-6 | ||||
|       = f.input :display_name, wrapper: :with_label, hint: t('simple_form.hints.defaults.display_name', count: 30 - @account.display_name.size).html_safe | ||||
|       = f.input :note, wrapper: :with_label, hint: t('simple_form.hints.defaults.note', count: 500 - @account.note.size).html_safe | ||||
|       = f.input :display_name, wrapper: :with_label, input_html: { maxlength: 30 }, hint: false | ||||
|       = f.input :note, wrapper: :with_label, input_html: { maxlength: 500 }, hint: false | ||||
| 
 | ||||
|   .fields-row | ||||
|     .fields-row__column.fields-row__column-6 | ||||
|  | @ -36,8 +36,8 @@ | |||
| 
 | ||||
|         = f.simple_fields_for :fields do |fields_f| | ||||
|           .row | ||||
|             = fields_f.input :name, placeholder: t('simple_form.labels.account.fields.name') | ||||
|             = fields_f.input :value, placeholder: t('simple_form.labels.account.fields.value') | ||||
|             = fields_f.input :name, placeholder: t('simple_form.labels.account.fields.name'), input_html: { maxlength: 255 } | ||||
|             = fields_f.input :value, placeholder: t('simple_form.labels.account.fields.value'), input_html: { maxlength: 255 } | ||||
| 
 | ||||
|     .fields-row__column.fields-group.fields-row__column-6 | ||||
|       %h6= t('verification.verification') | ||||
|  |  | |||
|  | @ -15,6 +15,7 @@ | |||
|         %span.display-name | ||||
|           %bdi | ||||
|             %strong.display-name__html.p-name.emojify= display_name(status.account, custom_emojify: true, autoplay: autoplay) | ||||
|             | ||||
|           %span.display-name__account | ||||
|             = acct(status.account) | ||||
|             = fa_icon('lock') if status.account.locked? | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ class ActivityPub::ProcessingWorker | |||
| 
 | ||||
|   sidekiq_options backtrace: true | ||||
| 
 | ||||
|   def perform(account_id, body) | ||||
|     ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true) | ||||
|   def perform(account_id, body, delivered_to_account_id = nil) | ||||
|     ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true, delivered_to_account_id: delivered_to_account_id) | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -9,6 +9,10 @@ Rails.application.config.middleware.insert_before 0, Rack::Cors do | |||
|   allow do | ||||
|     origins '*' | ||||
| 
 | ||||
|     resource '/.well-known/*', | ||||
|       headers: :any, | ||||
|       methods: [:get], | ||||
|       credentials: false | ||||
|     resource '/@:username', | ||||
|       headers: :any, | ||||
|       methods: [:get], | ||||
|  |  | |||
|  | @ -1 +1,2 @@ | |||
| --- | ||||
| ast: {} | ||||
|  |  | |||
|  | @ -30,22 +30,16 @@ ar: | |||
|     other_instances: خوادم أخرى | ||||
|     privacy_policy: سياسة الخصوصية | ||||
|     source_code: الشفرة المصدرية | ||||
|     status_count_after: | ||||
|       one: منشور | ||||
|       other: منشورات | ||||
|     status_count_after: منشورات | ||||
|     status_count_before: نشروا | ||||
|     terms: شروط الخدمة | ||||
|     user_count_after: | ||||
|       one: مستخدِم | ||||
|       other: مستخدِمين | ||||
|     user_count_after: مستخدِمين | ||||
|     user_count_before: يستضيف | ||||
|     what_is_mastodon: ما هو ماستدون ؟ | ||||
|   accounts: | ||||
|     choices_html: 'توصيات %{name} :' | ||||
|     follow: إتبع | ||||
|     followers: | ||||
|       one: مُتابِع | ||||
|       other: مُتابِعون | ||||
|     followers: مُتابِعون | ||||
|     following: مُتابَع | ||||
|     joined: انضم·ت في %{date} | ||||
|     link_verified_on: تم التحقق مِن مالك هذا الرابط بتاريخ %{date} | ||||
|  | @ -57,9 +51,7 @@ ar: | |||
|     people_who_follow: الأشخاص الذين يتبعون %{name} | ||||
|     pin_errors: | ||||
|       following: يجب أن تكون مِن متابعي حساب الشخص الذي تريد إبرازه | ||||
|     posts: | ||||
|       one: تبويق | ||||
|       other: تبويقات | ||||
|     posts: تبويقات | ||||
|     posts_tab_heading: تبويقات | ||||
|     posts_with_replies: التبويقات و الردود | ||||
|     reserved_username: إسم المستخدم محجوز | ||||
|  | @ -170,8 +162,8 @@ ar: | |||
|       web: الويب | ||||
|     action_logs: | ||||
|       actions: | ||||
|         assigned_to_self_report: قام {name} بتعيين التقرير٪ {target} لأنفسهم | ||||
|         change_email_user: غيّر٪ {name} عنوان البريد الإلكتروني للمستخدم٪ {target} | ||||
|         assigned_to_self_report: قام %{name} بتعيين التقرير %{target} لأنفسهم | ||||
|         change_email_user: غيّر %{name} عنوان البريد الإلكتروني للمستخدم %{target} | ||||
|         confirm_user: "%{name} قد قام بتأكيد عنوان البريد الإلكتروني لـ %{target}" | ||||
|         create_custom_emoji: "%{name} قام برفع إيموجي جديد %{target}" | ||||
|         create_domain_block: "%{name} قام بحجب نطاق %{target}" | ||||
|  | @ -187,13 +179,13 @@ ar: | |||
|         enable_user: لقد قام %{name} بتنشيط تسجيل الدخول للمستخدِم %{target} | ||||
|         memorialize_account: لقد قام %{name} بتحويل حساب %{target} إلى صفحة تذكارية | ||||
|         promote_user: "%{name} قام بترقية المستخدم %{target}" | ||||
|         remove_avatar_user: تمت إزالة٪ {name} الصورة الرمزية٪ {target} | ||||
|         reopen_report: تمت إعادة فتح التقرير {name}٪ {target} | ||||
|         remove_avatar_user: تمت إزالة %{name} الصورة الرمزية %{target} | ||||
|         reopen_report: تمت إعادة فتح التقرير %{name} %{target} | ||||
|         reset_password_user: "%{name} لقد قام بإعادة تعيين الكلمة السرية الخاصة بـ %{target}" | ||||
|         resolve_report: قام %{name} بحل التقرير %{target} | ||||
|         silence_account: لقد قام %{name} بكتم حساب %{target} | ||||
|         suspend_account: لقد قام %{name} بتعليق حساب %{target} | ||||
|         unassigned_report: "٪ {name} تقرير غير معتمد٪ {target}" | ||||
|         unassigned_report: "%{name} تقرير غير معتمد %{target}" | ||||
|         unsilence_account: لقد قام %{name} بإلغاء الكتم عن حساب %{target} | ||||
|         unsuspend_account: لقد قام %{name} بإلغاء التعليق المفروض على حساب %{target} | ||||
|         update_custom_emoji: "%{name} قام بتحديث الإيموجي %{target}" | ||||
|  | @ -268,9 +260,7 @@ ar: | |||
|         suspend: تعليق | ||||
|       severity: الشدة | ||||
|       show: | ||||
|         affected_accounts: | ||||
|           one: حساب واحد معني في قاعدة البيانات | ||||
|           other: "%{count} حسابات معنية في قاعدة البيانات" | ||||
|         affected_accounts: "%{count} حسابات معنية في قاعدة البيانات" | ||||
|         retroactive: | ||||
|           silence: إلغاء الكتم عن كافة الحسابات المتواجدة على هذا النطاق | ||||
|           suspend: إلغاء التعليق المفروض على كافة حسابات هذا النطاق | ||||
|  | @ -441,7 +431,7 @@ ar: | |||
|   admin_mailer: | ||||
|     new_report: | ||||
|       body: قام %{reporter} بالإبلاغ عن %{target} | ||||
|       body_remote: أبلغ شخص ما من٪ {domain} عن٪ {target} | ||||
|       body_remote: أبلغ شخص ما من %{domain} عن %{target} | ||||
|       subject: تقرير جديد ل%{instance} (#%{id}) | ||||
|   application_mailer: | ||||
|     notification_preferences: تعديل خيارات البريد الإلكتروني | ||||
|  | @ -570,9 +560,7 @@ ar: | |||
|   generic: | ||||
|     changes_saved_msg: تم حفظ التعديلات بنجاح ! | ||||
|     save_changes: حفظ التغييرات | ||||
|     validation_errors: | ||||
|       one: هناك شيء ما لا يبدو أنه على ما يُرام بعدُ. يُرجى الإطلاع على الخطأ أدناه | ||||
|       other: هناك شيء ليس على ما يُرام! يُرجى معاينة الأخطاء الـ %{count} التالية | ||||
|     validation_errors: هناك شيء ليس على ما يُرام! يُرجى معاينة الأخطاء الـ %{count} التالية | ||||
|   imports: | ||||
|     preface: بإمكانك استيراد بيانات قد قُمتَ بتصديرها مِن مثيل خادوم آخَر، كقوائم المستخدِمين الذين كنتَ تتابِعهم أو قُمتَ بحظرهم. | ||||
|     success: تم تحميل بياناتك بنجاح وسيتم معالجتها في الوقت المناسب | ||||
|  | @ -595,9 +583,7 @@ ar: | |||
|     expires_in_prompt: أبدا | ||||
|     generate: توليد | ||||
|     invited_by: 'تمت دعوتك من طرف :' | ||||
|     max_uses: | ||||
|       one: استعمال واحد | ||||
|       other: "%{count} استخدامات" | ||||
|     max_uses: "%{count} استخدامات" | ||||
|     max_uses_prompt: بلا حدود | ||||
|     prompt: توليد و مشاركة روابط للسماح للآخَرين بالنفاذ إلى مثيل الخادوم هذا | ||||
|     table: | ||||
|  | @ -623,12 +609,8 @@ ar: | |||
|       action: معاينة كافة الإشعارات | ||||
|       body: هذا هو مُلَخَّص الرسائل التي فاتتك وذلك منذ آخر زيارة لك في  %{since} | ||||
|       mention: "%{name} أشار إليك في :" | ||||
|       new_followers_summary: | ||||
|         one: و لقد تحصّلت أيضا على متابِع جديد أثناء فترة غيابك! يا للروعة! | ||||
|         other: رائع، لقد قام بمتابعتك %{count} مُتابِعون جُدد أثناء فترة غيابك عن ماستدون ! | ||||
|       subject: | ||||
|         one: "إشعار جديد واحد منذ آخر زيارة لك لـ \U0001F418" | ||||
|         other: "%{count} إشعارات جديدة منذ آخر زيارة لك إلى \U0001F418" | ||||
|       new_followers_summary: رائع، لقد قام بمتابعتك %{count} مُتابِعون جُدد أثناء فترة غيابك عن ماستدون ! | ||||
|       subject: "%{count} إشعارات جديدة منذ آخر زيارة لك إلى \U0001F418" | ||||
|       title: أثناء فترة غيابك … | ||||
|     favourite: | ||||
|       body: 'أُعجب %{name} بمنشورك :' | ||||
|  | @ -746,17 +728,11 @@ ar: | |||
|   statuses: | ||||
|     attached: | ||||
|       description: 'مُرفَق : %{attached}' | ||||
|       image: | ||||
|         one: "%{count} صورة" | ||||
|         other: "%{count} صُوَر" | ||||
|       video: | ||||
|         one: "%{count} فيديو" | ||||
|         other: "%{count} فيديوهات" | ||||
|       image: "%{count} صُوَر" | ||||
|       video: "%{count} فيديوهات" | ||||
|     boosted_from_html: تم إعادة ترقيته مِن %{acct_link} | ||||
|     content_warning: 'تحذير عن المحتوى : %{warning}' | ||||
|     disallowed_hashtags: | ||||
|       one: 'يحتوي على وسم ممنوع:  %{tags}' | ||||
|       other: 'يحتوي على أحد الوسوم الممنوعة: %{tags}' | ||||
|     disallowed_hashtags: 'يحتوي على أحد الوسوم الممنوعة: %{tags}' | ||||
|     language_detection: اكتشاف اللغة تلقائيا | ||||
|     open_in_web: إفتح في الويب | ||||
|     over_character_limit: تم تجاوز حد الـ %{max} حرف المسموح بها | ||||
|  |  | |||
|  | @ -21,8 +21,7 @@ ast: | |||
|     hosted_on: Mastodon ta agospiáu en %{domain} | ||||
|     learn_more: Deprendi más | ||||
|     source_code: Códigu fonte | ||||
|     status_count_after: | ||||
|       other: estaos | ||||
|     status_count_after: estaos | ||||
|     terms: Términos del serviciu | ||||
|     user_count_after: usuarios | ||||
|     what_is_mastodon: "¿Qué ye Mastodon?" | ||||
|  |  | |||
|  | @ -61,9 +61,7 @@ bg: | |||
|   generic: | ||||
|     changes_saved_msg: Успешно запазване на промените! | ||||
|     save_changes: Запази промените | ||||
|     validation_errors: | ||||
|       one: Нещо все още не е наред! Моля, прегледай грешката по-долу | ||||
|       other: Нещо все още не е наред! Моля, прегледай грешките по-долу | ||||
|     validation_errors: Нещо все още не е наред! Моля, прегледай грешките по-долу | ||||
|   imports: | ||||
|     preface: Можеш да импортираш някои данни, като например всички хора, които следваш или блокираш в акаунта си на тази инстанция, от файлове, създадени чрез експорт в друга инстанция. | ||||
|     success: Твоите данни бяха успешно качени и ще бъдат обработени впоследствие. | ||||
|  | @ -77,7 +75,7 @@ bg: | |||
|       too_many: Не мога да прикача повече от 4 файла | ||||
|   notification_mailer: | ||||
|     digest: | ||||
|       body: 'Ето кратко резюме на нещата, които се случиха от последното ти посещение в %{instance} на %{since}:' | ||||
|       body: 'Ето кратко резюме на нещата, които се случиха от последното ти посещение на %{since}:' | ||||
|       mention: "%{name} те спомена в:" | ||||
|       new_followers_summary: | ||||
|         one: Имаш един нов последовател! Ура! | ||||
|  |  | |||
|  | @ -617,7 +617,7 @@ ca: | |||
|   notification_mailer: | ||||
|     digest: | ||||
|       action: Veure totes les notificacions | ||||
|       body: Un resum del que et vas perdre en %{instance} desde la darrera visita el %{since} | ||||
|       body: Un resum del que et vas perdre desde la darrera visita el %{since} | ||||
|       mention: "%{name} t'ha mencionat en:" | ||||
|       new_followers_summary: | ||||
|         one: A més, has adquirit un nou seguidor durant la teva absència! Visca! | ||||
|  |  | |||
|  | @ -30,22 +30,16 @@ cs: | |||
|     other_instances: Seznam instancí | ||||
|     privacy_policy: Zásady soukromí | ||||
|     source_code: Zdrojový kód | ||||
|     status_count_after: | ||||
|       one: příspěvek | ||||
|       other: příspěvků | ||||
|     status_count_after: příspěvků | ||||
|     status_count_before: Kteří napsali | ||||
|     terms: Podmínky používání | ||||
|     user_count_after: | ||||
|       one: uživatele | ||||
|       other: uživatelů | ||||
|     user_count_after: uživatelů | ||||
|     user_count_before: Domov | ||||
|     what_is_mastodon: Co je Mastodon? | ||||
|   accounts: | ||||
|     choices_html: 'Volby uživatele %{name}:' | ||||
|     follow: Sledovat | ||||
|     followers: | ||||
|       one: Sledovatel | ||||
|       other: Sledovatelé | ||||
|     followers: Sledovatelé | ||||
|     following: Sledovaní | ||||
|     joined: Připojil/a se v %{date} | ||||
|     link_verified_on: Vlastnictví tohoto odkazu bylo zkontrolováno %{date} | ||||
|  | @ -57,9 +51,7 @@ cs: | |||
|     people_who_follow: Lidé, kteří sledují uživatele %{name} | ||||
|     pin_errors: | ||||
|       following: Musíte již sledovat osobu, kterou chcete podpořit | ||||
|     posts: | ||||
|       one: Toot | ||||
|       other: Tooty | ||||
|     posts: Tooty | ||||
|     posts_tab_heading: Tooty | ||||
|     posts_with_replies: Tooty a odpovědi | ||||
|     reserved_username: Toto uživatelské jméno je rezervováno | ||||
|  | @ -268,9 +260,7 @@ cs: | |||
|         suspend: Suspendovat | ||||
|       severity: Přísnost | ||||
|       show: | ||||
|         affected_accounts: | ||||
|           one: Jeden účet v databázi byl ovlivněn | ||||
|           other: "%{count} účtů v databázi byl ovlivněn" | ||||
|         affected_accounts: "%{count} účtů v databázi byl ovlivněn" | ||||
|         retroactive: | ||||
|           silence: Odtišit všechny existující účty z této domény | ||||
|           suspend: Zrušit suspenzaci všech existujících účtů z této domény | ||||
|  | @ -562,9 +552,7 @@ cs: | |||
|     followers_count: Počet sledovatelů | ||||
|     lock_link: Zamkněte svůj účet | ||||
|     purge: Odstranit ze sledovatelů | ||||
|     success: | ||||
|       one: V průběhu utišování sledovatelů z jedné domény... | ||||
|       other: V průběhu utišování sledovatelů z %{count} domén... | ||||
|     success: V průběhu utišování sledovatelů z %{count} domén... | ||||
|     true_privacy_html: Berte prosím na vědomí, že <strong>skutečného soukromí se dá dosáhnout pouze za pomoci end-to-end šifrování</strong>. | ||||
|     unlocked_warning_html: Kdokoliv vás může sledovat a okamžitě vidět vaše soukromé příspěvky. %{lock_link}, abyste mohl/a zkontrolovat a odmítnout sledovatele. | ||||
|     unlocked_warning_title: Váš účet není zamknutý | ||||
|  | @ -575,9 +563,7 @@ cs: | |||
|   generic: | ||||
|     changes_saved_msg: Změny byly úspěšně uloženy! | ||||
|     save_changes: Uložit změny | ||||
|     validation_errors: | ||||
|       one: Něco ještě není úplně v pořádku! Prosím zkontrolujte chybu níže | ||||
|       other: Něco ještě není úplně v pořádku! Prosím zkontrolujte %{count} chyb níže | ||||
|     validation_errors: Něco ještě není úplně v pořádku! Prosím zkontrolujte %{count} chyb níže | ||||
|   imports: | ||||
|     preface: Můžete importovat data, která jste exportoval/a z jiné instance, jako například seznam lidí, které sledujete či blokujete. | ||||
|     success: Vaše data byla úspěšně nahrána a nyní budou zpracována v daný čas | ||||
|  | @ -600,9 +586,7 @@ cs: | |||
|     expires_in_prompt: Nikdy | ||||
|     generate: Vygenerovat | ||||
|     invited_by: 'Byl/a jste pozván/a uživatelem:' | ||||
|     max_uses: | ||||
|       one: 1 použití | ||||
|       other: "%{count} použití" | ||||
|     max_uses: "%{count} použití" | ||||
|     max_uses_prompt: Bez limitu | ||||
|     prompt: Vygenerujte a sdílejte s ostatními odkazy a umožněte jim přístup na tuto instanci | ||||
|     table: | ||||
|  | @ -628,12 +612,8 @@ cs: | |||
|       action: Zobrazit všechna oznámení | ||||
|       body: Zde najdete stručný souhrn zpráv, které jste zmeškal/a od vaší poslední návštěvy %{since} | ||||
|       mention: "%{name} vás zmínil/a v:" | ||||
|       new_followers_summary: | ||||
|         one: Navíc jste získal/a jednoho nového sledovatele, zatímco jste byl/a pryč! Hurá! | ||||
|         other: Navíc jste získal/a %{count} nových sledovatelů, zatímco jste byl/a pryč! Hurá! | ||||
|       subject: | ||||
|         one: "Jedno nové oznámení od vaší poslední návštěvy \U0001F418" | ||||
|         other: "%{count} nových oznámení od vaší poslední návštěvy \U0001F418" | ||||
|       new_followers_summary: Navíc jste získal/a %{count} nových sledovatelů, zatímco jste byl/a pryč! Hurá! | ||||
|       subject: "%{count} nových oznámení od vaší poslední návštěvy \U0001F418" | ||||
|       title: Ve vaší absenci... | ||||
|     favourite: | ||||
|       body: 'Váš příspěvek si oblíbil/a %{name}:' | ||||
|  | @ -750,17 +730,11 @@ cs: | |||
|   statuses: | ||||
|     attached: | ||||
|       description: 'Přiloženo: %{attached}' | ||||
|       image: | ||||
|         one: "%{count} obrázek" | ||||
|         other: "%{count} obrázků" | ||||
|       video: | ||||
|         one: "%{count} video" | ||||
|         other: "%{count} videí" | ||||
|       image: "%{count} obrázků" | ||||
|       video: "%{count} videí" | ||||
|     boosted_from_html: Boostnuto z %{acct_link} | ||||
|     content_warning: 'Varování o obsahu: %{warning}' | ||||
|     disallowed_hashtags: | ||||
|       one: 'obsahuje nepovolený hashtag: %{tags}' | ||||
|       other: 'obsahuje nepovolené hashtagy: %{tags}' | ||||
|     disallowed_hashtags: 'obsahuje nepovolené hashtagy: %{tags}' | ||||
|     language_detection: Zjistit jazyk automaticky | ||||
|     open_in_web: Otevřít na webu | ||||
|     over_character_limit: limit %{max} znaků byl překročen | ||||
|  |  | |||
|  | @ -30,22 +30,16 @@ cy: | |||
|     other_instances: Rhestr achosion | ||||
|     privacy_policy: Polisi preifatrwydd | ||||
|     source_code: Cod ffynhonnell | ||||
|     status_count_after: | ||||
|       one: statws | ||||
|       other: statws | ||||
|     status_count_after: statws | ||||
|     status_count_before: Pwy ysgrifennodd | ||||
|     terms: Telerau gwasanaeth | ||||
|     user_count_after: | ||||
|       one: defnyddiwr | ||||
|       other: defnyddwyr | ||||
|     user_count_after: defnyddwyr | ||||
|     user_count_before: Cartref i | ||||
|     what_is_mastodon: Beth yw Mastodon? | ||||
|   accounts: | ||||
|     choices_html: 'Dewisiadau %{name}:' | ||||
|     follow: Dilynwch | ||||
|     followers: | ||||
|       one: Dilynwr | ||||
|       other: Dilynwyr | ||||
|     followers: Dilynwyr | ||||
|     following: Yn dilyn | ||||
|     joined: Ymunodd %{date} | ||||
|     media: Cyfryngau | ||||
|  | @ -56,9 +50,7 @@ cy: | |||
|     people_who_follow: Pobl sy'n dilyn %{name} | ||||
|     pin_errors: | ||||
|       following: Rhaid i ti fod yn dilyn y person yr ydych am ei gymeradwyo yn barod | ||||
|     posts: | ||||
|       one: Tŵt | ||||
|       other: Tŵtiau | ||||
|     posts: Tŵtiau | ||||
|     posts_tab_heading: Tŵtiau | ||||
|     posts_with_replies: Tŵtiau ac atebion | ||||
|     reserved_username: Mae'r enw defnyddior yn neilltuedig | ||||
|  | @ -262,9 +254,7 @@ cy: | |||
|         suspend: Atal | ||||
|       severity: Difrifoldeb | ||||
|       show: | ||||
|         affected_accounts: | ||||
|           one: Mae un cyfri yn y bas data wedi ei effeithio | ||||
|           other: "%{count} o gyfrifoedd yn y bas data wedi eu hefeithio" | ||||
|         affected_accounts: "%{count} o gyfrifoedd yn y bas data wedi eu hefeithio" | ||||
|         retroactive: | ||||
|           silence: Dad-dawelu pob cyfri presennol o'r parth hwn | ||||
|           suspend: Dad-atal pob cyfrif o'r parth hwn sy'n bodoli | ||||
|  | @ -508,9 +498,7 @@ cy: | |||
|   generic: | ||||
|     changes_saved_msg: Llwyddwyd i gadw y newidiadau! | ||||
|     save_changes: Cadw newidiadau | ||||
|     validation_errors: | ||||
|       one: Mae rhywbeth o'i le o hyd! Edrychwch ar y gwall isod os gwelwch yn dda | ||||
|       other: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda | ||||
|     validation_errors: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda | ||||
|   imports: | ||||
|     preface: Mae modd mewnforio data yr ydych wedi allforio o achos arall, megis rhestr o bobl yr ydych yn ei ddilyn neu yn blocio. | ||||
|     success: Uwchlwyddwyd eich data yn llwyddiannus ac fe fydd yn cael ei brosesu mewn da bryd | ||||
|  |  | |||
|  | @ -77,6 +77,4 @@ ar: | |||
|       expired: إنتهت مدة صلاحيته، الرجاء طلب واحد جديد | ||||
|       not_found: لا يوجد | ||||
|       not_locked: ليس مقفلاً | ||||
|       not_saved: | ||||
|         one: 'خطأ واحد منَعَ %{resource} مِن القيام بالإحتفاظ :' | ||||
|         other: "%{count} أخطاء منعت %{resource} مِن القيام بالإحتفاظ :" | ||||
|       not_saved: "%{count} أخطاء منعت %{resource} مِن القيام بالإحتفاظ :" | ||||
|  |  | |||
|  | @ -1 +1,2 @@ | |||
| --- | ||||
| ast: {} | ||||
|  |  | |||
|  | @ -8,16 +8,16 @@ bg: | |||
|     failure: | ||||
|       already_authenticated: Вече си вътре в профила си. | ||||
|       inactive: Профилът ти все още не е активиран. | ||||
|       invalid: Невалиден имейл адрес или парола. | ||||
|       invalid: Невалиден %{authentication_keys}. | ||||
|       last_attempt: Разполагаш с още един опит преди профилът ти да бъде заключен. | ||||
|       locked: Профилът ти е заключен. | ||||
|       not_found_in_database: Невалидни стойности за %{authentication_keys} или парола. | ||||
|       not_found_in_database: Невалиден %{authentication_keys}. | ||||
|       timeout: Сесията ти изтече, моля влез отново, за да продължиш. | ||||
|       unauthenticated: Преди да продължиш, трябва да влезеш в профила си или да се регистрираш. | ||||
|       unconfirmed: Преди да продължиш, трябва да потвърдиш регистрацията си. | ||||
|     mailer: | ||||
|       confirmation_instructions: | ||||
|         subject: 'Mastodon: Инструкции за потвърждаване' | ||||
|         subject: 'Mastodon: Инструкции за потвърждаване %{instance}' | ||||
|       password_change: | ||||
|         subject: 'Mastodon: Паролата е променена' | ||||
|       reset_password_instructions: | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ ca: | |||
|         action: Verifica l'adreça de correu | ||||
|         explanation: Has creat un compte a %{host} amb aquesta adreça de correu electrònic. Estàs a un sol clic de l'activació. Si no fos així, ignora aquest correu electrònic. | ||||
|         extra_html: Si us plau consulta també <a href="%{terms_path}"> les regles de la instància</a> i <a href="%{policy_path}"> les nostres condicions de servei</a>. | ||||
|         subject: 'Mastodon: Instruccions de confirmació' | ||||
|         subject: 'Mastodon: Instruccions de confirmació %{instance}' | ||||
|         title: Verifica l'adreça de correu | ||||
|       email_changed: | ||||
|         explanation: 'L''adreça de correu del teu compte s''està canviant a:' | ||||
|  |  | |||
|  | @ -77,6 +77,4 @@ cs: | |||
|       expired: vypršel, prosím vyžádejte si nový | ||||
|       not_found: nenalezen | ||||
|       not_locked: nebyl uzamčen | ||||
|       not_saved: | ||||
|         one: '1 chyba zabránila uložení tohoto %{resource}:' | ||||
|         other: "%{count} chyb zabránila uložení tohoto %{resource}:" | ||||
|       not_saved: "%{count} chyb zabránila uložení tohoto %{resource}:" | ||||
|  |  | |||
|  | @ -77,6 +77,4 @@ cy: | |||
|       expired: wedi dod i ben, gwnewch gais am un newydd os gwelwch yn dda | ||||
|       not_found: heb ei ganfod | ||||
|       not_locked: heb ei gloi | ||||
|       not_saved: | ||||
|         one: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd 1 gwall:' | ||||
|         other: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:' | ||||
|       not_saved: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:' | ||||
|  |  | |||
|  | @ -8,10 +8,10 @@ fr: | |||
|     failure: | ||||
|       already_authenticated: Vous êtes déjà connecté⋅e. | ||||
|       inactive: Votre compte n’est pas encore activé. | ||||
|       invalid: Courriel ou mot de passe incorrect. | ||||
|       invalid: "%{authentication_keys} incorrect." | ||||
|       last_attempt: Vous avez droit à une tentative avant que votre compte ne soit verrouillé. | ||||
|       locked: Votre compte est verrouillé. | ||||
|       not_found_in_database: Courriel ou mot de passe invalide. | ||||
|       not_found_in_database: "%{authentication_keys} invalide." | ||||
|       timeout: Votre session a expiré. Veuillez vous reconnecter pour continuer. | ||||
|       unauthenticated: Vous devez vous connecter ou vous inscrire pour continuer. | ||||
|       unconfirmed: Vous devez valider votre compte pour continuer. | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ he: | |||
|       unconfirmed: יש לאמת את כתובת הדוא"ל על מנת להמשיך. | ||||
|     mailer: | ||||
|       confirmation_instructions: | ||||
|         subject: 'מסטודון: הוראות אימות' | ||||
|         subject: 'מסטודון: הוראות אימות %{instance}' | ||||
|       password_change: | ||||
|         subject: 'מסטודון: הסיסמא שונתה' | ||||
|       reset_password_instructions: | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ hr: | |||
|       unconfirmed: Moraš potvrditi svoju email adresu prije no što nastaviš. | ||||
|     mailer: | ||||
|       confirmation_instructions: | ||||
|         subject: 'Mastodon: Upute za potvrđivanje' | ||||
|         subject: 'Mastodon: Upute za potvrđivanje %{instance}' | ||||
|       email_changed: | ||||
|         subject: 'Mastodon: Email adresa je promijenjena' | ||||
|         title: Nova email adresa | ||||
|  | @ -58,6 +58,4 @@ hr: | |||
|       expired: je istekao, zatraži novu | ||||
|       not_found: nije nađen | ||||
|       not_locked: nije zaključan | ||||
|       not_saved: | ||||
|         one: '1 greška je zabranila da ovaj %{resource} bude sačuvan:' | ||||
|         other: "%{count} greške su zabranile da ovaj %{resource} bude sačuvan:" | ||||
|       not_saved: "%{count} greške su zabranile da ovaj %{resource} bude sačuvan:" | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ hu: | |||
|         action: Erősítsd meg az e-mail címedet | ||||
|         explanation: Ezzel az e-mail címmel kezdeményeztek regisztrációt a(z) %{host} oldalon. Csak egy kattintás, és a felhasználói fiókdat aktiváljuk. Ha a regisztrációt nem te kezdeményezted, kérjük tekintsd ezt az e-mailt tárgytalannak. | ||||
|         extra_html: Kérjük tekintsd át a <a href="%{terms_path}">az instancia szabályzatát</a> és <a href="%{policy_path}">a felhasználási feltételeket</a>. | ||||
|         subject: 'Mastodon: Megerősítési lépések' | ||||
|         subject: 'Mastodon: Megerősítési lépések %{instance}' | ||||
|         title: E-mail cím megerősítése | ||||
|       email_changed: | ||||
|         explanation: 'A fiókodhoz tartozó e-mail címet az alábbira módosítod:' | ||||
|  |  | |||
|  | @ -8,16 +8,16 @@ io: | |||
|     failure: | ||||
|       already_authenticated: Tu ya esas enirinta. | ||||
|       inactive: Tua konto ankore ne konfirmesas. | ||||
|       invalid: Nejusta retpost-adreso o pasvorto. | ||||
|       invalid: Nejusta %{authentication_keys}. | ||||
|       last_attempt: Tu ankore povas probar unfoye ante ke tua konto esos extingita. | ||||
|       locked: Tua konto esas extingita. | ||||
|       not_found_in_database: Nejusta retpost-adreso o pasvorto. | ||||
|       not_found_in_database: Nejusta %{authentication_keys}. | ||||
|       timeout: Tua kunsido expiris. Voluntez rienirar por durar. | ||||
|       unauthenticated: Tu devas enirar o membreskar por durar. | ||||
|       unconfirmed: Tu devas konfirmar tua konto por durar. | ||||
|     mailer: | ||||
|       confirmation_instructions: | ||||
|         subject: Instrucioni por konfirmar | ||||
|         subject: Instrucioni por konfirmar %{instance} | ||||
|       password_change: | ||||
|         subject: Tua pasvorto chanjesis senprobleme. | ||||
|       reset_password_instructions: | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ ja: | |||
|         action: メールアドレスの確認 | ||||
|         explanation: このメールアドレスで%{host}にアカウントを作成しました。有効にするまであと一歩です。もし心当たりがない場合、申し訳ありませんがこのメールを無視してください。 | ||||
|         extra_html: また <a href="%{terms_path}">インスタンスのルール</a> と <a href="%{policy_path}">利用規約</a> もお読みください。 | ||||
|         subject: 'Mastodon: メールアドレスの確認' | ||||
|         subject: 'Mastodon: メールアドレスの確認 %{instance}' | ||||
|         title: メールアドレスの確認 | ||||
|       email_changed: | ||||
|         explanation: 'アカウントのメールアドレスは以下のように変更されます:' | ||||
|  |  | |||
|  | @ -8,11 +8,11 @@ nl: | |||
|     failure: | ||||
|       already_authenticated: Je bent al ingelogd. | ||||
|       inactive: Jouw account is nog niet geactiveerd. | ||||
|       invalid: Ongeldig e-mailadres of wachtwoord. | ||||
|       invalid: Ongeldig %{authentication_keys}. | ||||
|       invalid_token: Ongeldige bevestigingscode. | ||||
|       last_attempt: Je hebt nog één poging over voordat jouw account wordt opgeschort. | ||||
|       locked: Jouw account is opgeschort. | ||||
|       not_found_in_database: Ongeldig e-mailadres of wachtwoord. | ||||
|       not_found_in_database: Ongeldig %{authentication_keys}. | ||||
|       timeout: Jouw sessie is verlopen, log opnieuw in. | ||||
|       unauthenticated: Je dient in te loggen of te registreren. | ||||
|       unconfirmed: Je dient eerst jouw account te bevestigen. | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ | |||
|         action: Bekreft e-postadresse | ||||
|         explanation: Du har laget en konto på %{host} med denne e-postadressen. Du er ett klikk unna å aktivere den. Hvis dette ikke var deg, vennligst se bort fra denne e-posten. | ||||
|         extra_html: Vennligst også sjekk ut <a href="%{terms_path}">instansens regler </a> og <a href="%{policy_path}">våre bruksvilkår</a>. | ||||
|         subject: 'Mastodon: Instruksjoner for å bekrefte e-postadresse' | ||||
|         subject: 'Mastodon: Instruksjoner for å bekrefte e-postadresse %{instance}' | ||||
|         title: Bekreft e-postadresse | ||||
|       email_changed: | ||||
|         explanation: 'E-postadressen til din konto endres til:' | ||||
|  |  | |||
|  | @ -8,10 +8,10 @@ oc: | |||
|     failure: | ||||
|       already_authenticated: Sètz ja connectat. | ||||
|       inactive: Vòstre compte es pas encara activat. | ||||
|       invalid: Corrièl o senhal invalid. | ||||
|       invalid: "%{authentication_keys} invalid." | ||||
|       last_attempt: Vos demòra un ensag abans que vòstre compte siasque blocat. | ||||
|       locked: Vòstre compte es blocat. | ||||
|       not_found_in_database: Corrièl o senhal invalid. | ||||
|       not_found_in_database: "%{authentication_keys} invalid." | ||||
|       timeout: Vòstra session a expirat. Mercés de vos tornar connectar per contunhar. | ||||
|       unauthenticated: Vos cal vos connectar o marcar abans de contunhar. | ||||
|       unconfirmed: Vos cal confirmar vòstra adreça de corrièl abans de contunhar. | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ pl: | |||
|         action: Zweryfikuj adres e-mail | ||||
|         explanation: Utworzyłeś(-aś) konto na %{host} podając ten adres e-mail. Jedno kliknięcie dzieli Cię od aktywacji tego konta. Jeżeli to nie Ty, zignoruj ten e-mail. | ||||
|         extra_html: Przeczytaj też <a href="%{terms_path}">regulamin instancji</a> i <a href="%{policy_path}">nasze zasady użytkowania</a>. | ||||
|         subject: 'Mastodon: Instrukcje weryfikacji adresu e-mail' | ||||
|         subject: 'Mastodon: Instrukcje weryfikacji adresu e-mail na %{instance}' | ||||
|         title: Zweryfikuj adres e-mail | ||||
|       email_changed: | ||||
|         explanation: 'Adres e-mail dla Twojego konta zostanie zmieniony na:' | ||||
|  | @ -35,7 +35,7 @@ pl: | |||
|       reconfirmation_instructions: | ||||
|         explanation: Potwierdź nowy adres aby zmienić e-mail. | ||||
|         extra: Jeżeli nie próbowałeś(-aś) zmienić e-maila, zignoruj tą wiadomość. Adres e-mail przypisany do konta Mastodona nie ulegnie zmianie, jeżeli nie użyjesz powyższego odnośniku. | ||||
|         subject: 'Mastodon: Potwierdź adres e-mail na &{instance}' | ||||
|         subject: 'Mastodon: Potwierdź adres e-mail na %{instance}' | ||||
|         title: Zweryfikuj adres e-mail | ||||
|       reset_password_instructions: | ||||
|         action: Zmień hasło | ||||
|  | @ -77,6 +77,4 @@ pl: | |||
|       expired: wygasło, poproś o nowe | ||||
|       not_found: nie znaleziono | ||||
|       not_locked: było zablokowane | ||||
|       not_saved: | ||||
|         one: '1 błąd uniemożliwił zapisanie zasobu %{resource}:' | ||||
|         other: 'Błędy (%{count}) uniemożliwiły zapisanie zasobu %{resource}:' | ||||
|       not_saved: 'Błędy (%{count}) uniemożliwiły zapisanie zasobu %{resource}:' | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ pt-BR: | |||
|         action: Verificar endereço de e-mail | ||||
|         explanation: Você criou uma conta em %{host} com esse endereço de e-mail. Você está a um clique de ativá-la. Se não foi você, por favor ignore esse e-mail. | ||||
|         extra_html: Por favor confira também <a href="%{terms_path}">as regras da instância</a> e <a href="%{policy_path}">nossos termos de serviço</a>. | ||||
|         subject: 'Mastodon: Instruções de confirmação' | ||||
|         subject: 'Mastodon: Instruções de confirmação para %{instance}' | ||||
|         title: Verifique o endereço de e-mail | ||||
|       email_changed: | ||||
|         explanation: 'O e-mail associado à sua conta será mudado para:' | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ uk: | |||
|       unconfirmed: Для продовження Вам потрібно підтвердити Вашу поштову скриньку. | ||||
|     mailer: | ||||
|       confirmation_instructions: | ||||
|         subject: 'Mastodon: Інструкції для підтвердження' | ||||
|         subject: 'Mastodon: Інструкції для підтвердження %{instance}' | ||||
|       password_change: | ||||
|         subject: 'Mastodon: Ваш пароль змінений' | ||||
|       reset_password_instructions: | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ zh-HK: | |||
|         action: 驗證電子郵件地址 | ||||
|         explanation: 你在 %{host} 上使用這個電子郵件地址建立了一個帳戶。只需點擊下面的連結,即可啟用帳戶。如果你並沒有建立過帳戶,請忽略此郵件。 | ||||
|         extra_html: 請記得閱讀本服務站的<a href="%{terms_path}">相關規定</a>和<a href="%{policy_path}">使用條款</a>。 | ||||
|         subject: 'Mastodon: 確認電郵地址' | ||||
|         subject: 'Mastodon: 確認電郵地址 %{instance}' | ||||
|         title: 驗證電子郵件地址 | ||||
|       email_changed: | ||||
|         explanation: 你的帳戶的電子郵件地址即將變更為: | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ zh-TW: | |||
|         action: 驗證 E-mail 地址 | ||||
|         explanation: 您已經在 %{host} 上以此 E-mail 地址建立了一個帳號。您距離啟用它只剩一次點擊之遙了。如果這不是你,請忽略此 E-mail 。 | ||||
|         extra_html: 同時也請看看<a href="%{terms_path}">該站點的規則</a>與<a href="%{policy_path}">我們的服務條款</a>。 | ||||
|         subject: 'Mastodon: 信箱驗證' | ||||
|         subject: 'Mastodon: 信箱驗證 %{instance}' | ||||
|         title: 驗證 E-mail 地址 | ||||
|       email_changed: | ||||
|         explanation: 您帳號的 E-mail 地址被變更為: | ||||
|  | @ -77,6 +77,4 @@ zh-TW: | |||
|       expired: 已經過期,請重新申請 | ||||
|       not_found: 找不到 | ||||
|       not_locked: 並未被鎖定 | ||||
|       not_saved: | ||||
|         one: 1 個錯誤使 %{resource} 無法被儲存︰ | ||||
|         other: "%{count} 個錯誤使 %{resource} 無法被儲存︰" | ||||
|       not_saved: "%{count} 個錯誤使 %{resource} 無法被儲存︰" | ||||
|  |  | |||
|  | @ -1 +1,2 @@ | |||
| --- | ||||
| ast: {} | ||||
|  |  | |||
|  | @ -1 +1,2 @@ | |||
| --- | ||||
| {} | ||||
|  |  | |||
|  | @ -297,7 +297,7 @@ he: | |||
|       too_many: לא ניתן להוסיף יותר מארבעה קבצים | ||||
|   notification_mailer: | ||||
|     digest: | ||||
|       body: 'להלן סיכום זריז של הדברים שקרו על %{instance} מאז ביקורך האחרון ב-%{since}:' | ||||
|       body: 'להלן סיכום זריז של הדברים שקרו על מאז ביקורך האחרון ב-%{since}:' | ||||
|       mention: "%{name} פנה אליך ב:" | ||||
|       new_followers_summary: | ||||
|         one: נוסף לך עוקב! סחתיין! | ||||
|  |  | |||
|  | @ -61,9 +61,7 @@ hr: | |||
|   generic: | ||||
|     changes_saved_msg: Izmjene su uspješno sačuvane! | ||||
|     save_changes: Sačuvaj izmjene | ||||
|     validation_errors: | ||||
|       one: Nešto ne štima! Vidi grešku ispod | ||||
|       other: Nešto još uvijek ne štima! Vidi %{count} greške ispod | ||||
|     validation_errors: Nešto još uvijek ne štima! Vidi %{count} greške ispod | ||||
|   imports: | ||||
|     preface: Možeš uvesti određene podatke kao što su svi ljudi koje slijediš ili blokiraš u svoj račun na ovoj instanci, sa fajlova kreiranih izvozom sa druge instance. | ||||
|     success: Tvoji podaci su uspješno uploadani i bit će obrađeni u dogledno vrijeme | ||||
|  | @ -74,14 +72,10 @@ hr: | |||
|     upload: Upload | ||||
|   notification_mailer: | ||||
|     digest: | ||||
|       body: 'Ovo je kratak sažetak propuštenog %{instance} od tvog prošlog posjeta %{since}:' | ||||
|       body: 'Ovo je kratak sažetak propuštenog od tvog prošlog posjeta %{since}:' | ||||
|       mention: "%{name} te je spomenuo:" | ||||
|       new_followers_summary: | ||||
|         one: Imaš novog sljedbenika! Yay! | ||||
|         other: Imaš %{count} novih sljedbenika! Prekrašno! | ||||
|       subject: | ||||
|         one: "1 nova notifikacija od tvog prošlog posjeta \U0001F418" | ||||
|         other: "%{count} novih notifikacija od tvog prošlog posjeta \U0001F418" | ||||
|       new_followers_summary: Imaš %{count} novih sljedbenika! Prekrašno! | ||||
|       subject: "%{count} novih notifikacija od tvog prošlog posjeta \U0001F418" | ||||
|     favourite: | ||||
|       body: 'Tvoj status je %{name} označio kao omiljen:' | ||||
|       subject: "%{name} je označio kao omiljen tvoj status" | ||||
|  |  | |||
|  | @ -204,9 +204,7 @@ id: | |||
|   generic: | ||||
|     changes_saved_msg: Perubahan berhasil disimpan! | ||||
|     save_changes: Simpan perubahan | ||||
|     validation_errors: | ||||
|       one: Ada yang tidak beres! Mohon tinjau error dibawah ini | ||||
|       other: Ada yang tidak beres! Mohon tinjau error dibawah ini | ||||
|     validation_errors: Ada yang tidak beres! Mohon tinjau error dibawah ini | ||||
|   imports: | ||||
|     preface: Anda bisa mengimpor data tertentu seperti orang-orang yang anda ikuti atau anda blokir di server ini, dari file yang dibuat oleh fitur expor di server lain. | ||||
|     success: Data anda berhasil diupload dan akan diproses sesegera mungkin | ||||
|  | @ -221,7 +219,7 @@ id: | |||
|       too_many: Tidak dapat melampirkan lebih dari 4 file | ||||
|   notification_mailer: | ||||
|     digest: | ||||
|       body: 'Ini adalah ringkasan singkat yang anda lewatkan pada %{instance} sejak kunjungan terakhir anda pada %{since}:' | ||||
|       body: 'Ini adalah ringkasan singkat yang anda lewatkan pada sejak kunjungan terakhir anda pada %{since}:' | ||||
|       mention: "%{name} menyebut anda di:" | ||||
|       new_followers_summary: | ||||
|         one: Anda mendapatkan satu pengikut baru! Hore! | ||||
|  |  | |||
|  | @ -201,7 +201,7 @@ io: | |||
|       too_many: Cannot attach more than 4 files | ||||
|   notification_mailer: | ||||
|     digest: | ||||
|       body: 'Yen mikra rezumo di to, quo eventis en %{instance}, depos ke tu laste vizitis en %{since}:' | ||||
|       body: 'Yen mikra rezumo di to, depos ke tu laste vizitis en %{since}:' | ||||
|       mention: "%{name} mencionis tu en:" | ||||
|       new_followers_summary: | ||||
|         one: Tu obtenis nova sequanto! Yey! | ||||
|  |  | |||
|  | @ -136,7 +136,7 @@ pl: | |||
|         most_recent: Najnowsze | ||||
|         title: Kolejność | ||||
|       outbox_url: Adres skrzynki nadawczej | ||||
|       perform_full_suspension: Całkowicie zawieś | ||||
|       perform_full_suspension: Zawieś | ||||
|       profile_url: Adres profilu | ||||
|       promote: Podnieś uprawnienia | ||||
|       protocol: Protokół | ||||
|  | @ -185,6 +185,7 @@ pl: | |||
|         create_domain_block: "%{name} zablokował(a) domenę %{target}" | ||||
|         create_email_domain_block: "%{name} dodał(a) domenę e-mail %{target} na czarną listę" | ||||
|         demote_user: "%{name} zdegradował(a) użytkownika %{target}" | ||||
|         destroy_custom_emoji: "%{name} usunął(-ęła) emoji %{target}" | ||||
|         destroy_domain_block: "%{name} odblokował(a) domenę %{target}" | ||||
|         destroy_email_domain_block: "%{name} usunął(-ęła) domenę e-mail %{target} z czarnej listy" | ||||
|         destroy_status: "%{name} usunął(-ęła) wpis użytkownika %{target}" | ||||
|  | @ -270,16 +271,15 @@ pl: | |||
|         title: Nowa blokada domen | ||||
|       reject_media: Odrzucaj pliki multimedialne | ||||
|       reject_media_hint: Usuwa przechowywane lokalnie pliki multimedialne i nie pozwala na ich pobieranie. Nieprzydatne przy zawieszeniu | ||||
|       reject_reports: Odrzucaj zgłoszenia | ||||
|       reject_reports_hint: Zgłoszenia z tej instancji będą ignorowane. Nieprzydatne przy zawieszeniu | ||||
|       severities: | ||||
|         noop: Nic nie rób | ||||
|         silence: Wycisz | ||||
|         suspend: Zawieś | ||||
|       severity: Priorytet | ||||
|       show: | ||||
|         affected_accounts: | ||||
|           many: Dotyczy %{count} kont w bazie danych | ||||
|           one: Dotyczy jednego konta w bazie danych | ||||
|           other: Dotyczy %{count} kont w bazie danych | ||||
|         affected_accounts: Dotyczy %{count} kont w bazie danych | ||||
|         retroactive: | ||||
|           silence: Odwołaj wyciszenie wszystkich kont w tej domenie | ||||
|           suspend: Odwołaj zawieszenie wszystkich kont w tej domenie | ||||
|  | @ -375,6 +375,9 @@ pl: | |||
|       hero: | ||||
|         desc_html: Wyświetlany na stronie głównej. Zalecany jest rozmiar przynajmniej 600x100 pikseli. Jeżeli nie ustawiony, zostanie użyta miniatura instancji. | ||||
|         title: Obraz bohatera | ||||
|       mascot: | ||||
|         desc_html: Wyświetlany na wielu stronach. Zalecany jest rozmiar przynajmniej 293px × 205px. Jeżeli nie ustawiono, zostanie użyta domyślna. | ||||
|         title: Obraz maskotki | ||||
|       peers_api_enabled: | ||||
|         desc_html: Nazwy domen, z którymi ta instancja wchodziła w interakcje | ||||
|         title: Publikuj listę znanych instancji | ||||
|  | @ -571,9 +574,7 @@ pl: | |||
|     followers_count: Liczba śledzących | ||||
|     lock_link: Zablokuj swoje konto | ||||
|     purge: Przestań śledzić | ||||
|     success: | ||||
|       one: W trakcie usuwania śledzących z jednej domeny… | ||||
|       other: W trakcie usuwania śledzących z %{count} domen… | ||||
|     success: W trakcie usuwania śledzących z %{count} domen… | ||||
|     true_privacy_html: Pamiętaj, że <strong>rzeczywista prywatność może zostać uzyskana wyłącznie dzięki szyfrowaniu end-to-end</strong>. | ||||
|     unlocked_warning_html: Każdy może Cię śledzić, dzięki czemu może zobaczyć Twoje niepubliczne wpisy. %{lock_link} aby móc kontrolować, kto Cię śledzi. | ||||
|     unlocked_warning_title: Twoje konto nie jest zablokowane | ||||
|  | @ -782,9 +783,7 @@ pl: | |||
|         other: "%{count} filmów" | ||||
|     boosted_from_html: Podbito przez %{acct_link} | ||||
|     content_warning: 'Ostrzeżenie o zawartości: %{warning}' | ||||
|     disallowed_hashtags: | ||||
|       one: 'zawiera niedozwolony hashtag: %{tags}' | ||||
|       other: 'zawiera niedozwolone hashtagi: %{tags}' | ||||
|     disallowed_hashtags: 'zawiera niedozwolone hashtagi: %{tags}' | ||||
|     language_detection: Automatycznie wykrywaj język | ||||
|     open_in_web: Otwórz w przeglądarce | ||||
|     over_character_limit: limit %{max} znaków przekroczony | ||||
|  |  | |||
|  | @ -150,7 +150,7 @@ pt: | |||
|         enable_user: "%{name} ativou o acesso para o utilizador %{target}" | ||||
|         memorialize_account: "%{name} transformou a conta de %{target} em um memorial" | ||||
|         promote_user: "%{name} promoveu o utilizador %{target}" | ||||
|         reset_password_user: "%{name} restabeleceu a palavra-passe do utilizador %{target" | ||||
|         reset_password_user: "%{name} restabeleceu a palavra-passe do utilizador %{target}" | ||||
|         resolve_report: "%{name} recusou o relatório %{target}" | ||||
|         silence_account: "%{name} silenciou a conta de %{target}" | ||||
|         suspend_account: "%{name} suspendeu a conta de %{target}" | ||||
|  |  | |||
|  | @ -8,7 +8,6 @@ ar: | |||
|         bot: يُعلِم أنّ هذا الحساب لا يمثل شخصًا | ||||
|         context: واحد أو أكثر من السياقات التي يجب أن ينطبق عليها عامل التصفية | ||||
|         digest: تُرسَل إليك بعد مُضيّ مدة مِن خمول نشاطك و فقط إذا ما تلقيت رسائل شخصية مباشِرة أثناء فترة غيابك مِن الشبكة | ||||
|         display_name: <span class="name-counter">%{count}</span> حرف باق | ||||
|         email: سوف تتلقى رسالة إلكترونية للتأكيد | ||||
|         fields: يُمكنك عرض 4 عناصر على شكل جدول في ملفك الشخصي | ||||
|         header: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير %{size}. سيتم تصغيره إلى %{dimensions}px | ||||
|  | @ -16,7 +15,6 @@ ar: | |||
|         irreversible: التبويقات التي تم تصفيتها ستختفي لا محالة حتى و إن تمت إزالة عامِل التصفية لاحقًا | ||||
|         locale: لغة واجهة المستخدم و الرسائل الإلكترونية و الإشعارات | ||||
|         locked: يتطلب منك الموافقة يدويا على طلبات المتابعة | ||||
|         note: <span class="note-counter">%{count}</span> حرف باق | ||||
|         password: يُنصح باستخدام 8 أحرف على الأقل | ||||
|         phrase: سوف يتم العثور عليه مهما كان نوع النص أو حتى و إن كان داخل الويب فيه تحذير عن المحتوى | ||||
|         scopes: ما هي المجالات المسموح بها في التطبيق ؟ إن قمت باختيار أعلى المجالات فيمكنك الإستغناء عن الخَيار اليدوي. | ||||
|  |  | |||
|  | @ -6,13 +6,7 @@ ast: | |||
|         autofollow: La xente que se rexistre pente la invitación va siguite automáticamente | ||||
|         bot: Esta cuenta fai principalmente aiciones automatizaes y podría nun supervisase | ||||
|         digest: Namái s'unvia tres un periodu llargu d'inactividá y namái si recibiesti cualesquier mensaxe personal na to ausencia | ||||
|         display_name: | ||||
|           one: Queda <span class="name-counter">1</span> caráuter | ||||
|           other: Queden <span class="name-counter">%{count}</span> caráuteres | ||||
|         irreversible: Los toots peñeraos van desapaecer de mou irreversible, magar que se desanicie la peñera dempués | ||||
|         note: | ||||
|           one: Queda <span class="note-counter">1</span> caráuter | ||||
|           other: Queden <span class="note-counter">%{count}</span> caráuteres | ||||
|         setting_hide_network: La xente que sigas y teas siguiendo nun va amosase nel perfil | ||||
|         setting_theme: Afeuta al aspeutu de Mastodon cuando anicies sesión dende cualesquier preséu. | ||||
|     labels: | ||||
|  |  | |||
|  | @ -4,10 +4,8 @@ bg: | |||
|     hints: | ||||
|       defaults: | ||||
|         avatar: PNG, GIF или JPG. До %{size}. Ще бъде смалена до %{dimensions} пиксела | ||||
|         display_name: До 30 символа | ||||
|         header: PNG, GIF или JPG. До %{size}. Ще бъде смалена до %{dimensions} пиксела | ||||
|         locked: Изисква ръчно одобрение на последователите. По подразбиране, публикациите са достъпни само до последователи. | ||||
|         note: До 160 символа | ||||
|       imports: | ||||
|         data: CSV файл, експортиран от друга инстанция на Mastodon | ||||
|     labels: | ||||
|  |  | |||
|  | @ -8,17 +8,11 @@ ca: | |||
|         bot: Aquest compte realitza principalment accions automatitzades i pot no estar controlat per cap persona | ||||
|         context: Un o diversos contextos on s'ha d'aplicar el filtre | ||||
|         digest: Només s'envia després d'un llarg període d'inactivitat amb un resum de les mencions que has rebut en la teva absència | ||||
|         display_name: | ||||
|           one: <span class="name-counter">1</span> càracter restant | ||||
|           other: <span class="name-counter">%{count}</span> càracters restans | ||||
|         fields: Pots tenir fins a 4 elements que es mostren com a taula al teu perfil | ||||
|         header: PNG, GIF o JPG. Màxim %{size}. S'escalarà a %{dimensions}px | ||||
|         irreversible: Els nodes filtrats desapareixeran de manera irreversible, fins i tot si el filtre es retira més tard | ||||
|         locale: El llenguatge de l’interfície d’usuari, els correus i les notificacions push | ||||
|         locked: Requereix que aprovis manualment els seguidors | ||||
|         note: | ||||
|           one: <span class="note-counter">1</span> càracter restant | ||||
|           other: <span class="note-counter">%{count}</span> caràcters restants | ||||
|         phrase: Es combinarà independentment del format en el text o l'avís de contingut d'un toot | ||||
|         setting_default_language: La llengua dels teus toots pot ser detectada automàticament però no sempre acuradament | ||||
|         setting_hide_network: Qui tu segueixes i els que et segueixen a tu no es mostraran en el teu perfil | ||||
|  |  | |||
|  | @ -4,23 +4,17 @@ co: | |||
|     hints: | ||||
|       defaults: | ||||
|         autofollow: Quelli·e chì s'arregistranu cù l'invitazione saranu autumaticamente abbunati·e à voi | ||||
|         avatar: Furmatu PNG, GIF o JPG. 2Mo o menu. Sarà ridottu à %{dimensions}px | ||||
|         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 | ||||
|         digest: Solu mandatu dopu à una longa perioda d’inattività, è solu s’elli ci sò novi missaghji diretti | ||||
|         display_name: | ||||
|           one: Ci ferma <span class="name-counter">1</span> caratteru | ||||
|           other: Ci fermanu <span class="name-counter">%{count}</span> caratteri | ||||
|         email: Avete da riceve un'e-mail di cunfirmazione | ||||
|         fields: Pudete avè fin’à 4 elementi mustrati cum’un tavulone nant’à u vostru prufile | ||||
|         header: Furmatu PNG, GIF o JPG. 2Mo o menu. Sarà ridottu à %{dimensions}px | ||||
|         header: Furmatu PNG, GIF o JPG. %{size} o menu. Sarà ridottu à %{dimensions}px | ||||
|         inbox_url: Cupiate l'URL di a pagina d'accolta di u ripetitore chì vulete utilizà | ||||
|         irreversible: I statuti filtrati saranu sguassati di manera irreversibile, ancu s'ellu hè toltu u filtru | ||||
|         locale: A lingua di l'interfaccia utilizatore, di l'e-mail è di e nutificazione push | ||||
|         locked: Duvarete appruvà e dumande d’abbunamentu | ||||
|         note: | ||||
|           one: Ci ferma <span class="name-counter">1</span> caratteru | ||||
|           other: Ci fermanu <span class="name-counter">%{count}</span> caratteri | ||||
|         password: Ci volenu almenu 8 caratteri | ||||
|         phrase: Sarà trovu senza primura di e maiuscule o di l'avertimenti | ||||
|         scopes: L'API à quelle l'applicazione averà accessu. S'è voi selezziunate un parametru d'altu livellu, un c'hè micca bisognu di selezziunà quell'individuali. | ||||
|  |  | |||
|  | @ -8,9 +8,6 @@ cs: | |||
|         bot: Tento účet provádí hlavně automatizované akce a nemusí být spravován | ||||
|         context: Jedno či více kontextů, ve kterých má být filtr uplatněn | ||||
|         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 | ||||
|         display_name: | ||||
|           one: Zbývá <span class="name-counter">1</span> znak | ||||
|           other: Zbývá vám <span class="name-counter">%{count}</span> znaků | ||||
|         email: Bude vám poslán potvrzovací e-mail | ||||
|         fields: Na profilu můžete mít až 4 položky zobrazené jako tabulka | ||||
|         header: PNG, GIF či JPG. Maximálně %{size}. Bude zmenšena na %{dimensions} px | ||||
|  | @ -18,9 +15,6 @@ cs: | |||
|         irreversible: Filtrované tooty nenávratně zmizí, i pokud bude filtr později odstraněn | ||||
|         locale: Jazyk uživatelského rozhraní, e-mailů a oznámení push | ||||
|         locked: Vyžaduje manuální schvalování sledovatelů | ||||
|         note: | ||||
|           one: Zbývá <span class="note-counter">1</span>znak | ||||
|           other: Zbývá <span class="note-counter">%{count}</span> znaků | ||||
|         password: Použijte alespoň 8 znaků | ||||
|         phrase: Shoda bude nalezena bez ohledu na velikost písmen v těle tootu či varování o obsahu | ||||
|         scopes: Které API bude aplikace povolena používat. Pokud vyberete rozsah nejvyššího stupně, nebudete je muset vybírat po jednom. | ||||
|  |  | |||
|  | @ -8,18 +8,12 @@ cy: | |||
|         bot: Mae'r cyfrif hwn yn perfformio gweithredoedd awtomataidd yn bennaf ac mae'n bosib nad yw'n cael ei fonitro | ||||
|         context: Un neu fwy cyd-destun lle dylai'r hidlydd weithio | ||||
|         digest: Dim ond yn cael eu hanfon ar ôl cyfnod hir o anweithgarwch ac ond os ydych wedi derbyn unrhyw negeseuon personol yn eich absenoldeb | ||||
|         display_name: | ||||
|           one: <span class="name-counter">1</span> nodyn ar ôl | ||||
|           other: <span class="name-counter">%{count}</span> nodyn ar ôl | ||||
|         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 | ||||
|         inbox_url: Copïwch yr URL o dudalen flaen y relái yr ydych am ei ddefnyddio | ||||
|         irreversible: Bydd tŵtiau wedi eu hidlo yn diflannu am byth, hyd yn oed os ceith yr hidlydd ei ddileu'n hwyrach | ||||
|         locale: Iaith y rhyngwyneb, e-byst a hysbysiadau push | ||||
|         locked: Ei wneud yn ofynnol arnoch chi i ganiatau dilynwyr a llaw | ||||
|         note: | ||||
|           one: <span class="note-counter">1</span> cymeriad ar ôl | ||||
|           other: <span class="note-counter">%{count}</span> o gymeriadau ar ôl | ||||
|         scopes: Pa APIau y bydd gan y rhaglen ganiatad i gael mynediad iddynt. Os dewiswch maes lefel uchaf, yna nid oes angen dewis rhai unigol. | ||||
|         setting_default_language: Mae modd adnabod iaith eich tŵtiau yn awtomatig, ond nid yw bob tro'n gywir | ||||
|         setting_hide_network: Ni fydd pwy yr ydych yn ei ddilyn a phwy sy'n eich dilyn chi yn cael ei ddangos ar eich proffil | ||||
|  |  | |||
|  | @ -8,18 +8,12 @@ da: | |||
|         bot: Denne konto udfører hovedsageligt automatiserede handlinger og bliver muligvis ikke overvåget | ||||
|         context: En eller flere sammenhænge hvor filteret skal være gældende | ||||
|         digest: Sendes kun efter en lang periode med inaktivitet og kun hvis du har modtaget nogle personlige beskeder mens du er væk | ||||
|         display_name: | ||||
|           one: <span class="name-counter">1</span> tegn tilbage | ||||
|           other: <span class="name-counter">%{count}</span>tegn tilbage | ||||
|         fields: Du kan have op til 4 ting vist som en tabel på din profil | ||||
|         header: PNG, GIF eller JPG. Højest %{size}. Vil blive skaleret ned til %{dimensions}px | ||||
|         inbox_url: Kopiere linket fra forsiden af den relay som du ønsker at bruge | ||||
|         irreversible: Filtrerede trut vil forsvinde fulstændigt, selv hvis filteret senere skulle blive fjernet | ||||
|         locale: Sproget på interfacet, emails og push beskeder | ||||
|         locked: Kræver, at du godkender følgere manuelt | ||||
|         note: | ||||
|           one: <span class="note-counter">1</span> tegn tilbage | ||||
|           other: <span class="note-counter">%{count}</span> tegn tilbage | ||||
|         phrase: Vil blive parret uanset om der er store eller små bogstaver i teksten eller om der er en advarsel om et trut | ||||
|         scopes: Hvilke APIs applikationen vil få adgang til. Hvis du vælger et højtlevel omfang, behøver du ikke vælge enkeltstående. | ||||
|         setting_default_language: Sproget for dine trut kan blive fundet automatisk, men det er ikke altid præcist | ||||
|  |  | |||
|  | @ -4,23 +4,17 @@ de: | |||
|     hints: | ||||
|       defaults: | ||||
|         autofollow: Leute die sich über deine Einladung registrieren werden dir automatisch folgen | ||||
|         avatar: PNG, GIF oder JPG. Maximal %{size}. Wird auf 400×400 px herunterskaliert | ||||
|         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 Aspekte, wo der Filter greifen soll | ||||
|         digest: Wenn du lange Zeit inaktiv bist, wird dir eine Zusammenfassung von Erwähnungen in deiner Abwesenheit zugeschickt | ||||
|         display_name: | ||||
|           one: <span class="name-counter">1</span> Zeichen verbleibt | ||||
|           other: <span class="name-counter">%{count}</span> Zeichen verbleiben | ||||
|         email: Du wirst ein Bestätigungs-E-Mail erhalten | ||||
|         fields: Du kannst bis zu 4 Elemente als Tabelle dargestellt auf deinem Profil anzeigen lassen | ||||
|         header: PNG, GIF oder JPG. Maximal %{size}. Wird auf 700×335 px herunterskaliert | ||||
|         header: PNG, GIF oder JPG. Maximal %{size}. Wird auf %{dimensions} px herunterskaliert | ||||
|         inbox_url: Kopiere die URL von der Startseite des gewünschten Relays | ||||
|         irreversible: Gefilterte Beiträge werden unwiderruflich gefiltert, selbst wenn der Filter später entfernt wurde | ||||
|         locale: Die Sprache der Oberfläche, E-Mails und Push-Benachrichtigungen | ||||
|         locked: Wer dir folgen möchte, muss um deine Erlaubnis bitten | ||||
|         note: | ||||
|           one: <span class="note-counter">1</span> Zeichen verbleibt | ||||
|           other: <span class="note-counter">%{count}</span> Zeichen verbleiben | ||||
|         password: Verwende mindestens 8 Zeichen | ||||
|         phrase: Wird unabhängig vom umgebenen Text oder Inhaltswarnung eines Beitrags verglichen | ||||
|         scopes: Welche Schnittstellen der Applikation erlaubt sind. Wenn du einen Top-Level-Scope auswählst, dann musst du nicht jeden einzelnen darunter auswählen. | ||||
|  |  | |||
|  | @ -8,9 +8,6 @@ el: | |||
|         bot: Ο λογαριασμός αυτός εκτελεί κυρίως αυτοματοποιημένες ενέργειες και ίσως να μην παρακολουθείται | ||||
|         context: Ένα ή περισσότερα πλαίσια στα οποία μπορεί να εφαρμόζεται αυτό το φίλτρο | ||||
|         digest: Αποστέλλεται μόνο μετά από μακρά περίοδο αδράνειας και μόνο αν έχεις λάβει προσωπικά μηνύματα κατά την απουσία σου | ||||
|         display_name: | ||||
|           one: απομένει <span class="name-counter">1</span> χαρακτήρας | ||||
|           other: απομένουν <span class="name-counter">%{count}</span> χαρακτήρες | ||||
|         email: Θα σου σταλεί email επιβεβαίωσης | ||||
|         fields: Μπορείς να έχεις έως 4 σημειώσεις σε μορφή πίνακα στο προφίλ σου | ||||
|         header: PNG, GIF ή JPG. Έως %{size}. Θα περιοριστεί σε διάσταση %{dimensions}px | ||||
|  | @ -18,9 +15,6 @@ el: | |||
|         irreversible: Τα φιλτραρισμένα τουτ θα εξαφανιστούν αμετάκλητα, ακόμα και αν το φίλτρο αργότερα αφαιρεθεί | ||||
|         locale: Η γλώσσα του περιβάλλοντος χρήσης, των email και των ειδοποιήσεων ώθησης | ||||
|         locked: Απαιτεί να εγκρίνεις χειροκίνητα τους ακόλουθούς σου | ||||
|         note: | ||||
|           one: απομένει <span class="note-counter">1</span> χαρακτήρας | ||||
|           other: απομένουν <span class="note-counter">%{count}</span> χαρακτήρες | ||||
|         password: Χρησιμοποίησε τουλάχιστον 8 χαρακτήρες | ||||
|         phrase: Θα ταιριάζει ανεξαρτήτως πεζών/κεφαλαίων ή προειδοποίησης περιεχομένου του τουτ | ||||
|         scopes: Ποια API θα επιτρέπεται στην εφαρμογή να χρησιμοποιήσεις. Αν επιλέξεις κάποιο υψηλό εύρος εφαρμογής, δε χρειάζεται να επιλέξεις και εξειδικευμένα. | ||||
|  |  | |||
|  | @ -8,9 +8,6 @@ en: | |||
|         bot: This account mainly performs automated actions and might not be monitored | ||||
|         context: One or multiple contexts where the filter should apply | ||||
|         digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence | ||||
|         display_name: | ||||
|           one: <span class="name-counter">1</span> character left | ||||
|           other: <span class="name-counter">%{count}</span> characters left | ||||
|         email: You will be sent a confirmation e-mail | ||||
|         fields: You can have up to 4 items displayed as a table on your profile | ||||
|         header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px | ||||
|  | @ -18,9 +15,6 @@ en: | |||
|         irreversible: Filtered toots will disappear irreversibly, even if filter is later removed | ||||
|         locale: The language of the user interface, e-mails and push notifications | ||||
|         locked: Requires you to manually approve followers | ||||
|         note: | ||||
|           one: <span class="note-counter">1</span> character left | ||||
|           other: <span class="note-counter">%{count}</span> characters left | ||||
|         password: Use at least 8 characters | ||||
|         phrase: Will be matched regardless of casing in text or content warning of a toot | ||||
|         scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. | ||||
|  |  | |||
|  | @ -1 +1,2 @@ | |||
| --- | ||||
| {} | ||||
|  |  | |||
|  | @ -8,18 +8,12 @@ eo: | |||
|         bot: Tiu konto ĉefe faras aŭtomatajn agojn, kaj povas esti ne kontrolata | ||||
|         context: Unu ol pluraj kuntekstoj kie la filtrilo devus agi | ||||
|         digest: Sendita nur post longa tempo de neaktiveco, kaj nur se vi ricevis personan mesaĝon en via foresto | ||||
|         display_name: | ||||
|           one: <span class="name-counter">1</span> signo restas | ||||
|           other: <span class="name-counter">%{count}</span> signoj restas | ||||
|         fields: Vi povas havi ĝis 4 tabelajn elementojn en via profilo | ||||
|         header: Formato PNG, GIF aŭ JPG. Ĝis %{size}. Estos malgrandigita al %{dimensions}px | ||||
|         inbox_url: Kopiu la URL de la ĉefpaĝo de la ripetilo, kiun vi volas uzi | ||||
|         irreversible: Elfiltritaj mesaĝoj malaperos por ĉiam, eĉ se la filtrilo estas poste forigita | ||||
|         locale: La lingvo de la uzant-interfaco, retmesaĝoj kaj puŝ-sciigoj | ||||
|         locked: Vi devos aprobi ĉiun peton de sekvado mane | ||||
|         note: | ||||
|           one: <span class="note-counter">1</span> signo restas | ||||
|           other: <span class="note-counter">%{count}</span> signoj restas | ||||
|         phrase: Estos provita senzorge pri la uskleco de teksto aŭ averto pri enhavo de mesaĝo | ||||
|         setting_default_language: La lingvo de viaj mesaĝoj povas esti aŭtomate detektitaj, sed tio ne ĉiam ĝustas | ||||
|         setting_hide_network: Tiuj, kiujn vi sekvas, kaj tiuj, kiuj sekvas vin ne estos videblaj en via profilo | ||||
|  |  | |||
|  | @ -8,18 +8,12 @@ es: | |||
|         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 | ||||
|         digest: Solo enviado tras un largo periodo de inactividad y solo si has recibido mensajes personales durante tu ausencia | ||||
|         display_name: | ||||
|           one: <span class="name-counter">1</span> caracter restante | ||||
|           other: <span class="name-counter">%{count}</span> caracteres restantes | ||||
|         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 | ||||
|         note: | ||||
|           one: <span class="name-counter">1</span> carácter restante | ||||
|           other: <span class="name-counter">%{count}</span> caracteres restantes | ||||
|         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_default_language: El idioma de tus toots podrá detectarse automáticamente, pero no siempre es preciso | ||||
|  |  | |||
|  | @ -8,18 +8,12 @@ eu: | |||
|         bot: Kontu honek nagusiki automatizatutako ekintzak burutzen ditu eta agian ez du inork monitorizatzen | ||||
|         context: Iragazkia aplikatzeko testuinguru bat edo batzuk | ||||
|         digest: Soilik jarduerarik gabeko epe luze bat eta gero, eta soilik ez zeudela mezu pertsonalen bat jaso baduzu | ||||
|         display_name: | ||||
|           one: Karaktere <span class="name-counter">1</span> geratzen da | ||||
|           other: <span class="name-counter">%{count}</span> karaktere geratzen dira | ||||
|         fields: 4 elementu bistaratu ditzakezu taula batean zure profilean | ||||
|         header: PNG, GIF edo JPG. Gehienez %{size}. %{dimensions}px eskalara txikituko da | ||||
|         inbox_url: Kopiatu erabili nahi duzun errelearen hasiera orriaren URLa | ||||
|         irreversible: Iragazitako toot-ak betirako galduko dira, geroago iragazkia kentzen baduzu ere | ||||
|         locale: Erabiltzaile-interfazea, e-mail mezuen eta jakinarazpenen hizkuntza | ||||
|         locked: Jarraitzaileak eskuz onartu behar dituzu | ||||
|         note: | ||||
|           one: Karaktere<span class="note-counter">1</span> geratzen da | ||||
|           other: <span class="note-counter"> %{count}</span> karaktere geratzen dira | ||||
|         phrase: Bat egingo du Maiuskula/minuskula kontuan hartu gabe eta edukiaren abisua kontuan hartu gabe | ||||
|         scopes: Zeintzuk API atzitu ditzakeen aplikazioak. Goi mailako arloa aukeratzen baduzu, ez dituzu azpikoak aukeratu behar. | ||||
|         setting_default_language: Zure toot-en hizkuntza automatikoki antzeman daiteke, baina ez da beti zehatza | ||||
|  |  | |||
|  | @ -8,9 +8,6 @@ fa: | |||
|         bot: این حساب بیشتر به طور خودکار فعالیت میکند و نظارت پیوستهای روی آن وجود ندارد | ||||
|         context: یک یا چند زمینه که فیلتر باید در آنها اعمال شود | ||||
|         digest: تنها وقتی فرستاده میشود که مدتی طولانی فعالیتی نداشته باشید و در این مدت برای شما پیغام خصوصیای نوشته شده باشد | ||||
|         display_name: | ||||
|           one: <span class="name-counter">1</span> حرف باقی مانده | ||||
|           other: <span class="name-counter">%{count}</span> حرف باقی مانده | ||||
|         email: به شما ایمیل تأییدی فرستاده خواهد شد | ||||
|         fields: شما میتوانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید | ||||
|         header: یکی از قالبهای PNG یا  GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد | ||||
|  | @ -18,9 +15,6 @@ fa: | |||
|         irreversible: بوقهای فیلترشده به طور برگشتناپذیری ناپدید میشوند، حتی اگر فیلتر را بعداً بردارید | ||||
|         locale: زبان محیط کاربری، ایمیلها، و اعلانها | ||||
|         locked: باید پیگیران تازه را خودتان تأیید کنید | ||||
|         note: | ||||
|           one: <span class="note-counter">1</span> حرف باقی مانده | ||||
|           other: <span class="note-counter">%{count}</span> حرف باقی مانده | ||||
|         password: دستکم باید ۸ نویسه داشته باشد | ||||
|         phrase: مستقل از کوچکی و بزرگی حروف، با متن اصلی یا هشدار محتوای بوقها مقایسه میشود | ||||
|         scopes: واسطهای برنامهنویسی که این برنامه به آن دسترسی دارد. اگر بالاترین سطح دسترسی را انتخاب کنید، دیگر نیازی به انتخاب سطحهای پایینی ندارید. | ||||
|  |  | |||
|  | @ -3,17 +3,11 @@ fi: | |||
|   simple_form: | ||||
|     hints: | ||||
|       defaults: | ||||
|         avatar: PNG, GIF tai JPG. Enintään 2 Mt. Skaalataan kokoon 400 x 400 px | ||||
|         avatar: PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px | ||||
|         digest: Lähetetään vain pitkän poissaolon jälkeen ja vain, jos olet saanut suoria viestejä poissaolosi aikana | ||||
|         display_name: | ||||
|           one: <span class="name-counter">1</span> merkki jäljellä | ||||
|           other: <span class="name-counter">%{count}</span> merkkiä jäljellä | ||||
|         fields: Sinulla voi olla korkeintaan 4 asiaa profiilissasi taulukossa | ||||
|         header: PNG, GIF tai JPG. Enintään 2 Mt. Skaalataan kokoon 700 x 335 px | ||||
|         header: PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px | ||||
|         locked: Sinun täytyy hyväksyä seuraajat manuaalisesti | ||||
|         note: | ||||
|           one: <span class="note-counter">1</span> merkki jäljellä | ||||
|           other: <span class="note-counter">%{count}</span> merkkiä jäljellä | ||||
|         setting_noindex: Vaikuttaa julkiseen profiiliisi ja tilasivuihisi | ||||
|         setting_theme: Vaikuttaa Mastodonin ulkoasuun millä tahansa laitteella kirjauduttaessa. | ||||
|       imports: | ||||
|  |  | |||
|  | @ -4,23 +4,17 @@ fr: | |||
|     hints: | ||||
|       defaults: | ||||
|         autofollow: Les personnes qui s’inscrivent grâce à l’invitation vous suivront automatiquement | ||||
|         avatar: Au format PNG, GIF ou JPG. 2 Mo maximum. Sera réduit à %{dimensions}px | ||||
|         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 | ||||
|         digest: Uniquement envoyé après une longue période d’inactivité et uniquement si vous avez reçu des messages personnels pendant votre absence | ||||
|         display_name: | ||||
|           one: <span class="name-counter">1</span> caractère restant | ||||
|           other: <span class="name-counter">%{count}</span> caractères restants | ||||
|         email: Vous recevrez un courriel de confirmation | ||||
|         fields: Vous pouvez avoir jusqu’à 4 éléments affichés en tant que tableau sur votre profil | ||||
|         header: Au format PNG, GIF ou JPG. 2 Mo maximum. Sera réduit à %{dimensions}px | ||||
|         header: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px | ||||
|         inbox_url: Copiez l’URL depuis la page d’accueil du relais que vous souhaitez utiliser | ||||
|         irreversible: Les pouets filtrés disparaîtront irrémédiablement, même si le filtre est supprimé plus tard | ||||
|         locale: La langue de l’interface, des courriels et des notifications | ||||
|         locked: Vous devrez approuver chaque abonné⋅e et vos statuts ne s’afficheront qu’à vos abonné⋅es | ||||
|         note: | ||||
|           one: <span class="note-counter">1</span> caractère restant | ||||
|           other: <span class="note-counter">%{count}</span> caractères restants | ||||
|         password: Utilisez au moins 8 caractères | ||||
|         phrase: Sera trouvé sans que la case ou l’avertissement de contenu du pouet soit pris en compte | ||||
|         scopes: À quelles APIs l’application sera autorisée à accéder. Si vous sélectionnez un périmètre de haut-niveau, vous n’avez pas besoin de sélectionner les individuels. | ||||
|  |  | |||
|  | @ -8,9 +8,6 @@ gl: | |||
|         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 | ||||
|         digest: Enviar só tras un longo período de inactividade e só si recibeu algunha mensaxe personal na súa ausencia | ||||
|         display_name: | ||||
|           one: <span class="name-counter">1</span> caracter restante | ||||
|           other: <span class="name-counter">%{count}</span> caracteres restantes | ||||
|         email: Enviaráselle un correo-e de confirmación | ||||
|         fields: Pode ter ate 4 elementos no seu perfil mostrados como unha táboa | ||||
|         header: PNG, GIF ou JPG. Máximo %{size}. Será reducida a %{dimensions}px | ||||
|  | @ -18,9 +15,6 @@ gl: | |||
|         irreversible: Os toots filtrados desaparecerán de xeito irreversible, incluso si despois se elimina o filtro | ||||
|         locale: O idioma da interface de usuaria, correos e notificacións | ||||
|         locked: Require que vostede acepte as seguidoras de xeito manual | ||||
|         note: | ||||
|           one: <span class="note-counter">1</span> caracter restante | ||||
|           other: <span class="note-counter">%{count}</span> caracteres restantes | ||||
|         password: Utilice 8 caracteres ao menos | ||||
|         phrase: Concordará independentemente das maiúsculas ou avisos de contido no toot | ||||
|         scopes: A que APIs terá acceso a aplicación. Si selecciona un ámbito de alto nivel, non precisa seleccionar elementos individuais. | ||||
|  |  | |||
|  | @ -5,14 +5,8 @@ he: | |||
|       defaults: | ||||
|         avatar: PNG, GIF או JPG. מקסימום %{size}. גודל התמונה יוקטן ל-%{dimensions}px | ||||
|         digest: נשלח לאחר תקופה ארוכה של אי-פעילות עם סיכום איזכורים שקיבלת בהעדרך | ||||
|         display_name: | ||||
|           one: נותרה אות<span class="name-counter">אחת</span> | ||||
|           other: נותרו<span class="name-counter">%{count}</span> אותיות | ||||
|         header: PNG, GIF או JPG. מקסימום %{size}. גודל התמונה יוקטן %{dimensions}px | ||||
|         locked: מחייב אישור עוקבים באופן ידני. פרטיות ההודעות תהיה עוקבים-בלבד אלא אם יצוין אחרת | ||||
|         note: | ||||
|           one: נותרה אות<span class="note-counter">אחת</span> | ||||
|           other: נותרו <span class="note-counter">%{count}</span> אותיות | ||||
|         setting_noindex: משפיע על הפרופיל הציבורי שלך ועמודי ההודעות | ||||
|         setting_theme: משפיע על המראה של מסטודון בעת החיבור המזוהה מכל מכשיר שהוא. | ||||
|       imports: | ||||
|  |  | |||
|  | @ -4,10 +4,8 @@ hr: | |||
|     hints: | ||||
|       defaults: | ||||
|         avatar: PNG, GIF ili JPG. Najviše %{size}. Bit će smanjen na %{dimensions}px | ||||
|         display_name: Najviše 30 znakova | ||||
|         header: PNG, GIF ili JPG. Najviše %{size}. Bit će smanjen na %{dimensions}px | ||||
|         locked: traži te da ručno odobriš sljedbenike i postavlja privatnost postova na dostupnu samo sljedbenicima | ||||
|         note: Najviše 160 znakova | ||||
|       imports: | ||||
|         data: CSV fajl izvezen iz druge Mastodon instance | ||||
|     labels: | ||||
|  |  | |||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
		Reference in a new issue