From b253d3e0c2591700f597ad63a93bc62c5f48409d Mon Sep 17 00:00:00 2001 From: gol-cha <info@mevo.xyz> Date: Sat, 2 Feb 2019 09:26:49 +0900 Subject: [PATCH 001/192] Upgrade new Web Share Target API (#9963) * Update manifest.json for new Web Share Target API. * fix code formatting --- app/serializers/manifest_serializer.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb index 859ef0d149..cc8b9a4d45 100644 --- a/app/serializers/manifest_serializer.rb +++ b/app/serializers/manifest_serializer.rb @@ -52,6 +52,14 @@ class ManifestSerializer < ActiveModel::Serializer end def share_target - { url_template: 'share?title={title}&text={text}&url={url}' } + { + url_template: 'share?title={title}&text={text}&url={url}', + action: 'share', + params: { + title: 'title', + text: 'text', + url: 'url', + }, + } end end -- GitLab From 5092d17f2936146fa26e5d8a9b9e391f77010f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= <root@acid-chicken.com> Date: Sat, 2 Feb 2019 20:25:04 +0900 Subject: [PATCH 002/192] Add WebP support (#9879) * Add WebP support * Remove the changes to the tooltip refs: https://github.com/tootsuite/mastodon/pull/9879#pullrequestreview-199312528 --- app/javascript/mastodon/utils/resize_image.js | 2 +- app/models/concerns/account_avatar.rb | 2 +- app/models/concerns/account_header.rb | 2 +- app/models/media_attachment.rb | 4 ++-- app/models/preview_card.rb | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/utils/resize_image.js b/app/javascript/mastodon/utils/resize_image.js index d1608094f7..bbdbc865e9 100644 --- a/app/javascript/mastodon/utils/resize_image.js +++ b/app/javascript/mastodon/utils/resize_image.js @@ -31,7 +31,7 @@ const loadImage = inputFile => new Promise((resolve, reject) => { }); const getOrientation = (img, type = 'image/png') => new Promise(resolve => { - if (type !== 'image/jpeg') { + if (!['image/jpeg', 'image/webp'].includes(type)) { resolve(1); return; } diff --git a/app/models/concerns/account_avatar.rb b/app/models/concerns/account_avatar.rb index 2d5ebfca35..5fff3ef5d2 100644 --- a/app/models/concerns/account_avatar.rb +++ b/app/models/concerns/account_avatar.rb @@ -3,7 +3,7 @@ module AccountAvatar extend ActiveSupport::Concern - IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze + IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze LIMIT = 2.megabytes class_methods do diff --git a/app/models/concerns/account_header.rb b/app/models/concerns/account_header.rb index 067e166eb6..a748fdff72 100644 --- a/app/models/concerns/account_header.rb +++ b/app/models/concerns/account_header.rb @@ -3,7 +3,7 @@ module AccountHeader extend ActiveSupport::Concern - IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze + IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze LIMIT = 2.megabytes MAX_PIXELS = 750_000 # 1500x500px diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index 6b939124fa..2e0f98cc6f 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -25,10 +25,10 @@ class MediaAttachment < ApplicationRecord enum type: [:image, :gifv, :video, :unknown] - IMAGE_FILE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif'].freeze + IMAGE_FILE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp'].freeze VIDEO_FILE_EXTENSIONS = ['.webm', '.mp4', '.m4v', '.mov'].freeze - IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze + IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze VIDEO_MIME_TYPES = ['video/webm', 'video/mp4', 'video/quicktime'].freeze VIDEO_CONVERTIBLE_MIME_TYPES = ['video/webm', 'video/quicktime'].freeze diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb index a792b352bd..f26ea0c748 100644 --- a/app/models/preview_card.rb +++ b/app/models/preview_card.rb @@ -25,7 +25,7 @@ # class PreviewCard < ApplicationRecord - IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze + IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze LIMIT = 1.megabytes self.inheritance_column = false -- GitLab From 6a5e3da6b044e50635d293c2716883cc5627e4c8 Mon Sep 17 00:00:00 2001 From: Jakub Mendyk <jakubmendyk.szkola@gmail.com> Date: Sat, 2 Feb 2019 19:01:18 +0100 Subject: [PATCH 003/192] Allow most kinds of characters in URL query (fixes #8408) (#8447) * Allow unicode characters in URL query strings Fixes #8408 * Alternative approach to unicode support in urls Adds PoC/idea to approch this problem. --- app/lib/formatter.rb | 39 +++++++++++++++++++++++++++++++++++++- spec/lib/formatter_spec.rb | 32 ++++++++++++++++++++++++++++--- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 05fd9eeb12..2e35871696 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -99,7 +99,7 @@ class Formatter end def encode_and_link_urls(html, accounts = nil, options = {}) - entities = Extractor.extract_entities_with_indices(html, extract_url_without_protocol: false) + entities = utf8_friendly_extractor(html, extract_url_without_protocol: false) if accounts.is_a?(Hash) options = accounts @@ -199,6 +199,43 @@ class Formatter result.flatten.join end + def utf8_friendly_extractor(text, options = {}) + old_to_new_index = [0] + + escaped = text.chars.map do |c| + output = c.ord.to_s(16).length > 2 ? CGI.escape(c) : c + old_to_new_index << old_to_new_index.last + output.length + output + end.join + + # Note: I couldn't obtain list_slug with @user/list-name format + # for mention so this requires additional check + special = Extractor.extract_entities_with_indices(escaped, options).map do |extract| + # exactly one of :url, :hashtag, :screen_name, :cashtag keys is present + key = (extract.keys & [:url, :hashtag, :screen_name, :cashtag]).first + + new_indices = [ + old_to_new_index.find_index(extract[:indices].first), + old_to_new_index.find_index(extract[:indices].last), + ] + + has_prefix_char = [:hashtag, :screen_name, :cashtag].include?(key) + value_indices = [ + new_indices.first + (has_prefix_char ? 1 : 0), # account for #, @ or $ + new_indices.last - 1, + ] + + next extract.merge( + :indices => new_indices, + key => text[value_indices.first..value_indices.last] + ) + end + + standard = Extractor.extract_entities_with_indices(text, options) + + Extractor.remove_overlapping_entities(special + standard) + end + def link_to_url(entity, options = {}) url = Addressable::URI.parse(entity[:url]) html_attrs = { target: '_blank', rel: 'nofollow noopener' } diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb index 0c1efe7c3c..9872d37567 100644 --- a/spec/lib/formatter_spec.rb +++ b/spec/lib/formatter_spec.rb @@ -74,10 +74,36 @@ RSpec.describe Formatter do end context 'given a URL with a query string' do - let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink' } + context 'with escaped unicode character' do + let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink' } - it 'matches the full URL' do - is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink"' + it 'matches the full URL' do + is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink"' + end + end + + context 'with unicode character' do + let(:text) { 'https://www.ruby-toolbox.com/search?utf8=✓&q=autolink' } + + it 'matches the full URL' do + is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=✓&q=autolink"' + end + end + + context 'with unicode character at the end' do + let(:text) { 'https://www.ruby-toolbox.com/search?utf8=✓' } + + it 'matches the full URL' do + is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=✓"' + end + end + + context 'with escaped and not escaped unicode characters' do + let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&utf81=✓&q=autolink' } + + it 'preserves escaped unicode characters' do + is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&utf81=✓&q=autolink"' + end end end -- GitLab From bcfff65195f557dc086470f91b4c90b15c004cf7 Mon Sep 17 00:00:00 2001 From: ysksn <bluewhale1982@gmail.com> Date: Sun, 3 Feb 2019 03:11:38 +0900 Subject: [PATCH 004/192] Create Redisable#redis (#9633) * Create Redisable * Use #redis instead of Redis.current --- app/lib/activity_tracker.rb | 6 ++---- app/lib/activitypub/activity.rb | 5 +---- app/lib/feed_manager.rb | 9 +++------ app/lib/ostatus/activity/base.rb | 6 ++---- app/lib/potential_friendship_tracker.rb | 8 ++------ app/models/concerns/redisable.rb | 11 +++++++++++ app/models/feed.rb | 6 ++---- app/models/trending_tags.rb | 6 ++---- app/services/batched_remove_status_service.rb | 5 +---- app/services/follow_service.rb | 6 ++---- app/services/post_status_service.rb | 6 ++---- app/services/remove_status_service.rb | 19 ++++++++----------- .../scheduler/feed_cleanup_scheduler.rb | 5 +---- 13 files changed, 39 insertions(+), 59 deletions(-) create mode 100644 app/models/concerns/redisable.rb diff --git a/app/lib/activity_tracker.rb b/app/lib/activity_tracker.rb index 5b49726747..ae3c11b6af 100644 --- a/app/lib/activity_tracker.rb +++ b/app/lib/activity_tracker.rb @@ -4,6 +4,8 @@ class ActivityTracker EXPIRE_AFTER = 90.days.seconds class << self + include Redisable + def increment(prefix) key = [prefix, current_week].join(':') @@ -20,10 +22,6 @@ class ActivityTracker private - def redis - Redis.current - end - def current_week Time.zone.today.cweek end diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 87318fb1c5..919678618a 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -2,6 +2,7 @@ class ActivityPub::Activity include JsonLdHelper + include Redisable def initialize(json, account, **options) @json = json @@ -70,10 +71,6 @@ class ActivityPub::Activity @object_uri ||= value_or_id(@object) end - def redis - Redis.current - end - def distribute(status) crawl_links(status) diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index f99df33e54..d77cdb3a3c 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -4,6 +4,7 @@ require 'singleton' class FeedManager include Singleton + include Redisable MAX_ITEMS = 400 @@ -35,7 +36,7 @@ class FeedManager def unpush_from_home(account, status) return false unless remove_from_feed(:home, account.id, status) - Redis.current.publish("timeline:#{account.id}", Oj.dump(event: :delete, payload: status.id.to_s)) + redis.publish("timeline:#{account.id}", Oj.dump(event: :delete, payload: status.id.to_s)) true end @@ -53,7 +54,7 @@ class FeedManager def unpush_from_list(list, status) return false unless remove_from_feed(:list, list.id, status) - Redis.current.publish("timeline:list:#{list.id}", Oj.dump(event: :delete, payload: status.id.to_s)) + redis.publish("timeline:list:#{list.id}", Oj.dump(event: :delete, payload: status.id.to_s)) true end @@ -142,10 +143,6 @@ class FeedManager private - def redis - Redis.current - end - def push_update_required?(timeline_id) redis.exists("subscribed:#{timeline_id}") end diff --git a/app/lib/ostatus/activity/base.rb b/app/lib/ostatus/activity/base.rb index c5933f3adf..db70f19980 100644 --- a/app/lib/ostatus/activity/base.rb +++ b/app/lib/ostatus/activity/base.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class OStatus::Activity::Base + include Redisable + def initialize(xml, account = nil, **options) @xml = xml @account = account @@ -66,8 +68,4 @@ class OStatus::Activity::Base Status.find_by(uri: uri) end end - - def redis - Redis.current - end end diff --git a/app/lib/potential_friendship_tracker.rb b/app/lib/potential_friendship_tracker.rb index 017a9748d5..188aa4a275 100644 --- a/app/lib/potential_friendship_tracker.rb +++ b/app/lib/potential_friendship_tracker.rb @@ -11,6 +11,8 @@ class PotentialFriendshipTracker }.freeze class << self + include Redisable + def record(account_id, target_account_id, action) return if account_id == target_account_id @@ -31,11 +33,5 @@ class PotentialFriendshipTracker return [] if account_ids.empty? Account.searchable.where(id: account_ids) end - - private - - def redis - Redis.current - end end end diff --git a/app/models/concerns/redisable.rb b/app/models/concerns/redisable.rb new file mode 100644 index 0000000000..c6cf973596 --- /dev/null +++ b/app/models/concerns/redisable.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Redisable + extend ActiveSupport::Concern + + private + + def redis + Redis.current + end +end diff --git a/app/models/feed.rb b/app/models/feed.rb index 5bce88f255..0e8943ff86 100644 --- a/app/models/feed.rb +++ b/app/models/feed.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Feed + include Redisable + def initialize(type, id) @type = type @id = id @@ -27,8 +29,4 @@ class Feed def key FeedManager.instance.key(@type, @id) end - - def redis - Redis.current - end end diff --git a/app/models/trending_tags.rb b/app/models/trending_tags.rb index 3a8be21649..148535c212 100644 --- a/app/models/trending_tags.rb +++ b/app/models/trending_tags.rb @@ -7,6 +7,8 @@ class TrendingTags THRESHOLD = 5 class << self + include Redisable + def record_use!(tag, account, at_time = Time.now.utc) return if disallowed_hashtags.include?(tag.name) || account.silenced? || account.bot? @@ -59,9 +61,5 @@ class TrendingTags @disallowed_hashtags = @disallowed_hashtags.split(' ') if @disallowed_hashtags.is_a? String @disallowed_hashtags = @disallowed_hashtags.map(&:downcase) end - - def redis - Redis.current - end end end diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb index 2e61904fc7..cd3b14e08e 100644 --- a/app/services/batched_remove_status_service.rb +++ b/app/services/batched_remove_status_service.rb @@ -2,6 +2,7 @@ class BatchedRemoveStatusService < BaseService include StreamEntryRenderer + include Redisable # Delete given statuses and reblogs of them # Dispatch PuSH updates of the deleted statuses, but only local ones @@ -109,10 +110,6 @@ class BatchedRemoveStatusService < BaseService end end - def redis - Redis.current - end - def build_xml(stream_entry) return @activity_xml[stream_entry.id] if @activity_xml.key?(stream_entry.id) diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb index 9d36a1449d..92d8c864a7 100644 --- a/app/services/follow_service.rb +++ b/app/services/follow_service.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class FollowService < BaseService + include Redisable + # Follow a remote user, notify remote user about the follow # @param [Account] source_account From which to follow # @param [String, Account] uri User URI to follow in the form of username@domain (or account record) @@ -67,10 +69,6 @@ class FollowService < BaseService follow end - def redis - Redis.current - end - def build_follow_request_xml(follow_request) OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.follow_request_salmon(follow_request)) end diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 9959bb1fbf..686b10c581 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class PostStatusService < BaseService + include Redisable + MIN_SCHEDULE_OFFSET = 5.minutes.freeze # Post a text status update, fetch and notify remote users mentioned @@ -110,10 +112,6 @@ class PostStatusService < BaseService ProcessHashtagsService.new end - def redis - Redis.current - end - def scheduled? @scheduled_at.present? end diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb index 11d28e783d..28c5224b01 100644 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@ -2,6 +2,7 @@ class RemoveStatusService < BaseService include StreamEntryRenderer + include Redisable def call(status, **options) @payload = Oj.dump(event: :delete, payload: status.id.to_s) @@ -55,7 +56,7 @@ class RemoveStatusService < BaseService def remove_from_affected @mentions.map(&:account).select(&:local?).each do |account| - Redis.current.publish("timeline:#{account.id}", @payload) + redis.publish("timeline:#{account.id}", @payload) end end @@ -133,26 +134,22 @@ class RemoveStatusService < BaseService return unless @status.public_visibility? @tags.each do |hashtag| - Redis.current.publish("timeline:hashtag:#{hashtag}", @payload) - Redis.current.publish("timeline:hashtag:#{hashtag}:local", @payload) if @status.local? + redis.publish("timeline:hashtag:#{hashtag}", @payload) + redis.publish("timeline:hashtag:#{hashtag}:local", @payload) if @status.local? end end def remove_from_public return unless @status.public_visibility? - Redis.current.publish('timeline:public', @payload) - Redis.current.publish('timeline:public:local', @payload) if @status.local? + redis.publish('timeline:public', @payload) + redis.publish('timeline:public:local', @payload) if @status.local? end def remove_from_media return unless @status.public_visibility? - Redis.current.publish('timeline:public:media', @payload) - Redis.current.publish('timeline:public:local:media', @payload) if @status.local? - end - - def redis - Redis.current + redis.publish('timeline:public:media', @payload) + redis.publish('timeline:public:local:media', @payload) if @status.local? end end diff --git a/app/workers/scheduler/feed_cleanup_scheduler.rb b/app/workers/scheduler/feed_cleanup_scheduler.rb index cd22734180..bf5e207570 100644 --- a/app/workers/scheduler/feed_cleanup_scheduler.rb +++ b/app/workers/scheduler/feed_cleanup_scheduler.rb @@ -2,6 +2,7 @@ class Scheduler::FeedCleanupScheduler include Sidekiq::Worker + include Redisable sidekiq_options unique: :until_executed, retry: 0 @@ -57,8 +58,4 @@ class Scheduler::FeedCleanupScheduler def feed_manager FeedManager.instance end - - def redis - Redis.current - end end -- GitLab From ed3011061896dfc4819d517a0f4f4947e56feac4 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Sat, 2 Feb 2019 19:18:15 +0100 Subject: [PATCH 005/192] Make displaying application used to toot opt-in (#9897) * Make storing and displaying application used to toot opt-in * Revert to storing application info, and display it to the author via API --- app/controllers/settings/preferences_controller.rb | 1 + app/lib/user_settings_decorator.rb | 5 +++++ app/models/account.rb | 1 + app/models/user.rb | 6 +++++- app/serializers/rest/status_serializer.rb | 6 +++++- app/views/settings/preferences/show.html.haml | 3 +++ app/views/stream_entries/_detailed_status.html.haml | 2 +- config/locales/simple_form.en.yml | 2 ++ config/settings.yml | 1 + 9 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 41df3bde2f..90967635da 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -48,6 +48,7 @@ class Settings::PreferencesController < Settings::BaseController :setting_theme, :setting_hide_network, :setting_aggregate_reblogs, + :setting_show_application, notification_emails: %i(follow follow_request reblog favourite mention digest report), interactions: %i(must_be_follower must_be_following) ) diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb index 19b8544103..daeb3d936f 100644 --- a/app/lib/user_settings_decorator.rb +++ b/app/lib/user_settings_decorator.rb @@ -32,6 +32,7 @@ class UserSettingsDecorator user.settings['theme'] = theme_preference if change?('setting_theme') user.settings['hide_network'] = hide_network_preference if change?('setting_hide_network') user.settings['aggregate_reblogs'] = aggregate_reblogs_preference if change?('setting_aggregate_reblogs') + user.settings['show_application'] = show_application_preference if change?('setting_show_application') end def merged_notification_emails @@ -90,6 +91,10 @@ class UserSettingsDecorator boolean_cast_setting 'setting_hide_network' end + def show_application_preference + boolean_cast_setting 'setting_show_application' + end + def theme_preference settings['setting_theme'] end diff --git a/app/models/account.rb b/app/models/account.rb index 11a3c21fe4..12d7a747ee 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -109,6 +109,7 @@ class Account < ApplicationRecord :staff?, :locale, :hides_network?, + :shows_application?, to: :user, prefix: true, allow_nil: true diff --git a/app/models/user.rb b/app/models/user.rb index fdd2741c1d..7432e3da88 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -100,7 +100,7 @@ class User < ApplicationRecord delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :delete_modal, :reduce_motion, :system_font_ui, :noindex, :theme, :display_media, :hide_network, - :expand_spoilers, :default_language, :aggregate_reblogs, to: :settings, prefix: :setting, allow_nil: false + :expand_spoilers, :default_language, :aggregate_reblogs, :show_application, to: :settings, prefix: :setting, allow_nil: false attr_reader :invite_code @@ -244,6 +244,10 @@ class User < ApplicationRecord @aggregates_reblogs ||= settings.aggregate_reblogs end + def shows_application? + @shows_application ||= settings.shows_application + end + def token_for_app(a) return nil if a.nil? || a.owner != self Doorkeeper::AccessToken diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb index bfc2d78b41..66e19be560 100644 --- a/app/serializers/rest/status_serializer.rb +++ b/app/serializers/rest/status_serializer.rb @@ -12,7 +12,7 @@ class REST::StatusSerializer < ActiveModel::Serializer attribute :pinned, if: :pinnable? belongs_to :reblog, serializer: REST::StatusSerializer - belongs_to :application + belongs_to :application, if: :show_application? belongs_to :account, serializer: REST::AccountSerializer has_many :media_attachments, serializer: REST::MediaAttachmentSerializer @@ -38,6 +38,10 @@ class REST::StatusSerializer < ActiveModel::Serializer !current_user.nil? end + def show_application? + object.account.user_shows_application? || (current_user? && current_user.account_id == object.account_id) + end + def visibility # This visibility is masked behind "private" # to avoid API changes because there are no diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index a2c61c9a68..3cb91631ed 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -34,6 +34,9 @@ .fields-group = f.input :setting_hide_network, as: :boolean, wrapper: :with_label + .fields-group + = f.input :setting_show_application, as: :boolean, wrapper: :with_label + %hr#settings_web/ .fields-row diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml index 18265e1107..e123d657fa 100644 --- a/app/views/stream_entries/_detailed_status.html.haml +++ b/app/views/stream_entries/_detailed_status.html.haml @@ -39,7 +39,7 @@ = link_to TagManager.instance.url_for(status), class: 'detailed-status__datetime u-url u-uid', target: stream_link_target, rel: 'noopener' do %time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at) · - - if status.application + - if status.application && @account.user&.setting_show_application - if status.application.website.blank? %strong.detailed-status__application= status.application.name - else diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 4363c59e42..325114755b 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -33,6 +33,7 @@ en: setting_display_media_show_all: Always show media marked as sensitive setting_hide_network: Who you follow and who follows you will not be shown on your profile setting_noindex: Affects your public profile and status pages + setting_show_application: The application you use to toot will be displayed in the detailed view of your toots setting_theme: Affects how Mastodon looks when you're logged in from any device. username: Your username will be unique on %{domain} whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word @@ -100,6 +101,7 @@ en: setting_hide_network: Hide your network setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations + setting_show_application: Disclose application used to send toots setting_system_font_ui: Use system's default font setting_theme: Site theme setting_unfollow_modal: Show confirmation dialog before unfollowing someone diff --git a/config/settings.yml b/config/settings.yml index 4f7c2c8f32..2cf286a9e4 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -26,6 +26,7 @@ defaults: &defaults expand_spoilers: false preview_sensitive_media: false reduce_motion: false + show_application: false system_font_ui: false noindex: false theme: 'default' -- GitLab From 582f86ab32b4ce2b9d242cf6f5c3c6c0dce4e144 Mon Sep 17 00:00:00 2001 From: Jeong Arm <kjwonmail@gmail.com> Date: Sun, 3 Feb 2019 03:37:16 +0900 Subject: [PATCH 006/192] Re-enable ignored translations that is needed (#7842) Some of strings should be translated. --- config/i18n-tasks.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index eec8b6dbec..1bcac154b1 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -35,11 +35,8 @@ ignore_missing: - 'activemodel.errors.*' - 'activerecord.attributes.*' - 'activerecord.errors.*' - - '{devise,pagination,doorkeeper}.*' + - '{pagination,doorkeeper}.*' - '{date,datetime,time,number}.*' - - 'simple_form.{yes,no}' - - 'simple_form.{placeholders,hints,labels}.*' - - 'simple_form.{error_notification,required}.:' - 'errors.messages.*' - 'activerecord.errors.models.doorkeeper/*' - 'sessions.{browsers,platforms}.*' -- GitLab From 750c67660de753065ec160b4e389ba0dda2f81cc Mon Sep 17 00:00:00 2001 From: tmm576 <tmm576@users.noreply.github.com> Date: Sat, 2 Feb 2019 14:22:05 -0500 Subject: [PATCH 007/192] Allow multiple files upload through web UI, including drag & drop (#9856) * Allow drag and drop uploads of multiple files to compose * Calculate aggregate upload progress for single action * Allow multiple uploads to compose through traditional input, consolidate update file limit logic, provide file limit feedback --- app/javascript/mastodon/actions/alerts.js | 4 +- app/javascript/mastodon/actions/compose.js | 38 ++++++++++++++----- .../compose/components/upload_button.js | 2 +- app/javascript/mastodon/features/ui/index.js | 2 +- .../mastodon/locales/defaultMessages.json | 11 +++++- app/javascript/mastodon/locales/en.json | 1 + 6 files changed, 43 insertions(+), 15 deletions(-) diff --git a/app/javascript/mastodon/actions/alerts.js b/app/javascript/mastodon/actions/alerts.js index 3f5d7ef46b..50cd48a9ed 100644 --- a/app/javascript/mastodon/actions/alerts.js +++ b/app/javascript/mastodon/actions/alerts.js @@ -22,7 +22,7 @@ export function clearAlert() { }; }; -export function showAlert(title, message) { +export function showAlert(title = messages.unexpectedTitle, message = messages.unexpectedMessage) { return { type: ALERT_SHOW, title, @@ -44,6 +44,6 @@ export function showAlertForError(error) { return showAlert(title, message); } else { console.error(error); - return showAlert(messages.unexpectedTitle, messages.unexpectedMessage); + return showAlert(); } } diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index a4352faaba..0be2a5cd46 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -8,6 +8,8 @@ import resizeImage from '../utils/resize_image'; import { importFetchedAccounts } from './importer'; import { updateTimeline } from './timelines'; import { showAlertForError } from './alerts'; +import { showAlert } from './alerts'; +import { defineMessages } from 'react-intl'; let cancelFetchComposeSuggestionsAccounts; @@ -49,6 +51,10 @@ export const COMPOSE_UPLOAD_CHANGE_REQUEST = 'COMPOSE_UPLOAD_UPDATE_REQUEST' export const COMPOSE_UPLOAD_CHANGE_SUCCESS = 'COMPOSE_UPLOAD_UPDATE_SUCCESS'; export const COMPOSE_UPLOAD_CHANGE_FAIL = 'COMPOSE_UPLOAD_UPDATE_FAIL'; +const messages = defineMessages({ + uploadErrorLimit: { id: 'upload_error.limit', defaultMessage: 'File upload limit exceeded.' }, +}); + export function changeCompose(text) { return { type: COMPOSE_CHANGE, @@ -184,20 +190,32 @@ export function submitComposeFail(error) { export function uploadCompose(files) { return function (dispatch, getState) { - if (getState().getIn(['compose', 'media_attachments']).size > 3) { + const uploadLimit = 4; + const media = getState().getIn(['compose', 'media_attachments']); + const total = Array.from(files).reduce((a, v) => a + v.size, 0); + const progress = new Array(files.length).fill(0); + + if (files.length + media.size > uploadLimit) { + dispatch(showAlert(undefined, messages.uploadErrorLimit)); return; } - dispatch(uploadComposeRequest()); - resizeImage(files[0]).then(file => { - const data = new FormData(); - data.append('file', file); - - return api(getState).post('/api/v1/media', data, { - onUploadProgress: ({ loaded, total }) => dispatch(uploadComposeProgress(loaded, total)), - }).then(({ data }) => dispatch(uploadComposeSuccess(data))); - }).catch(error => dispatch(uploadComposeFail(error))); + for (const [i, f] of Array.from(files).entries()) { + if (media.size + i > 3) break; + + resizeImage(f).then(file => { + const data = new FormData(); + data.append('file', file); + + return api(getState).post('/api/v1/media', data, { + onUploadProgress: function({ loaded }){ + progress[i] = loaded; + dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); + }, + }).then(({ data }) => dispatch(uploadComposeSuccess(data))); + }).catch(error => dispatch(uploadComposeFail(error))); + }; }; }; diff --git a/app/javascript/mastodon/features/compose/components/upload_button.js b/app/javascript/mastodon/features/compose/components/upload_button.js index b6fe770ead..db55ad70bf 100644 --- a/app/javascript/mastodon/features/compose/components/upload_button.js +++ b/app/javascript/mastodon/features/compose/components/upload_button.js @@ -63,7 +63,7 @@ class UploadButton extends ImmutablePureComponent { key={resetFileKey} ref={this.setRef} type='file' - multiple={false} + multiple accept={acceptContentTypes.toArray().join(',')} onChange={this.handleChange} disabled={disabled} diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index f01c2bf247..93e45678f2 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -263,7 +263,7 @@ class UI extends React.PureComponent { this.setState({ draggingOver: false }); this.dragTargets = []; - if (e.dataTransfer && e.dataTransfer.files.length === 1) { + if (e.dataTransfer && e.dataTransfer.files.length >= 1) { this.props.dispatch(uploadCompose(e.dataTransfer.files)); } } diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 6ac8160ba4..89d4e6bbaa 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -12,6 +12,15 @@ ], "path": "app/javascript/mastodon/actions/alerts.json" }, + { + "descriptors": [ + { + "defaultMessage": "File upload limit exceeded.", + "id": "upload_error.limit" + } + ], + "path": "app/javascript/mastodon/actions/compose.json" + }, { "descriptors": [ { @@ -2285,4 +2294,4 @@ ], "path": "app/javascript/mastodon/features/video/index.json" } -] \ No newline at end of file +] diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 1dbf280222..e840b17d84 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -342,6 +342,7 @@ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Change preview", "upload_form.undo": "Delete", -- GitLab From 7e33d6d192128238768c976ba108a374ad073aa2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Feb 2019 03:40:22 +0100 Subject: [PATCH 008/192] Bump httplog from 1.2.0 to 1.2.1 (#9942) Bumps [httplog](https://github.com/trusche/httplog) from 1.2.0 to 1.2.1. - [Release notes](https://github.com/trusche/httplog/releases) - [Changelog](https://github.com/trusche/httplog/blob/master/CHANGELOG.md) - [Commits](https://github.com/trusche/httplog/compare/v1.2.0...v1.2.1) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8f661fc242..3b488710b0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -266,7 +266,7 @@ GEM domain_name (~> 0.5) http-form_data (2.1.1) http_accept_language (2.1.1) - httplog (1.2.0) + httplog (1.2.1) rack (>= 1.0) rainbow (>= 2.0.0) i18n (1.5.3) -- GitLab From c5071f2d787e81251c2b3111074b20d94773ee44 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Feb 2019 03:40:40 +0100 Subject: [PATCH 009/192] Bump capybara from 3.12.0 to 3.13.2 (#9935) Bumps [capybara](https://github.com/teamcapybara/capybara) from 3.12.0 to 3.13.2. - [Release notes](https://github.com/teamcapybara/capybara/releases) - [Changelog](https://github.com/teamcapybara/capybara/blob/master/History.md) - [Commits](https://github.com/teamcapybara/capybara/compare/3.12.0...3.13.2) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 8266488f89..44cae11ff2 100644 --- a/Gemfile +++ b/Gemfile @@ -107,7 +107,7 @@ group :production, :test do end group :test do - gem 'capybara', '~> 3.12' + gem 'capybara', '~> 3.13' gem 'climate_control', '~> 0.2' gem 'faker', '~> 1.9' gem 'microformats', '~> 4.0' diff --git a/Gemfile.lock b/Gemfile.lock index 3b488710b0..5bec39a01f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -126,7 +126,7 @@ GEM sshkit (~> 1.3) capistrano-yarn (2.0.2) capistrano (~> 3.0) - capybara (3.12.0) + capybara (3.13.2) addressable mini_mime (>= 0.1.3) nokogiri (~> 1.8) @@ -669,7 +669,7 @@ DEPENDENCIES capistrano-rails (~> 1.4) capistrano-rbenv (~> 2.1) capistrano-yarn (~> 2.0) - capybara (~> 3.12) + capybara (~> 3.13) charlock_holmes (~> 0.7.6) chewy (~> 5.0) cld3 (~> 3.2.3) -- GitLab From d14c276e58f0f223b0e4889d342a948c961081b2 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Sun, 3 Feb 2019 03:59:51 +0100 Subject: [PATCH 010/192] Add option to overwrite imported data (#9962) * Add option to overwrite imported data Fix #7465 * Add import for domain blocks --- app/models/account_domain_block.rb | 1 + app/models/concerns/domain_normalizable.rb | 2 +- app/models/export.rb | 1 + app/models/import.rb | 14 ++- app/services/import_service.rb | 90 +++++++++++++++++++ app/views/settings/imports/show.html.haml | 7 +- app/workers/import/relationship_worker.rb | 8 +- app/workers/import_worker.rb | 38 +------- config/locales/en.yml | 6 ++ ...20190201012802_add_overwrite_to_imports.rb | 17 ++++ db/schema.rb | 3 +- .../concerns/account_interactions_spec.rb | 4 +- 12 files changed, 148 insertions(+), 43 deletions(-) create mode 100644 app/services/import_service.rb create mode 100644 db/migrate/20190201012802_add_overwrite_to_imports.rb diff --git a/app/models/account_domain_block.rb b/app/models/account_domain_block.rb index e352000c3a..7c0d60379e 100644 --- a/app/models/account_domain_block.rb +++ b/app/models/account_domain_block.rb @@ -12,6 +12,7 @@ class AccountDomainBlock < ApplicationRecord include Paginable + include DomainNormalizable belongs_to :account validates :domain, presence: true, uniqueness: { scope: :account_id } diff --git a/app/models/concerns/domain_normalizable.rb b/app/models/concerns/domain_normalizable.rb index dff3e5414f..fb84058fc2 100644 --- a/app/models/concerns/domain_normalizable.rb +++ b/app/models/concerns/domain_normalizable.rb @@ -10,6 +10,6 @@ module DomainNormalizable private def normalize_domain - self.domain = TagManager.instance.normalize_domain(domain) + self.domain = TagManager.instance.normalize_domain(domain&.strip) end end diff --git a/app/models/export.rb b/app/models/export.rb index a2520e9c24..fc4bb69648 100644 --- a/app/models/export.rb +++ b/app/models/export.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + require 'csv' class Export diff --git a/app/models/import.rb b/app/models/import.rb index 55e970b0d8..a7a0d80657 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -13,20 +13,30 @@ # data_file_size :integer # data_updated_at :datetime # account_id :bigint(8) not null +# overwrite :boolean default(FALSE), not null # class Import < ApplicationRecord - FILE_TYPES = ['text/plain', 'text/csv'].freeze + FILE_TYPES = %w(text/plain text/csv).freeze + MODES = %i(merge overwrite).freeze self.inheritance_column = false belongs_to :account - enum type: [:following, :blocking, :muting] + enum type: [:following, :blocking, :muting, :domain_blocking] validates :type, presence: true has_attached_file :data validates_attachment_content_type :data, content_type: FILE_TYPES validates_attachment_presence :data + + def mode + overwrite? ? :overwrite : :merge + end + + def mode=(str) + self.overwrite = str.to_sym == :overwrite + end end diff --git a/app/services/import_service.rb b/app/services/import_service.rb new file mode 100644 index 0000000000..3f558626e6 --- /dev/null +++ b/app/services/import_service.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true + +require 'csv' + +class ImportService < BaseService + ROWS_PROCESSING_LIMIT = 20_000 + + def call(import) + @import = import + @account = @import.account + @data = CSV.new(import_data).reject(&:blank?) + + case @import.type + when 'following' + import_follows! + when 'blocking' + import_blocks! + when 'muting' + import_mutes! + when 'domain_blocking' + import_domain_blocks! + end + end + + private + + def import_follows! + import_relationships!('follow', 'unfollow', @account.following, follow_limit) + end + + def import_blocks! + import_relationships!('block', 'unblock', @account.blocking, ROWS_PROCESSING_LIMIT) + end + + def import_mutes! + import_relationships!('mute', 'unmute', @account.muting, ROWS_PROCESSING_LIMIT) + end + + def import_domain_blocks! + items = @data.take(ROWS_PROCESSING_LIMIT).map { |row| row.first.strip } + + if @import.overwrite? + presence_hash = items.each_with_object({}) { |id, mapping| mapping[id] = true } + + @account.domain_blocks.find_each do |domain_block| + if presence_hash[domain_block.domain] + items.delete(domain_block.domain) + else + @account.unblock_domain!(domain_block.domain) + end + end + end + + items.each do |domain| + @account.block_domain!(domain) + end + + AfterAccountDomainBlockWorker.push_bulk(items) do |domain| + [@account.id, domain] + end + end + + def import_relationships!(action, undo_action, overwrite_scope, limit) + items = @data.take(limit).map { |row| row.first.strip } + + if @import.overwrite? + presence_hash = items.each_with_object({}) { |id, mapping| mapping[id] = true } + + overwrite_scope.find_each do |target_account| + if presence_hash[target_account.acct] + items.delete(target_account.acct) + else + Import::RelationshipWorker.perform_async(@account.id, target_account.acct, undo_action) + end + end + end + + Import::RelationshipWorker.push_bulk(items) do |acct| + [@account.id, acct, action] + end + end + + def import_data + Paperclip.io_adapters.for(@import.data).read + end + + def follow_limit + FollowLimitValidator.limit_for_account(@account) + end +end diff --git a/app/views/settings/imports/show.html.haml b/app/views/settings/imports/show.html.haml index 4512fc714d..7bb4beb01c 100644 --- a/app/views/settings/imports/show.html.haml +++ b/app/views/settings/imports/show.html.haml @@ -5,8 +5,11 @@ .field-group = f.input :type, collection: Import.types.keys, wrapper: :with_block_label, include_blank: false, label_method: lambda { |type| I18n.t("imports.types.#{type}") }, hint: t('imports.preface') - .field-group - = f.input :data, wrapper: :with_block_label, hint: t('simple_form.hints.imports.data') + .fields-row + .fields-group.fields-row__column.fields-row__column-6 + = f.input :data, wrapper: :with_block_label, hint: t('simple_form.hints.imports.data') + .fields-group.fields-row__column.fields-row__column-6 + = f.input :mode, as: :radio_buttons, collection: Import::MODES, label_method: lambda { |mode| safe_join([I18n.t("imports.modes.#{mode}"), content_tag(:span, I18n.t("imports.modes.#{mode}_long"), class: 'hint')]) }, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' .actions = f.button :button, t('imports.upload'), type: :submit diff --git a/app/workers/import/relationship_worker.rb b/app/workers/import/relationship_worker.rb index 1dd8bf8fbb..e9db20a463 100644 --- a/app/workers/import/relationship_worker.rb +++ b/app/workers/import/relationship_worker.rb @@ -13,11 +13,17 @@ class Import::RelationshipWorker case relationship when 'follow' - FollowService.new.call(from_account, target_account.acct) + FollowService.new.call(from_account, target_account) + when 'unfollow' + UnfollowService.new.call(from_account, target_account) when 'block' BlockService.new.call(from_account, target_account) + when 'unblock' + UnblockService.new.call(from_account, target_account) when 'mute' MuteService.new.call(from_account, target_account) + when 'unmute' + UnmuteService.new.call(from_account, target_account) end rescue ActiveRecord::RecordNotFound true diff --git a/app/workers/import_worker.rb b/app/workers/import_worker.rb index aeb221cf68..dfa71b29ec 100644 --- a/app/workers/import_worker.rb +++ b/app/workers/import_worker.rb @@ -1,44 +1,14 @@ # frozen_string_literal: true -require 'csv' - class ImportWorker include Sidekiq::Worker sidekiq_options queue: 'pull', retry: false - attr_reader :import - def perform(import_id) - @import = Import.find(import_id) - - Import::RelationshipWorker.push_bulk(import_rows) do |row| - [@import.account_id, row.first, relationship_type] - end - - @import.destroy - end - - private - - def import_contents - Paperclip.io_adapters.for(@import.data).read - end - - def relationship_type - case @import.type - when 'following' - 'follow' - when 'blocking' - 'block' - when 'muting' - 'mute' - end - end - - def import_rows - rows = CSV.new(import_contents).reject(&:blank?) - rows = rows.take(FollowLimitValidator.limit_for_account(@import.account)) if @import.type == 'following' - rows + import = Import.find(import_id) + ImportService.new.call(import) + ensure + import&.destroy end end diff --git a/config/locales/en.yml b/config/locales/en.yml index c7ef36598a..f23f867e5c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -628,10 +628,16 @@ en: one: Something isn't quite right yet! Please review the error below other: Something isn't quite right yet! Please review %{count} errors below imports: + modes: + merge: Merge + merge_long: Keep existing records and add new ones + overwrite: Overwrite + overwrite_long: Replace current records with the new ones preface: You can import data that you have exported from another instance, such as a list of the people you are following or blocking. success: Your data was successfully uploaded and will now be processed in due time types: blocking: Blocking list + domain_blocking: Domain blocking list following: Following list muting: Muting list upload: Upload diff --git a/db/migrate/20190201012802_add_overwrite_to_imports.rb b/db/migrate/20190201012802_add_overwrite_to_imports.rb new file mode 100644 index 0000000000..89b262cc72 --- /dev/null +++ b/db/migrate/20190201012802_add_overwrite_to_imports.rb @@ -0,0 +1,17 @@ +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class AddOverwriteToImports < ActiveRecord::Migration[5.2] + include Mastodon::MigrationHelpers + + disable_ddl_transaction! + + def up + safety_assured do + add_column_with_default :imports, :overwrite, :boolean, default: false, allow_null: false + end + end + + def down + remove_column :imports, :overwrite, :boolean + end +end diff --git a/db/schema.rb b/db/schema.rb index 3487adf088..44e00df405 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_01_17_114553) do +ActiveRecord::Schema.define(version: 2019_02_01_012802) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -290,6 +290,7 @@ ActiveRecord::Schema.define(version: 2019_01_17_114553) do t.integer "data_file_size" t.datetime "data_updated_at" t.bigint "account_id", null: false + t.boolean "overwrite", default: false, null: false end create_table "invites", force: :cascade do |t| diff --git a/spec/models/concerns/account_interactions_spec.rb b/spec/models/concerns/account_interactions_spec.rb index 8df52b7706..e8ef61f66c 100644 --- a/spec/models/concerns/account_interactions_spec.rb +++ b/spec/models/concerns/account_interactions_spec.rb @@ -237,9 +237,9 @@ describe AccountInteractions do end describe '#block_domain!' do - let(:domain_block) { Fabricate(:domain_block) } + let(:domain) { 'example.com' } - subject { account.block_domain!(domain_block) } + subject { account.block_domain!(domain) } it 'creates and returns AccountDomainBlock' do expect do -- GitLab From 364f2ff9aa2b4bf601d68a12bce758aeb5530467 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Mon, 4 Feb 2019 04:25:59 +0100 Subject: [PATCH 011/192] Add featured hashtags to profiles (#9755) * Add hashtag filter to profiles GET /@:username/tagged/:hashtag GET /api/v1/accounts/:id/statuses?tagged=:hashtag * Display featured hashtags on public profile * Use separate model for featured tags * Update featured hashtag counters on-write * Limit featured tags to 10 --- app/controllers/accounts_controller.rb | 14 ++++- .../api/v1/accounts/statuses_controller.rb | 5 ++ .../settings/featured_tags_controller.rb | 51 +++++++++++++++++++ .../settings/profiles_controller.rb | 2 +- .../settings/sessions_controller.rb | 1 + app/javascript/styles/mastodon/accounts.scss | 4 ++ app/javascript/styles/mastodon/admin.scss | 7 ++- app/javascript/styles/mastodon/widgets.scss | 7 ++- app/models/concerns/account_associations.rb | 1 + app/models/featured_tag.rb | 46 +++++++++++++++++ app/models/tag.rb | 2 + app/services/process_hashtags_service.rb | 12 ++++- app/services/remove_status_service.rb | 4 ++ app/views/accounts/show.html.haml | 13 +++++ .../settings/featured_tags/index.html.haml | 27 ++++++++++ config/locales/en.yml | 5 ++ config/locales/simple_form.en.yml | 4 ++ config/navigation.rb | 1 + config/routes.rb | 2 + ...5102658_create_account_moderation_notes.rb | 1 + .../20190203180359_create_featured_tags.rb | 12 +++++ db/schema.rb | 15 +++++- spec/fabricators/featured_tag_fabricator.rb | 6 +++ spec/models/featured_tag_spec.rb | 4 ++ 24 files changed, 238 insertions(+), 8 deletions(-) create mode 100644 app/controllers/settings/featured_tags_controller.rb create mode 100644 app/models/featured_tag.rb create mode 100644 app/views/settings/featured_tags/index.html.haml create mode 100644 db/migrate/20190203180359_create_featured_tags.rb create mode 100644 spec/fabricators/featured_tag_fabricator.rb create mode 100644 spec/models/featured_tag_spec.rb diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index f788a90789..6e3a23073b 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -57,6 +57,7 @@ class AccountsController < ApplicationController def filtered_statuses default_statuses.tap do |statuses| + statuses.merge!(hashtag_scope) if tag_requested? statuses.merge!(only_media_scope) if media_requested? statuses.merge!(no_replies_scope) unless replies_requested? end @@ -78,12 +79,15 @@ class AccountsController < ApplicationController Status.without_replies end + def hashtag_scope + Status.tagged_with(Tag.find_by(name: params[:tag].downcase)&.id) + end + def set_account @account = Account.find_local!(params[:username]) end def older_url - ::Rails.logger.info("older: max_id #{@statuses.last.id}, url #{pagination_url(max_id: @statuses.last.id)}") pagination_url(max_id: @statuses.last.id) end @@ -92,7 +96,9 @@ class AccountsController < ApplicationController end def pagination_url(max_id: nil, min_id: nil) - if media_requested? + if tag_requested? + short_account_tag_url(@account, params[:tag], max_id: max_id, min_id: min_id) + elsif media_requested? short_account_media_url(@account, max_id: max_id, min_id: min_id) elsif replies_requested? short_account_with_replies_url(@account, max_id: max_id, min_id: min_id) @@ -109,6 +115,10 @@ class AccountsController < ApplicationController request.path.ends_with?('/with_replies') end + def tag_requested? + request.path.ends_with?("/tagged/#{params[:tag]}") + end + def filtered_status_page(params) if params[:min_id].present? filtered_statuses.paginate_by_min_id(PAGE_SIZE, params[:min_id]).reverse diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb index 6c2a5c1414..6fdc827cb2 100644 --- a/app/controllers/api/v1/accounts/statuses_controller.rb +++ b/app/controllers/api/v1/accounts/statuses_controller.rb @@ -33,6 +33,7 @@ class Api::V1::Accounts::StatusesController < Api::BaseController statuses.merge!(only_media_scope) if truthy_param?(:only_media) statuses.merge!(no_replies_scope) if truthy_param?(:exclude_replies) statuses.merge!(no_reblogs_scope) if truthy_param?(:exclude_reblogs) + statuses.merge!(hashtag_scope) if params[:tagged].present? statuses end @@ -67,6 +68,10 @@ class Api::V1::Accounts::StatusesController < Api::BaseController Status.without_reblogs end + def hashtag_scope + Status.tagged_with(Tag.find_by(name: params[:tagged])&.id) + end + def pagination_params(core_params) params.slice(:limit, :only_media, :exclude_replies).permit(:limit, :only_media, :exclude_replies).merge(core_params) end diff --git a/app/controllers/settings/featured_tags_controller.rb b/app/controllers/settings/featured_tags_controller.rb new file mode 100644 index 0000000000..19815e4168 --- /dev/null +++ b/app/controllers/settings/featured_tags_controller.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +class Settings::FeaturedTagsController < Settings::BaseController + layout 'admin' + + before_action :authenticate_user! + before_action :set_featured_tags, only: :index + before_action :set_featured_tag, except: [:index, :create] + before_action :set_most_used_tags, only: :index + + def index + @featured_tag = FeaturedTag.new + end + + def create + @featured_tag = current_account.featured_tags.new(featured_tag_params) + @featured_tag.reset_data + + if @featured_tag.save + redirect_to settings_featured_tags_path + else + set_featured_tags + set_most_used_tags + + render :index + end + end + + def destroy + @featured_tag.destroy! + redirect_to settings_featured_tags_path + end + + private + + def set_featured_tag + @featured_tag = current_account.featured_tags.find(params[:id]) + end + + def set_featured_tags + @featured_tags = current_account.featured_tags.reject(&:new_record?) + end + + def set_most_used_tags + @most_used_tags = Tag.most_used(current_account).where.not(id: @featured_tags.map(&:id)).limit(10) + end + + def featured_tag_params + params.require(:featured_tag).permit(:name) + end +end diff --git a/app/controllers/settings/profiles_controller.rb b/app/controllers/settings/profiles_controller.rb index db9081fdf0..8b640cdca1 100644 --- a/app/controllers/settings/profiles_controller.rb +++ b/app/controllers/settings/profiles_controller.rb @@ -32,6 +32,6 @@ class Settings::ProfilesController < Settings::BaseController end def set_account - @account = current_user.account + @account = current_account end end diff --git a/app/controllers/settings/sessions_controller.rb b/app/controllers/settings/sessions_controller.rb index 11b150ffd3..84ebb21f2c 100644 --- a/app/controllers/settings/sessions_controller.rb +++ b/app/controllers/settings/sessions_controller.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true class Settings::SessionsController < Settings::BaseController + before_action :authenticate_user! before_action :set_session, only: :destroy def destroy diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss index 63a5c61b8b..f4f458cf42 100644 --- a/app/javascript/styles/mastodon/accounts.scss +++ b/app/javascript/styles/mastodon/accounts.scss @@ -288,3 +288,7 @@ border-bottom: 0; } } + +.directory__tag .trends__item__current { + width: auto; +} diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 177f8145fa..6d785707c9 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -153,10 +153,15 @@ $content-width: 840px; font-weight: 500; } - .directory__tag a { + .directory__tag > a, + .directory__tag > div { box-shadow: none; } + .directory__tag .table-action-link .fa { + color: inherit; + } + .directory__tag h4 { font-size: 18px; font-weight: 700; diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss index c97337e4e3..1eaf30c5b3 100644 --- a/app/javascript/styles/mastodon/widgets.scss +++ b/app/javascript/styles/mastodon/widgets.scss @@ -269,7 +269,8 @@ box-sizing: border-box; margin-bottom: 10px; - a { + & > a, + & > div { display: flex; align-items: center; justify-content: space-between; @@ -279,7 +280,9 @@ text-decoration: none; color: inherit; box-shadow: 0 0 15px rgba($base-shadow-color, 0.2); + } + & > a { &:hover, &:active, &:focus { @@ -287,7 +290,7 @@ } } - &.active a { + &.active > a { background: $ui-highlight-color; cursor: default; } diff --git a/app/models/concerns/account_associations.rb b/app/models/concerns/account_associations.rb index 7dafeee34c..397ec4a22a 100644 --- a/app/models/concerns/account_associations.rb +++ b/app/models/concerns/account_associations.rb @@ -55,5 +55,6 @@ module AccountAssociations # Hashtags has_and_belongs_to_many :tags + has_many :featured_tags, -> { includes(:tag) }, dependent: :destroy, inverse_of: :account end end diff --git a/app/models/featured_tag.rb b/app/models/featured_tag.rb new file mode 100644 index 0000000000..b5a10ad2da --- /dev/null +++ b/app/models/featured_tag.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true +# == Schema Information +# +# Table name: featured_tags +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) +# tag_id :bigint(8) +# statuses_count :bigint(8) default(0), not null +# last_status_at :datetime +# created_at :datetime not null +# updated_at :datetime not null +# + +class FeaturedTag < ApplicationRecord + belongs_to :account, inverse_of: :featured_tags, required: true + belongs_to :tag, inverse_of: :featured_tags, required: true + + delegate :name, to: :tag, allow_nil: true + + validates :name, presence: true + validate :validate_featured_tags_limit, on: :create + + def name=(str) + self.tag = Tag.find_or_initialize_by(name: str.delete('#').mb_chars.downcase.to_s) + end + + def increment(timestamp) + update(statuses_count: statuses_count + 1, last_status_at: timestamp) + end + + def decrement(deleted_status_id) + update(statuses_count: [0, statuses_count - 1].max, last_status_at: account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag).where.not(id: deleted_status_id).select(:created_at).first&.created_at) + end + + def reset_data + self.statuses_count = account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag).count + self.last_status_at = account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag).select(:created_at).first&.created_at + end + + private + + def validate_featured_tags_limit + errors.add(:base, I18n.t('featured_tags.errors.limit')) if account.featured_tags.count >= 10 + end +end diff --git a/app/models/tag.rb b/app/models/tag.rb index 99830ae92c..4373e967b2 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -14,6 +14,7 @@ class Tag < ApplicationRecord has_and_belongs_to_many :accounts has_and_belongs_to_many :sample_accounts, -> { searchable.discoverable.popular.limit(3) }, class_name: 'Account' + has_many :featured_tags, dependent: :destroy, inverse_of: :tag has_one :account_tag_stat, dependent: :destroy HASHTAG_NAME_RE = '[[:word:]_]*[[:alpha:]_·][[:word:]_]*' @@ -23,6 +24,7 @@ class Tag < ApplicationRecord scope :discoverable, -> { joins(:account_tag_stat).where(AccountTagStat.arel_table[:accounts_count].gt(0)).where(account_tag_stats: { hidden: false }).order(Arel.sql('account_tag_stats.accounts_count desc')) } scope :hidden, -> { where(account_tag_stats: { hidden: true }) } + scope :most_used, ->(account) { joins(:statuses).where(statuses: { account: account }).group(:id).order(Arel.sql('count(*) desc')) } delegate :accounts_count, :accounts_count=, diff --git a/app/services/process_hashtags_service.rb b/app/services/process_hashtags_service.rb index cf7471c989..d5ec076a8b 100644 --- a/app/services/process_hashtags_service.rb +++ b/app/services/process_hashtags_service.rb @@ -2,12 +2,22 @@ class ProcessHashtagsService < BaseService def call(status, tags = []) - tags = Extractor.extract_hashtags(status.text) if status.local? + tags = Extractor.extract_hashtags(status.text) if status.local? + records = [] tags.map { |str| str.mb_chars.downcase }.uniq(&:to_s).each do |name| tag = Tag.where(name: name).first_or_create(name: name) + status.tags << tag + records << tag + TrendingTags.record_use!(tag, status.account, status.created_at) if status.public_visibility? end + + return unless status.public_visibility? || status.unlisted_visibility? + + status.account.featured_tags.where(tag_id: records.map(&:id)).each do |featured_tag| + featured_tag.increment(status.created_at) + end end end diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb index 28c5224b01..2012f15fc7 100644 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@ -131,6 +131,10 @@ class RemoveStatusService < BaseService end def remove_from_hashtags + @account.featured_tags.where(tag_id: @status.tags.pluck(:id)).each do |featured_tag| + featured_tag.decrement(@status.id) + end + return unless @status.public_visibility? @tags.each do |hashtag| diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml index 0ee9dd7ded..23a595205c 100644 --- a/app/views/accounts/show.html.haml +++ b/app/views/accounts/show.html.haml @@ -63,4 +63,17 @@ - @endorsed_accounts.each do |account| = account_link_to account + - @account.featured_tags.each do |featured_tag| + .directory__tag{ class: params[:tag] == featured_tag.name ? 'active' : nil } + = link_to short_account_tag_path(@account, featured_tag.tag) do + %h4 + = fa_icon 'hashtag' + = featured_tag.name + %small + - if featured_tag.last_status_at.nil? + = t('accounts.nothing_here') + - else + %time{ datetime: featured_tag.last_status_at.iso8601, title: l(featured_tag.last_status_at) }= l featured_tag.last_status_at + .trends__item__current= number_to_human featured_tag.statuses_count, strip_insignificant_zeros: true + = render 'application/sidebar' diff --git a/app/views/settings/featured_tags/index.html.haml b/app/views/settings/featured_tags/index.html.haml new file mode 100644 index 0000000000..5f69517f3a --- /dev/null +++ b/app/views/settings/featured_tags/index.html.haml @@ -0,0 +1,27 @@ +- content_for :page_title do + = t('settings.featured_tags') + += simple_form_for @featured_tag, url: settings_featured_tags_path do |f| + = render 'shared/error_messages', object: @featured_tag + + .fields-group + = f.input :name, wrapper: :with_block_label, hint: safe_join([t('simple_form.hints.featured_tag.name'), safe_join(@most_used_tags.map { |tag| link_to("##{tag.name}", settings_featured_tags_path(featured_tag: { name: tag.name }), method: :post) }, ', ')], ' ') + + .actions + = f.button :button, t('featured_tags.add_new'), type: :submit + +%hr.spacer/ + +- @featured_tags.each do |featured_tag| + .directory__tag{ class: params[:tag] == featured_tag.name ? 'active' : nil } + %div + %h4 + = fa_icon 'hashtag' + = featured_tag.name + %small + - if featured_tag.last_status_at.nil? + = t('accounts.nothing_here') + - else + %time{ datetime: featured_tag.last_status_at.iso8601, title: l(featured_tag.last_status_at) }= l featured_tag.last_status_at + = table_link_to 'trash', t('filters.index.delete'), settings_featured_tag_path(featured_tag), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } + .trends__item__current= number_to_human featured_tag.statuses_count, strip_insignificant_zeros: true diff --git a/config/locales/en.yml b/config/locales/en.yml index f23f867e5c..c92fc781c8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -588,6 +588,10 @@ en: lists: Lists mutes: You mute storage: Media storage + featured_tags: + add_new: Add new + errors: + limit: You have already featured the maximum amount of hashtags filters: contexts: home: Home timeline @@ -807,6 +811,7 @@ en: development: Development edit_profile: Edit profile export: Data export + featured_tags: Featured hashtags followers: Authorized followers import: Import migrate: Account migration diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 325114755b..3a2746a539 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -37,6 +37,8 @@ en: setting_theme: Affects how Mastodon looks when you're logged in from any device. username: Your username will be unique on %{domain} whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word + featured_tag: + name: 'You might want to use one of these:' imports: data: CSV file exported from another Mastodon instance sessions: @@ -110,6 +112,8 @@ en: username: Username username_or_email: Username or Email whole_word: Whole word + featured_tag: + name: Hashtag interactions: must_be_follower: Block notifications from non-followers must_be_following: Block notifications from people you don't follow diff --git a/config/navigation.rb b/config/navigation.rb index a9521f956d..1be621ac24 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -6,6 +6,7 @@ SimpleNavigation::Configuration.run do |navigation| primary.item :settings, safe_join([fa_icon('cog fw'), t('settings.settings')]), settings_profile_url do |settings| settings.item :profile, safe_join([fa_icon('user fw'), t('settings.edit_profile')]), settings_profile_url, highlights_on: %r{/settings/profile|/settings/migration} + settings.item :featured_tags, safe_join([fa_icon('hashtag fw'), t('settings.featured_tags')]), settings_featured_tags_url settings.item :preferences, safe_join([fa_icon('sliders fw'), t('settings.preferences')]), settings_preferences_url settings.item :notifications, safe_join([fa_icon('bell fw'), t('settings.notifications')]), settings_notifications_url settings.item :password, safe_join([fa_icon('lock fw'), t('auth.security')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete} diff --git a/config/routes.rb b/config/routes.rb index af49845ccb..ded62981d4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -74,6 +74,7 @@ Rails.application.routes.draw do get '/@:username', to: 'accounts#show', as: :short_account get '/@:username/with_replies', to: 'accounts#show', as: :short_account_with_replies get '/@:username/media', to: 'accounts#show', as: :short_account_media + get '/@:username/tagged/:tag', to: 'accounts#show', as: :short_account_tag get '/@:account_username/:id', to: 'statuses#show', as: :short_account_status get '/@:account_username/:id/embed', to: 'statuses#embed', as: :embed_short_account_status @@ -116,6 +117,7 @@ Rails.application.routes.draw do resource :migration, only: [:show, :update] resources :sessions, only: [:destroy] + resources :featured_tags, only: [:index, :create, :destroy] end resources :media, only: [:show] do diff --git a/db/migrate/20171005102658_create_account_moderation_notes.rb b/db/migrate/20171005102658_create_account_moderation_notes.rb index d1802b5b3c..974ed99403 100644 --- a/db/migrate/20171005102658_create_account_moderation_notes.rb +++ b/db/migrate/20171005102658_create_account_moderation_notes.rb @@ -7,6 +7,7 @@ class CreateAccountModerationNotes < ActiveRecord::Migration[5.1] t.timestamps end + add_foreign_key :account_moderation_notes, :accounts, column: :target_account_id end end diff --git a/db/migrate/20190203180359_create_featured_tags.rb b/db/migrate/20190203180359_create_featured_tags.rb new file mode 100644 index 0000000000..b08410a3a7 --- /dev/null +++ b/db/migrate/20190203180359_create_featured_tags.rb @@ -0,0 +1,12 @@ +class CreateFeaturedTags < ActiveRecord::Migration[5.2] + def change + create_table :featured_tags do |t| + t.references :account, foreign_key: { on_delete: :cascade } + t.references :tag, foreign_key: { on_delete: :cascade } + t.bigint :statuses_count, default: 0, null: false + t.datetime :last_status_at + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 44e00df405..e9fb358f80 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_02_01_012802) do +ActiveRecord::Schema.define(version: 2019_02_03_180359) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -250,6 +250,17 @@ ActiveRecord::Schema.define(version: 2019_02_01_012802) do t.index ["status_id"], name: "index_favourites_on_status_id" end + create_table "featured_tags", force: :cascade do |t| + t.bigint "account_id" + t.bigint "tag_id" + t.bigint "statuses_count", default: 0, null: false + t.datetime "last_status_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id"], name: "index_featured_tags_on_account_id" + t.index ["tag_id"], name: "index_featured_tags_on_tag_id" + end + create_table "follow_requests", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false @@ -708,6 +719,8 @@ ActiveRecord::Schema.define(version: 2019_02_01_012802) do add_foreign_key "custom_filters", "accounts", on_delete: :cascade add_foreign_key "favourites", "accounts", name: "fk_5eb6c2b873", on_delete: :cascade add_foreign_key "favourites", "statuses", name: "fk_b0e856845e", on_delete: :cascade + add_foreign_key "featured_tags", "accounts", on_delete: :cascade + add_foreign_key "featured_tags", "tags", on_delete: :cascade add_foreign_key "follow_requests", "accounts", column: "target_account_id", name: "fk_9291ec025d", on_delete: :cascade add_foreign_key "follow_requests", "accounts", name: "fk_76d644b0e7", on_delete: :cascade add_foreign_key "follows", "accounts", column: "target_account_id", name: "fk_745ca29eac", on_delete: :cascade diff --git a/spec/fabricators/featured_tag_fabricator.rb b/spec/fabricators/featured_tag_fabricator.rb new file mode 100644 index 0000000000..25cbdaac0b --- /dev/null +++ b/spec/fabricators/featured_tag_fabricator.rb @@ -0,0 +1,6 @@ +Fabricator(:featured_tag) do + account + tag + statuses_count 1_337 + last_status_at Time.now.utc +end diff --git a/spec/models/featured_tag_spec.rb b/spec/models/featured_tag_spec.rb new file mode 100644 index 0000000000..07533e0b90 --- /dev/null +++ b/spec/models/featured_tag_spec.rb @@ -0,0 +1,4 @@ +require 'rails_helper' + +RSpec.describe FeaturedTag, type: :model do +end -- GitLab From f86413fce29e70532fbbe5eab9ee8ff053f5552c Mon Sep 17 00:00:00 2001 From: mike castleman <m@mlcastle.net> Date: Mon, 4 Feb 2019 01:45:29 -0200 Subject: [PATCH 012/192] change "finish tutorial" text to "finish toot-orial" (#9905) --- app/javascript/mastodon/features/introduction/index.js | 2 +- app/javascript/mastodon/locales/defaultMessages.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/introduction/index.js b/app/javascript/mastodon/features/introduction/index.js index e712b2f7d4..754477bb99 100644 --- a/app/javascript/mastodon/features/introduction/index.js +++ b/app/javascript/mastodon/features/introduction/index.js @@ -89,7 +89,7 @@ const FrameInteractions = ({ onNext }) => ( </div> <div className='introduction__action'> - <button className='button' onClick={onNext}><FormattedMessage id='introduction.interactions.action' defaultMessage='Finish tutorial!' /></button> + <button className='button' onClick={onNext}><FormattedMessage id='introduction.interactions.action' defaultMessage='Finish toot-orial!' /></button> </div> </div> ); diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 89d4e6bbaa..2dc755e0f5 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -1457,7 +1457,7 @@ "id": "introduction.interactions.favourite.text" }, { - "defaultMessage": "Finish tutorial!", + "defaultMessage": "Finish toot-orial!", "id": "introduction.interactions.action" } ], -- GitLab From c78d64d9c399d58a49aa92fbb2c607bb681ef5a0 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Mon, 4 Feb 2019 12:46:05 +0900 Subject: [PATCH 013/192] Use video filesize limit with gifv (#9924) --- app/models/media_attachment.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index 2e0f98cc6f..a57ba0b2ea 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -87,8 +87,8 @@ class MediaAttachment < ApplicationRecord convert_options: { all: '-quality 90 -strip' } validates_attachment_content_type :file, content_type: IMAGE_MIME_TYPES + VIDEO_MIME_TYPES - validates_attachment_size :file, less_than: IMAGE_LIMIT, unless: :video? - validates_attachment_size :file, less_than: VIDEO_LIMIT, if: :video? + validates_attachment_size :file, less_than: IMAGE_LIMIT, unless: :video_or_gifv? + validates_attachment_size :file, less_than: VIDEO_LIMIT, if: :video_or_gifv? remotable_attachment :file, VIDEO_LIMIT include Attachmentable @@ -111,6 +111,10 @@ class MediaAttachment < ApplicationRecord file.blank? && remote_url.present? end + def video_or_gifv? + video? || gifv? + end + def to_param shortcode end -- GitLab From 88f35f339d19eed87bb3b55ebd5ed2303726aa78 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Tue, 5 Feb 2019 06:25:42 +0900 Subject: [PATCH 014/192] Fix authorized applications list page design (#9969) --- app/controllers/oauth/authorized_applications_controller.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb index 0c28d194bc..f3d2353669 100644 --- a/app/controllers/oauth/authorized_applications_controller.rb +++ b/app/controllers/oauth/authorized_applications_controller.rb @@ -5,6 +5,7 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio before_action :store_current_location before_action :authenticate_resource_owner! + before_action :set_body_classes include Localized @@ -15,6 +16,10 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio private + def set_body_classes + @body_classes = 'admin' + end + def store_current_location store_location_for(:user, request.url) end -- GitLab From e02a13f64e5c2c93fa73a67a4ce32a7d1df24760 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Tue, 5 Feb 2019 07:14:57 +0900 Subject: [PATCH 015/192] Fix not showing custom emojis in share page emoji picker (#9970) --- app/javascript/mastodon/containers/compose_container.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/javascript/mastodon/containers/compose_container.js b/app/javascript/mastodon/containers/compose_container.js index 5ee1d2f141..7bc7bbaa4d 100644 --- a/app/javascript/mastodon/containers/compose_container.js +++ b/app/javascript/mastodon/containers/compose_container.js @@ -7,6 +7,7 @@ import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from '../locales'; import Compose from '../features/standalone/compose'; import initialState from '../initial_state'; +import { fetchCustomEmojis } from '../actions/custom_emojis'; const { localeData, messages } = getLocale(); addLocaleData(localeData); @@ -17,6 +18,8 @@ if (initialState) { store.dispatch(hydrateStore(initialState)); } +store.dispatch(fetchCustomEmojis()); + export default class TimelineContainer extends React.PureComponent { static propTypes = { -- GitLab From 2557cb2f9550f7ab0cd6e6f392642b5249589ed8 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Tue, 5 Feb 2019 00:27:18 +0100 Subject: [PATCH 016/192] Fix pinned statuses being shown in a featured hashtag (#9971) --- app/controllers/accounts_controller.rb | 2 +- app/controllers/settings/featured_tags_controller.rb | 2 +- app/views/accounts/show.html.haml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 6e3a23073b..cbf1a8287b 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -52,7 +52,7 @@ class AccountsController < ApplicationController private def show_pinned_statuses? - [replies_requested?, media_requested?, params[:max_id].present?, params[:min_id].present?].none? + [replies_requested?, media_requested?, tag_requested?, params[:max_id].present?, params[:min_id].present?].none? end def filtered_statuses diff --git a/app/controllers/settings/featured_tags_controller.rb b/app/controllers/settings/featured_tags_controller.rb index 19815e4168..3a3241425d 100644 --- a/app/controllers/settings/featured_tags_controller.rb +++ b/app/controllers/settings/featured_tags_controller.rb @@ -38,7 +38,7 @@ class Settings::FeaturedTagsController < Settings::BaseController end def set_featured_tags - @featured_tags = current_account.featured_tags.reject(&:new_record?) + @featured_tags = current_account.featured_tags.order(statuses_count: :desc).reject(&:new_record?) end def set_most_used_tags diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml index 23a595205c..0da69728f3 100644 --- a/app/views/accounts/show.html.haml +++ b/app/views/accounts/show.html.haml @@ -63,7 +63,7 @@ - @endorsed_accounts.each do |account| = account_link_to account - - @account.featured_tags.each do |featured_tag| + - @account.featured_tags.order(statuses_count: :desc).each do |featured_tag| .directory__tag{ class: params[:tag] == featured_tag.name ? 'active' : nil } = link_to short_account_tag_path(@account, featured_tag.tag) do %h4 -- GitLab From 76d41475a89ebdd19b08b9e8a81e5e3c7dbd4001 Mon Sep 17 00:00:00 2001 From: trwnh <a@trwnh.com> Date: Mon, 4 Feb 2019 21:46:18 -0600 Subject: [PATCH 017/192] [UI] Fix whitespace being applied to div instead of p (#9968) * fix large line breaks * fix ascii art posts --- app/javascript/styles/mastodon/components.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 10e0946481..32fd773859 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -638,7 +638,6 @@ font-weight: 400; overflow: hidden; text-overflow: ellipsis; - white-space: pre-wrap; padding-top: 2px; color: $primary-text-color; @@ -662,6 +661,7 @@ p { margin-bottom: 20px; + white-space: pre-wrap; &:last-child { margin-bottom: 0; -- GitLab From 5c873a4ed7d4abb8c684e3a8ed3cdf9383e77be5 Mon Sep 17 00:00:00 2001 From: ashleyhull-versent <ashley.hull@versent.com.au> Date: Tue, 5 Feb 2019 15:11:51 +1100 Subject: [PATCH 018/192] Update Dockerfile (#9965) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1909053375..1e60045c01 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ FROM node:8.15-alpine as node -FROM ruby:2.6-alpine3.8 +FROM ruby:2.6-alpine3.9 LABEL maintainer="https://github.com/tootsuite/mastodon" \ description="Your self-hosted, globally interconnected microblogging community" -- GitLab From 5bffb53a763531f6ed1d8e87bacede3ff0938086 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda <noel.yoshiba@gmail.com> Date: Tue, 5 Feb 2019 23:11:11 +0900 Subject: [PATCH 019/192] Fix it as tagged_request of accounts_controller is not addressable_uri (#9976) --- app/controllers/accounts_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index cbf1a8287b..cad2ecf3fe 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -116,7 +116,7 @@ class AccountsController < ApplicationController end def tag_requested? - request.path.ends_with?("/tagged/#{params[:tag]}") + request.path.ends_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize) end def filtered_status_page(params) -- GitLab From 1ac9a3f4bb8d1fb4bf521f9452ebc839d44315ba Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Tue, 5 Feb 2019 15:11:35 +0100 Subject: [PATCH 020/192] =?UTF-8?q?Hide=20misleading=20=E2=80=9CYou=20will?= =?UTF-8?q?=20be=20sent=20a=20confirmation=20e-mail=E2=80=9D=20hint=20from?= =?UTF-8?q?=20admin=20view=20(#9973)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks @wryk for noticing this issue. --- app/views/admin/change_emails/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admin/change_emails/show.html.haml b/app/views/admin/change_emails/show.html.haml index 6febef9b1a..6ff0d785ed 100644 --- a/app/views/admin/change_emails/show.html.haml +++ b/app/views/admin/change_emails/show.html.haml @@ -3,7 +3,7 @@ = simple_form_for @user, url: admin_account_change_email_path(@account.id) do |f| .fields-group - = f.input :email, wrapper: :with_label, disabled: true, label: t('admin.accounts.change_email.current_email') + = f.input :email, wrapper: :with_label, hint: false, disabled: true, label: t('admin.accounts.change_email.current_email') .fields-group = f.input :unconfirmed_email, wrapper: :with_label, label: t('admin.accounts.change_email.new_email') -- GitLab From 11d150285302211def8015d0bc1b825f9f7e0e23 Mon Sep 17 00:00:00 2001 From: J0WI <J0WI@users.noreply.github.com> Date: Tue, 5 Feb 2019 15:12:45 +0100 Subject: [PATCH 021/192] Replace LibreSSL by OpenSSL (#9975) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1e60045c01..184e25ca2c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,7 +29,7 @@ RUN apk -U upgrade \ build-base \ icu-dev \ libidn-dev \ - libressl \ + openssl \ libtool \ libxml2-dev \ libxslt-dev \ -- GitLab From 26c1aba658d04617caf33783306b4504ca41f63c Mon Sep 17 00:00:00 2001 From: J0WI <J0WI@users.noreply.github.com> Date: Tue, 5 Feb 2019 15:13:19 +0100 Subject: [PATCH 022/192] Do not use apk cache and upgrade (#9966) --- Dockerfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 184e25ca2c..2b15381ec5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,8 +24,7 @@ COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules COPY --from=node /usr/local/bin/npm /usr/local/bin/npm COPY --from=node /opt/yarn-* /opt/yarn -RUN apk -U upgrade \ - && apk add -t build-dependencies \ +RUN apk add --no-cache -t build-dependencies \ build-base \ icu-dev \ libidn-dev \ @@ -36,7 +35,7 @@ RUN apk -U upgrade \ postgresql-dev \ protobuf-dev \ python \ - && apk add \ + && apk add --no-cache \ ca-certificates \ ffmpeg \ file \ @@ -64,7 +63,7 @@ RUN apk -U upgrade \ && make install \ && libtool --finish /usr/local/lib \ && cd /mastodon \ - && rm -rf /tmp/* /var/cache/apk/* + && rm -rf /tmp/* COPY Gemfile Gemfile.lock package.json yarn.lock .yarnclean /mastodon/ -- GitLab From 3eb17a3beafbfa998f4d09f6d3310658195638d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= <me@m4sk.in> Date: Tue, 5 Feb 2019 15:13:34 +0100 Subject: [PATCH 023/192] =?UTF-8?q?i18n:=20Update=20Polish=20translation?= =?UTF-8?q?=20=F0=9F=87=B5=20(#9974)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcin MikoÅ‚ajczak <me@m4sk.in> --- app/javascript/mastodon/locales/pl.json | 1 + config/locales/pl.yml | 11 +++++++++++ config/locales/simple_form.pl.yml | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 0d16f7cfc0..a1cda6c2d4 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -342,6 +342,7 @@ "ui.beforeunload": "Utracisz tworzony wpis, jeżeli opuÅ›cisz Mastodona.", "upload_area.title": "PrzeciÄ…gnij i upuść aby wysÅ‚ać", "upload_button.label": "Dodaj zawartość multimedialnÄ… (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "Przekroczono limit plików do wysÅ‚ania.", "upload_form.description": "Wprowadź opis dla niewidomych i niedowidzÄ…cych", "upload_form.focus": "Dopasuj podglÄ…d", "upload_form.undo": "UsuÅ„", diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 188f5c22b9..e110db50de 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -602,6 +602,10 @@ pl: lists: Listy mutes: Wyciszeni storage: UrzÄ…dzenie przechowujÄ…ce dane + featured_tags: + add_new: Dodaj nowy + errors: + limit: Już przekroczyÅ‚eÅ›(-aÅ›) maksymalnÄ… liczbÄ™ wyróżnionych hashtagów filters: contexts: home: Strona główna @@ -646,10 +650,16 @@ pl: one: CoÅ› jest wciąż nie tak! Przyjrzyj siÄ™ poniższemu bÅ‚Ä™dowi other: CoÅ› jest wciąż nie tak! Przejrzyj poniższe bÅ‚Ä™dy (%{count}) imports: + modes: + merge: PoÅ‚Ä…cz + merge_long: Zachowaj obecne wpisy i dodaj nowe + overwrite: Nadpisz + overwrite_long: ZastÄ…p obecne wpisy nowymi preface: Możesz zaimportować pewne dane (np. lista kont, które Å›ledzisz lub blokujesz) do swojego konta na tym serwerze, korzystajÄ…c z danych wyeksportowanych z innego serwera. success: Twoje dane zostaÅ‚y zaÅ‚adowane i zostanÄ… niebawem przetworzone types: blocking: Lista blokowanych + domain_blocking: Lista zablokowanych domen following: Lista Å›ledzonych muting: Lista wyciszonych upload: ZaÅ‚aduj @@ -825,6 +835,7 @@ pl: development: Tworzenie aplikacji edit_profile: Edytuj profil export: Eksportowanie danych + featured_tags: Wyróżnione hashtagi followers: Autoryzowani Å›ledzÄ…cy import: Importowanie danych migrate: Migracja konta diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index bbc55e8a91..0ab045068e 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -33,9 +33,12 @@ pl: setting_display_media_show_all: Zawsze pokazuj zawartość multimedialnÄ… jako wrażliwÄ… setting_hide_network: Informacje o tym, kto CiÄ™ Å›ledzi i kogo Å›ledzisz nie bÄ™dÄ… widoczne setting_noindex: WpÅ‚ywa na widoczność strony profilu i Twoich wpisów + setting_show_application: W informacjach o wpisie bÄ™dzie widoczna informacja o aplikacji, z której zostaÅ‚ wysÅ‚any setting_theme: Zmienia wyglÄ…d Mastodona po zalogowaniu z dowolnego urzÄ…dzenia. username: Twoja nazwa użytkownika bÄ™dzie niepowtarzalna na %{domain} whole_word: JeÅ›li sÅ‚owo lub fraza skÅ‚ada siÄ™ jedynie z liter lub cyfr, filtr bÄ™dzie zastosowany tylko do peÅ‚nych wystÄ…pieÅ„ + featured_tag: + name: 'Sugerujemy użycie jednego z nastÄ™pujÄ…cych:' imports: data: Plik CSV wyeksportowany z innej instancji Mastodona sessions: @@ -101,6 +104,7 @@ pl: setting_hide_network: Ukryj swojÄ… sieć setting_noindex: Nie indeksuj mojego profilu w wyszukiwarkach internetowych setting_reduce_motion: Ogranicz ruch w animacjach + setting_show_application: Informuj o aplikacji z której wysÅ‚ano wpisy setting_system_font_ui: Używaj domyÅ›lnej czcionki systemu setting_theme: Motyw strony setting_unfollow_modal: Pytaj o potwierdzenie przed cofniÄ™ciem Å›ledzenia @@ -109,6 +113,8 @@ pl: username: Nazwa użytkownika username_or_email: Nazwa użytkownika lub adres e-mail whole_word: CaÅ‚e sÅ‚owo + featured_tag: + name: Hashtag interactions: must_be_follower: Nie wyÅ›wietlaj powiadomieÅ„ od osób, które CiÄ™ nie Å›ledzÄ… must_be_following: Nie wyÅ›wietlaj powiadomieÅ„ od osób, których nie Å›ledzisz -- GitLab From 46e806cd2f14a5e45d66b4c23040855202818984 Mon Sep 17 00:00:00 2001 From: mayaeh <mayaeh@marimo-net.org> Date: Wed, 6 Feb 2019 03:11:24 +0900 Subject: [PATCH 024/192] Rename from instance to server. (#9938) --- .../features/getting_started/index.js | 2 +- .../features/public_timeline/index.js | 2 +- .../features/ui/components/report_modal.js | 2 +- .../mastodon/locales/defaultMessages.json | 6 +-- app/javascript/mastodon/locales/en.json | 6 +-- app/javascript/mastodon/locales/ja.json | 8 ++-- config/locales/devise.en.yml | 6 +-- config/locales/devise.ja.yml | 6 +-- config/locales/en.yml | 34 ++++++------- config/locales/ja.yml | 48 +++++++++---------- config/locales/simple_form.en.yml | 2 +- config/locales/simple_form.ja.yml | 2 +- 12 files changed, 62 insertions(+), 62 deletions(-) diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js index e277a73c7a..e1f84de276 100644 --- a/app/javascript/mastodon/features/getting_started/index.js +++ b/app/javascript/mastodon/features/getting_started/index.js @@ -160,7 +160,7 @@ class GettingStarted extends ImmutablePureComponent { {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>} {multiColumn && <li><Link to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link> · </li>} <li><a href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a> · </li> - <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this instance' /></a> · </li> + <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li> <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li> <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li> <li><a href='/settings/applications' target='_blank'><FormattedMessage id='getting_started.developers' defaultMessage='Developers' /></a> · </li> diff --git a/app/javascript/mastodon/features/public_timeline/index.js b/app/javascript/mastodon/features/public_timeline/index.js index d640033ebb..2b7d9c56f9 100644 --- a/app/javascript/mastodon/features/public_timeline/index.js +++ b/app/javascript/mastodon/features/public_timeline/index.js @@ -124,7 +124,7 @@ class PublicTimeline extends React.PureComponent { onLoadMore={this.handleLoadMore} trackScroll={!pinned} scrollKey={`public_timeline-${columnId}`} - emptyMessage={<FormattedMessage id='empty_column.public' defaultMessage='There is nothing here! Write something publicly, or manually follow users from other instances to fill it up' />} + emptyMessage={<FormattedMessage id='empty_column.public' defaultMessage='There is nothing here! Write something publicly, or manually follow users from other servers to fill it up' />} shouldUpdateScroll={shouldUpdateScroll} /> </Column> diff --git a/app/javascript/mastodon/features/ui/components/report_modal.js b/app/javascript/mastodon/features/ui/components/report_modal.js index bc6b18664a..2e41f784dd 100644 --- a/app/javascript/mastodon/features/ui/components/report_modal.js +++ b/app/javascript/mastodon/features/ui/components/report_modal.js @@ -97,7 +97,7 @@ class ReportModal extends ImmutablePureComponent { <div className='report-modal__container'> <div className='report-modal__comment'> - <p><FormattedMessage id='report.hint' defaultMessage='The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:' /></p> + <p><FormattedMessage id='report.hint' defaultMessage='The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:' /></p> <textarea className='setting-text light' diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 2dc755e0f5..5df071839a 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -1284,7 +1284,7 @@ "id": "getting_started.security" }, { - "defaultMessage": "About this instance", + "defaultMessage": "About this server", "id": "navigation_bar.info" }, { @@ -1837,7 +1837,7 @@ "id": "column.public" }, { - "defaultMessage": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", + "defaultMessage": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", "id": "empty_column.public" } ], @@ -2184,7 +2184,7 @@ "id": "report.target" }, { - "defaultMessage": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:", + "defaultMessage": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", "id": "report.hint" }, { diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index e840b17d84..03af57ba80 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -128,7 +128,7 @@ "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", "empty_column.mutes": "You haven't muted any users yet.", "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", - "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", "follow_request.authorize": "Authorize", "follow_request.reject": "Reject", "getting_started.developers": "Developers", @@ -224,7 +224,7 @@ "navigation_bar.favourites": "Favourites", "navigation_bar.filters": "Muted words", "navigation_bar.follow_requests": "Follow requests", - "navigation_bar.info": "About this instance", + "navigation_bar.info": "About this server", "navigation_bar.keyboard_shortcuts": "Hotkeys", "navigation_bar.lists": "Lists", "navigation_bar.logout": "Logout", @@ -276,7 +276,7 @@ "reply_indicator.cancel": "Cancel", "report.forward": "Forward to {target}", "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", - "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:", + "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", "report.placeholder": "Additional comments", "report.submit": "Submit", "report.target": "Reporting {target}", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index cd4addd686..81b21a94a4 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -128,7 +128,7 @@ "empty_column.lists": "ã¾ã リストãŒã‚ã‚Šã¾ã›ã‚“。リストを作るã¨ã“ã“ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚", "empty_column.mutes": "ã¾ã 誰もミュートã—ã¦ã„ã¾ã›ã‚“。", "empty_column.notifications": "ã¾ã 通知ãŒã‚ã‚Šã¾ã›ã‚“。他ã®äººã¨ãµã‚Œåˆã£ã¦ä¼šè©±ã‚’始ã‚ã¾ã—ょã†ã€‚", - "empty_column.public": "ã“ã“ã«ã¯ã¾ã 何もã‚ã‚Šã¾ã›ã‚“ï¼ å…¬é–‹ã§ä½•ã‹ã‚’投稿ã—ãŸã‚Šã€ä»–ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フォãƒãƒ¼ã—ãŸã‚Šã—ã¦ã„ã£ã±ã„ã«ã—ã¾ã—ょã†", + "empty_column.public": "ã“ã“ã«ã¯ã¾ã 何もã‚ã‚Šã¾ã›ã‚“ï¼ å…¬é–‹ã§ä½•ã‹ã‚’投稿ã—ãŸã‚Šã€ä»–ã®ã‚µãƒ¼ãƒãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フォãƒãƒ¼ã—ãŸã‚Šã—ã¦ã„ã£ã±ã„ã«ã—ã¾ã—ょã†", "follow_request.authorize": "許å¯", "follow_request.reject": "æ‹’å¦", "getting_started.developers": "開発", @@ -224,7 +224,7 @@ "navigation_bar.favourites": "ãŠæ°—ã«å…¥ã‚Š", "navigation_bar.filters": "フィルターè¨å®š", "navigation_bar.follow_requests": "フォãƒãƒ¼ãƒªã‚¯ã‚¨ã‚¹ãƒˆ", - "navigation_bar.info": "ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ã¤ã„ã¦", + "navigation_bar.info": "ã“ã®ã‚µãƒ¼ãƒãƒ¼ã«ã¤ã„ã¦", "navigation_bar.keyboard_shortcuts": "ホットã‚ー", "navigation_bar.lists": "リスト", "navigation_bar.logout": "ãƒã‚°ã‚¢ã‚¦ãƒˆ", @@ -275,8 +275,8 @@ "relative_time.seconds": "{number}秒å‰", "reply_indicator.cancel": "ã‚ャンセル", "report.forward": "{target} ã«è»¢é€ã™ã‚‹", - "report.forward_hint": "ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯åˆ¥ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«æ‰€å±žã—ã¦ã„ã¾ã™ã€‚é€šå ±å†…å®¹ã‚’åŒ¿åã§è»¢é€ã—ã¾ã™ã‹ï¼Ÿ", - "report.hint": "é€šå ±å†…å®¹ã¯ã‚ãªãŸã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ãƒ¼ã¸é€ä¿¡ã•ã‚Œã¾ã™ã€‚é€šå ±ç†ç”±ã‚’入力ã—ã¦ãã ã•ã„。:", + "report.forward_hint": "ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯åˆ¥ã®ã‚µãƒ¼ãƒãƒ¼ã«æ‰€å±žã—ã¦ã„ã¾ã™ã€‚é€šå ±å†…å®¹ã‚’åŒ¿åã§è»¢é€ã—ã¾ã™ã‹ï¼Ÿ", + "report.hint": "é€šå ±å†…å®¹ã¯ã‚ãªãŸã®ã‚µãƒ¼ãƒãƒ¼ã®ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ãƒ¼ã¸é€ä¿¡ã•ã‚Œã¾ã™ã€‚é€šå ±ç†ç”±ã‚’入力ã—ã¦ãã ã•ã„。:", "report.placeholder": "è¿½åŠ ã‚³ãƒ¡ãƒ³ãƒˆ", "report.submit": "é€šå ±ã™ã‚‹", "report.target": "{target}ã•ã‚“ã‚’é€šå ±ã™ã‚‹", diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index bd0642b251..726c0504ef 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -20,17 +20,17 @@ en: action: Verify email address action_with_app: Confirm and return to %{app} explanation: You have created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email. - extra_html: Please also check out <a href="%{terms_path}">the rules of the instance</a> and <a href="%{policy_path}">our terms of service</a>. + extra_html: Please also check out <a href="%{terms_path}">the rules of the server</a> and <a href="%{policy_path}">our terms of service</a>. subject: 'Mastodon: Confirmation instructions for %{instance}' title: Verify email address email_changed: explanation: 'The email address for your account is being changed to:' - extra: If you did not change your email, it is likely that someone has gained access to your account. Please change your password immediately or contact the instance admin if you're locked out of your account. + extra: If you did not change your email, it is likely that someone has gained access to your account. Please change your password immediately or contact the server admin if you're locked out of your account. subject: 'Mastodon: Email changed' title: New email address password_change: explanation: The password for your account has been changed. - extra: If you did not change your password, it is likely that someone has gained access to your account. Please change your password immediately or contact the instance admin if you're locked out of your account. + extra: If you did not change your password, it is likely that someone has gained access to your account. Please change your password immediately or contact the server admin if you're locked out of your account. subject: 'Mastodon: Password changed' title: Password changed reconfirmation_instructions: diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml index cae76d4938..bd2bb71bb3 100644 --- a/config/locales/devise.ja.yml +++ b/config/locales/devise.ja.yml @@ -20,17 +20,17 @@ ja: action: メールアドレスã®ç¢ºèª action_with_app: 確èªã— %{app} ã«æˆ»ã‚‹ explanation: ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§%{host}ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã—ã¾ã—ãŸã€‚有効ã«ã™ã‚‹ã¾ã§ã‚ã¨ä¸€æ©ã§ã™ã€‚ã‚‚ã—心当ãŸã‚ŠãŒãªã„å ´åˆã€ç”³ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã“ã®ãƒ¡ãƒ¼ãƒ«ã‚’無視ã—ã¦ãã ã•ã„。 - extra_html: ã¾ãŸ <a href="%{terms_path}">インスタンスã®ãƒ«ãƒ¼ãƒ«</a> 㨠<a href="%{policy_path}">利用è¦ç´„</a> ã‚‚ãŠèªã¿ãã ã•ã„。 + extra_html: ã¾ãŸ <a href="%{terms_path}">サーãƒãƒ¼ã®ãƒ«ãƒ¼ãƒ«</a> 㨠<a href="%{policy_path}">利用è¦ç´„</a> ã‚‚ãŠèªã¿ãã ã•ã„。 subject: 'Mastodon: メールアドレスã®ç¢ºèª %{instance}' title: メールアドレスã®ç¢ºèª email_changed: explanation: 'アカウントã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«å¤‰æ›´ã•ã‚Œã¾ã™:' - extra: メールアドレスã®å¤‰æ›´ã‚’è¡Œã£ã¦ã„ãªã„å ´åˆã€ä»–ã®èª°ã‹ãŒã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã™ãã«ãƒ‘スワードを変更ã™ã‚‹ã‹ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。 + extra: メールアドレスã®å¤‰æ›´ã‚’è¡Œã£ã¦ã„ãªã„å ´åˆã€ä»–ã®èª°ã‹ãŒã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã™ãã«ãƒ‘スワードを変更ã™ã‚‹ã‹ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã‚µãƒ¼ãƒãƒ¼ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。 subject: 'Mastodon: メールアドレスã®å¤‰æ›´' title: æ–°ã—ã„メールアドレス password_change: explanation: パスワードãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚ - extra: パスワードã®å¤‰æ›´ã‚’è¡Œã£ã¦ã„ãªã„å ´åˆã€ä»–ã®èª°ã‹ãŒã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã™ãã«ãƒ‘スワードを変更ã™ã‚‹ã‹ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。 + extra: パスワードã®å¤‰æ›´ã‚’è¡Œã£ã¦ã„ãªã„å ´åˆã€ä»–ã®èª°ã‹ãŒã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã™ãã«ãƒ‘スワードを変更ã™ã‚‹ã‹ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã‚µãƒ¼ãƒãƒ¼ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。 subject: 'Mastodon: パスワードãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ' title: パスワードã®å¤‰æ›´ reconfirmation_instructions: diff --git a/config/locales/en.yml b/config/locales/en.yml index c92fc781c8..dacf16d563 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -7,7 +7,7 @@ en: administered_by: 'Administered by:' api: API apps: Mobile apps - closed_registrations: Registrations are currently closed on this instance. However! You can find a different instance to make an account on and get access to the very same network from there. + closed_registrations: Registrations are currently closed on this server. However! You can find a different server to make an account on and get access to the very same network from there. contact: Contact contact_missing: Not set contact_unavailable: N/A @@ -27,7 +27,7 @@ en: generic_description: "%{domain} is one server in the network" hosted_on: Mastodon hosted on %{domain} learn_more: Learn more - other_instances: Instance list + other_instances: Server list privacy_policy: Privacy policy source_code: Source code status_count_after: @@ -386,14 +386,14 @@ en: desc_html: Modify the look with CSS loaded on every page title: Custom CSS hero: - desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to instance thumbnail + desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to server thumbnail title: Hero image mascot: desc_html: Displayed on multiple pages. At least 293×205px recommended. When not set, falls back to default mascot title: Mascot image peers_api_enabled: - desc_html: Domain names this instance has encountered in the fediverse - title: Publish list of discovered instances + desc_html: Domain names this server has encountered in the fediverse + title: Publish list of discovered servers preview_sensitive_media: desc_html: Link previews on other websites will display a thumbnail even if the media is marked as sensitive title: Show sensitive media in OpenGraph previews @@ -421,20 +421,20 @@ en: title: Show staff badge site_description: desc_html: Introductory paragraph on the frontpage. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <code><a></code> and <code><em></code>. - title: Instance description + title: Server description site_description_extended: - desc_html: A good place for your code of conduct, rules, guidelines and other things that set your instance apart. You can use HTML tags + desc_html: A good place for your code of conduct, rules, guidelines and other things that set your server apart. You can use HTML tags title: Custom extended information site_short_description: - desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph. If empty, defaults to instance description. - title: Short instance description + desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph. If empty, defaults to server description. + title: Short server description site_terms: desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags title: Custom terms of service - site_title: Instance name + site_title: Server name thumbnail: desc_html: Used for previews via OpenGraph and API. 1200x630px recommended - title: Instance thumbnail + title: Server thumbnail timeline_preview: desc_html: Display public timeline on landing page title: Timeline preview @@ -495,7 +495,7 @@ en: warning: Be very careful with this data. Never share it with anyone! your_token: Your access token auth: - agreement_html: By clicking "Sign up" below you agree to follow <a href="%{rules_path}">the rules of the instance</a> and <a href="%{terms_path}">our terms of service</a>. + agreement_html: By clicking "Sign up" below you agree to follow <a href="%{rules_path}">the rules of the server</a> and <a href="%{terms_path}">our terms of service</a>. change_password: Password confirm_email: Confirm email delete_account: Delete account @@ -549,7 +549,7 @@ en: description_html: This will <strong>permanently, irreversibly</strong> remove content from your account and deactivate it. Your username will remain reserved to prevent future impersonations. proceed: Delete account success_msg: Your account was successfully deleted - warning_html: Only deletion of content from this particular instance is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases. + warning_html: Only deletion of content from this particular server is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases. warning_title: Disseminated content availability directories: directory: Profile directory @@ -610,7 +610,7 @@ en: title: Add new filter followers: domain: Domain - explanation_html: If you want to ensure the privacy of your statuses, you must be aware of who is following you. <strong>Your private statuses are delivered to all instances where you have followers</strong>. You may wish to review them, and remove followers if you do not trust your privacy to be respected by the staff or software of those instances. + explanation_html: If you want to ensure the privacy of your statuses, you must be aware of who is following you. <strong>Your private statuses are delivered to all servers where you have followers</strong>. You may wish to review them, and remove followers if you do not trust your privacy to be respected by the staff or software of those servers. followers_count: Number of followers lock_link: Lock your account purge: Remove from followers @@ -637,7 +637,7 @@ en: merge_long: Keep existing records and add new ones overwrite: Overwrite overwrite_long: Replace current records with the new ones - preface: You can import data that you have exported from another instance, such as a list of the people you are following or blocking. + preface: You can import data that you have exported from another server, such as a list of the people you are following or blocking. success: Your data was successfully uploaded and will now be processed in due time types: blocking: Blocking list @@ -663,7 +663,7 @@ en: one: 1 use other: "%{count} uses" max_uses_prompt: No limit - prompt: Generate and share links with others to grant access to this instance + prompt: Generate and share links with others to grant access to this server table: expires_at: Expires uses: Uses @@ -991,7 +991,7 @@ en: final_action: Start posting final_step: 'Start posting! Even without followers your public messages may be seen by others, for example on the local timeline and in hashtags. You may want to introduce yourself on the #introductions hashtag.' full_handle: Your full handle - full_handle_hint: This is what you would tell your friends so they can message or follow you from another instance. + full_handle_hint: This is what you would tell your friends so they can message or follow you from another server. review_preferences_action: Change preferences review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay. subject: Welcome to Mastodon diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 7ccb2f21c5..07458d07dd 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -7,7 +7,7 @@ ja: administered_by: '管ç†è€…:' api: API apps: アプリ - closed_registrations: ç¾åœ¨ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ã®æ–°è¦ç™»éŒ²ã¯å—ã‘付ã‘ã¦ã„ã¾ã›ã‚“。ã—ã‹ã—ã€ä»–ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã—ã¦ã‚‚å…¨ãåŒã˜ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + closed_registrations: ç¾åœ¨ã“ã®ã‚µãƒ¼ãƒãƒ¼ã§ã®æ–°è¦ç™»éŒ²ã¯å—ã‘付ã‘ã¦ã„ã¾ã›ã‚“。ã—ã‹ã—ã€ä»–ã®ã‚µãƒ¼ãƒãƒ¼ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã—ã¦ã‚‚å…¨ãåŒã˜ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ contact: 連絡先 contact_missing: 未è¨å®š contact_unavailable: N/A @@ -24,10 +24,10 @@ ja: real_conversation_title: 本当ã®ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã®ãŸã‚ã« within_reach_body: デベãƒãƒƒãƒ‘ーフレンドリー㪠API ã«ã‚ˆã‚Šå®Ÿç¾ã•ã‚ŒãŸã€iOS ã‚„ Androidã€ãã®ä»–様々ãªãƒ—ラットフォームã®ãŸã‚ã®ã‚¢ãƒ—リã§ã©ã“ã§ã‚‚å‹äººã¨ã‚„ã‚Šã¨ã‚Šã§ãã¾ã™ã€‚ within_reach_title: ã„ã¤ã§ã‚‚身近㫠- generic_description: "%{domain} ã¯ã€Mastodon インスタンスã®ä¸€ã¤ã§ã™" + generic_description: "%{domain} ã¯ã€Mastodon サーãƒãƒ¼ã®ä¸€ã¤ã§ã™" hosted_on: Mastodon hosted on %{domain} learn_more: ã‚‚ã£ã¨è©³ã—ã - other_instances: ä»–ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ + other_instances: ä»–ã®ã‚µãƒ¼ãƒãƒ¼ privacy_policy: プライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼ source_code: ソースコード status_count_after: @@ -310,7 +310,7 @@ ja: all: ã™ã¹ã¦ limited: 制é™ã‚ã‚Š title: モデレーション - title: 既知ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ + title: 既知ã®ã‚µãƒ¼ãƒãƒ¼ total_blocked_by_us: ブãƒãƒƒã‚¯åˆè¨ˆ total_followed_by_them: 被フォãƒãƒ¼åˆè¨ˆ total_followed_by_us: フォãƒãƒ¼åˆè¨ˆ @@ -392,8 +392,8 @@ ja: desc_html: 複数ã®ãƒšãƒ¼ã‚¸ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚サイズã¯293x205px以上推奨ã§ã™ã€‚未è¨å®šã®å ´åˆã€æ¨™æº–ã®ãƒžã‚¹ã‚³ãƒƒãƒˆãŒä½¿ç”¨ã•ã‚Œã¾ã™ title: マスコットイメージ peers_api_enabled: - desc_html: 連åˆå†…ã§ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒéé‡ã—ãŸãƒ‰ãƒ¡ã‚¤ãƒ³ã®åå‰ - title: 接続ã—ã¦ã„るインスタンスã®ãƒªã‚¹ãƒˆã‚’公開ã™ã‚‹ + desc_html: 連åˆå†…ã§ã“ã®ã‚µãƒ¼ãƒãƒ¼ãŒéé‡ã—ãŸãƒ‰ãƒ¡ã‚¤ãƒ³ã®åå‰ + title: 接続ã—ã¦ã„るサーãƒãƒ¼ã®ãƒªã‚¹ãƒˆã‚’公開ã™ã‚‹ preview_sensitive_media: desc_html: ä»–ã®ã‚¦ã‚§ãƒ–サイトã«ãƒªãƒ³ã‚¯ã‚’è²¼ã£ãŸéš›ã€ãƒ¡ãƒ‡ã‚£ã‚¢ãŒé–²è¦§æ³¨æ„ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¦ã‚‚サムãƒã‚¤ãƒ«ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ title: OpenGraphã«ã‚ˆã‚‹ãƒ—レビューã§é–²è¦§æ³¨æ„ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚‚表示ã™ã‚‹ @@ -420,21 +420,21 @@ ja: desc_html: ユーザーページã«ã‚¹ã‚¿ãƒƒãƒ•ã®ãƒãƒƒã‚¸ã‚’表示ã—ã¾ã™ title: スタッフãƒãƒƒã‚¸ã‚’表示ã™ã‚‹ site_description: - desc_html: フãƒãƒ³ãƒˆãƒšãƒ¼ã‚¸ã¸ã®è¡¨ç¤ºã«ä½¿ç”¨ã•ã‚Œã‚‹ç´¹ä»‹æ–‡ã§ã™ã€‚ã“ã®Mastodonインスタンスを特徴付ã‘ã‚‹ã“ã¨ã‚„ãã®ä»–é‡è¦ãªã“ã¨ã‚’記述ã—ã¦ãã ã•ã„。HTMLã‚¿ã‚°ã€ç‰¹ã«<code><a></code> 㨠<code><em></code>ãŒä½¿ãˆã¾ã™ã€‚ - title: インスタンスã®èª¬æ˜Ž + desc_html: フãƒãƒ³ãƒˆãƒšãƒ¼ã‚¸ã¸ã®è¡¨ç¤ºã«ä½¿ç”¨ã•ã‚Œã‚‹ç´¹ä»‹æ–‡ã§ã™ã€‚ã“ã®Mastodonサーãƒãƒ¼ã‚’特徴付ã‘ã‚‹ã“ã¨ã‚„ãã®ä»–é‡è¦ãªã“ã¨ã‚’記述ã—ã¦ãã ã•ã„。HTMLã‚¿ã‚°ã€ç‰¹ã«<code><a></code> 㨠<code><em></code>ãŒä½¿ãˆã¾ã™ã€‚ + title: サーãƒãƒ¼ã®èª¬æ˜Ž site_description_extended: - desc_html: ã‚ãªãŸã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ãŠã‘る行動è¦ç¯„やルールã€ã‚¬ã‚¤ãƒ‰ãƒ©ã‚¤ãƒ³ã€ãã®ã»ã‹ã®è¨˜è¿°ã‚’ã™ã‚‹éš›ã«æœ€é©ãªå ´æ‰€ã§ã™ã€‚HTMLã‚¿ã‚°ãŒä½¿ãˆã¾ã™ + desc_html: ã‚ãªãŸã®ã‚µãƒ¼ãƒãƒ¼ã«ãŠã‘る行動è¦ç¯„やルールã€ã‚¬ã‚¤ãƒ‰ãƒ©ã‚¤ãƒ³ã€ãã®ã»ã‹ã®è¨˜è¿°ã‚’ã™ã‚‹éš›ã«æœ€é©ãªå ´æ‰€ã§ã™ã€‚HTMLã‚¿ã‚°ãŒä½¿ãˆã¾ã™ title: カスタム詳細説明 site_short_description: - desc_html: サイドãƒãƒ¼ã¨ meta ã‚¿ã‚°ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚Mastodon ã¨ã¯ä½•ã‹ã€ãã—ã¦ã“ã®ã‚µãƒ¼ãƒãƒ¼ã®ç‰¹åˆ¥ãªä½•ã‹ã‚’1段è½ã§è¨˜è¿°ã—ã¦ãã ã•ã„。空欄ã®å ´åˆã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®èª¬æ˜ŽãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ - title: çŸã„インスタンスã®èª¬æ˜Ž + desc_html: サイドãƒãƒ¼ã¨ meta ã‚¿ã‚°ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚Mastodon ã¨ã¯ä½•ã‹ã€ãã—ã¦ã“ã®ã‚µãƒ¼ãƒãƒ¼ã®ç‰¹åˆ¥ãªä½•ã‹ã‚’1段è½ã§è¨˜è¿°ã—ã¦ãã ã•ã„。空欄ã®å ´åˆã€ã‚µãƒ¼ãƒãƒ¼ã®èª¬æ˜ŽãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + title: çŸã„サーãƒãƒ¼ã®èª¬æ˜Ž site_terms: desc_html: ã‚ãªãŸã¯ç‹¬è‡ªã®ãƒ—ライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼ã‚„利用è¦ç´„ã€ãã®ã»ã‹ã®æ³•çš„æ ¹æ‹ ã‚’æ›¸ãã“ã¨ãŒã§ãã¾ã™ã€‚HTMLã‚¿ã‚°ãŒä½¿ãˆã¾ã™ title: カスタム利用è¦ç´„ - site_title: インスタンスã®åå‰ + site_title: サーãƒãƒ¼ã®åå‰ thumbnail: desc_html: OpenGraphã¨APIã«ã‚ˆã‚‹ãƒ—レビューã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚サイズã¯1200×630px推奨ã§ã™ - title: インスタンスã®ã‚µãƒ ãƒã‚¤ãƒ« + title: サーãƒãƒ¼ã®ã‚µãƒ ãƒã‚¤ãƒ« timeline_preview: desc_html: ランディングページã«å…¬é–‹ã‚¿ã‚¤ãƒ ラインを表示ã—ã¾ã™ title: タイムラインプレビュー @@ -495,7 +495,7 @@ ja: warning: ã“ã®ãƒ‡ãƒ¼ã‚¿ã¯æ°—ã‚’ã¤ã‘ã¦å–り扱ã£ã¦ãã ã•ã„。他ã®äººã¨å…±æœ‰ã—ãªã„ã§ãã ã•ã„ï¼ your_token: アクセストークン auth: - agreement_html: 登録ã™ã‚‹ã‚’クリックã™ã‚‹ã¨ <a href="%{rules_path}">インスタンスã®ãƒ«ãƒ¼ãƒ«</a> 㨠<a href="%{terms_path}">プライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼</a> ã«å¾“ã†ã“ã¨ã«åŒæ„ã—ãŸã“ã¨ã«ãªã‚Šã¾ã™ã€‚ + agreement_html: 登録ã™ã‚‹ã‚’クリックã™ã‚‹ã¨ <a href="%{rules_path}">サーãƒãƒ¼ã®ãƒ«ãƒ¼ãƒ«</a> 㨠<a href="%{terms_path}">プライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼</a> ã«å¾“ã†ã“ã¨ã«åŒæ„ã—ãŸã“ã¨ã«ãªã‚Šã¾ã™ã€‚ change_password: パスワード confirm_email: メールアドレスã®ç¢ºèª delete_account: アカウントã®å‰Šé™¤ @@ -513,7 +513,7 @@ ja: cas: CAS saml: SAML register: 登録ã™ã‚‹ - register_elsewhere: ä»–ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§æ–°è¦ç™»éŒ² + register_elsewhere: ä»–ã®ã‚µãƒ¼ãƒãƒ¼ã§æ–°è¦ç™»éŒ² resend_confirmation: 確èªãƒ¡ãƒ¼ãƒ«ã‚’å†é€ã™ã‚‹ reset_password: パスワードをå†ç™ºè¡Œ security: ã‚»ã‚ュリティ @@ -549,7 +549,7 @@ ja: description_html: ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«å«ã¾ã‚Œã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯å…¨ã¦å‰Šé™¤ã•ã‚Œã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯æ’ä¹…çš„ãªã‚‚ã®ã§ã€<strong>å–り消ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“</strong>。ãªã‚Šã™ã¾ã—を防ããŸã‚ã«ã€åŒã˜ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§å†åº¦ç™»éŒ²ã™ã‚‹ã“ã¨ã¯ã§ããªããªã‚Šã¾ã™ã€‚ proceed: アカウントを削除ã™ã‚‹ success_msg: アカウントã¯æ£å¸¸ã«å‰Šé™¤ã•ã‚Œã¾ã—㟠- warning_html: 削除ãŒä¿è¨¼ã•ã‚Œã‚‹ã®ã¯ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ä¸Šã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã¿ã§ã™ã€‚ä»–ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ç‰ã€å¤–部ã«åºƒã共有ã•ã‚ŒãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«ã¤ã„ã¦ã¯ç—•è·¡ãŒæ®‹ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ã¾ãŸã€ç¾åœ¨æŽ¥ç¶šã§ããªã„サーãƒãƒ¼ã‚„ã€ã‚ãªãŸã®æ›´æ–°ã‚’å—ã‘å–らãªããªã£ãŸã‚µãƒ¼ãƒãƒ¼ã«å¯¾ã—ã¦ã¯ã€å‰Šé™¤ã¯åæ˜ ã•ã‚Œã¾ã›ã‚“。 + warning_html: 削除ãŒä¿è¨¼ã•ã‚Œã‚‹ã®ã¯ã“ã®ã‚µãƒ¼ãƒãƒ¼ä¸Šã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã¿ã§ã™ã€‚ä»–ã®ã‚µãƒ¼ãƒãƒ¼ç‰ã€å¤–部ã«åºƒã共有ã•ã‚ŒãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«ã¤ã„ã¦ã¯ç—•è·¡ãŒæ®‹ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ã¾ãŸã€ç¾åœ¨æŽ¥ç¶šã§ããªã„サーãƒãƒ¼ã‚„ã€ã‚ãªãŸã®æ›´æ–°ã‚’å—ã‘å–らãªããªã£ãŸã‚µãƒ¼ãƒãƒ¼ã«å¯¾ã—ã¦ã¯ã€å‰Šé™¤ã¯åæ˜ ã•ã‚Œã¾ã›ã‚“。 warning_title: 共有ã•ã‚ŒãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«ã¤ã„㦠directories: directory: ディレクトリ @@ -606,7 +606,7 @@ ja: title: æ–°è¦ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’è¿½åŠ followers: domain: ドメイン - explanation_html: ã‚ãªãŸã®æŠ•ç¨¿ã®ãƒ—ライãƒã‚·ãƒ¼ã‚’確ä¿ã—ãŸã„å ´åˆã€èª°ãŒã‚ãªãŸã‚’フォãƒãƒ¼ã—ã¦ã„ã‚‹ã®ã‹ã‚’把æ¡ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ <strong>プライベート投稿ã¯ã€ã‚ãªãŸã®ãƒ•ã‚©ãƒãƒ¯ãƒ¼ãŒã„ã‚‹å…¨ã¦ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«é…ä¿¡ã•ã‚Œã¾ã™</strong>。 フォãƒãƒ¯ãƒ¼ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®ç®¡ç†è€…やソフトウェアãŒã‚ãªãŸã®ãƒ—ライãƒã‚·ãƒ¼ã‚’å°Šé‡ã—ã¦ãれるã‹ã©ã†ã‹æ€ªã—ã„å ´åˆã¯ã€ãã®ãƒ•ã‚©ãƒãƒ¯ãƒ¼ã‚’削除ã—ãŸæ–¹ãŒã‚ˆã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 + explanation_html: ã‚ãªãŸã®æŠ•ç¨¿ã®ãƒ—ライãƒã‚·ãƒ¼ã‚’確ä¿ã—ãŸã„å ´åˆã€èª°ãŒã‚ãªãŸã‚’フォãƒãƒ¼ã—ã¦ã„ã‚‹ã®ã‹ã‚’把æ¡ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ <strong>プライベート投稿ã¯ã€ã‚ãªãŸã®ãƒ•ã‚©ãƒãƒ¯ãƒ¼ãŒã„ã‚‹å…¨ã¦ã®ã‚µãƒ¼ãƒãƒ¼ã«é…ä¿¡ã•ã‚Œã¾ã™</strong>。 フォãƒãƒ¯ãƒ¼ã®ã‚µãƒ¼ãƒãƒ¼ã®ç®¡ç†è€…やソフトウェアãŒã‚ãªãŸã®ãƒ—ライãƒã‚·ãƒ¼ã‚’å°Šé‡ã—ã¦ãれるã‹ã©ã†ã‹æ€ªã—ã„å ´åˆã¯ã€ãã®ãƒ•ã‚©ãƒãƒ¯ãƒ¼ã‚’削除ã—ãŸæ–¹ãŒã‚ˆã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 followers_count: フォãƒãƒ¯ãƒ¼æ•° lock_link: 承èªåˆ¶ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã™ã‚‹ purge: フォãƒãƒ¯ãƒ¼ã‹ã‚‰å‰Šé™¤ã™ã‚‹ @@ -628,7 +628,7 @@ ja: one: エラーãŒç™ºç”Ÿã—ã¾ã—ãŸï¼ 以下ã®ã‚¨ãƒ©ãƒ¼ã‚’確èªã—ã¦ãã ã•ã„ other: エラーãŒç™ºç”Ÿã—ã¾ã—ãŸï¼ 以下ã®%{count}個ã®ã‚¨ãƒ©ãƒ¼ã‚’確èªã—ã¦ãã ã•ã„ imports: - preface: ä»–ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰ã€ãƒ•ã‚©ãƒãƒ¼/ブãƒãƒƒã‚¯ã—ãŸæƒ…å ±ã‚’ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ä¸Šã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚ + preface: ä»–ã®ã‚µãƒ¼ãƒãƒ¼ã§ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰ã€ãƒ•ã‚©ãƒãƒ¼/ブãƒãƒƒã‚¯ã—ãŸæƒ…å ±ã‚’ã“ã®ã‚µãƒ¼ãƒãƒ¼ä¸Šã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚ success: ファイルã¯æ£å¸¸ã«ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•ã‚Œã€ç¾åœ¨å‡¦ç†ä¸ã§ã™ã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ç¢ºèªã—ã¦ãã ã•ã„ types: blocking: ブãƒãƒƒã‚¯ã—ãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆãƒªã‚¹ãƒˆ @@ -653,7 +653,7 @@ ja: one: '1' other: "%{count}" max_uses_prompt: ç„¡åˆ¶é™ - prompt: リンクを生æˆãƒ»å…±æœ‰ã—ã¦ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¸ã®æ–°è¦ç™»éŒ²ã‚’å—ã‘付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ + prompt: リンクを生æˆãƒ»å…±æœ‰ã—ã¦ã“ã®ã‚µãƒ¼ãƒãƒ¼ã¸ã®æ–°è¦ç™»éŒ²ã‚’å—ã‘付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ table: expires_at: æœ‰åŠ¹æœŸé™ uses: 使用 @@ -800,7 +800,7 @@ ja: development: 開発 edit_profile: プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’編集 export: データã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ - followers: ä¿¡é ¼æ¸ˆã¿ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ + followers: ä¿¡é ¼æ¸ˆã¿ã®ã‚µãƒ¼ãƒãƒ¼ import: データã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ migrate: アカウントã®å¼•ã£è¶Šã— notifications: 通知 @@ -979,13 +979,13 @@ ja: final_action: 始ã‚ã¾ã—ょㆠfinal_step: 'ã•ã‚始ã‚ã¾ã—ょã†ï¼ ãŸã¨ãˆãƒ•ã‚©ãƒãƒ¯ãƒ¼ãŒã„ãªãã¦ã‚‚ã€ã‚ãªãŸã®å…¬é–‹ã—ãŸæŠ•ç¨¿ã¯ãƒãƒ¼ã‚«ãƒ«ã‚¿ã‚¤ãƒ ラインやãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ãªã©ã§èª°ã‹ã®ç›®ã«æ¢ã¾ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。自己紹介をã—ãŸã„時㯠#introductions ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã‚’使ã†ã¨ã„ã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。' full_handle: ã‚ãªãŸã®æ£å¼ãªãƒ¦ãƒ¼ã‚¶ãƒ¼å - full_handle_hint: ã“ã‚Œã¯åˆ¥ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‹ã‚‰ãƒ•ã‚©ãƒãƒ¼ã—ã¦ã‚‚らã£ãŸã‚Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚„ã‚Šå–ã‚Šã‚’ã™ã‚‹éš›ã«ã€å‹é”ã«ä¼ãˆã‚‹ã¨ã„ã„ã§ã—ょã†ã€‚ + full_handle_hint: ã“ã‚Œã¯åˆ¥ã®ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ãƒ•ã‚©ãƒãƒ¼ã—ã¦ã‚‚らã£ãŸã‚Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚„ã‚Šå–ã‚Šã‚’ã™ã‚‹éš›ã«ã€å‹é”ã«ä¼ãˆã‚‹ã¨ã„ã„ã§ã—ょã†ã€‚ review_preferences_action: è¨å®šã®å¤‰æ›´ review_preferences_step: å—ã‘å–ã‚ŠãŸã„メールや投稿ã®å…¬é–‹ç¯„囲ãªã©ã®è¨å®šã‚’å¿…ãšè¡Œã£ã¦ãã ã•ã„。ä¸å¿«ã§ãªã„ãªã‚‰ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ GIF ã®è‡ªå‹•å†ç”Ÿã‚’有効ã«ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ subject: Mastodon ã¸ã‚ˆã†ã“ã - tip_federated_timeline: 連åˆã‚¿ã‚¤ãƒ ライン㯠Mastodon ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æµã‚Œã‚’見られるもã®ã§ã™ã€‚ãŸã ã—ã‚ãªãŸã¨åŒã˜ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®äººãŒãƒ•ã‚©ãƒãƒ¼ã—ã¦ã„る人ã ã‘ãŒå«ã¾ã‚Œã‚‹ã®ã§ã€ãã‚ŒãŒå…¨ã¦ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 - tip_following: 標準ã§ã¯è‡ªå‹•ã§ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®ç®¡ç†è€…をフォãƒãƒ¼ã—ã¦ã„ã¾ã™ã€‚ã‚‚ã£ã¨èˆˆå‘³ã®ã‚る人ãŸã¡ã‚’見ã¤ã‘ã‚‹ã«ã¯ã€ãƒãƒ¼ã‚«ãƒ«ã‚¿ã‚¤ãƒ ラインã¨é€£åˆã‚¿ã‚¤ãƒ ラインを確èªã—ã¦ãã ã•ã„。 - tip_local_timeline: ãƒãƒ¼ã‚«ãƒ«ã‚¿ã‚¤ãƒ ライン㯠%{instance} ã«ã„る人々ã®æµã‚Œã‚’見られるもã®ã§ã™ã€‚彼らã¯ã‚ãªãŸã¨åŒã˜ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ã„る隣人ã®ã‚ˆã†ãªã‚‚ã®ã§ã™ï¼ + tip_federated_timeline: 連åˆã‚¿ã‚¤ãƒ ライン㯠Mastodon ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æµã‚Œã‚’見られるもã®ã§ã™ã€‚ãŸã ã—ã‚ãªãŸã¨åŒã˜ã‚µãƒ¼ãƒãƒ¼ã®äººãŒãƒ•ã‚©ãƒãƒ¼ã—ã¦ã„る人ã ã‘ãŒå«ã¾ã‚Œã‚‹ã®ã§ã€ãã‚ŒãŒå…¨ã¦ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 + tip_following: 標準ã§ã¯è‡ªå‹•ã§ã‚µãƒ¼ãƒãƒ¼ã®ç®¡ç†è€…をフォãƒãƒ¼ã—ã¦ã„ã¾ã™ã€‚ã‚‚ã£ã¨èˆˆå‘³ã®ã‚る人ãŸã¡ã‚’見ã¤ã‘ã‚‹ã«ã¯ã€ãƒãƒ¼ã‚«ãƒ«ã‚¿ã‚¤ãƒ ラインã¨é€£åˆã‚¿ã‚¤ãƒ ラインを確èªã—ã¦ãã ã•ã„。 + tip_local_timeline: ãƒãƒ¼ã‚«ãƒ«ã‚¿ã‚¤ãƒ ライン㯠%{instance} ã«ã„る人々ã®æµã‚Œã‚’見られるもã®ã§ã™ã€‚彼らã¯ã‚ãªãŸã¨åŒã˜ã‚µãƒ¼ãƒãƒ¼ã«ã„る隣人ã®ã‚ˆã†ãªã‚‚ã®ã§ã™ï¼ tip_mobile_webapp: ã‚‚ã—モãƒã‚¤ãƒ«ç«¯æœ«ã®ãƒ–ラウザ㧠Mastodon をホーム画é¢ã«è¿½åŠ ã§ãã‚‹å ´åˆã€ãƒ—ッシュ通知をå—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã‚Œã¯ã¾ã‚‹ã§ãƒã‚¤ãƒ†ã‚£ãƒ–アプリã®ã‚ˆã†ã«å‹•ä½œã—ã¾ã™ï¼ tips: è±†çŸ¥è˜ title: よã†ã“ãã€%{name} ï¼ diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 3a2746a539..3faaa6ac7b 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -40,7 +40,7 @@ en: featured_tag: name: 'You might want to use one of these:' imports: - data: CSV file exported from another Mastodon instance + data: CSV file exported from another Mastodon server sessions: otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:' user: diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index f9beedb7e1..c22b67314a 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -37,7 +37,7 @@ ja: username: ã‚ãªãŸã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å㯠%{domain} ã®ä¸ã§é‡è¤‡ã—ã¦ã„ãªã„å¿…è¦ãŒã‚ã‚Šã¾ã™ whole_word: ã‚ーワードã¾ãŸã¯ãƒ•ãƒ¬ãƒ¼ã‚ºãŒè‹±æ•°å—ã®ã¿ã®å ´åˆã€å˜èªžå…¨ä½“ã¨ä¸€è‡´ã™ã‚‹å ´åˆã®ã¿é©ç”¨ã•ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ imports: - data: ä»–ã® Mastodon インスタンスã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ãŸCSVファイルをé¸æŠžã—ã¦ä¸‹ã•ã„ + data: ä»–ã® Mastodon サーãƒãƒ¼ã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ãŸCSVファイルをé¸æŠžã—ã¦ä¸‹ã•ã„ sessions: otp: 'æºå¸¯é›»è©±ã®ã‚¢ãƒ—リã§ç”Ÿæˆã•ã‚ŒãŸäºŒæ®µéšŽèªè¨¼ã‚³ãƒ¼ãƒ‰ã‚’入力ã™ã‚‹ã‹ã€ãƒªã‚«ãƒãƒªãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’使用ã—ã¦ãã ã•ã„:' user: -- GitLab From e186bd2fb0d2d70c0c401d35cd9f6a63bd20eeac Mon Sep 17 00:00:00 2001 From: abcang <abcang1015@gmail.com> Date: Wed, 6 Feb 2019 10:50:52 +0900 Subject: [PATCH 025/192] Fix Tombstone.delete_all ArgumentError (#9978) --- app/services/activitypub/process_account_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index 487456f3af..5e33084282 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -212,7 +212,7 @@ class ActivityPub::ProcessAccountService < BaseService end def clear_tombstones! - Tombstone.delete_all(account_id: @account.id) + Tombstone.where(account_id: @account.id).delete_all end def protocol_changed? -- GitLab From 3ce34ce7a2795b8fbea618a8c869d9447f5a60b5 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Wed, 6 Feb 2019 14:13:15 +0100 Subject: [PATCH 026/192] Fix unfolding CWs on public hashtag page Fixes #909 --- .../glitch/features/status/components/detailed_status.js | 2 +- .../status/containers/detailed_status_container.js | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/app/javascript/flavours/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js index 02f02efea3..a114e2158b 100644 --- a/app/javascript/flavours/glitch/features/status/components/detailed_status.js +++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js @@ -26,7 +26,7 @@ export default class DetailedStatus extends ImmutablePureComponent { settings: ImmutablePropTypes.map.isRequired, onOpenMedia: PropTypes.func.isRequired, onOpenVideo: PropTypes.func.isRequired, - onToggleHidden: PropTypes.func.isRequired, + onToggleHidden: PropTypes.func, expanded: PropTypes.bool, measureHeight: PropTypes.bool, onHeightChange: PropTypes.func, diff --git a/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js b/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js index e41b1dc88c..6d3909ea7c 100644 --- a/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js +++ b/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js @@ -160,14 +160,6 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ } }, - onToggleHidden (status) { - if (status.get('hidden')) { - dispatch(revealStatus(status.get('id'))); - } else { - dispatch(hideStatus(status.get('id'))); - } - }, - }); export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(DetailedStatus)); -- GitLab From 1a70fca168bec82e3521c2039bbdecc256f328af Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Wed, 6 Feb 2019 15:11:46 +0100 Subject: [PATCH 027/192] Fix CW unfolding not triggering re-layout in public hashtag page --- app/javascript/flavours/glitch/components/status_content.js | 2 ++ .../glitch/features/status/components/detailed_status.js | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/app/javascript/flavours/glitch/components/status_content.js b/app/javascript/flavours/glitch/components/status_content.js index 6542df65b2..c60d63f9a1 100644 --- a/app/javascript/flavours/glitch/components/status_content.js +++ b/app/javascript/flavours/glitch/components/status_content.js @@ -17,6 +17,7 @@ export default class StatusContent extends React.PureComponent { mediaIcon: PropTypes.string, parseClick: PropTypes.func, disabled: PropTypes.bool, + onUpdate: PropTypes.func, }; state = { @@ -62,6 +63,7 @@ export default class StatusContent extends React.PureComponent { componentDidUpdate () { this._updateStatusLinks(); + if (this.props.onUpdate) this.props.onUpdate(); } onLinkClick = (e) => { diff --git a/app/javascript/flavours/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js index a114e2158b..8f49a9a301 100644 --- a/app/javascript/flavours/glitch/features/status/components/detailed_status.js +++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js @@ -79,6 +79,10 @@ export default class DetailedStatus extends ImmutablePureComponent { this._measureHeight(prevState.height !== this.state.height); } + handleChildUpdate = () => { + this._measureHeight(); + } + handleModalLink = e => { e.preventDefault(); @@ -218,6 +222,7 @@ export default class DetailedStatus extends ImmutablePureComponent { collapsed={false} onExpandedToggle={onToggleHidden} parseClick={this.parseClick} + onUpdate={this.handleChildUpdate} /> <div className='detailed-status__meta'> -- GitLab From e28fe2ef2639d06c0df8717216052720f1c3543f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Feb 2019 16:46:37 +0100 Subject: [PATCH 028/192] Bump microformats from 4.0.7 to 4.1.0 (#9980) Bumps [microformats](https://github.com/microformats/microformats-ruby) from 4.0.7 to 4.1.0. - [Release notes](https://github.com/microformats/microformats-ruby/releases) - [Commits](https://github.com/microformats/microformats-ruby/compare/v4.0.7...v4.1.0) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 44cae11ff2..fc919af6ef 100644 --- a/Gemfile +++ b/Gemfile @@ -110,7 +110,7 @@ group :test do gem 'capybara', '~> 3.13' gem 'climate_control', '~> 0.2' gem 'faker', '~> 1.9' - gem 'microformats', '~> 4.0' + gem 'microformats', '~> 4.1' gem 'rails-controller-testing', '~> 1.0' gem 'rspec-sidekiq', '~> 3.0' gem 'simplecov', '~> 0.16', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 5bec39a01f..af76296906 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -335,9 +335,9 @@ GEM redis (>= 3.0.5) memory_profiler (0.9.12) method_source (0.9.2) - microformats (4.0.7) - json - nokogiri + microformats (4.1.0) + json (~> 2.1) + nokogiri (~> 1.8, >= 1.8.3) mime-types (3.2.2) mime-types-data (~> 3.2015) mime-types-data (3.2018.0812) @@ -709,7 +709,7 @@ DEPENDENCIES makara (~> 0.4) mario-redis-lock (~> 1.2) memory_profiler - microformats (~> 4.0) + microformats (~> 4.1) mime-types (~> 3.2) net-ldap (~> 0.10) nokogiri (~> 1.10) -- GitLab From d09ce6d81b542705fcce8f5091d032471531c755 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Wed, 6 Feb 2019 23:36:43 +0100 Subject: [PATCH 029/192] Fix IntersectionObserverArticle not hiding some out-of-view items (#9982) IntersectionObserverArticle is made to save on RAM by avoiding fully rendering items that are far out of view. However, it did not work for items spawned outside the intersection observer. --- .../mastodon/components/intersection_observer_article.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/intersection_observer_article.js b/app/javascript/mastodon/components/intersection_observer_article.js index de2203a4bc..e453730ba4 100644 --- a/app/javascript/mastodon/components/intersection_observer_article.js +++ b/app/javascript/mastodon/components/intersection_observer_article.js @@ -65,7 +65,7 @@ export default class IntersectionObserverArticle extends React.Component { } updateStateAfterIntersection = (prevState) => { - if (prevState.isIntersecting && !this.entry.isIntersecting) { + if (prevState.isIntersecting !== false && !this.entry.isIntersecting) { scheduleIdleTask(this.hideIfNotIntersecting); } return { -- GitLab From 157d3af46c1a94dd0365b6e33e82919dd3c15fde Mon Sep 17 00:00:00 2001 From: Hinaloe <hina@hinaloe.net> Date: Sat, 9 Feb 2019 11:39:38 +0900 Subject: [PATCH 030/192] Only URLs extract with pre-escaped text (#9991) * [test] add japanese hashtag testcase * Only URLs extract with pre-escaped text ( https://github.com/tootsuite/mastodon/issues/9989 ) --- app/lib/formatter.rb | 2 +- spec/lib/formatter_spec.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 2e35871696..6603b8df17 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -210,7 +210,7 @@ class Formatter # Note: I couldn't obtain list_slug with @user/list-name format # for mention so this requires additional check - special = Extractor.extract_entities_with_indices(escaped, options).map do |extract| + special = Extractor.extract_urls_with_indices(escaped, options).map do |extract| # exactly one of :url, :hashtag, :screen_name, :cashtag keys is present key = (extract.keys & [:url, :hashtag, :screen_name, :cashtag]).first diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb index 9872d37567..8fb6695a9b 100644 --- a/spec/lib/formatter_spec.rb +++ b/spec/lib/formatter_spec.rb @@ -194,6 +194,14 @@ RSpec.describe Formatter do is_expected.to include '/tags/hashtag" class="mention hashtag" rel="tag">#<span>hashtag</span></a>' end end + + context 'given text containing a hashtag with Unicode chars' do + let(:text) { '#hashtagã‚¿ã‚°' } + + it 'creates a hashtag link' do + is_expected.to include '/tags/hashtag%E3%82%BF%E3%82%B0" class="mention hashtag" rel="tag">#<span>hashtagã‚¿ã‚°</span></a>' + end + end end describe '#format_spoiler' do -- GitLab From a666d1e7edaa8a3da61ce23f648321f7aa61d03b Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sun, 10 Feb 2019 01:33:41 +0900 Subject: [PATCH 031/192] Enable "displaying application used to post" setting by default (#9994) related: https://github.com/tootsuite/mastodon/pull/9897#issuecomment-461093615 --- config/settings.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/settings.yml b/config/settings.yml index 2cf286a9e4..33a03efccb 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -26,7 +26,7 @@ defaults: &defaults expand_spoilers: false preview_sensitive_media: false reduce_motion: false - show_application: false + show_application: true system_font_ui: false noindex: false theme: 'default' -- GitLab From 016ad37bc8c9ca8bf8f872b8fee704a0388f575e Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Sat, 9 Feb 2019 20:13:11 +0100 Subject: [PATCH 032/192] Fix URL linkifier grabbing full-width spaces and quotations (#9997) Fix #9993 Fix #5654 --- app/lib/formatter.rb | 12 +++++++- config/initializers/twitter_regex.rb | 4 +-- spec/lib/formatter_spec.rb | 44 ++++++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 6603b8df17..0653214f53 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -199,12 +199,22 @@ class Formatter result.flatten.join end + UNICODE_ESCAPE_BLACKLIST_RE = /\p{Z}|\p{P}/ + def utf8_friendly_extractor(text, options = {}) old_to_new_index = [0] escaped = text.chars.map do |c| - output = c.ord.to_s(16).length > 2 ? CGI.escape(c) : c + output = begin + if c.ord.to_s(16).length > 2 && UNICODE_ESCAPE_BLACKLIST_RE.match(c).nil? + CGI.escape(c) + else + c + end + end + old_to_new_index << old_to_new_index.last + output.length + output end.join diff --git a/config/initializers/twitter_regex.rb b/config/initializers/twitter_regex.rb index 0e8f5bfeb4..0ddbbee982 100644 --- a/config/initializers/twitter_regex.rb +++ b/config/initializers/twitter_regex.rb @@ -1,7 +1,7 @@ module Twitter class Regex - REGEXEN[:valid_general_url_path_chars] = /[^\p{White_Space}\(\)\?]/iou - REGEXEN[:valid_url_path_ending_chars] = /[^\p{White_Space}\(\)\?!\*';:=\,\.\$%\[\]~&\|@]|(?:#{REGEXEN[:valid_url_balanced_parens]})/iou + REGEXEN[:valid_general_url_path_chars] = /[^\p{White_Space}<>\(\)\?]/iou + REGEXEN[:valid_url_path_ending_chars] = /[^\p{White_Space}\(\)\?!\*"'「ã€<>;:=\,\.\$%\[\]~&\|@]|(?:#{REGEXEN[:valid_url_balanced_parens]})/iou REGEXEN[:valid_url_balanced_parens] = / \( (?: diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb index 8fb6695a9b..96d2fc7e06 100644 --- a/spec/lib/formatter_spec.rb +++ b/spec/lib/formatter_spec.rb @@ -115,6 +115,22 @@ RSpec.describe Formatter do end end + context 'given a URL in quotation marks' do + let(:text) { '"https://example.com/"' } + + it 'does not match the quotation marks' do + is_expected.to include 'href="https://example.com/"' + end + end + + context 'given a URL in angle brackets' do + let(:text) { '<https://example.com/>' } + + it 'does not match the angle brackets' do + is_expected.to include 'href="https://example.com/"' + end + end + context 'given a URL with Japanese path string' do let(:text) { 'https://ja.wikipedia.org/wiki/日本' } @@ -131,6 +147,22 @@ RSpec.describe Formatter do end end + context 'given a URL with a full-width space' do + let(:text) { 'https://example.com/ abc123' } + + it 'does not match the full-width space' do + is_expected.to include 'href="https://example.com/"' + end + end + + context 'given a URL in Japanese quotation marks' do + let(:text) { '「[https://example.org/ã€' } + + it 'does not match the quotation marks' do + is_expected.to include 'href="https://example.org/"' + end + end + context 'given a URL with Simplified Chinese path string' do let(:text) { 'https://baike.baidu.com/item/ä¸åŽäººæ°‘共和国' } @@ -150,7 +182,11 @@ RSpec.describe Formatter do context 'given a URL containing unsafe code (XSS attack, visible part)' do let(:text) { %q{http://example.com/b<del>b</del>} } - it 'escapes the HTML in the URL' do + it 'does not include the HTML in the URL' do + is_expected.to include '"http://example.com/b"' + end + + it 'escapes the HTML' do is_expected.to include '<del>b</del>' end end @@ -158,7 +194,11 @@ RSpec.describe Formatter do context 'given a URL containing unsafe code (XSS attack, invisible part)' do let(:text) { %q{http://example.com/blahblahblahblah/a<script>alert("Hello")</script>} } - it 'escapes the HTML in the URL' do + it 'does not include the HTML in the URL' do + is_expected.to include '"http://example.com/blahblahblahblah/a"' + end + + it 'escapes the HTML' do is_expected.to include '<script>alert("Hello")</script>' end end -- GitLab From fb90ec894ed3ebaf31b860991bd2a79d21c45e13 Mon Sep 17 00:00:00 2001 From: mayaeh <mayaeh@marimo-net.org> Date: Sun, 10 Feb 2019 21:04:59 +0900 Subject: [PATCH 033/192] i18n: add Japanese translations (#10000) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add Japanese translations. * Probably change to more general "çµ±åˆ" than "マージ" . --- app/javascript/mastodon/locales/ja.json | 1 + config/locales/ja.yml | 11 +++++++++++ config/locales/simple_form.ja.yml | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 81b21a94a4..92f9b0effe 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -342,6 +342,7 @@ "ui.beforeunload": "Mastodonã‹ã‚‰é›¢ã‚Œã‚‹ã¨é€ä¿¡å‰ã®æŠ•ç¨¿ã¯å¤±ã‚ã‚Œã¾ã™ã€‚", "upload_area.title": "ドラッグ&ドãƒãƒƒãƒ—ã§ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰", "upload_button.label": "ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’è¿½åŠ (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "アップãƒãƒ¼ãƒ‰ã§ãる上é™ã‚’超ãˆã¦ã„ã¾ã™ã€‚", "upload_form.description": "視覚障害者ã®ãŸã‚ã®èª¬æ˜Ž", "upload_form.focus": "焦点", "upload_form.undo": "削除", diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 07458d07dd..1a2591cb4e 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -588,6 +588,10 @@ ja: lists: リスト mutes: ミュート storage: メディア + featured_tags: + add_new: è¿½åŠ + errors: + limit: 注目ã®ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã®ä¸Šé™ã«é”ã—ã¾ã—㟠filters: contexts: home: ホームタイムライン @@ -628,10 +632,16 @@ ja: one: エラーãŒç™ºç”Ÿã—ã¾ã—ãŸï¼ 以下ã®ã‚¨ãƒ©ãƒ¼ã‚’確èªã—ã¦ãã ã•ã„ other: エラーãŒç™ºç”Ÿã—ã¾ã—ãŸï¼ 以下ã®%{count}個ã®ã‚¨ãƒ©ãƒ¼ã‚’確èªã—ã¦ãã ã•ã„ imports: + modes: + merge: çµ±åˆ + merge_long: ç¾åœ¨ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’ä¿æŒã—ãŸã¾ã¾æ–°ã—ã„ã‚‚ã®ã‚’è¿½åŠ ã—ã¾ã™ + overwrite: 上書ã + overwrite_long: ç¾åœ¨ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’æ–°ã—ã„ã‚‚ã®ã§ç½®ãæ›ãˆã¾ã™ preface: ä»–ã®ã‚µãƒ¼ãƒãƒ¼ã§ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰ã€ãƒ•ã‚©ãƒãƒ¼/ブãƒãƒƒã‚¯ã—ãŸæƒ…å ±ã‚’ã“ã®ã‚µãƒ¼ãƒãƒ¼ä¸Šã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚ success: ファイルã¯æ£å¸¸ã«ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•ã‚Œã€ç¾åœ¨å‡¦ç†ä¸ã§ã™ã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ç¢ºèªã—ã¦ãã ã•ã„ types: blocking: ブãƒãƒƒã‚¯ã—ãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆãƒªã‚¹ãƒˆ + domain_blocking: éžè¡¨ç¤ºã«ã—ãŸãƒ‰ãƒ¡ã‚¤ãƒ³ãƒªã‚¹ãƒˆ following: フォãƒãƒ¼ä¸ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãƒªã‚¹ãƒˆ muting: ミュートã—ãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆãƒªã‚¹ãƒˆ upload: アップãƒãƒ¼ãƒ‰ @@ -800,6 +810,7 @@ ja: development: 開発 edit_profile: プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’編集 export: データã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ + featured_tags: 注目ã®ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚° followers: ä¿¡é ¼æ¸ˆã¿ã®ã‚µãƒ¼ãƒãƒ¼ import: データã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ migrate: アカウントã®å¼•ã£è¶Šã— diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index c22b67314a..87ffe9d143 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -33,9 +33,12 @@ ja: setting_display_media_show_all: 閲覧注æ„ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚ŒãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚‚常ã«è¡¨ç¤ºã™ã‚‹ setting_hide_network: フォãƒãƒ¼ã¨ãƒ•ã‚©ãƒãƒ¯ãƒ¼ã®æƒ…å ±ãŒãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«ãƒšãƒ¼ã‚¸ã§è¦‹ã‚‰ã‚Œãªã„よã†ã«ã—ã¾ã™ setting_noindex: 公開プãƒãƒ•ã‚£ãƒ¼ãƒ«ãŠã‚ˆã³å„投稿ページã«å½±éŸ¿ã—ã¾ã™ + setting_show_application: トゥートã™ã‚‹ã®ã«ä½¿ç”¨ã—ãŸã‚¢ãƒ—リãŒãƒˆã‚¥ãƒ¼ãƒˆã®è©³ç´°ãƒ“ューã«è¡¨ç¤ºã•ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ setting_theme: ãƒã‚°ã‚¤ãƒ³ã—ã¦ã„ã‚‹å…¨ã¦ã®ãƒ‡ãƒã‚¤ã‚¹ã§é©ç”¨ã•ã‚Œã‚‹ãƒ‡ã‚¶ã‚¤ãƒ³ã§ã™ã€‚ username: ã‚ãªãŸã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å㯠%{domain} ã®ä¸ã§é‡è¤‡ã—ã¦ã„ãªã„å¿…è¦ãŒã‚ã‚Šã¾ã™ whole_word: ã‚ーワードã¾ãŸã¯ãƒ•ãƒ¬ãƒ¼ã‚ºãŒè‹±æ•°å—ã®ã¿ã®å ´åˆã€å˜èªžå…¨ä½“ã¨ä¸€è‡´ã™ã‚‹å ´åˆã®ã¿é©ç”¨ã•ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ + featured_tag: + name: 'ã“れらを使ã†ã¨ã„ã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“:' imports: data: ä»–ã® Mastodon サーãƒãƒ¼ã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ãŸCSVファイルをé¸æŠžã—ã¦ä¸‹ã•ã„ sessions: @@ -100,6 +103,7 @@ ja: setting_hide_network: 繋ãŒã‚Šã‚’éš ã™ setting_noindex: 検索エンジンã«ã‚ˆã‚‹ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’æ‹’å¦ã™ã‚‹ setting_reduce_motion: アニメーションã®å‹•ãを減ら㙠+ setting_show_application: トゥートã®é€ä¿¡ã«ä½¿ç”¨ã—ãŸã‚¢ãƒ—リを開示ã™ã‚‹ setting_system_font_ui: システムã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ•ã‚©ãƒ³ãƒˆã‚’使ㆠsetting_theme: サイトテーマ setting_unfollow_modal: フォãƒãƒ¼ã‚’解除ã™ã‚‹å‰ã«ç¢ºèªãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’表示ã™ã‚‹ @@ -108,6 +112,8 @@ ja: username: ユーザーå username_or_email: ユーザーåã¾ãŸã¯ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ whole_word: å˜èªžå…¨ä½“ã«ãƒžãƒƒãƒ + featured_tag: + name: ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚° interactions: must_be_follower: フォãƒãƒ¯ãƒ¼ä»¥å¤–ã‹ã‚‰ã®é€šçŸ¥ã‚’ブãƒãƒƒã‚¯ must_be_following: フォãƒãƒ¼ã—ã¦ã„ãªã„ユーザーã‹ã‚‰ã®é€šçŸ¥ã‚’ブãƒãƒƒã‚¯ -- GitLab From 3031b8a8f22a74a1b691cfe8a31a816ae9cc480d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Feb 2019 18:17:34 +0100 Subject: [PATCH 034/192] Bump parallel_tests from 2.27.1 to 2.28.0 (#9985) Bumps [parallel_tests](https://github.com/grosser/parallel_tests) from 2.27.1 to 2.28.0. - [Release notes](https://github.com/grosser/parallel_tests/releases) - [Commits](https://github.com/grosser/parallel_tests/compare/v2.27.1...v2.28.0) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index fc919af6ef..53c8b4602f 100644 --- a/Gemfile +++ b/Gemfile @@ -115,7 +115,7 @@ group :test do gem 'rspec-sidekiq', '~> 3.0' gem 'simplecov', '~> 0.16', require: false gem 'webmock', '~> 3.5' - gem 'parallel_tests', '~> 2.27' + gem 'parallel_tests', '~> 2.28' end group :development do diff --git a/Gemfile.lock b/Gemfile.lock index af76296906..0c342064fc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -390,7 +390,7 @@ GEM av (~> 0.9.0) paperclip (>= 2.5.2) parallel (1.13.0) - parallel_tests (2.27.1) + parallel_tests (2.28.0) parallel parser (2.6.0.0) ast (~> 2.4.0) @@ -722,7 +722,7 @@ DEPENDENCIES ox (~> 2.10) paperclip (~> 6.0) paperclip-av-transcoder (~> 0.6) - parallel_tests (~> 2.27) + parallel_tests (~> 2.28) pg (~> 1.1) pghero (~> 2.2) pkg-config (~> 1.3) -- GitLab From 6b2eefc7bf8cf1bb58da165d9594d9b17bf97e11 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 10 Feb 2019 21:13:17 +0100 Subject: [PATCH 035/192] [Glitch] Add WebP support Port 5092d17f2936146fa26e5d8a9b9e391f77010f28 to glitch-soc --- app/javascript/flavours/glitch/util/resize_image.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/util/resize_image.js b/app/javascript/flavours/glitch/util/resize_image.js index d1608094f7..bbdbc865e9 100644 --- a/app/javascript/flavours/glitch/util/resize_image.js +++ b/app/javascript/flavours/glitch/util/resize_image.js @@ -31,7 +31,7 @@ const loadImage = inputFile => new Promise((resolve, reject) => { }); const getOrientation = (img, type = 'image/png') => new Promise(resolve => { - if (type !== 'image/jpeg') { + if (!['image/jpeg', 'image/webp'].includes(type)) { resolve(1); return; } -- GitLab From a963ea67dda17f69ed783b3fbcc91e5ce3858ad3 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 10 Feb 2019 21:28:29 +0100 Subject: [PATCH 036/192] [Glitch] Add missing rejection handling for Promises Port missing parts from 2c51bc0ca5a4c3a4bb140b4b40dabdda859ebb94 to glitch-soc --- .../flavours/glitch/actions/alerts.js | 25 +++++++++++++++++++ .../flavours/glitch/actions/compose.js | 7 +++++- .../flavours/glitch/actions/lists.js | 4 ++- .../actions/push_notifications/registerer.js | 15 +++++------ .../flavours/glitch/actions/settings.js | 5 +++- .../glitch/containers/status_container.js | 6 ++++- .../features/ui/components/embed_modal.js | 3 +++ .../flavours/glitch/middleware/errors.js | 18 ++----------- 8 files changed, 54 insertions(+), 29 deletions(-) diff --git a/app/javascript/flavours/glitch/actions/alerts.js b/app/javascript/flavours/glitch/actions/alerts.js index f37fdeeb6a..3f5d7ef46b 100644 --- a/app/javascript/flavours/glitch/actions/alerts.js +++ b/app/javascript/flavours/glitch/actions/alerts.js @@ -1,3 +1,10 @@ +import { defineMessages } from 'react-intl'; + +const messages = defineMessages({ + unexpectedTitle: { id: 'alert.unexpected.title', defaultMessage: 'Oops!' }, + unexpectedMessage: { id: 'alert.unexpected.message', defaultMessage: 'An unexpected error occurred.' }, +}); + export const ALERT_SHOW = 'ALERT_SHOW'; export const ALERT_DISMISS = 'ALERT_DISMISS'; export const ALERT_CLEAR = 'ALERT_CLEAR'; @@ -22,3 +29,21 @@ export function showAlert(title, message) { message, }; }; + +export function showAlertForError(error) { + if (error.response) { + const { data, status, statusText } = error.response; + + let message = statusText; + let title = `${status}`; + + if (data.error) { + message = data.error; + } + + return showAlert(title, message); + } else { + console.error(error); + return showAlert(messages.unexpectedTitle, messages.unexpectedMessage); + } +} diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index 04e8577132..204d609b0d 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -1,5 +1,5 @@ import api from 'flavours/glitch/util/api'; -import { CancelToken } from 'axios'; +import { CancelToken, isCancel } from 'axios'; import { throttle } from 'lodash'; import { search as emojiSearch } from 'flavours/glitch/util/emoji/emoji_mart_search_light'; import { useEmoji } from './emojis'; @@ -8,6 +8,7 @@ import { recoverHashtags } from 'flavours/glitch/util/hashtag'; import resizeImage from 'flavours/glitch/util/resize_image'; import { updateTimeline } from './timelines'; +import { showAlertForError } from './alerts'; let cancelFetchComposeSuggestionsAccounts; @@ -320,6 +321,10 @@ const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => }, }).then(response => { dispatch(readyComposeSuggestionsAccounts(token, response.data)); + }).catch(error => { + if (!isCancel(error)) { + dispatch(showAlertForError(error)); + } }); }, 200, { leading: true, trailing: true }); diff --git a/app/javascript/flavours/glitch/actions/lists.js b/app/javascript/flavours/glitch/actions/lists.js index 7d94ee950e..f29ca1e010 100644 --- a/app/javascript/flavours/glitch/actions/lists.js +++ b/app/javascript/flavours/glitch/actions/lists.js @@ -1,4 +1,5 @@ import api from 'flavours/glitch/util/api'; +import { showAlertForError } from './alerts'; export const LIST_FETCH_REQUEST = 'LIST_FETCH_REQUEST'; export const LIST_FETCH_SUCCESS = 'LIST_FETCH_SUCCESS'; @@ -239,7 +240,8 @@ export const fetchListSuggestions = q => (dispatch, getState) => { }; api(getState).get('/api/v1/accounts/search', { params }) - .then(({ data }) => dispatch(fetchListSuggestionsReady(q, data))); + .then(({ data }) => dispatch(fetchListSuggestionsReady(q, data))) + .catch(error => dispatch(showAlertForError(error))); }; export const fetchListSuggestionsReady = (query, accounts) => ({ diff --git a/app/javascript/flavours/glitch/actions/push_notifications/registerer.js b/app/javascript/flavours/glitch/actions/push_notifications/registerer.js index 91f442415a..8fdb239f72 100644 --- a/app/javascript/flavours/glitch/actions/push_notifications/registerer.js +++ b/app/javascript/flavours/glitch/actions/push_notifications/registerer.js @@ -109,14 +109,11 @@ export function register () { pushNotificationsSetting.remove(me); } - try { - getRegistration() - .then(getPushSubscription) - .then(unsubscribe); - } catch (e) { - - } - }); + return getRegistration() + .then(getPushSubscription) + .then(unsubscribe); + }) + .catch(console.warn); } else { console.warn('Your browser does not support Web Push Notifications.'); } @@ -137,6 +134,6 @@ export function saveSettings() { if (me) { pushNotificationsSetting.set(me, data); } - }); + }).catch(console.warn); }; } diff --git a/app/javascript/flavours/glitch/actions/settings.js b/app/javascript/flavours/glitch/actions/settings.js index 87b2ae76d9..fb0bcc09ce 100644 --- a/app/javascript/flavours/glitch/actions/settings.js +++ b/app/javascript/flavours/glitch/actions/settings.js @@ -1,5 +1,6 @@ import api from 'flavours/glitch/util/api'; import { debounce } from 'lodash'; +import { showAlertForError } from './alerts'; export const SETTING_CHANGE = 'SETTING_CHANGE'; export const SETTING_SAVE = 'SETTING_SAVE'; @@ -23,7 +24,9 @@ const debouncedSave = debounce((dispatch, getState) => { const data = getState().get('settings').filter((_, path) => path !== 'saved').toJS(); - api(getState).put('/api/web/settings', { data }).then(() => dispatch({ type: SETTING_SAVE })); + api(getState).put('/api/web/settings', { data }) + .then(() => dispatch({ type: SETTING_SAVE })) + .catch(error => dispatch(showAlertForError(error))); }, 5000, { trailing: true }); export function saveSettings() { diff --git a/app/javascript/flavours/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js index f28dce609e..f783878b00 100644 --- a/app/javascript/flavours/glitch/containers/status_container.js +++ b/app/javascript/flavours/glitch/containers/status_container.js @@ -25,6 +25,7 @@ import { openModal } from 'flavours/glitch/actions/modal'; import { changeLocalSetting } from 'flavours/glitch/actions/local_settings'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/util/initial_state'; +import { showAlertForError } from '../actions/alerts'; const messages = defineMessages({ deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, @@ -134,7 +135,10 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onEmbed (status) { - dispatch(openModal('EMBED', { url: status.get('url') })); + dispatch(openModal('EMBED', { + url: status.get('url'), + onError: error => dispatch(showAlertForError(error)), + })); }, onDelete (status, history, withRedraft = false) { diff --git a/app/javascript/flavours/glitch/features/ui/components/embed_modal.js b/app/javascript/flavours/glitch/features/ui/components/embed_modal.js index bf29b0da5d..b1643df1cb 100644 --- a/app/javascript/flavours/glitch/features/ui/components/embed_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/embed_modal.js @@ -10,6 +10,7 @@ export default class EmbedModal extends ImmutablePureComponent { static propTypes = { url: PropTypes.string.isRequired, onClose: PropTypes.func.isRequired, + onError: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, } @@ -35,6 +36,8 @@ export default class EmbedModal extends ImmutablePureComponent { iframeDocument.body.style.margin = 0; this.iframe.width = iframeDocument.body.scrollWidth; this.iframe.height = iframeDocument.body.scrollHeight; + }).catch(error => { + this.props.onError(error); }); } diff --git a/app/javascript/flavours/glitch/middleware/errors.js b/app/javascript/flavours/glitch/middleware/errors.js index f3dfc8b069..212c1f4ad2 100644 --- a/app/javascript/flavours/glitch/middleware/errors.js +++ b/app/javascript/flavours/glitch/middleware/errors.js @@ -1,4 +1,4 @@ -import { showAlert } from 'flavours/glitch/actions/alerts'; +import { showAlertForError } from 'flavours/glitch/actions/alerts'; const defaultFailSuffix = 'FAIL'; @@ -8,21 +8,7 @@ export default function errorsMiddleware() { const isFail = new RegExp(`${defaultFailSuffix}$`, 'g'); if (action.type.match(isFail)) { - if (action.error.response) { - const { data, status, statusText } = action.error.response; - - let message = statusText; - let title = `${status}`; - - if (data.error) { - message = data.error; - } - - dispatch(showAlert(title, message)); - } else { - console.error(action.error); - dispatch(showAlert('Oops!', 'An unexpected error occurred.')); - } + dispatch(showAlertForError(action.error)); } } -- GitLab From 7ed2aeb6e9b0fe4fc7fbe7c76003d1e044c682eb Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 10 Feb 2019 21:35:04 +0100 Subject: [PATCH 037/192] [Glitch] Allow multiple files upload through web UI, including drag & drop Port 750c67660de753065ec160b4e389ba0dda2f81cc to glitch-soc --- .../flavours/glitch/actions/alerts.js | 4 +- .../flavours/glitch/actions/compose.js | 38 ++++++++++++++----- .../glitch/features/composer/options/index.js | 1 + .../flavours/glitch/features/ui/index.js | 2 +- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/app/javascript/flavours/glitch/actions/alerts.js b/app/javascript/flavours/glitch/actions/alerts.js index 3f5d7ef46b..50cd48a9ed 100644 --- a/app/javascript/flavours/glitch/actions/alerts.js +++ b/app/javascript/flavours/glitch/actions/alerts.js @@ -22,7 +22,7 @@ export function clearAlert() { }; }; -export function showAlert(title, message) { +export function showAlert(title = messages.unexpectedTitle, message = messages.unexpectedMessage) { return { type: ALERT_SHOW, title, @@ -44,6 +44,6 @@ export function showAlertForError(error) { return showAlert(title, message); } else { console.error(error); - return showAlert(messages.unexpectedTitle, messages.unexpectedMessage); + return showAlert(); } } diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index 204d609b0d..0dd1766bc7 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -9,6 +9,8 @@ import resizeImage from 'flavours/glitch/util/resize_image'; import { updateTimeline } from './timelines'; import { showAlertForError } from './alerts'; +import { showAlert } from './alerts'; +import { defineMessages } from 'react-intl'; let cancelFetchComposeSuggestionsAccounts; @@ -53,6 +55,10 @@ export const COMPOSE_UPLOAD_CHANGE_FAIL = 'COMPOSE_UPLOAD_UPDATE_FAIL'; export const COMPOSE_DOODLE_SET = 'COMPOSE_DOODLE_SET'; +const messages = defineMessages({ + uploadErrorLimit: { id: 'upload_error.limit', defaultMessage: 'File upload limit exceeded.' }, +}); + export function changeCompose(text) { return { type: COMPOSE_CHANGE, @@ -208,20 +214,32 @@ export function doodleSet(options) { export function uploadCompose(files) { return function (dispatch, getState) { - if (getState().getIn(['compose', 'media_attachments']).size > 3) { + const uploadLimit = 4; + const media = getState().getIn(['compose', 'media_attachments']); + const total = Array.from(files).reduce((a, v) => a + v.size, 0); + const progress = new Array(files.length).fill(0); + + if (files.length + media.size > uploadLimit) { + dispatch(showAlert(undefined, messages.uploadErrorLimit)); return; } - dispatch(uploadComposeRequest()); - resizeImage(files[0]).then(file => { - const data = new FormData(); - data.append('file', file); - - return api(getState).post('/api/v1/media', data, { - onUploadProgress: ({ loaded, total }) => dispatch(uploadComposeProgress(loaded, total)), - }).then(({ data }) => dispatch(uploadComposeSuccess(data))); - }).catch(error => dispatch(uploadComposeFail(error))); + for (const [i, f] of Array.from(files).entries()) { + if (media.size + i > 3) break; + + resizeImage(f).then(file => { + const data = new FormData(); + data.append('file', file); + + return api(getState).post('/api/v1/media', data, { + onUploadProgress: function({ loaded }){ + progress[i] = loaded; + dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); + }, + }).then(({ data }) => dispatch(uploadComposeSuccess(data))); + }).catch(error => dispatch(uploadComposeFail(error))); + }; }; }; diff --git a/app/javascript/flavours/glitch/features/composer/options/index.js b/app/javascript/flavours/glitch/features/composer/options/index.js index 9fe3abc03e..5b4a7444c0 100644 --- a/app/javascript/flavours/glitch/features/composer/options/index.js +++ b/app/javascript/flavours/glitch/features/composer/options/index.js @@ -214,6 +214,7 @@ export default class ComposerOptions extends React.PureComponent { onChange={handleChangeFiles} ref={handleRefFileElement} type='file' + multiple {...hiddenComponent} /> <Dropdown diff --git a/app/javascript/flavours/glitch/features/ui/index.js b/app/javascript/flavours/glitch/features/ui/index.js index 602d93832f..a19b3abf19 100644 --- a/app/javascript/flavours/glitch/features/ui/index.js +++ b/app/javascript/flavours/glitch/features/ui/index.js @@ -186,7 +186,7 @@ export default class UI extends React.Component { this.setState({ draggingOver: false }); this.dragTargets = []; - if (e.dataTransfer && e.dataTransfer.files.length === 1) { + if (e.dataTransfer && e.dataTransfer.files.length >= 1) { this.props.dispatch(uploadCompose(e.dataTransfer.files)); } } -- GitLab From b7fbcb21b3ca7f7ee560785fa1249bf689fbaff3 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 10 Feb 2019 21:50:42 +0100 Subject: [PATCH 038/192] [Glitch] Add featured hashtags to profiles Port SCSS changes from 364f2ff9aa2b4bf601d68a12bce758aeb5530467 --- app/javascript/flavours/glitch/styles/accounts.scss | 4 ++++ app/javascript/flavours/glitch/styles/admin.scss | 7 ++++++- app/javascript/flavours/glitch/styles/widgets.scss | 7 +++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/javascript/flavours/glitch/styles/accounts.scss b/app/javascript/flavours/glitch/styles/accounts.scss index 9c6518bea6..d2ae83b2e0 100644 --- a/app/javascript/flavours/glitch/styles/accounts.scss +++ b/app/javascript/flavours/glitch/styles/accounts.scss @@ -290,3 +290,7 @@ border-bottom: 0; } } + +.directory__tag .trends__item__current { + width: auto; +} diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss index 4e969601b1..4dbbaa1e83 100644 --- a/app/javascript/flavours/glitch/styles/admin.scss +++ b/app/javascript/flavours/glitch/styles/admin.scss @@ -153,10 +153,15 @@ $content-width: 840px; font-weight: 500; } - .directory__tag a { + .directory__tag > a, + .directory__tag > div { box-shadow: none; } + .directory__tag .table-action-link .fa { + color: inherit; + } + .directory__tag h4 { font-size: 18px; font-weight: 700; diff --git a/app/javascript/flavours/glitch/styles/widgets.scss b/app/javascript/flavours/glitch/styles/widgets.scss index c97337e4e3..1eaf30c5b3 100644 --- a/app/javascript/flavours/glitch/styles/widgets.scss +++ b/app/javascript/flavours/glitch/styles/widgets.scss @@ -269,7 +269,8 @@ box-sizing: border-box; margin-bottom: 10px; - a { + & > a, + & > div { display: flex; align-items: center; justify-content: space-between; @@ -279,7 +280,9 @@ text-decoration: none; color: inherit; box-shadow: 0 0 15px rgba($base-shadow-color, 0.2); + } + & > a { &:hover, &:active, &:focus { @@ -287,7 +290,7 @@ } } - &.active a { + &.active > a { background: $ui-highlight-color; cursor: default; } -- GitLab From 14a1bb703a98282349cc95ac9a561c795c6881a0 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 10 Feb 2019 21:54:43 +0100 Subject: [PATCH 039/192] [Glitch] Fix not showing custom emojis in share page emoji picker Port e02a13f64e5c2c93fa73a67a4ce32a7d1df24760 to glitch-soc --- app/javascript/flavours/glitch/containers/compose_container.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/javascript/flavours/glitch/containers/compose_container.js b/app/javascript/flavours/glitch/containers/compose_container.js index 60f6a9c9f2..74c411b7c1 100644 --- a/app/javascript/flavours/glitch/containers/compose_container.js +++ b/app/javascript/flavours/glitch/containers/compose_container.js @@ -7,6 +7,7 @@ import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from 'mastodon/locales'; import Compose from 'flavours/glitch/features/standalone/compose'; import initialState from 'flavours/glitch/util/initial_state'; +import { fetchCustomEmojis } from 'flavours/glitch/actions/custom_emojis'; const { localeData, messages } = getLocale(); addLocaleData(localeData); @@ -17,6 +18,8 @@ if (initialState) { store.dispatch(hydrateStore(initialState)); } +store.dispatch(fetchCustomEmojis()); + export default class TimelineContainer extends React.PureComponent { static propTypes = { -- GitLab From b47a53f90299a1fb52423aacbc0c23427e2eb132 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 10 Feb 2019 22:19:26 +0100 Subject: [PATCH 040/192] [Glitch] Rename from instance to server. Port 46e806cd2f14a5e45d66b4c23040855202818984 to glitch-soc --- .../flavours/glitch/features/getting_started/index.js | 2 +- .../flavours/glitch/features/public_timeline/index.js | 2 +- .../flavours/glitch/features/ui/components/report_modal.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/javascript/flavours/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js index fe0dd506ed..7b645c9d09 100644 --- a/app/javascript/flavours/glitch/features/getting_started/index.js +++ b/app/javascript/flavours/glitch/features/getting_started/index.js @@ -166,7 +166,7 @@ export default class GettingStarted extends ImmutablePureComponent { <div className='getting-started__footer'> <ul> {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>} - <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this instance' /></a> · </li> + <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li> <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li> <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li> <li><a href='https://docs.joinmastodon.org' target='_blank'><FormattedMessage id='getting_started.documentation' defaultMessage='Documentation' /></a></li> diff --git a/app/javascript/flavours/glitch/features/public_timeline/index.js b/app/javascript/flavours/glitch/features/public_timeline/index.js index 477d3b8c78..7fe4722028 100644 --- a/app/javascript/flavours/glitch/features/public_timeline/index.js +++ b/app/javascript/flavours/glitch/features/public_timeline/index.js @@ -127,7 +127,7 @@ export default class PublicTimeline extends React.PureComponent { onLoadMore={this.handleLoadMore} trackScroll={!pinned} scrollKey={`public_timeline-${columnId}`} - emptyMessage={<FormattedMessage id='empty_column.public' defaultMessage='There is nothing here! Write something publicly, or manually follow users from other instances to fill it up' />} + emptyMessage={<FormattedMessage id='empty_column.public' defaultMessage='There is nothing here! Write something publicly, or manually follow users from other servers to fill it up' />} /> </Column> ); diff --git a/app/javascript/flavours/glitch/features/ui/components/report_modal.js b/app/javascript/flavours/glitch/features/ui/components/report_modal.js index a139394ac2..8be1d5856d 100644 --- a/app/javascript/flavours/glitch/features/ui/components/report_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/report_modal.js @@ -97,7 +97,7 @@ export default class ReportModal extends ImmutablePureComponent { <div className='report-modal__container'> <div className='report-modal__comment'> - <p><FormattedMessage id='report.hint' defaultMessage='The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:' /></p> + <p><FormattedMessage id='report.hint' defaultMessage='The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:' /></p> <textarea className='setting-text light' -- GitLab From 405ef5ad3763ebf948dff61fff8af59a3937a9f9 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Wed, 6 Feb 2019 18:59:28 +0100 Subject: [PATCH 041/192] Hide items rendered out-of-frame (once they have been rendered at least once) --- .../glitch/components/intersection_observer_article.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/flavours/glitch/components/intersection_observer_article.js b/app/javascript/flavours/glitch/components/intersection_observer_article.js index 6eeca5598e..03d8f17c6b 100644 --- a/app/javascript/flavours/glitch/components/intersection_observer_article.js +++ b/app/javascript/flavours/glitch/components/intersection_observer_article.js @@ -63,7 +63,7 @@ export default class IntersectionObserverArticle extends ImmutablePureComponent } updateStateAfterIntersection = (prevState) => { - if (prevState.isIntersecting && !this.entry.isIntersecting) { + if (prevState.isIntersecting !== false && !this.entry.isIntersecting) { scheduleIdleTask(this.hideIfNotIntersecting); } return { @@ -109,7 +109,7 @@ export default class IntersectionObserverArticle extends ImmutablePureComponent ref={this.handleRef} aria-posinset={index + 1} aria-setsize={listLength} - style={{ height: `${this.height || cachedHeight}px`, opacity: 0, overflow: 'hidden' }} + style={{ height: `${this.height || cachedHeight || 150}px`, opacity: 0, overflow: 'hidden' }} data-id={id} tabIndex='0' > -- GitLab From e49e54a5ffb3c5304a42c12be9dba6cc47384250 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Wed, 6 Feb 2019 19:48:28 +0100 Subject: [PATCH 042/192] Cleanup redundant markup for hidden statuses --- app/javascript/flavours/glitch/components/status.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index 9ff53485e8..80cd0f42e6 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -384,15 +384,7 @@ export default class Status extends ImmutablePureComponent { if (hidden) { return ( - <div - ref={this.handleRef} - data-id={status.get('id')} - style={{ - height: `${this.height}px`, - opacity: 0, - overflow: 'hidden', - }} - > + <div ref={this.handleRef}> {status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])} {' '} {status.get('content')} -- GitLab From 68f3d003d6e841c864330fd5e7bcecadcc9b9178 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Wed, 6 Feb 2019 20:04:39 +0100 Subject: [PATCH 043/192] Refactor intersection observer article code --- .../intersection_observer_article.js | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/app/javascript/flavours/glitch/components/intersection_observer_article.js b/app/javascript/flavours/glitch/components/intersection_observer_article.js index 03d8f17c6b..900c986380 100644 --- a/app/javascript/flavours/glitch/components/intersection_observer_article.js +++ b/app/javascript/flavours/glitch/components/intersection_observer_article.js @@ -103,24 +103,23 @@ export default class IntersectionObserverArticle extends ImmutablePureComponent const { children, id, index, listLength, cachedHeight } = this.props; const { isIntersecting, isHidden } = this.state; + const style = {}; + if (!isIntersecting && (isHidden || cachedHeight)) { - return ( - <article - ref={this.handleRef} - aria-posinset={index + 1} - aria-setsize={listLength} - style={{ height: `${this.height || cachedHeight || 150}px`, opacity: 0, overflow: 'hidden' }} - data-id={id} - tabIndex='0' - > - {children && React.cloneElement(children, { hidden: true })} - </article> - ); + style.height = `${this.height || cachedHeight || 150}px`; + style.opacity = 0; + style.overflow = 'hidden'; } return ( - <article ref={this.handleRef} aria-posinset={index + 1} aria-setsize={listLength} data-id={id} tabIndex='0'> - {children && React.cloneElement(children, { hidden: false })} + <article + ref={this.handleRef} + aria-posinset={index + 1} + aria-setsize={listLength} + data-id={id} + tabIndex='0' + style={style}> + {children && React.cloneElement(children, { hidden: !isIntersecting && (isHidden || cachedHeight) })} </article> ); } -- GitLab From 049c9a3b9711ed203855d18a9a549e65e164ec59 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sat, 9 Feb 2019 20:54:11 +0100 Subject: [PATCH 044/192] Avoid two-step rendering of statuses as much as possible Cache width shared by Video player, MediaGallery and Cards at the ScrollableList level, pass it down through StatusList and Notifications. --- .../flavours/glitch/components/media_gallery.js | 10 ++++++++-- .../flavours/glitch/components/scrollable_list.js | 12 +++++++++++- app/javascript/flavours/glitch/components/status.js | 8 ++++++++ .../notifications/components/notification.js | 12 ++++++++++++ .../glitch/features/status/components/card.js | 7 +++++-- .../flavours/glitch/features/video/index.js | 5 ++++- 6 files changed, 48 insertions(+), 6 deletions(-) diff --git a/app/javascript/flavours/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js index d0226bbbbc..1fa25ee4ec 100644 --- a/app/javascript/flavours/glitch/components/media_gallery.js +++ b/app/javascript/flavours/glitch/components/media_gallery.js @@ -224,6 +224,8 @@ export default class MediaGallery extends React.PureComponent { size: PropTypes.object, onOpenMedia: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, + defaultWidth: PropTypes.number, + cacheWidth: PropTypes.func, }; static defaultProps = { @@ -232,6 +234,7 @@ export default class MediaGallery extends React.PureComponent { state = { visible: this.props.revealed === undefined ? (displayMedia !== 'hide_all' && !this.props.sensitive || displayMedia === 'show_all') : this.props.revealed, + width: this.props.defaultWidth, }; componentWillReceiveProps (nextProps) { @@ -259,6 +262,7 @@ export default class MediaGallery extends React.PureComponent { handleRef = (node) => { this.node = node; if (node && node.offsetWidth && node.offsetWidth != this.state.width) { + if (this.props.cacheWidth) this.props.cacheWidth(node.offsetWidth); this.setState({ width: node.offsetWidth, }); @@ -271,10 +275,12 @@ export default class MediaGallery extends React.PureComponent { } render () { - const { media, intl, sensitive, letterbox, fullwidth } = this.props; - const { width, visible } = this.state; + const { media, intl, sensitive, letterbox, fullwidth, defaultWidth } = this.props; + const { visible } = this.state; const size = media.take(4).size; + const width = this.state.width || defaultWidth; + let children; const style = {}; diff --git a/app/javascript/flavours/glitch/components/scrollable_list.js b/app/javascript/flavours/glitch/components/scrollable_list.js index 7cd0774a93..2e7c9fd6eb 100644 --- a/app/javascript/flavours/glitch/components/scrollable_list.js +++ b/app/javascript/flavours/glitch/components/scrollable_list.js @@ -40,6 +40,7 @@ export default class ScrollableList extends PureComponent { state = { fullscreen: null, + cachedMediaWidth: 300, }; intersectionObserverWrapper = new IntersectionObserverWrapper(); @@ -141,6 +142,10 @@ export default class ScrollableList extends PureComponent { this.setScrollTop(newScrollTop); } + cacheMediaWidth = (width) => { + if (width && this.state.cachedMediaWidth != width) this.setState({ cachedMediaWidth: width }); + } + getSnapshotBeforeUpdate (prevProps, prevState) { const someItemInserted = React.Children.count(prevProps.children) > 0 && React.Children.count(prevProps.children) < React.Children.count(this.props.children) && @@ -252,7 +257,12 @@ export default class ScrollableList extends PureComponent { intersectionObserverWrapper={this.intersectionObserverWrapper} saveHeightKey={trackScroll ? `${this.context.router.route.location.key}:${scrollKey}` : null} > - {React.cloneElement(child, {getScrollPosition: this.getScrollPosition, updateScrollBottom: this.updateScrollBottom})} + {React.cloneElement(child, { + getScrollPosition: this.getScrollPosition, + updateScrollBottom: this.updateScrollBottom, + cachedMediaWidth: this.state.cachedMediaWidth, + cacheMediaWidth: this.cacheMediaWidth, + })} </IntersectionObserverArticleContainer> ))} diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index 80cd0f42e6..68788451b0 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -72,6 +72,8 @@ export default class Status extends ImmutablePureComponent { updateScrollBottom: PropTypes.func, expanded: PropTypes.bool, intl: PropTypes.object.isRequired, + cacheMediaWidth: PropTypes.func, + cachedMediaWidth: PropTypes.number, }; state = { @@ -445,6 +447,8 @@ export default class Status extends ImmutablePureComponent { fullwidth={settings.getIn(['media', 'fullwidth'])} preventPlayback={isCollapsed || !isExpanded} onOpenVideo={this.handleOpenVideo} + width={this.props.cachedMediaWidth} + cacheWidth={this.props.cacheMediaWidth} />)} </Bundle> ); @@ -460,6 +464,8 @@ export default class Status extends ImmutablePureComponent { fullwidth={settings.getIn(['media', 'fullwidth'])} hidden={isCollapsed || !isExpanded} onOpenMedia={this.props.onOpenMedia} + cacheWidth={this.props.cacheMediaWidth} + defaultWidth={this.props.cachedMediaWidth} /> )} </Bundle> @@ -476,6 +482,8 @@ export default class Status extends ImmutablePureComponent { onOpenMedia={this.props.onOpenMedia} card={status.get('card')} compact + cacheWidth={this.props.cacheMediaWidth} + defaultWidth={this.props.cachedMediaWidth} /> ); mediaIcon = 'link'; diff --git a/app/javascript/flavours/glitch/features/notifications/components/notification.js b/app/javascript/flavours/glitch/features/notifications/components/notification.js index 21c55acccb..daafe3507f 100644 --- a/app/javascript/flavours/glitch/features/notifications/components/notification.js +++ b/app/javascript/flavours/glitch/features/notifications/components/notification.js @@ -18,6 +18,9 @@ export default class Notification extends ImmutablePureComponent { onMention: PropTypes.func.isRequired, getScrollPosition: PropTypes.func, updateScrollBottom: PropTypes.func, + cacheMediaWidth: PropTypes.func, + cachedMediaWidth: PropTypes.number, + onUnmount: PropTypes.func, }; render () { @@ -57,6 +60,9 @@ export default class Notification extends ImmutablePureComponent { contextType='notifications' getScrollPosition={getScrollPosition} updateScrollBottom={updateScrollBottom} + cachedMediaWidth={this.props.cachedMediaWidth} + cacheMediaWidth={this.props.cacheMediaWidth} + onUnmount={this.props.onUnmount} withDismiss /> ); @@ -75,6 +81,9 @@ export default class Notification extends ImmutablePureComponent { onMention={onMention} getScrollPosition={getScrollPosition} updateScrollBottom={updateScrollBottom} + cachedMediaWidth={this.props.cachedMediaWidth} + cacheMediaWidth={this.props.cacheMediaWidth} + onUnmount={this.props.onUnmount} withDismiss /> ); @@ -93,6 +102,9 @@ export default class Notification extends ImmutablePureComponent { onMention={onMention} getScrollPosition={getScrollPosition} updateScrollBottom={updateScrollBottom} + cachedMediaWidth={this.props.cachedMediaWidth} + cacheMediaWidth={this.props.cacheMediaWidth} + onUnmount={this.props.onUnmount} withDismiss /> ); diff --git a/app/javascript/flavours/glitch/features/status/components/card.js b/app/javascript/flavours/glitch/features/status/components/card.js index 1e1604d5cd..e405a5ef00 100644 --- a/app/javascript/flavours/glitch/features/status/components/card.js +++ b/app/javascript/flavours/glitch/features/status/components/card.js @@ -60,6 +60,8 @@ export default class Card extends React.PureComponent { maxDescription: PropTypes.number, onOpenMedia: PropTypes.func.isRequired, compact: PropTypes.bool, + defaultWidth: PropTypes.number, + cacheWidth: PropTypes.func, }; static defaultProps = { @@ -68,7 +70,7 @@ export default class Card extends React.PureComponent { }; state = { - width: 280, + width: this.props.defaultWidth || 280, embedded: false, }; @@ -111,6 +113,7 @@ export default class Card extends React.PureComponent { setRef = c => { if (c) { + if (this.props.cacheWidth) this.props.cacheWidth(c.offsetWidth); this.setState({ width: c.offsetWidth }); } } @@ -133,7 +136,7 @@ export default class Card extends React.PureComponent { } render () { - const { card, maxDescription, compact } = this.props; + const { card, maxDescription, compact, defaultWidth } = this.props; const { width, embedded } = this.state; if (card === null) { diff --git a/app/javascript/flavours/glitch/features/video/index.js b/app/javascript/flavours/glitch/features/video/index.js index d8e8791a74..a6f651db65 100644 --- a/app/javascript/flavours/glitch/features/video/index.js +++ b/app/javascript/flavours/glitch/features/video/index.js @@ -103,6 +103,7 @@ export default class Video extends React.PureComponent { inline: PropTypes.bool, preventPlayback: PropTypes.bool, intl: PropTypes.object.isRequired, + cacheWidth: PropTypes.func, }; state = { @@ -111,7 +112,7 @@ export default class Video extends React.PureComponent { volume: 0.5, paused: true, dragging: false, - containerWidth: false, + containerWidth: this.props.width, fullscreen: false, hovered: false, muted: false, @@ -131,6 +132,7 @@ export default class Video extends React.PureComponent { this.player = c; if (c && c.offsetWidth && c.offsetWidth != this.state.containerWidth) { + if (this.props.cacheWidth) this.props.cacheWidth(this.player.offsetWidth); this.setState({ containerWidth: c.offsetWidth, }); @@ -275,6 +277,7 @@ export default class Video extends React.PureComponent { componentDidUpdate (prevProps) { if (this.player && this.player.offsetWidth && this.player.offsetWidth != this.state.containerWidth && !this.state.fullscreen) { + if (this.props.cacheWidth) this.props.cacheWidth(this.player.offsetWidth); this.setState({ containerWidth: this.player.offsetWidth, }); -- GitLab From 0b91322762e845acc76966da448eeccd1ad78047 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sat, 9 Feb 2019 21:24:43 +0100 Subject: [PATCH 045/192] Adjust scroll if previewCard appeared --- app/javascript/flavours/glitch/components/status.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index 68788451b0..1a5cb4a975 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -216,6 +216,8 @@ export default class Status extends ImmutablePureComponent { // Hack to fix timeline jumps on second rendering when auto-collapsing this.setState({ autoCollapsed: true }); } + + this.didShowCard = !this.props.muted && !this.props.hidden && this.props.status.get('card') && this.props.settings.get('inline_preview_cards'); } getSnapshotBeforeUpdate (prevProps, prevState) { @@ -228,8 +230,10 @@ export default class Status extends ImmutablePureComponent { // Hack to fix timeline jumps on second rendering when auto-collapsing componentDidUpdate (prevProps, prevState, snapshot) { - if (this.state.autoCollapsed) { - this.setState({ autoCollapsed: false }); + const doShowCard = !this.props.muted && !this.props.hidden && this.props.status.get('card') && this.props.settings.get('inline_preview_cards'); + if (this.state.autoCollapsed || (doShowCard && !this.didShowCard)) { + if (doShowCard) this.didShowCard = true; + if (this.state.autoCollapsed) this.setState({ autoCollapsed: false }); if (snapshot !== null && this.props.updateScrollBottom) { if (this.node.offsetTop < snapshot.top) { this.props.updateScrollBottom(snapshot.height - snapshot.top); -- GitLab From dfe1d548a58154c988b98cab313496292bdc62e2 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sat, 9 Feb 2019 22:08:57 +0100 Subject: [PATCH 046/192] Adjust scroll when statuses above the current scroll position are deleted --- app/javascript/flavours/glitch/components/status.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index 1a5cb4a975..9d987dc9c3 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -242,6 +242,15 @@ export default class Status extends ImmutablePureComponent { } } + componentWillUnmount() { + if (this.node && this.props.getScrollPosition) { + const position = this.props.getScrollPosition(); + if (position !== null && this.node.offsetTop < position.top) { + requestAnimationFrame(() => { this.props.updateScrollBottom(position.height - position.top); }); + } + } + } + // `setCollapsed()` sets the value of `isCollapsed` in our state, that is, // whether the toot is collapsed or not. -- GitLab From 7c0728c7764e1e851eb0174b37767029c1061f2d Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sat, 9 Feb 2019 22:32:09 +0100 Subject: [PATCH 047/192] Minor fix to timeline jump avoiding behavior --- app/javascript/flavours/glitch/components/scrollable_list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/components/scrollable_list.js b/app/javascript/flavours/glitch/components/scrollable_list.js index 2e7c9fd6eb..462185bbcc 100644 --- a/app/javascript/flavours/glitch/components/scrollable_list.js +++ b/app/javascript/flavours/glitch/components/scrollable_list.js @@ -129,7 +129,7 @@ export default class ScrollableList extends PureComponent { } getScrollPosition = () => { - if (this.node && this.node.scrollTop > 0) { + if (this.node && (this.node.scrollTop > 0 || this.mouseMovedRecently)) { return {height: this.node.scrollHeight, top: this.node.scrollTop}; } else { return null; -- GitLab From b89e003c4d049d64d2d4015357b8b931370bc5f0 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 10 Feb 2019 11:50:31 +0100 Subject: [PATCH 048/192] Handle deletion of filtered toots --- app/javascript/flavours/glitch/components/status.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index 9d987dc9c3..51fee0eec5 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -415,7 +415,7 @@ export default class Status extends ImmutablePureComponent { return ( <HotKeys handlers={minHandlers}> - <div className='status__wrapper status__wrapper--filtered focusable' tabIndex='0'> + <div className='status__wrapper status__wrapper--filtered focusable' tabIndex='0' ref={this.handleRef}> <FormattedMessage id='status.filtered' defaultMessage='Filtered' /> </div> </HotKeys> -- GitLab From 3cfadd875cc91b3fb893681ed7c2ef86148b3f85 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Mon, 11 Feb 2019 04:19:49 +0100 Subject: [PATCH 049/192] Add "copy link" item to status action bars (#9983) Fix #6848 --- .../mastodon/components/status_action_bar.js | 22 +++++++++++++++++++ .../features/status/components/action_bar.js | 21 ++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index 0995a14904..16c7caf1c1 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -32,6 +32,7 @@ const messages = defineMessages({ embed: { id: 'status.embed', defaultMessage: 'Embed' }, admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' }, admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' }, + copy: { id: 'status.copy', defaultMessage: 'Copy link to status' }, }); const obfuscatedCount = count => { @@ -141,6 +142,25 @@ class StatusActionBar extends ImmutablePureComponent { this.props.onMuteConversation(this.props.status); } + handleCopy = () => { + const url = this.props.status.get('url'); + const textarea = document.createElement('textarea'); + + textarea.textContent = url; + textarea.style.position = 'fixed'; + + document.body.appendChild(textarea); + + try { + textarea.select(); + document.execCommand('copy'); + } catch (e) { + + } finally { + document.body.removeChild(textarea); + } + } + render () { const { status, intl, withDismiss } = this.props; @@ -156,6 +176,7 @@ class StatusActionBar extends ImmutablePureComponent { menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen }); if (publicStatus) { + menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy }); menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed }); } @@ -184,6 +205,7 @@ class StatusActionBar extends ImmutablePureComponent { menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick }); menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick }); menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport }); + if (isStaff) { menu.push(null); menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` }); diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js index d3b725283a..73be1fc5f8 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.js +++ b/app/javascript/mastodon/features/status/components/action_bar.js @@ -28,6 +28,7 @@ const messages = defineMessages({ embed: { id: 'status.embed', defaultMessage: 'Embed' }, admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' }, admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' }, + copy: { id: 'status.copy', defaultMessage: 'Copy link to status' }, }); export default @injectIntl @@ -113,6 +114,25 @@ class ActionBar extends React.PureComponent { this.props.onEmbed(this.props.status); } + handleCopy = () => { + const url = this.props.status.get('url'); + const textarea = document.createElement('textarea'); + + textarea.textContent = url; + textarea.style.position = 'fixed'; + + document.body.appendChild(textarea); + + try { + textarea.select(); + document.execCommand('copy'); + } catch (e) { + + } finally { + document.body.removeChild(textarea); + } + } + render () { const { status, intl } = this.props; @@ -122,6 +142,7 @@ class ActionBar extends React.PureComponent { let menu = []; if (publicStatus) { + menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy }); menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed }); menu.push(null); } -- GitLab From a3e10f44c6483dd83d3b7e7eeb9176a4338d7925 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Mon, 11 Feb 2019 07:41:35 +0100 Subject: [PATCH 050/192] Weblate translations (2019-02-11) (#10007) * Translated using Weblate (Galician) Currently translated at 100.0% (107 of 107 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/gl/ * Translated using Weblate (Basque) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eu/ * Translated using Weblate (Basque) Currently translated at 100.0% (755 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/ * Translated using Weblate (Arabic) Currently translated at 94.8% (716 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ar/ * Translated using Weblate (Basque) Currently translated at 100.0% (107 of 107 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eu/ * Translated using Weblate (Slovak) Currently translated at 100.0% (107 of 107 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/ * Translated using Weblate (German) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/de/ * Translated using Weblate (Slovenian) Currently translated at 21.7% (164 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sl/ * Translated using Weblate (Corsican) Currently translated at 99.9% (754 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/co/ * Translated using Weblate (Welsh) Currently translated at 86.9% (93 of 107 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/cy/ * Translated using Weblate (Welsh) Currently translated at 94.6% (714 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cy/ * Translated using Weblate (Welsh) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/cy/ * Translated using Weblate (Slovak) Currently translated at 99.7% (753 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Czech) Currently translated at 99.9% (754 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/ * Added translation using Weblate (Irish) * Translated using Weblate (Irish) Currently translated at 0.1% (1 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ga/ * Translated using Weblate (Telugu) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/te/ * Translated using Weblate (Indonesian) Currently translated at 38.4% (290 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/id/ * Translated using Weblate (Welsh) Currently translated at 94.6% (714 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cy/ * Translated using Weblate (Czech) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/ * Translated using Weblate (Korean) Currently translated at 100.0% (755 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ko/ * Translated using Weblate (Welsh) Currently translated at 93.5% (100 of 107 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/cy/ * Translated using Weblate (Welsh) Currently translated at 98.0% (349 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cy/ * Translated using Weblate (Serbian) Currently translated at 95.8% (723 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sr/ * Translated using Weblate (Slovak) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sk/ * Translated using Weblate (Slovak) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Czech) Currently translated at 99.9% (754 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/ * Translated using Weblate (Slovak) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Greek) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/ * Translated using Weblate (Greek) Currently translated at 99.9% (754 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/el/ * Translated using Weblate (Occitan) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/oc/ * Translated using Weblate (Welsh) Currently translated at 98.0% (740 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cy/ * Translated using Weblate (Italian) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/it/ * Translated using Weblate (Italian) Currently translated at 84.0% (634 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/it/ * Translated using Weblate (Slovenian) Currently translated at 29.0% (219 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sl/ * Translated using Weblate (Slovak) Currently translated at 99.7% (753 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Slovak) Currently translated at 100.0% (107 of 107 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/ * Translated using Weblate (Slovak) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sk/ * Translated using Weblate (Slovenian) Currently translated at 34.4% (260 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sl/ * Translated using Weblate (Latvian) Currently translated at 40.7% (145 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/lv/ * Translated using Weblate (Japanese) Currently translated at 91.0% (687 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/ * Translated using Weblate (Serbian) Currently translated at 95.8% (723 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sr/ * Translated using Weblate (Slovak) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Slovak) Currently translated at 99.7% (753 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Latvian) Currently translated at 48.3% (172 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/lv/ * Translated using Weblate (Slovak) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Slovak) Currently translated at 99.7% (753 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Slovak) Currently translated at 100.0% (107 of 107 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/ * Translated using Weblate (Czech) Currently translated at 100.0% (98 of 98 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/cs/ * Translated using Weblate (Slovak) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Czech) Currently translated at 99.9% (754 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/ * Translated using Weblate (Greek) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/ * Translated using Weblate (Greek) Currently translated at 99.9% (754 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/el/ * Translated using Weblate (Czech) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/ * Translated using Weblate (Czech) Currently translated at 100.0% (107 of 107 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/cs/ * Translated using Weblate (Czech) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/cs/ * Translated using Weblate (Czech) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/ * Translated using Weblate (Czech) Currently translated at 99.9% (754 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/ Rename "instance" to "server" * Translated using Weblate (Czech) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/cs/ rename from "instance" to "server" * Translated using Weblate (Czech) Currently translated at 100.0% (107 of 107 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/cs/ * Translated using Weblate (Czech) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/ rename from "instance" to "server" * Translated using Weblate (Czech) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/ * Translated using Weblate (Czech) Currently translated at 99.9% (754 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/ rename from "instance" to "server" * Translated using Weblate (Slovak) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sk/ * Translated using Weblate (Slovak) Currently translated at 99.7% (753 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Korean) Currently translated at 100.0% (755 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ko/ * Added translation using Weblate (Lithuanian) * Translated using Weblate (Japanese) Currently translated at 99.2% (353 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/ * Translated using Weblate (Lithuanian) Currently translated at 20.1% (152 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/lt/ * Added translation using Weblate (Albanian) * Translated using Weblate (Slovak) Currently translated at 99.7% (753 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Slovak) Currently translated at 100.0% (356 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Slovak) Currently translated at 100.0% (107 of 107 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/ * Added translation using Weblate (Albanian) * Added translation using Weblate (Albanian) * Added translation using Weblate (Albanian) * Added translation using Weblate (Albanian) * Added translation using Weblate (Albanian) * Translated using Weblate (Albanian) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sq/ * Translated using Weblate (Albanian) Currently translated at 100.0% (2 of 2 strings) Translation: Mastodon/Activerecord Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/sq/ * Translated using Weblate (Albanian) Currently translated at 100.0% (98 of 98 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/sq/ * Translated using Weblate (Albanian) Currently translated at 64.5% (487 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/ * Translated using Weblate (Slovak) Currently translated at 99.7% (753 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Slovenian) Currently translated at 40.0% (302 of 755 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sl/ * Translated using Weblate (Slovenian) Currently translated at 74.8% (80 of 107 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sl/ * Translated using Weblate (Slovenian) Currently translated at 45.2% (161 of 356 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sl/ * i18n-tasks normalize * yarn manage:translations * Fix inconsistent interpolations and unused keys * Fix missing plural forms --- app/javascript/mastodon/locales/ar.json | 2 + app/javascript/mastodon/locales/ast.json | 2 + app/javascript/mastodon/locales/bg.json | 2 + app/javascript/mastodon/locales/ca.json | 2 + app/javascript/mastodon/locales/co.json | 2 + app/javascript/mastodon/locales/cs.json | 26 +- app/javascript/mastodon/locales/cy.json | 26 +- app/javascript/mastodon/locales/da.json | 2 + app/javascript/mastodon/locales/de.json | 20 +- .../mastodon/locales/defaultMessages.json | 10 +- app/javascript/mastodon/locales/el.json | 18 +- app/javascript/mastodon/locales/en.json | 1 + app/javascript/mastodon/locales/eo.json | 2 + app/javascript/mastodon/locales/es.json | 2 + app/javascript/mastodon/locales/eu.json | 6 +- app/javascript/mastodon/locales/fa.json | 2 + app/javascript/mastodon/locales/fi.json | 2 + app/javascript/mastodon/locales/fr.json | 2 + app/javascript/mastodon/locales/gl.json | 2 + app/javascript/mastodon/locales/he.json | 2 + app/javascript/mastodon/locales/hr.json | 2 + app/javascript/mastodon/locales/hu.json | 2 + app/javascript/mastodon/locales/hy.json | 2 + app/javascript/mastodon/locales/id.json | 2 + app/javascript/mastodon/locales/io.json | 2 + app/javascript/mastodon/locales/it.json | 6 +- app/javascript/mastodon/locales/ja.json | 1 + app/javascript/mastodon/locales/ka.json | 2 + app/javascript/mastodon/locales/ko.json | 2 + app/javascript/mastodon/locales/lv.json | 264 ++++---- app/javascript/mastodon/locales/ms.json | 2 + app/javascript/mastodon/locales/nl.json | 2 + app/javascript/mastodon/locales/no.json | 2 + app/javascript/mastodon/locales/oc.json | 4 +- app/javascript/mastodon/locales/pl.json | 1 + app/javascript/mastodon/locales/pt-BR.json | 2 + app/javascript/mastodon/locales/pt.json | 2 + app/javascript/mastodon/locales/ro.json | 2 + app/javascript/mastodon/locales/ru.json | 2 + app/javascript/mastodon/locales/sk.json | 44 +- app/javascript/mastodon/locales/sl.json | 4 +- app/javascript/mastodon/locales/sq.json | 360 +++++++++++ app/javascript/mastodon/locales/sr-Latn.json | 2 + app/javascript/mastodon/locales/sr.json | 2 + app/javascript/mastodon/locales/sv.json | 2 + app/javascript/mastodon/locales/ta.json | 2 + app/javascript/mastodon/locales/te.json | 8 +- app/javascript/mastodon/locales/th.json | 2 + app/javascript/mastodon/locales/tr.json | 2 + app/javascript/mastodon/locales/uk.json | 2 + .../mastodon/locales/whitelist_sq.json | 2 + app/javascript/mastodon/locales/zh-CN.json | 2 + app/javascript/mastodon/locales/zh-HK.json | 2 + app/javascript/mastodon/locales/zh-TW.json | 2 + config/locales/activerecord.sq.yml | 13 + config/locales/ar.yml | 1 + config/locales/co.yml | 3 + config/locales/cs.yml | 102 +-- config/locales/cy.yml | 133 +++- config/locales/devise.cs.yml | 10 +- config/locales/devise.cy.yml | 9 +- config/locales/devise.sk.yml | 14 +- config/locales/devise.sq.yml | 83 +++ config/locales/doorkeeper.cs.yml | 2 +- config/locales/doorkeeper.sq.yml | 142 ++++ config/locales/el.yml | 6 +- config/locales/eu.yml | 61 +- config/locales/ga.yml | 4 + config/locales/id.yml | 53 ++ config/locales/it.yml | 2 +- config/locales/ja.yml | 4 +- config/locales/ko.yml | 6 +- config/locales/lt.yml | 182 ++++++ config/locales/simple_form.cs.yml | 6 +- config/locales/simple_form.cy.yml | 14 + config/locales/simple_form.eu.yml | 1 + config/locales/simple_form.gl.yml | 2 +- config/locales/simple_form.sk.yml | 16 +- config/locales/simple_form.sl.yml | 2 +- config/locales/simple_form.sq.yml | 1 + config/locales/sk.yml | 42 +- config/locales/sl.yml | 269 +++++++- config/locales/sq.yml | 612 ++++++++++++++++++ config/locales/sr.yml | 10 +- 84 files changed, 2346 insertions(+), 334 deletions(-) create mode 100644 app/javascript/mastodon/locales/sq.json create mode 100644 app/javascript/mastodon/locales/whitelist_sq.json create mode 100644 config/locales/activerecord.sq.yml create mode 100644 config/locales/devise.sq.yml create mode 100644 config/locales/doorkeeper.sq.yml create mode 100644 config/locales/ga.yml create mode 100644 config/locales/lt.yml create mode 100644 config/locales/simple_form.sq.yml create mode 100644 config/locales/sq.yml diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 1486272e22..78e63e5e68 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "إلغاء الترقية", "status.cannot_reblog": "تعذرت ترقية هذا المنشور", + "status.copy": "Copy link to status", "status.delete": "Ø¥ØØ°Ù", "status.detailed_status": "تÙاصيل المØادثة", "status.direct": "رسالة خاصة إلى @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "سو٠تÙقد مسودتك إن تركت ماستدون.", "upload_area.title": "إسØب ثم Ø£Ùلت للرÙع", "upload_button.label": "إضاÙØ© وسائط (JPEGØŒ PNGØŒ GIFØŒ WebMØŒ MP4ØŒ MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "وص٠للمعاقين بصريا", "upload_form.focus": "قص", "upload_form.undo": "ØØ°Ù", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index a9407e82dd..a94e235722 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -297,6 +297,7 @@ "status.block": "Bloquiar a @{name}", "status.cancel_reblog_private": "Dexar de compartir", "status.cannot_reblog": "Esti artÃculu nun pue compartise", + "status.copy": "Copy link to status", "status.delete": "Delete", "status.detailed_status": "Detailed conversation view", "status.direct": "Unviar un mensaxe direutu a @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "El borrador va perdese si coles de Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Descripción pa discapacitaos visuales", "upload_form.focus": "Crop", "upload_form.undo": "Desaniciar", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index a812f5cb1a..a5ab165b75 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", "status.delete": "Изтриване", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Добави медиÑ", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", "upload_form.undo": "ОтмÑна", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 07a4f01746..8519590b75 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Desfer l'impuls", "status.cannot_reblog": "Aquesta publicació no pot ser retootejada", + "status.copy": "Copy link to status", "status.delete": "Esborrar", "status.detailed_status": "Visualització detallada de la conversa", "status.direct": "Missatge directe @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "El vostre esborrany es perdrà si sortiu de Mastodon.", "upload_area.title": "Arrossega i deixa anar per carregar", "upload_button.label": "Afegir multimèdia (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Descriure els problemes visuals", "upload_form.focus": "Modificar la previsualització", "upload_form.undo": "Esborra", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 496f13e7d5..b4d8f9781f 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -297,6 +297,7 @@ "status.block": "Bluccà @{name}", "status.cancel_reblog_private": "Ùn sparte più", "status.cannot_reblog": "Stu statutu ùn pò micca esse spartutu", + "status.copy": "Copy link to status", "status.delete": "Toglie", "status.detailed_status": "Vista in ditagliu di a cunversazione", "status.direct": "Mandà un missaghju @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "A bruttacopia sarà persa s'ellu hè chjosu Mastodon.", "upload_area.title": "Drag & drop per caricà un fugliale", "upload_button.label": "Aghjunghje un media (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Discrive per i malvistosi", "upload_form.focus": "Cambià a vista", "upload_form.undo": "Sguassà ", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index e11e0be93e..508b5debeb 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -10,7 +10,7 @@ "account.edit_profile": "Upravit profil", "account.endorse": "PÅ™edstavit na profilu", "account.follow": "Sledovat", - "account.followers": "Sledovatelé", + "account.followers": "SledujÃcÃ", "account.followers.empty": "Tohoto uživatele jeÅ¡tÄ› nikdo nesleduje.", "account.follows": "SledovanÃ", "account.follows.empty": "Tento uživatel jeÅ¡tÄ› nikoho nesleduje.", @@ -70,8 +70,8 @@ "compose_form.direct_message_warning": "Tento toot bude odeslán pouze zmÃnÄ›ným uživatelům.", "compose_form.direct_message_warning_learn_more": "Zjistit vÃce", "compose_form.hashtag_warning": "Tento toot nebude zobrazen pod žádným hashtagem, neboÅ¥ je neuvedený. Pouze veÅ™ejné tooty mohou být vyhledány podle hashtagu.", - "compose_form.lock_disclaimer": "Váš úÄet nenà {locked}. Kdokoliv vás může sledovat a vidÄ›t vaÅ¡e pÅ™ÃspÄ›vky pouze pro sledovatele.", - "compose_form.lock_disclaimer.lock": "zamÄený", + "compose_form.lock_disclaimer": "Váš úÄet nenà {locked}. Kdokoliv vás může sledovat a vidÄ›t vaÅ¡e pÅ™ÃspÄ›vky pouze pro sledujÃcÃ.", + "compose_form.lock_disclaimer.lock": "uzamÄen", "compose_form.placeholder": "Co máte na mysli?", "compose_form.publish": "Tootnout", "compose_form.publish_loud": "{publish}!", @@ -88,7 +88,7 @@ "confirmations.delete_list.confirm": "Smazat", "confirmations.delete_list.message": "Jste si jistý/á, že chcete tento seznam navždy vymazat?", "confirmations.domain_block.confirm": "Skrýt celou doménu", - "confirmations.domain_block.message": "Jste si opravdu, opravdu jistý/á, že chcete blokovat celou {domain}? Ve vÄ›tÅ¡inÄ› pÅ™Ãpadů staÄà zablokovat nebo ignorovat pár konkrétnÃch uživatelů, což se doporuÄuje. Z této domény neuvidÃte obsah v žádné veÅ™ejné Äasové ose ani v oznámenÃch. VaÅ¡i sledovatelé z této domény budou odstranÄ›ni.", + "confirmations.domain_block.message": "Jste si opravdu, opravdu jistý/á, že chcete blokovat celou doménu {domain}? Ve vÄ›tÅ¡inÄ› pÅ™Ãpadů staÄà zablokovat nebo ignorovat pár konkrétnÃch uživatelů, což se doporuÄuje. Z této domény neuvidÃte obsah v žádné veÅ™ejné Äasové ose ani v oznámenÃch. VaÅ¡i sledujÃcà z této domény budou odstranÄ›ni.", "confirmations.mute.confirm": "Ignorovat", "confirmations.mute.message": "Jste si jistý/á, že chcete ignorovat uživatele {name}?", "confirmations.redraft.confirm": "Vymazat a pÅ™epsat", @@ -128,7 +128,7 @@ "empty_column.lists": "JeÅ¡tÄ› nemáte žádný seznam. Pokud nÄ›jaký vytvoÅ™Ãte, zobrazà se zde.", "empty_column.mutes": "JeÅ¡tÄ› neignorujete žádné uživatele.", "empty_column.notifications": "JeÅ¡tÄ› nemáte žádná oznámenÃ. ZaÄnÄ›te konverzaci komunikovánÃm s ostatnÃmi.", - "empty_column.public": "Tady nic nenÃ! NapiÅ¡te nÄ›co veÅ™ejnÄ›, nebo manuálnÄ› zaÄnÄ›te sledovat uživatele z jiných instancÃ, aby tu nÄ›co pÅ™ibylo", + "empty_column.public": "Tady nic nenÃ! NapiÅ¡te nÄ›co veÅ™ejnÄ›, nebo zaÄnÄ›te ruÄnÄ› sledovat uživatele z jiných serverů, aby tu nÄ›co pÅ™ibylo", "follow_request.authorize": "Autorizovat", "follow_request.reject": "OdmÃtnout", "getting_started.developers": "Vývojáři", @@ -160,7 +160,7 @@ "introduction.interactions.favourite.headline": "OblÃbenÃ", "introduction.interactions.favourite.text": "OblÃbenÃm si můžete uložit toot na pozdÄ›ji a dát jeho autorovi vÄ›dÄ›t, že se vám lÃbÃ.", "introduction.interactions.reblog.headline": "Boost", - "introduction.interactions.reblog.text": "BoostnutÃm můžete sdÃlet tooty jiných lidà s vaÅ¡imi sledovately.", + "introduction.interactions.reblog.text": "BoostnutÃm můžete sdÃlet tooty jiných lidà s vaÅ¡imi sledujÃcÃmi.", "introduction.interactions.reply.headline": "OdpovÄ›Ä", "introduction.interactions.reply.text": "Můžete odpovÃdat na tooty jiných lidà i vaÅ¡e vlastnÃ, což je propojà do konverzace.", "introduction.welcome.action": "Jdeme na to!", @@ -224,10 +224,10 @@ "navigation_bar.favourites": "OblÃbené", "navigation_bar.filters": "Skrytá slova", "navigation_bar.follow_requests": "Požadavky o sledovánÃ", - "navigation_bar.info": "O této instanci", + "navigation_bar.info": "O tomto serveru", "navigation_bar.keyboard_shortcuts": "Klávesové zkratky", "navigation_bar.lists": "Seznamy", - "navigation_bar.logout": "Odhlásit se", + "navigation_bar.logout": "Odhlásit", "navigation_bar.mutes": "Ignorovanà uživatelé", "navigation_bar.personal": "OsobnÃ", "navigation_bar.pins": "PÅ™ipnuté tooty", @@ -245,7 +245,7 @@ "notifications.column_settings.filter_bar.advanced": "Zobrazit vÅ¡echny kategorie", "notifications.column_settings.filter_bar.category": "Panel rychlého filtrovánÃ", "notifications.column_settings.filter_bar.show": "Zobrazit", - "notifications.column_settings.follow": "Novà sledovatelé:", + "notifications.column_settings.follow": "Novà sledujÃcÃ:", "notifications.column_settings.mention": "ZmÃnky:", "notifications.column_settings.push": "Push oznámenÃ", "notifications.column_settings.reblog": "Boosty:", @@ -260,8 +260,8 @@ "privacy.change": "ZmÄ›nit soukromà pÅ™ÃspÄ›vku", "privacy.direct.long": "Odeslat pouze zmÃnÄ›ným uživatelům", "privacy.direct.short": "PÅ™Ãmý", - "privacy.private.long": "Odeslat pouze sledovatelům", - "privacy.private.short": "Pouze pro sledovatele", + "privacy.private.long": "Odeslat pouze sledujÃcÃm", + "privacy.private.short": "Pouze pro sledujÃcÃ", "privacy.public.long": "Odeslat na veÅ™ejné Äasové osy", "privacy.public.short": "VeÅ™ejný", "privacy.unlisted.long": "Neodeslat na veÅ™ejné Äasové osy", @@ -276,7 +276,7 @@ "reply_indicator.cancel": "ZruÅ¡it", "report.forward": "PÅ™eposlat na {target}", "report.forward_hint": "Tento úÄet je z jiného serveru. Chcete na nÄ›j také poslat anonymizovanou kopii?", - "report.hint": "Toto nahlášenà bude zasláno moderátorům vaÅ¡Ã instance. NÞe můžete uvést, proÄ tento úÄet nahlaÅ¡ujete:", + "report.hint": "Toto nahlášenà bude zasláno moderátorům vaÅ¡eho serveru. NÞe můžete uvést, proÄ tento úÄet nahlaÅ¡ujete:", "report.placeholder": "DodateÄné komentáře", "report.submit": "Odeslat", "report.target": "Nahlášenà uživatele {target}", @@ -297,6 +297,7 @@ "status.block": "Zablokovat uživatele @{name}", "status.cancel_reblog_private": "ZruÅ¡it boost", "status.cannot_reblog": "Tento pÅ™ÃspÄ›vek nemůže být boostnutý", + "status.copy": "Copy link to status", "status.delete": "Smazat", "status.detailed_status": "Detailnà zobrazenà konverzace", "status.direct": "Poslat pÅ™Ãmou zprávu uživateli @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Váš koncept se ztratÃ, pokud Mastodon opustÃte.", "upload_area.title": "PÅ™etaženÃm nahrajete", "upload_button.label": "PÅ™idat média (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Popis pro zrakovÄ› postižené", "upload_form.focus": "ZmÄ›nit náhled", "upload_form.undo": "Smazat", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index f35b96244e..df08b907c1 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -1,5 +1,5 @@ { - "account.add_or_remove_from_list": "Add or Remove from lists", + "account.add_or_remove_from_list": "Ychwanegu neu Dileu o'r rhestrau", "account.badges.bot": "Bot", "account.block": "Blocio @{name}", "account.block_domain": "Cuddio popeth rhag {domain}", @@ -17,7 +17,7 @@ "account.follows_you": "Yn eich dilyn chi", "account.hide_reblogs": "Cuddio bwstiau o @{name}", "account.link_verified_on": "Gwiriwyd perchnogaeth y ddolen yma ar {date}", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.locked_info": "Mae'r statws preifatrwydd cyfrif hwn wedi'i osod i gloi. Mae'r perchennog yn adolygu'r sawl sy'n gallu eu dilyn.", "account.media": "Cyfryngau", "account.mention": "Crybwyll @{name}", "account.moved_to": "Mae @{name} wedi symud i:", @@ -132,7 +132,7 @@ "follow_request.authorize": "Caniatau", "follow_request.reject": "Gwrthod", "getting_started.developers": "Datblygwyr", - "getting_started.directory": "Profile directory", + "getting_started.directory": "Cyfeiriadur proffil", "getting_started.documentation": "Dogfennaeth", "getting_started.heading": "Dechrau", "getting_started.invite": "Gwahodd pobl", @@ -156,15 +156,15 @@ "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", "introduction.federation.local.headline": "Local", "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", - "introduction.interactions.action": "Finish tutorial!", + "introduction.interactions.action": "Gorffen tiwtorial!", "introduction.interactions.favourite.headline": "Ffefryn", "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", "introduction.interactions.reblog.headline": "Hwb", "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", "introduction.interactions.reply.headline": "Ateb", "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", - "introduction.welcome.action": "Let's go!", - "introduction.welcome.headline": "First steps", + "introduction.welcome.action": "Awn ni!", + "introduction.welcome.headline": "Camau cyntaf", "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", "keyboard_shortcuts.back": "i lywio nôl", "keyboard_shortcuts.blocked": "i agor rhestr defnyddwyr a flociwyd", @@ -242,8 +242,8 @@ "notifications.clear_confirmation": "Ydych chi'n sicr eich bod am glirio'ch holl hysbysiadau am byth?", "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith", "notifications.column_settings.favourite": "Ffefrynnau:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", - "notifications.column_settings.filter_bar.category": "Quick filter bar", + "notifications.column_settings.filter_bar.advanced": "Dangos pob categori", + "notifications.column_settings.filter_bar.category": "Bar hidlo", "notifications.column_settings.filter_bar.show": "Dangos", "notifications.column_settings.follow": "Dilynwyr newydd:", "notifications.column_settings.mention": "Crybwylliadau:", @@ -255,7 +255,7 @@ "notifications.filter.boosts": "Hybiadau", "notifications.filter.favourites": "Ffefrynnau", "notifications.filter.follows": "Yn dilyn", - "notifications.filter.mentions": "Mentions", + "notifications.filter.mentions": "Crybwylliadau", "notifications.group": "{count} o hysbysiadau", "privacy.change": "Addasu preifatrwdd y tŵt", "privacy.direct.long": "Cyhoeddi i'r defnyddwyr sy'n cael eu crybwyll yn unig", @@ -290,13 +290,14 @@ "search_results.accounts": "Pobl", "search_results.hashtags": "Hanshnodau", "search_results.statuses": "Tŵtiau", - "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "search_results.total": "{count, number} {count, plural, one {result} arall {results}}", "standalone.public_title": "Golwg tu fewn...", "status.admin_account": "Open moderation interface for @{name}", "status.admin_status": "Open this tŵt in the moderation interface", "status.block": "Blocio @{name}", "status.cancel_reblog_private": "Dadfŵstio", "status.cannot_reblog": "Ni ellir sbarduno'r tŵt hwn", + "status.copy": "Copy link to status", "status.delete": "Dileu", "status.detailed_status": "Golwg manwl o'r sgwrs", "status.direct": "Neges breifat @{name}", @@ -331,8 +332,8 @@ "status.show_thread": "Dangos edefyn", "status.unmute_conversation": "Dad-dawelu sgwrs", "status.unpin": "Dadbinio o'r proffil", - "suggestions.dismiss": "Dismiss suggestion", - "suggestions.header": "You might be interested in…", + "suggestions.dismiss": "Diswyddo", + "suggestions.header": "Efallai y bydd gennych ddiddordeb mewn…", "tabs_bar.federated_timeline": "Ffederasiwn", "tabs_bar.home": "Hafan", "tabs_bar.local_timeline": "Lleol", @@ -342,6 +343,7 @@ "ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.", "upload_area.title": "Llusgwch & gollwing i uwchlwytho", "upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg", "upload_form.focus": "Newid rhagolwg", "upload_form.undo": "Dileu", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 60315211ad..f418d26f79 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -297,6 +297,7 @@ "status.block": "Bloker @{name}", "status.cancel_reblog_private": "Fremhæv ikke længere", "status.cannot_reblog": "Denne post kan ikke fremhæves", + "status.copy": "Copy link to status", "status.delete": "Slet", "status.detailed_status": "Detaljeret visning af samtale", "status.direct": "Send direkte besked til @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Din kladde vil gÃ¥ tabt hvis du forlader Mastodon.", "upload_area.title": "Træk og slip for at uploade", "upload_button.label": "Tilføj medie (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Beskriv for de svagtseende", "upload_form.focus": "Beskær", "upload_form.undo": "Slet", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 3a55f26a75..e7cfd48b72 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -150,20 +150,20 @@ "home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen", "home.column_settings.show_replies": "Antworten anzeigen", "introduction.federation.action": "Weiter", - "introduction.federation.federated.headline": "Federated", - "introduction.federation.federated.text": "Öffentliche Beiträge von anderen Servern im Fediverse werden in der föderierten Zeitleiste erscheinen.", + "introduction.federation.federated.headline": "Föderiert", + "introduction.federation.federated.text": "Öffentliche Beiträge von anderen Servern im Fediverse erscheinen in der föderierten Zeitleiste.", "introduction.federation.home.headline": "Home", - "introduction.federation.home.text": "Beiträge von Leuten, denen du folgst werden in deiner Startseite erscheinen. Du kannst jedem auf irgendeinen Server folgen!", - "introduction.federation.local.headline": "Local", - "introduction.federation.local.text": "Öffentliche Beiträge von Leuten auf demselben Server wie du werden in der lokalen Zeitleiste erscheinen.", + "introduction.federation.home.text": "Beiträge von Leuten, denen du folgst, erscheinen in deiner Start-Zeitleiste. Du kannst Menschen auf beliebigen Servern folgen!", + "introduction.federation.local.headline": "Lokal", + "introduction.federation.local.text": "Öffentliche Beiträge von Leuten auf demselben Server wie du erscheinen in der lokalen Zeitleiste.", "introduction.interactions.action": "Tutorial beenden!", "introduction.interactions.favourite.headline": "Favorisieren", - "introduction.interactions.favourite.text": "Du kannst einen Beitrag für später speichern und dem Autor wissen lassen, dass du ihn magst, indem du ihn favorisierst.", + "introduction.interactions.favourite.text": "Du kannst Beitrage für später speichern und ihre AutorInnen wissen lassen, dass sie dir gefallen haben, indem du sie favorisierst.", "introduction.interactions.reblog.headline": "Teilen", - "introduction.interactions.reblog.text": "Du kannst Beiträge von anderen Leuten an deine Follower teilen.", + "introduction.interactions.reblog.text": "Du kannst Beiträge anderer mit deinen Followern teilen, indem du sie boostest.", "introduction.interactions.reply.headline": "Antworten", - "introduction.interactions.reply.text": "Du kannst auf die Beiträge von anderen Leuten antworten und die Beiträge werden dann in eine Konversation zusammengebunden.", - "introduction.welcome.action": "Lasst uns loslegen!", + "introduction.interactions.reply.text": "Du kannst auf die Beiträge anderer antworten und die Beiträge werden dann in einer Unterhaltung zusammengefasst.", + "introduction.welcome.action": "Lass uns loslegen!", "introduction.welcome.headline": "Erste Schritte", "introduction.welcome.text": "Willkommen im Fediverse! In wenigen Momenten wirst du in der Lage sein Nachrichten zu versenden und mit deinen Freunden über Server hinweg in Kontakt zu treten. Aber dieser Server, {domain}, ist sehr speziell — er hostet dein Profil, also merke dir den Namen.", "keyboard_shortcuts.back": "zurück navigieren", @@ -297,6 +297,7 @@ "status.block": "Blockiere @{name}", "status.cancel_reblog_private": "Nicht mehr teilen", "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden", + "status.copy": "Copy link to status", "status.delete": "Löschen", "status.detailed_status": "Detaillierte Ansicht der Konversation", "status.direct": "Direktnachricht @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Dein Entwurf geht verloren, wenn du Mastodon verlässt.", "upload_area.title": "Zum Hochladen hereinziehen", "upload_button.label": "Mediendatei hinzufügen (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Für Menschen mit Sehbehinderung beschreiben", "upload_form.focus": "Thumbnail bearbeiten", "upload_form.undo": "Löschen", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 5df071839a..86b2a4a1d6 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -319,6 +319,10 @@ { "defaultMessage": "Open this status in the moderation interface", "id": "status.admin_status" + }, + { + "defaultMessage": "Copy link to status", + "id": "status.copy" } ], "path": "app/javascript/mastodon/components/status_action_bar.json" @@ -1955,6 +1959,10 @@ { "defaultMessage": "Open this status in the moderation interface", "id": "status.admin_status" + }, + { + "defaultMessage": "Copy link to status", + "id": "status.copy" } ], "path": "app/javascript/mastodon/features/status/components/action_bar.json" @@ -2294,4 +2302,4 @@ ], "path": "app/javascript/mastodon/features/video/index.json" } -] +] \ No newline at end of file diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 7b4852271b..165f90f0cb 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -7,7 +7,7 @@ "account.direct": "Î Ïοσωπικό μήνυμα Ï€Ïος @{name}", "account.disclaimer_full": "Οι παÏακάτω πληÏοφοÏίες μποÏει να μην αντανακλοÏν το Ï€Ïοφίλ του χÏήστη επαÏκως.", "account.domain_blocked": "ΚÏυμμÎνος τομÎας", - "account.edit_profile": "ΕπεξεÏγάσου το Ï€Ïοφίλ", + "account.edit_profile": "ΕπεξεÏγασία Ï€Ïοφίλ", "account.endorse": "Î Ïοβολή στο Ï€Ïοφίλ", "account.follow": "ΑκολοÏθησε", "account.followers": "Ακόλουθοι", @@ -145,16 +145,16 @@ "hashtag.column_settings.tag_mode.all": "Όλα αυτα", "hashtag.column_settings.tag_mode.any": "Οποιοδήποτε από αυτά", "hashtag.column_settings.tag_mode.none": "ΚανÎνα από αυτά", - "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "hashtag.column_settings.tag_toggle": "Î Ïοσθήκη επιπλÎον ταμπελών για την κολώνα", "home.column_settings.basic": "Βασικά", "home.column_settings.show_reblogs": "Εμφάνιση Ï€Ïοωθήσεων", "home.column_settings.show_replies": "Εμφάνιση απαντήσεων", "introduction.federation.action": "Επόμενο", - "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.headline": "Ομοσπονδιακή", "introduction.federation.federated.text": "Οι δημόσιες αναÏτήσεις από άλλους κόμβους του fediverse θα εμφανίζονται στην ομοσπονδιακή Ïοή.", - "introduction.federation.home.headline": "Home", + "introduction.federation.home.headline": "ΑÏχική", "introduction.federation.home.text": "Οι αναÏτήσεις όσων ακολουθείς θα εμφανίζονται στην αÏχική Ïοή. ΜποÏείς να ακολουθήσεις όποιον θÎλεις σε οποιονδήποτε κόμβο!", - "introduction.federation.local.headline": "Local", + "introduction.federation.local.headline": "Τοπική", "introduction.federation.local.text": "Οι δημόσιες αναÏτήσεις από άτομα στον ίδιο κόμβο με εσÎνα θα εμφανίζονται στην τοπική Ïοή.", "introduction.interactions.action": "ΤÎλος μαθήματος!", "introduction.interactions.favourite.headline": "ΑγαπημÎνο", @@ -165,7 +165,7 @@ "introduction.interactions.reply.text": "ΜποÏείς να απαντήσεις στα τουτ άλλων αλλά ακόμα και στα δικά σου, δÎνοντας τα όλα μαζί σε μια συζήτηση.", "introduction.welcome.action": "Ας ξεκινήσουμε!", "introduction.welcome.headline": "Î Ïώτα βήματα", - "introduction.welcome.text": "Καλώς ήÏθες στο fediverse! Σε Ï€Î¿Î»Ï Î»Î¯Î³Î¿ θα μποÏείς να στÎλνεις δημοσιεÏσεις και να μιλάς με τους φίλους σου σε πολλοÏÏ‚, διαφοÏετικοÏÏ‚ κόμβους. Ο κόμβος {domain} όμως είναι ξεχωÏιστός — φιλοξενεί τον λογαÏιασμό σου, για αυτό μα θυμάσαι το όνομά του.", + "introduction.welcome.text": "Καλώς ήÏθες στο fediverse! Σε Ï€Î¿Î»Ï Î»Î¯Î³Î¿ θα μποÏείς να στÎλνεις δημοσιεÏσεις και να μιλάς με τους φίλους σου σε πολλοÏÏ‚, διαφοÏετικοÏÏ‚ κόμβους. Ο κόμβος {domain} όμως είναι ξεχωÏιστός — φιλοξενεί τον λογαÏιασμό σου, για αυτό να θυμάσαι το όνομά του.", "keyboard_shortcuts.back": "επιστÏοφή", "keyboard_shortcuts.blocked": "άνοιγμα λίστας αποκλεισμÎνων χÏηστών", "keyboard_shortcuts.boost": "Ï€Ïοώθηση", @@ -292,11 +292,12 @@ "search_results.statuses": "Τουτ", "search_results.total": "{count, number} {count, plural, Îνα {result} υπόλοιπα {results}}", "standalone.public_title": "Μια Ï€Ïώτη γεÏση...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Άνοιγμα λειτουÏγίας διαμεσολάβησης για τον/την @{name}", + "status.admin_status": "Άνοιγμα αυτής της δημοσίευσης στη λειτουÏγία διαμεσολάβησης", "status.block": "Αποκλεισμός @{name}", "status.cancel_reblog_private": "ΑκÏÏωσε την Ï€Ïοώθηση", "status.cannot_reblog": "Αυτή η δημοσίευση δεν μποÏεί να Ï€Ïοωθηθεί", + "status.copy": "Copy link to status", "status.delete": "ΔιαγÏαφή", "status.detailed_status": "Î Ïοβολή λεπτομεÏειών συζήτησης", "status.direct": "Î Ïοσωπικό μήνυμα Ï€Ïος @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Το Ï€ÏοσχÎδιό σου θα χαθεί αν φÏγεις από το Mastodon.", "upload_area.title": "Drag & drop για να ανεβάσεις", "upload_button.label": "Î Ïόσθεσε πολυμÎσα (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "ΠεÏιÎγÏαψε για όσους & όσες Îχουν Ï€Ïοβλήματα ÏŒÏασης", "upload_form.focus": "Αλλαγή Ï€Ïοεπισκόπησης", "upload_form.undo": "ΔιαγÏαφή", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 03af57ba80..58e672aa53 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", "status.delete": "Delete", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 8be964a52a..759eed46a0 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -297,6 +297,7 @@ "status.block": "Bloki @{name}", "status.cancel_reblog_private": "Eksdiskonigi", "status.cannot_reblog": "Ĉi tiu mesaÄo ne diskonigeblas", + "status.copy": "Copy link to status", "status.delete": "Forigi", "status.detailed_status": "Detala konversacia vido", "status.direct": "Rekte mesaÄi @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Via malneto perdiÄos se vi eliras de Mastodon.", "upload_area.title": "Altreni kaj lasi por alÅuti", "upload_button.label": "Aldoni aÅdovidaĵon (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Priskribi por misvidantaj homoj", "upload_form.focus": "Stuci", "upload_form.undo": "Forigi", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 4f73dbba24..43bfe039ca 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Des-impulsar", "status.cannot_reblog": "Este toot no puede retootearse", + "status.copy": "Copy link to status", "status.delete": "Borrar", "status.detailed_status": "Vista de conversación detallada", "status.direct": "Mensaje directo a @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.", "upload_area.title": "Arrastra y suelta para subir", "upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Describir para los usuarios con dificultad visual", "upload_form.focus": "Recortar", "upload_form.undo": "Borrar", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 0602fbf9e9..747348e718 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -292,11 +292,12 @@ "search_results.statuses": "Toot-ak", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "Begiradatxo bat...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Ireki @{name} erabiltzailearen moderazio interfazea", + "status.admin_status": "Ireki mezu hau moderazio interfazean", "status.block": "Block @{name}", "status.cancel_reblog_private": "Kendu bultzada", "status.cannot_reblog": "Mezu honi ezin zaio bultzada eman", + "status.copy": "Copy link to status", "status.delete": "Ezabatu", "status.detailed_status": "Elkarrizketaren ikuspegi xehetsua", "status.direct": "Mezu zuzena @{name}(r)i", @@ -342,6 +343,7 @@ "ui.beforeunload": "Zure zirriborroa galduko da Mastodon uzten baduzu.", "upload_area.title": "Arrastatu eta jaregin igotzeko", "upload_button.label": "Gehitu multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Deskribatu ikusmen arazoak dituztenentzat", "upload_form.focus": "Aldatu aurrebista", "upload_form.undo": "Ezabatu", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index b11d88d875..44c39802a1 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -297,6 +297,7 @@ "status.block": "مسدودسازی @{name}", "status.cancel_reblog_private": "Øذ٠بازبوق", "status.cannot_reblog": "این نوشته را نمی‌شود بازبوقید", + "status.copy": "Copy link to status", "status.delete": "پاک‌کردن", "status.detailed_status": "نمایش کامل Ú¯Ùتگو", "status.direct": "پیغام مستقیم به @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "اگر از ماستدون خارج شوید پیش‌نویس شما پاک خواهد شد.", "upload_area.title": "برای بارگذاری به این‌جا بکشید", "upload_button.label": "اÙزودن عکس Ùˆ ویدیو (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "نوشتهٔ توضیØÛŒ برای کم‌بینایان Ùˆ نابینایان", "upload_form.focus": "بریدن لبه‌ها", "upload_form.undo": "ØØ°Ù", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index c8d2586723..6e878d7ff6 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -297,6 +297,7 @@ "status.block": "Estä @{name}", "status.cancel_reblog_private": "Peru buustaus", "status.cannot_reblog": "Tätä julkaisua ei voi buustata", + "status.copy": "Copy link to status", "status.delete": "Poista", "status.detailed_status": "Detailed conversation view", "status.direct": "Viesti käyttäjälle @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.", "upload_area.title": "Lataa raahaamalla ja pudottamalla tähän", "upload_button.label": "Lisää mediaa", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Anna kuvaus näkörajoitteisia varten", "upload_form.focus": "Rajaa", "upload_form.undo": "Peru", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 7628968879..24182c00b9 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Dé-booster", "status.cannot_reblog": "Cette publication ne peut être boostée", + "status.copy": "Copy link to status", "status.delete": "Effacer", "status.detailed_status": "Vue détaillée de la conversation", "status.direct": "Envoyer un message direct à @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.", "upload_area.title": "Glissez et déposez pour envoyer", "upload_button.label": "Joindre un média (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Décrire pour les malvoyant·e·s", "upload_form.focus": "Modifier l’aperçu", "upload_form.undo": "Supprimer", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index c1ece163d7..45bc2d36c5 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Non promover", "status.cannot_reblog": "Esta mensaxe non pode ser promovida", + "status.copy": "Copy link to status", "status.delete": "Eliminar", "status.detailed_status": "Vista detallada da conversa", "status.direct": "Mensaxe directa @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "O borrador perderase se sae de Mastodon.", "upload_area.title": "Arrastre e solte para subir", "upload_button.label": "Engadir medios (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Describa para deficientes visuais", "upload_form.focus": "Cambiar vista previa", "upload_form.undo": "Eliminar", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index e27e7f09e6..13278382fd 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "×œ× × ×™×ª×Ÿ להדהד הודעה זו", + "status.copy": "Copy link to status", "status.delete": "מחיקה", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "×”×˜×™×•×˜× ×ª×בד ×× ×ª×¢×–×‘×• ×ת מסטודון.", "upload_area.title": "× ×™×ª×Ÿ להעלות על ידי Drag & drop", "upload_button.label": "הוספת מדיה", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "תי×ור לכבדי ר××™×”", "upload_form.focus": "Crop", "upload_form.undo": "ביטול", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 71dd5319e7..a4aafd8fbe 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Ovaj post ne može biti boostan", + "status.copy": "Copy link to status", "status.delete": "ObriÅ¡i", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Povuci i spusti kako bi uploadao", "upload_button.label": "Dodaj media", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", "upload_form.undo": "PoniÅ¡ti", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index c2842aea7b..41734b58da 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Ezen státusz nem rebloggolható", + "status.copy": "Copy link to status", "status.delete": "Törlés", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "A piszkozata el fog vesztÅ‘dni ha elhagyja Mastodon-t.", "upload_area.title": "Húzza ide a feltöltéshez", "upload_button.label": "Média hozzáadása", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", "upload_form.undo": "Mégsem", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 6919948874..2169bb9908 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -297,6 +297,7 @@ "status.block": "Ô±Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬ @{name}ÖŠÕ«Õ¶", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Ô±ÕµÕ½ Õ©Õ¸Ö‚Õ©Õ¨ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ¿Õ¡Ö€Õ¡Õ®Õ¾Õ¥Õ¬", + "status.copy": "Copy link to status", "status.delete": "Õ‹Õ¶Õ»Õ¥Õ¬", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Õ”Õ¸ Õ½Õ¥Ö‚Õ¡Õ£Õ«Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ«, Õ¥Õ©Õ¥ Õ¬Ö„Õ¥Õ½ Õ„Õ¡Õ½Õ¿Õ¸Õ¤Õ¸Õ¶Õ¨Ö‰", "upload_area.title": "Õ”Õ¡Õ·Õ«Ö€ Õ¸Ö‚ Õ¶Õ¥Õ¿Õ«Ö€Õ Õ¾Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€", "upload_button.label": "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ´Õ¥Õ¤Õ«Õ¡", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Õ†Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÖ€Õ¸Ö‚ Õ¿Õ¥Õ½Õ¸Õ²Õ¡Õ¯Õ¡Õ¶ ÕÕ¶Õ¤Õ«Ö€Õ¶Õ¥Ö€ Õ¸Ö‚Õ¶Õ¥ÖÕ¸Õ²Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€", "upload_form.focus": "Crop", "upload_form.undo": "Õ€Õ¥Õ¿Õ¡Ö€Õ¯Õ¥Õ¬", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index eed61af707..c8cd2b3d29 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", "status.delete": "Hapus", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Naskah anda akan hilang jika anda keluar dari Mastodon.", "upload_area.title": "Seret & lepaskan untuk mengunggah", "upload_button.label": "Tambahkan media", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Deskripsikan untuk mereka yang tidak bisa melihat dengan jelas", "upload_form.focus": "Potong", "upload_form.undo": "Undo", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index b26fa6c4ab..17f74cbabc 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", "status.delete": "Efacar", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Tranar faligar por kargar", "upload_button.label": "Adjuntar kontenajo", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", "upload_form.undo": "Desfacar", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 1f52d37248..423efdbc3c 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -292,11 +292,12 @@ "search_results.statuses": "Toot", "search_results.total": "{count} {count, plural, one {risultato} other {risultati}}", "standalone.public_title": "Un'occhiata all'interno...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Apri interfaccia di moderazione per @{name}", + "status.admin_status": "Apri questo status nell'interfaccia di moderazione", "status.block": "Block @{name}", "status.cancel_reblog_private": "Annulla condivisione", "status.cannot_reblog": "Questo post non può essere condiviso", + "status.copy": "Copy link to status", "status.delete": "Elimina", "status.detailed_status": "Vista conversazione dettagliata", "status.direct": "Messaggio diretto @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "La bozza andrà persa se esci da Mastodon.", "upload_area.title": "Trascina per caricare", "upload_button.label": "Aggiungi file multimediale", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Descrizione per utenti con disabilità visive", "upload_form.focus": "Modifica anteprima", "upload_form.undo": "Cancella", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 92f9b0effe..13364066fa 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -297,6 +297,7 @@ "status.block": "@{name}ã•ã‚“をブãƒãƒƒã‚¯", "status.cancel_reblog_private": "ブースト解除", "status.cannot_reblog": "ã“ã®æŠ•ç¨¿ã¯ãƒ–ーストã§ãã¾ã›ã‚“", + "status.copy": "Copy link to status", "status.delete": "削除", "status.detailed_status": "詳細ãªä¼šè©±ãƒ“ュー", "status.direct": "@{name}ã•ã‚“ã«ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 93a11027a6..e2e7306fd0 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -297,6 +297,7 @@ "status.block": "დáƒáƒ‘ლáƒáƒ™áƒ” @{name}", "status.cancel_reblog_private": "ბუსტის მáƒáƒ¨áƒáƒ ებáƒ", "status.cannot_reblog": "ეს პáƒáƒ¡áƒ¢áƒ˜ ვერდáƒáƒ˜áƒ‘უსტებáƒ", + "status.copy": "Copy link to status", "status.delete": "წáƒáƒ¨áƒšáƒ", "status.detailed_status": "Detailed conversation view", "status.direct": "პირდáƒáƒžáƒ˜áƒ ი წერილი @{name}-ს", @@ -342,6 +343,7 @@ "ui.beforeunload": "თქვენი დრáƒáƒ¤áƒ¢áƒ˜ გáƒáƒ£áƒ¥áƒ›áƒ“ებრთუ დáƒáƒ¢áƒáƒ•áƒ”ბთ მáƒáƒ¡áƒ¢áƒáƒ“áƒáƒœáƒ¡.", "upload_area.title": "გáƒáƒ“მáƒáƒ¬áƒ˜áƒ”თ დრჩáƒáƒáƒ’დეთ áƒáƒ¡áƒáƒ¢áƒ•áƒ˜áƒ თáƒáƒ—", "upload_button.label": "მედიის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "áƒáƒ¦áƒ¬áƒ”რილáƒáƒ‘რვიზუáƒáƒšáƒ£áƒ áƒáƒ“ უფáƒáƒ¡áƒ£áƒ ისთვის", "upload_form.focus": "კრáƒáƒžáƒ˜", "upload_form.undo": "გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index ceb474a3e5..6d607068e2 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -297,6 +297,7 @@ "status.block": "@{name} 차단", "status.cancel_reblog_private": "부스트 취소", "status.cannot_reblog": "ì´ í¬ìŠ¤íŠ¸ëŠ” 부스트 í• ìˆ˜ 없습니다", + "status.copy": "Copy link to status", "status.delete": "ì‚ì œ", "status.detailed_status": "대화 ìžì„¸ížˆ 보기", "status.direct": "@{name}ì—게 다ì´ë ‰íŠ¸ 메시지", @@ -342,6 +343,7 @@ "ui.beforeunload": "지금 나가면 ì €ìž¥ë˜ì§€ ì•Šì€ í•ëª©ì„ 잃게 ë©ë‹ˆë‹¤.", "upload_area.title": "드래그 & ë“œë¡ìœ¼ë¡œ 업로드", "upload_button.label": "미디어 추가 (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "ì‹œê°ìž¥ì• ì¸ì„ 위한 설명", "upload_form.focus": "미리보기 변경", "upload_form.undo": "ì‚ì œ", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 0d510d011f..dbea1d6dc9 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -1,136 +1,136 @@ { - "account.add_or_remove_from_list": "Add or Remove from lists", - "account.badges.bot": "Bot", - "account.block": "Block @{name}", - "account.block_domain": "Hide everything from {domain}", - "account.blocked": "Blocked", - "account.direct": "Direct message @{name}", - "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", - "account.domain_blocked": "Domain hidden", - "account.edit_profile": "Edit profile", - "account.endorse": "Feature on profile", - "account.follow": "Follow", - "account.followers": "Followers", - "account.followers.empty": "No one follows this user yet.", - "account.follows": "Follows", - "account.follows.empty": "This user doesn't follow anyone yet.", - "account.follows_you": "Follows you", - "account.hide_reblogs": "Hide boosts from @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", - "account.media": "Media", - "account.mention": "Mention @{name}", - "account.moved_to": "{name} has moved to:", - "account.mute": "Mute @{name}", - "account.mute_notifications": "Mute notifications from @{name}", - "account.muted": "Muted", - "account.posts": "Toots", - "account.posts_with_replies": "Toots and replies", - "account.report": "Report @{name}", - "account.requested": "Awaiting approval. Click to cancel follow request", - "account.share": "Share @{name}'s profile", - "account.show_reblogs": "Show boosts from @{name}", - "account.unblock": "Unblock @{name}", - "account.unblock_domain": "Unhide {domain}", - "account.unendorse": "Don't feature on profile", - "account.unfollow": "Unfollow", - "account.unmute": "Unmute @{name}", - "account.unmute_notifications": "Unmute notifications from @{name}", - "account.view_full_profile": "View full profile", - "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", - "boost_modal.combo": "You can press {combo} to skip this next time", - "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", - "bundle_modal_error.close": "Close", - "bundle_modal_error.message": "Something went wrong while loading this component.", - "bundle_modal_error.retry": "Try again", - "column.blocks": "Blocked users", - "column.community": "Local timeline", - "column.direct": "Direct messages", - "column.domain_blocks": "Hidden domains", - "column.favourites": "Favourites", - "column.follow_requests": "Follow requests", - "column.home": "Home", - "column.lists": "Lists", - "column.mutes": "Muted users", - "column.notifications": "Notifications", - "column.pins": "Pinned toot", - "column.public": "Federated timeline", - "column_back_button.label": "Back", - "column_header.hide_settings": "Hide settings", - "column_header.moveLeft_settings": "Move column to the left", - "column_header.moveRight_settings": "Move column to the right", - "column_header.pin": "Pin", - "column_header.show_settings": "Show settings", - "column_header.unpin": "Unpin", - "column_subheading.settings": "Settings", - "community.column_settings.media_only": "Media Only", - "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.", - "compose_form.direct_message_warning_learn_more": "Learn more", - "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", - "compose_form.lock_disclaimer.lock": "locked", - "compose_form.placeholder": "What is on your mind?", - "compose_form.publish": "Toot", + "account.add_or_remove_from_list": "Pievienot vai noņemt no saraksta", + "account.badges.bot": "Bots", + "account.block": "BloÄ·Ä“t @{name}", + "account.block_domain": "SlÄ“pt visu no {domain}", + "account.blocked": "BloÄ·Ä“ts", + "account.direct": "PrivÄtÄ ziņa @{name}", + "account.disclaimer_full": "InformÄcija zemÄk var nepilnÄ«gi atspoguļot lietotÄja profilu.", + "account.domain_blocked": "DomÄ“ns ir paslÄ“pts", + "account.edit_profile": "Labot profilu", + "account.endorse": "Izcelts profilÄ", + "account.follow": "Sekot", + "account.followers": "SekotÄji", + "account.followers.empty": "Å im lietotÄjam nav sekotÄju.", + "account.follows": "Seko", + "account.follows.empty": "Å is lietotÄjs pagaidÄm nevienam neseko.", + "account.follows_you": "Seko tev", + "account.hide_reblogs": "PaslÄ“pt paceltos ierakstus no lietotÄja @{name}", + "account.link_verified_on": "Å Ä«s saites piederÄ«ba ir pÄrbaudÄ«ta {date}", + "account.locked_info": "Å Ä« konta privÄtuma status ir iestatÄ«ts slÄ“gts. ĪpaÅ¡nieks izskatÄ«s un izvÄ“lÄ“sies kas viņam drÄ«kst sekot.", + "account.media": "MÄ“diji", + "account.mention": "Piemin @{name}", + "account.moved_to": "{name} ir pÄrvÄcies uz:", + "account.mute": "ApklusinÄt @{name}", + "account.mute_notifications": "NerÄdÄ«t paziņojumus no @{name}", + "account.muted": "ApklusinÄts", + "account.posts": "Ieraksti", + "account.posts_with_replies": "Ieraksti un atbildes", + "account.report": "Ziņot par lietotÄju @{name}", + "account.requested": "GaidÄm apstiprinÄjumu. Nospied lai atceltu sekoÅ¡anas pieparasÄ«jumu", + "account.share": "DalÄ«ties ar lietotÄja @{name}'s profilu", + "account.show_reblogs": "ParÄdÄ«t lietotÄja @{name} paceltos ierakstus", + "account.unblock": "AtbloÄ·Ä“t lietotÄju @{name}", + "account.unblock_domain": "AtbloÄ·Ä“t domÄ“nu {domain}", + "account.unendorse": "Neizcelt profilÄ", + "account.unfollow": "Nesekot", + "account.unmute": "Noņemt apklusinÄjumu no lietotÄja @{name}", + "account.unmute_notifications": "RÄdÄ«t paziņojumus no lietotÄja @{name}", + "account.view_full_profile": "ApskatÄ«t pilnu profilu", + "alert.unexpected.message": "NegaidÄ«ta kļūda.", + "alert.unexpected.title": "Ups!", + "boost_modal.combo": "Nospied {combo} lai izlaistu Å¡o nÄkamreiz", + "bundle_column_error.body": "Kaut kas nogÄja greizi ielÄdÄ“jot Å¡o komponenti.", + "bundle_column_error.retry": "MÄ“Ä£ini vÄ“lreiz", + "bundle_column_error.title": "TÄ«kla kļūda", + "bundle_modal_error.close": "AizvÄ“rt", + "bundle_modal_error.message": "Kaut kas nogÄja greizi ielÄdÄ“jot Å¡o komponenti.", + "bundle_modal_error.retry": "MÄ“Ä£ini vÄ“lreiz", + "column.blocks": "BloÄ·Ä“tie lietotÄji", + "column.community": "LokÄlÄ laika lÄ«nija", + "column.direct": "PrivÄtÄs ziņas", + "column.domain_blocks": "PaslÄ“ptie domÄ“ni", + "column.favourites": "FavorÄ«ti", + "column.follow_requests": "SekotÄju pieprasÄ«jumi", + "column.home": "SÄkums", + "column.lists": "Saraksti", + "column.mutes": "ApklusinÄtie lietotÄji", + "column.notifications": "Paziņojumi", + "column.pins": "Piespraustie ziņojumi", + "column.public": "FederatÄ«vÄ laika lÄ«nija", + "column_back_button.label": "Atpakaļ", + "column_header.hide_settings": "PaslÄ“pt iestatÄ«jumus", + "column_header.moveLeft_settings": "PÄrvietot kolonu pa kreisi", + "column_header.moveRight_settings": "PÄrvietot kolonu pa labi", + "column_header.pin": "Piespraust", + "column_header.show_settings": "RÄdÄ«t iestatÄ«jumus", + "column_header.unpin": "Atspraust", + "column_subheading.settings": "IestatÄ«jumi", + "community.column_settings.media_only": "Tikai mÄ“diji", + "compose_form.direct_message_warning": "Å is ziņojums tiks nosÅ«tÄ«ts tikai pieminÄ“tajiem lietotÄjiem.", + "compose_form.direct_message_warning_learn_more": "Papildus informÄcija", + "compose_form.hashtag_warning": "Ziņojumu nebÅ«s iespÄ“jams atrast zem haÅ¡tagiem jo tas nav publisks. Tikai publiskos ziņojumus ir iespÄ“jams meklÄ“t pÄ“c tiem.", + "compose_form.lock_disclaimer": "Tavs konts nav {locked}. Ikviens var Tev sekot lai apskatÄ«tu tikai sekotÄjiem paredzÄ“tos ziņojumus.", + "compose_form.lock_disclaimer.lock": "slÄ“gts", + "compose_form.placeholder": "Ko vÄ“lies publicÄ“t?", + "compose_form.publish": "PublicÄ“t", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.marked": "Media is marked as sensitive", - "compose_form.sensitive.unmarked": "Media is not marked as sensitive", - "compose_form.spoiler.marked": "Text is hidden behind warning", - "compose_form.spoiler.unmarked": "Text is not hidden", - "compose_form.spoiler_placeholder": "Write your warning here", - "confirmation_modal.cancel": "Cancel", - "confirmations.block.confirm": "Block", - "confirmations.block.message": "Are you sure you want to block {name}?", - "confirmations.delete.confirm": "Delete", - "confirmations.delete.message": "Are you sure you want to delete this status?", - "confirmations.delete_list.confirm": "Delete", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", - "confirmations.domain_block.confirm": "Hide entire domain", - "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", - "confirmations.mute.confirm": "Mute", - "confirmations.mute.message": "Are you sure you want to mute {name}?", - "confirmations.redraft.confirm": "Delete & redraft", - "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", - "confirmations.reply.confirm": "Reply", - "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "confirmations.unfollow.confirm": "Unfollow", - "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", - "embed.instructions": "Embed this status on your website by copying the code below.", - "embed.preview": "Here is what it will look like:", - "emoji_button.activity": "Activity", - "emoji_button.custom": "Custom", - "emoji_button.flags": "Flags", - "emoji_button.food": "Food & Drink", - "emoji_button.label": "Insert emoji", - "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ â”»â”â”»", - "emoji_button.objects": "Objects", - "emoji_button.people": "People", - "emoji_button.recent": "Frequently used", - "emoji_button.search": "Search...", - "emoji_button.search_results": "Search results", - "emoji_button.symbols": "Symbols", - "emoji_button.travel": "Travel & Places", - "empty_column.account_timeline": "No toots here!", - "empty_column.blocks": "You haven't blocked any users yet.", - "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", - "empty_column.hashtag": "There is nothing in this hashtag yet.", - "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", - "empty_column.home.public_timeline": "the public timeline", - "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", - "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", - "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", - "follow_request.authorize": "Authorize", - "follow_request.reject": "Reject", + "compose_form.sensitive.marked": "MÄ“dijs ir atzÄ«mÄ“ts kÄ sensitÄ«vs", + "compose_form.sensitive.unmarked": "MÄ“dijs nav atzÄ«mÄ“ts kÄ sensitÄ«vs", + "compose_form.spoiler.marked": "Teksts ir paslÄ“pts aiz brÄ«dinÄjuma", + "compose_form.spoiler.unmarked": "Teksts nav paslÄ“pts", + "compose_form.spoiler_placeholder": "Ieraksti Savu brÄ«dinÄjuma tekstu Å¡eit", + "confirmation_modal.cancel": "Atcelt", + "confirmations.block.confirm": "BloÄ·Ä“t", + "confirmations.block.message": "Vai tieÅ¡Äm vÄ“lies bloÄ·Ä“t lietotÄju {name}?", + "confirmations.delete.confirm": "DzÄ“st", + "confirmations.delete.message": "Vai tieÅ¡Äm vÄ“lies dzÄ“st Å¡o ierakstu?", + "confirmations.delete_list.confirm": "DzÄ“st", + "confirmations.delete_list.message": "Vai tieÅ¡am vÄ“lies neatgriezeniski dzÄ“st Å¡o sarakstu?", + "confirmations.domain_block.confirm": "PaslÄ“pt visu domÄ“nu", + "confirmations.domain_block.message": "Vai tu tieÅ¡Äm, tieÅ¡am vÄ“lies bloÄ·Ä“t visu domÄ“nu {domain}? LielÄkajÄ daÄ¼Ä gadÄ«jumu pietiek ja nobloÄ·Ä“ vai apklusini kÄdu. Tu neredzÄ“si saturu vai paziņojumus no Å¡Ä« domÄ“na nevienÄ laika lÄ«nijÄ. Tavi sekotÄji no Å¡Ä« domÄ“na tiks noņemti.", + "confirmations.mute.confirm": "ApklusinÄt", + "confirmations.mute.message": "Vai Tu tieÅ¡Äm velies apklusinÄt {name}?", + "confirmations.redraft.confirm": "DzÄ“st un pÄrrakstÄ«t", + "confirmations.redraft.message": "Vai tieÅ¡Äm vÄ“lies dzÄ“st un pÄrrakstÄ«t Å¡o ierakstu? FavorÄ«ti un paceltie ieraksti tiks dzÄ“sti, kÄ arÄ« atbildes tiks atsaistÄ«tas no Å¡Ä« ieraksta.", + "confirmations.reply.confirm": "AtbildÄ“t", + "confirmations.reply.message": "Atbildot tagad tava ziņa ko Å¡obrÄ«d raksti tiks pÄrrakstÄ«ta. Vai tieÅ¡Äm vÄ“lies turpinÄt?", + "confirmations.unfollow.confirm": "Nesekot", + "confirmations.unfollow.message": "Vai tieÅ¡am vairs nevÄ“lies sekot lietotÄjam {name}?", + "embed.instructions": "Iegul Å¡o ziņojumu savÄ mÄjaslapÄ kopÄ“jot kodu zemÄk.", + "embed.preview": "Tas izskatÄ«sies Å¡Ädi:", + "emoji_button.activity": "AktivitÄte", + "emoji_button.custom": "PielÄgots", + "emoji_button.flags": "Karogi", + "emoji_button.food": "Ä’dieni un dzÄ“rieni", + "emoji_button.label": "Ielikt emoji smaidiņu", + "emoji_button.nature": "Daba", + "emoji_button.not_found": "NekÄdu emodžīšu!! (╯°□°)╯︵ â”»â”â”»", + "emoji_button.objects": "Objekti", + "emoji_button.people": "CilvÄ“ki", + "emoji_button.recent": "BiežÄk lietotie", + "emoji_button.search": "MeklÄ“t...", + "emoji_button.search_results": "MeklÄ“Å¡anas rezultÄti", + "emoji_button.symbols": "Simboli", + "emoji_button.travel": "CeļoÅ¡ana & Vietas", + "empty_column.account_timeline": "Å eit ziņojumu nav!", + "empty_column.blocks": "Tu neesi vÄ“l nevienu bloÄ·Ä“jis.", + "empty_column.community": "LokÄlÄ laika lÄ«nija ir tukÅ¡a. :/ Ieraksti kaut ko lai sÄkas rosÄ«ba!", + "empty_column.direct": "Tev nav privÄto ziņu. TiklÄ«dz saņemsi tÄs Å¡eit parÄdÄ«sies.", + "empty_column.domain_blocks": "SlÄ“pto domÄ“nu vÄ“l nav.", + "empty_column.favourited_statuses": "Tev vÄ“l nav iemīļoto ziņojumu. Kad Tev tÄdu bÅ«s tie Å¡eit parÄdÄ«sies.", + "empty_column.favourites": "Neviens Å¡o ziņojumu nav pievienojis favorÄ«tiem. Kad tÄdu bÅ«s tie Å¡eit parÄdÄ«sies.", + "empty_column.follow_requests": "Å obrÄ«d neviens nav pieteicies tev sekot. Kad kÄds pieteiksies tas parÄdÄ«sies Å¡eit.", + "empty_column.hashtag": "Ar Å¡o haÅ¡tagu nekas nav atrodams.", + "empty_column.home": "Tava laika lÄ«nija ir tukÅ¡a! ApmeklÄ“ federatÄ«vo laika lÄ«niju vai uzmeklÄ“ kÄdu meklÄ“tÄjÄ lai satiktu citus.", + "empty_column.home.public_timeline": "publiskÄ laika lÄ«nija", + "empty_column.list": "Å is saraksts ir tukÅ¡s. Kad Å¡Ä« saraksta dalÄ«bnieki atjaunos statusu tas parÄdÄ«sies Å¡eit.", + "empty_column.lists": "Tev nav neviena saraksta. Kad tÄdu bÅ«s tie parÄdÄ«sies Å¡eit.", + "empty_column.mutes": "Tu neesi nevienu apklusinÄjis.", + "empty_column.notifications": "Tev nav paziņojumu. Iesaisties sarunÄs ar citiem.", + "empty_column.public": "Å eit nekÄ nav, tukÅ¡ums! Ieraksti kaut ko publiski, vai uzmeklÄ“ un seko kÄdam no citas instances", + "follow_request.authorize": "AutorizÄ“t", + "follow_request.reject": "NoraidÄ«t", "getting_started.developers": "Developers", "getting_started.directory": "Profile directory", "getting_started.documentation": "Documentation", @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", "status.delete": "Delete", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", "upload_form.undo": "Delete", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 0d510d011f..602a59ca08 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", "status.delete": "Delete", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", "upload_form.undo": "Delete", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 871142195d..92f94ddc06 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -297,6 +297,7 @@ "status.block": "Blokkeer @{name}", "status.cancel_reblog_private": "Niet langer boosten", "status.cannot_reblog": "Deze toot kan niet geboost worden", + "status.copy": "Copy link to status", "status.delete": "Verwijderen", "status.detailed_status": "Uitgebreide gespreksweergave", "status.direct": "Directe toot @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Je concept zal verloren gaan als je Mastodon verlaat.", "upload_area.title": "Hierin slepen om te uploaden", "upload_button.label": "Media toevoegen (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Omschrijf dit voor mensen met een visuele beperking", "upload_form.focus": "Voorvertoning aanpassen", "upload_form.undo": "Verwijderen", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index fa08e8d73b..f6910f0e66 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Denne posten kan ikke fremheves", + "status.copy": "Copy link to status", "status.delete": "Slett", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.", "upload_area.title": "Dra og slipp for Ã¥ laste opp", "upload_button.label": "Legg til media", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Beskriv for synshemmede", "upload_form.focus": "Crop", "upload_form.undo": "Angre", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index c28e9f5b83..8250d59bdc 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -251,7 +251,7 @@ "notifications.column_settings.reblog": "Partatges :", "notifications.column_settings.show": "Mostrar dins la colomna", "notifications.column_settings.sound": "Emetre un son", - "notifications.filter.all": "Totes", + "notifications.filter.all": "Totas", "notifications.filter.boosts": "Partages", "notifications.filter.favourites": "Favorits", "notifications.filter.follows": "Seguiments", @@ -297,6 +297,7 @@ "status.block": "Blocar @{name}", "status.cancel_reblog_private": "Quitar de partejar", "status.cannot_reblog": "Aqueste estatut pòt pas èsser partejat", + "status.copy": "Copy link to status", "status.delete": "Escafar", "status.detailed_status": "Vista detalhada de la convèrsa", "status.direct": "Messatge per @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Vòstre brolhon serà perdut se quitatz Mastodon.", "upload_area.title": "Lisatz e depausatz per mandar", "upload_button.label": "Ajustar un mèdia (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Descripcion pels mal vesents", "upload_form.focus": "Modificar l’apercebut", "upload_form.undo": "Suprimir", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index a1cda6c2d4..2af261251d 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -297,6 +297,7 @@ "status.block": "Zablokuj @{name}", "status.cancel_reblog_private": "Cofnij podbicie", "status.cannot_reblog": "Ten wpis nie może zostać podbity", + "status.copy": "Copy link to status", "status.delete": "UsuÅ„", "status.detailed_status": "Szczegółowy widok konwersacji", "status.direct": "WyÅ›lij wiadomość bezpoÅ›redniÄ… do @{name}", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 392e7f485d..bc36829210 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Desfazer compartilhamento", "status.cannot_reblog": "Esta postagem não pode ser compartilhada", + "status.copy": "Copy link to status", "status.delete": "Excluir", "status.detailed_status": "Visão detalhada da conversa", "status.direct": "Enviar mensagem direta a @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Seu rascunho será perdido se você sair do Mastodon.", "upload_area.title": "Arraste e solte para enviar", "upload_button.label": "Adicionar mÃdia (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Descreva a imagem para deficientes visuais", "upload_form.focus": "Ajustar foco", "upload_form.undo": "Remover", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json index d4126704a2..edcfd2fa29 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Este post não pode ser partilhado", + "status.copy": "Copy link to status", "status.delete": "Eliminar", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "O teu rascunho vai ser perdido se abandonares o Mastodon.", "upload_area.title": "Arraste e solte para enviar", "upload_button.label": "Adicionar media", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Descrição da imagem para pessoas com dificuldades visuais", "upload_form.focus": "Crop", "upload_form.undo": "Anular", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index a1a514f494..3be3214ee9 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -297,6 +297,7 @@ "status.block": "Blochează @{name}", "status.cancel_reblog_private": "Nedistribuit", "status.cannot_reblog": "Această postare nu poate fi redistribuită", + "status.copy": "Copy link to status", "status.delete": "Șterge", "status.detailed_status": "ConversaÈ›ia detailată", "status.direct": "Mesaj direct @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Postarea se va pierde dacă părăseÈ™ti pagina.", "upload_area.title": "Trage È™i eliberează pentru a încărca", "upload_button.label": "Adaugă media (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Adaugă o descriere pentru persoanele cu deficienÈ›e de vedere", "upload_form.focus": "Schimbă previzualizarea", "upload_form.undo": "Șterge", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index cb60108986..db9e732c09 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -297,6 +297,7 @@ "status.block": "Заблокировать @{name}", "status.cancel_reblog_private": "Ðе продвигать", "status.cannot_reblog": "Ðтот ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ðµ может быть продвинут", + "status.copy": "Copy link to status", "status.delete": "Удалить", "status.detailed_status": "Подробный проÑмотр обÑуждениÑ", "status.direct": "ÐапиÑать @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Ваш черновик будет утерÑн, еÑли вы покинете Mastodon.", "upload_area.title": "Перетащите Ñюда, чтобы загрузить", "upload_button.label": "Добавить медиаконтент", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "ОпиÑать Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹ Ñ Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñми зрениÑ", "upload_form.focus": "Обрезать", "upload_form.undo": "Отменить", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index a3467785a4..8ca9132454 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -13,7 +13,7 @@ "account.followers": "Sledujúci", "account.followers.empty": "Tohto užÃvateľa eÅ¡te nikto nenásleduje.", "account.follows": "Následuje", - "account.follows.empty": "Tento užÃvateľ tu eÅ¡te nikoho nenásleduje.", + "account.follows.empty": "Tento užÃvateľ eÅ¡te nikoho nenásleduje.", "account.follows_you": "Následuje Å¥a", "account.hide_reblogs": "SkryÅ¥ povýšenia od @{name}", "account.link_verified_on": "VlastnÃctvo tohto odkazu bolo skontrolované {date}", @@ -35,7 +35,7 @@ "account.unendorse": "Nezobrazuj na profile", "account.unfollow": "Prestaň následovaÅ¥", "account.unmute": "Prestaň ignorovaÅ¥ @{name}", - "account.unmute_notifications": "Odtĺm oboznámenia od @{name}", + "account.unmute_notifications": "ZruÅ¡iÅ¥ stlmenie oznámenà od @{name}", "account.view_full_profile": "Pozri celý profil", "alert.unexpected.message": "Vyskytla sa neÄakaná chyba.", "alert.unexpected.title": "Oops!", @@ -60,9 +60,9 @@ "column.public": "Federovaná Äasová os", "column_back_button.label": "Späť", "column_header.hide_settings": "SkryÅ¥ nastavenia", - "column_header.moveLeft_settings": "Presunúť stĺpec doľava", - "column_header.moveRight_settings": "Presunúť stĺpec doprava", - "column_header.pin": "Pripnúť", + "column_header.moveLeft_settings": "Presuň stĺpec doľava", + "column_header.moveRight_settings": "Presuň stĺpec doprava", + "column_header.pin": "Pripni", "column_header.show_settings": "Ukáž nastavenia", "column_header.unpin": "Odopnúť", "column_subheading.settings": "Nastavenia", @@ -79,14 +79,14 @@ "compose_form.sensitive.unmarked": "Médiálny obsah nieje oznaÄený ako chúlostivý", "compose_form.spoiler.marked": "Text je ukrytý za varovanÃm", "compose_form.spoiler.unmarked": "Text nieje ukrytý", - "compose_form.spoiler_placeholder": "Sem napÃÅ¡te vaÅ¡e varovanie", - "confirmation_modal.cancel": "ZruÅ¡iÅ¥", - "confirmations.block.confirm": "BlokovaÅ¥", - "confirmations.block.message": "Si si istý, že chcete blokovaÅ¥ {name}?", - "confirmations.delete.confirm": "ZmazaÅ¥", - "confirmations.delete.message": "Si si naozaj istá/ý, že chceÅ¡ vymazaÅ¥ túto správu?", - "confirmations.delete_list.confirm": "VymazaÅ¥", - "confirmations.delete_list.message": "Si si istý/á, že chceÅ¡ navždy vymazaÅ¥ tento zoznam?", + "compose_form.spoiler_placeholder": "Sem napÃÅ¡ tvoje varovanie", + "confirmation_modal.cancel": "ZruÅ¡", + "confirmations.block.confirm": "Blokuj", + "confirmations.block.message": "Si si istý/á, že chceÅ¡ blokovaÅ¥ {name}?", + "confirmations.delete.confirm": "Vymaž", + "confirmations.delete.message": "Si si istý/á, že chceÅ¡ vymazaÅ¥ túto správu?", + "confirmations.delete_list.confirm": "Vymaž", + "confirmations.delete_list.message": "Si si istý/á, že chceÅ¡ natrvalo vymazaÅ¥ tento zoznam?", "confirmations.domain_block.confirm": "SkryÅ¥ celú doménu", "confirmations.domain_block.message": "Si si naozaj istý, že chceÅ¡ blokovaÅ¥ celú {domain}? Vo väÄÅ¡ine prÃpadov staÄà blokovaÅ¥ alebo ignorovaÅ¥ pár konkrétnych užÃvateľov, Äo sa doporuÄuje. NeuvidÃÅ¡ obsah z tejto domény v žiadnej verejnej Äasovej osi, ani v oznámeniach. Tvoji následovnÃci pochádzajúci z tejto domény budú odstránenÃ.", "confirmations.mute.confirm": "Ignoruj", @@ -162,7 +162,7 @@ "introduction.interactions.reblog.headline": "Povýš", "introduction.interactions.reblog.text": "MôžeÅ¡ zdieľaÅ¥ prÃspevky iných ľudà s vaÅ¡imi následovateľmi tým, že ich povýšiÅ¡.", "introduction.interactions.reply.headline": "Odpovedz", - "introduction.interactions.reply.text": "OdpovedaÅ¥ môžeÅ¡ na prÃspevky iných ľudÃ, aj na svoje vlastné, ÄÃm sa sspolu prepoja do konverzácie.", + "introduction.interactions.reply.text": "OdpovedaÅ¥ môžeÅ¡ na prÃspevky iných ľudÃ, aj na svoje vlastné, ÄÃm sa spolu prepoja do konverzácie.", "introduction.welcome.action": "PoÄme do toho!", "introduction.welcome.headline": "Prvé kroky", "introduction.welcome.text": "Vitaj vo fediverse! Za malú chvÃľu budeÅ¡ môcÅ¥ posielaÅ¥ správy a rozpovedaÅ¥ sa so svojÃmi priateľmi cez Å¡irokú Å¡kálu rôznorodých serverov. Ale tento server, {domain}, je Å¡peciálny v tom, že ukladá tvoj profil, takže si jeho názov zapametaj.", @@ -212,7 +212,7 @@ "media_gallery.toggle_visible": "Zapnúť/Vypnúť viditeľnosÅ¥", "missing_indicator.label": "Nenájdené", "missing_indicator.sublabel": "Tento zdroj sa eÅ¡te nepodarilo nájsÅ¥", - "mute_modal.hide_notifications": "SkryÅ¥ oboznámenia od tohoto užÃvateľa?", + "mute_modal.hide_notifications": "SkryÅ¥ oznámenia od tohto použÃvateľa?", "navigation_bar.apps": "Mobilné aplikácie", "navigation_bar.blocks": "Blokovanà užÃvatelia", "navigation_bar.community_timeline": "Lokálna Äasová os", @@ -220,11 +220,11 @@ "navigation_bar.direct": "Súkromné správy", "navigation_bar.discover": "Objavuj", "navigation_bar.domain_blocks": "Skryté domény", - "navigation_bar.edit_profile": "Uprav profil", + "navigation_bar.edit_profile": "UpraviÅ¥ profil", "navigation_bar.favourites": "Obľúbené", "navigation_bar.filters": "Utĺmené slová", "navigation_bar.follow_requests": "Žiadosti o sledovanie", - "navigation_bar.info": "O tomto Mastodon serveri", + "navigation_bar.info": "O tomto serveri", "navigation_bar.keyboard_shortcuts": "Klávesové skratky", "navigation_bar.lists": "Zoznamy", "navigation_bar.logout": "Odhlás sa", @@ -255,10 +255,10 @@ "notifications.filter.boosts": "Vyzdvihnutia", "notifications.filter.favourites": "Obľúbené", "notifications.filter.follows": "Sledovania", - "notifications.filter.mentions": "Spomenutia", - "notifications.group": "{count} oznámenia", - "privacy.change": "ZmeňiÅ¥ viditeľnosÅ¥ statusu", - "privacy.direct.long": "PoslaÅ¥ priamo iba spomenutým použÃvateľom", + "notifications.filter.mentions": "Iba spomenutia", + "notifications.group": "{count} oboznámenÃ", + "privacy.change": "Uprav súkromie prÃspevku", + "privacy.direct.long": "PoÅ¡li iba spomenutým použÃvateľom", "privacy.direct.short": "Súkromne", "privacy.private.long": "PoslaÅ¥ iba následovateľom", "privacy.private.short": "Iba pre sledujúcich", @@ -297,6 +297,7 @@ "status.block": "BlokovaÅ¥ @{name}", "status.cancel_reblog_private": "Nezdieľaj", "status.cannot_reblog": "Tento prÃspevok nemôže byÅ¥ re-tootnutý", + "status.copy": "Copy link to status", "status.delete": "ZmazaÅ¥", "status.detailed_status": "Podrobný náhľad celej konverzácie", "status.direct": "Súkromná správa @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "ÄŒo máš rozpÃsané sa stratÃ, ak opustÃÅ¡ Mastodon.", "upload_area.title": "Pretiahni a pusÅ¥ pre nahratie", "upload_button.label": "PridaÅ¥ médiálny súbor (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Opis pre slabo vidiacich", "upload_form.focus": "Pozmeň náhľad", "upload_form.undo": "Vymaž", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index cabad737d6..8e5e3deb98 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -1,5 +1,5 @@ { - "account.add_or_remove_from_list": "Add or Remove from lists", + "account.add_or_remove_from_list": "Dodaj ali odstrani iz seznama", "account.badges.bot": "Robot", "account.block": "Blokiraj @{name}", "account.block_domain": "Skrij vse iz {domain}", @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", "status.delete": "Delete", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "VaÅ¡ osnutek bo izgubljen, Äe zapustite Mastodona.", "upload_area.title": "Povlecite in spustite za poÅ¡iljanje", "upload_button.label": "Dodaj medij", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "OpiÅ¡ite za slabovidne", "upload_form.focus": "Obreži", "upload_form.undo": "IzbriÅ¡i", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json new file mode 100644 index 0000000000..3dd7fb4435 --- /dev/null +++ b/app/javascript/mastodon/locales/sq.json @@ -0,0 +1,360 @@ +{ + "account.add_or_remove_from_list": "Add or Remove from lists", + "account.badges.bot": "Bot", + "account.block": "Block @{name}", + "account.block_domain": "Hide everything from {domain}", + "account.blocked": "Blocked", + "account.direct": "Direct message @{name}", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.domain_blocked": "Domain hidden", + "account.edit_profile": "Edit profile", + "account.endorse": "Feature on profile", + "account.follow": "Follow", + "account.followers": "Followers", + "account.followers.empty": "No one follows this user yet.", + "account.follows": "Follows", + "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows_you": "Follows you", + "account.hide_reblogs": "Hide boosts from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.media": "Media", + "account.mention": "Mention @{name}", + "account.moved_to": "{name} has moved to:", + "account.mute": "Mute @{name}", + "account.mute_notifications": "Mute notifications from @{name}", + "account.muted": "Muted", + "account.posts": "Toots", + "account.posts_with_replies": "Toots and replies", + "account.report": "Report @{name}", + "account.requested": "Awaiting approval. Click to cancel follow request", + "account.share": "Share @{name}'s profile", + "account.show_reblogs": "Show boosts from @{name}", + "account.unblock": "Unblock @{name}", + "account.unblock_domain": "Unhide {domain}", + "account.unendorse": "Don't feature on profile", + "account.unfollow": "Unfollow", + "account.unmute": "Unmute @{name}", + "account.unmute_notifications": "Unmute notifications from @{name}", + "account.view_full_profile": "View full profile", + "alert.unexpected.message": "An unexpected error occurred.", + "alert.unexpected.title": "Oops!", + "boost_modal.combo": "You can press {combo} to skip this next time", + "bundle_column_error.body": "Something went wrong while loading this component.", + "bundle_column_error.retry": "Try again", + "bundle_column_error.title": "Network error", + "bundle_modal_error.close": "Close", + "bundle_modal_error.message": "Something went wrong while loading this component.", + "bundle_modal_error.retry": "Try again", + "column.blocks": "Blocked users", + "column.community": "Local timeline", + "column.direct": "Direct messages", + "column.domain_blocks": "Hidden domains", + "column.favourites": "Favourites", + "column.follow_requests": "Follow requests", + "column.home": "Home", + "column.lists": "Lists", + "column.mutes": "Muted users", + "column.notifications": "Notifications", + "column.pins": "Pinned toot", + "column.public": "Federated timeline", + "column_back_button.label": "Back", + "column_header.hide_settings": "Hide settings", + "column_header.moveLeft_settings": "Move column to the left", + "column_header.moveRight_settings": "Move column to the right", + "column_header.pin": "Pin", + "column_header.show_settings": "Show settings", + "column_header.unpin": "Unpin", + "column_subheading.settings": "Settings", + "community.column_settings.media_only": "Media Only", + "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.", + "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", + "compose_form.lock_disclaimer.lock": "locked", + "compose_form.placeholder": "What is on your mind?", + "compose_form.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive.marked": "Media is marked as sensitive", + "compose_form.sensitive.unmarked": "Media is not marked as sensitive", + "compose_form.spoiler.marked": "Text is hidden behind warning", + "compose_form.spoiler.unmarked": "Text is not hidden", + "compose_form.spoiler_placeholder": "Write your warning here", + "confirmation_modal.cancel": "Cancel", + "confirmations.block.confirm": "Block", + "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.delete.confirm": "Delete", + "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.mute.confirm": "Mute", + "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "confirmations.unfollow.confirm": "Unfollow", + "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "embed.instructions": "Embed this status on your website by copying the code below.", + "embed.preview": "Here is what it will look like:", + "emoji_button.activity": "Activity", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flags", + "emoji_button.food": "Food & Drink", + "emoji_button.label": "Insert emoji", + "emoji_button.nature": "Nature", + "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ â”»â”â”»", + "emoji_button.objects": "Objects", + "emoji_button.people": "People", + "emoji_button.recent": "Frequently used", + "emoji_button.search": "Search...", + "emoji_button.search_results": "Search results", + "emoji_button.symbols": "Symbols", + "emoji_button.travel": "Travel & Places", + "empty_column.account_timeline": "No toots here!", + "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.domain_blocks": "There are no hidden domains yet.", + "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", + "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", + "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home.public_timeline": "the public timeline", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", + "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", + "follow_request.authorize": "Authorize", + "follow_request.reject": "Reject", + "getting_started.developers": "Developers", + "getting_started.directory": "Profile directory", + "getting_started.documentation": "Documentation", + "getting_started.heading": "Getting started", + "getting_started.invite": "Invite people", + "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.security": "Security", + "getting_started.terms": "Terms of service", + "hashtag.column_header.tag_mode.all": "and {additional}", + "hashtag.column_header.tag_mode.any": "or {additional}", + "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.tag_mode.all": "All of these", + "hashtag.column_settings.tag_mode.any": "Any of these", + "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "home.column_settings.basic": "Basic", + "home.column_settings.show_reblogs": "Show boosts", + "home.column_settings.show_replies": "Show replies", + "introduction.federation.action": "Next", + "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", + "introduction.federation.home.headline": "Home", + "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", + "introduction.federation.local.headline": "Local", + "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", + "introduction.interactions.action": "Finish toot-orial!", + "introduction.interactions.favourite.headline": "Favourite", + "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "introduction.interactions.reblog.headline": "Boost", + "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", + "introduction.interactions.reply.headline": "Reply", + "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", + "introduction.welcome.action": "Let's go!", + "introduction.welcome.headline": "First steps", + "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", + "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.compose": "to focus the compose textarea", + "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.favourites": "to open favourites list", + "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.heading": "Keyboard Shortcuts", + "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.muted": "to open muted users list", + "keyboard_shortcuts.my_profile": "to open your profile", + "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.pinned": "to open pinned toots list", + "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.up": "to move up in the list", + "lightbox.close": "Close", + "lightbox.next": "Next", + "lightbox.previous": "Previous", + "lists.account.add": "Add to list", + "lists.account.remove": "Remove from list", + "lists.delete": "Delete list", + "lists.edit": "Edit list", + "lists.new.create": "Add list", + "lists.new.title_placeholder": "New list title", + "lists.search": "Search among people you follow", + "lists.subheading": "Your lists", + "loading_indicator.label": "Loading...", + "media_gallery.toggle_visible": "Toggle visibility", + "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", + "mute_modal.hide_notifications": "Hide notifications from this user?", + "navigation_bar.apps": "Mobile apps", + "navigation_bar.blocks": "Blocked users", + "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", + "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.edit_profile": "Edit profile", + "navigation_bar.favourites": "Favourites", + "navigation_bar.filters": "Muted words", + "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.info": "About this server", + "navigation_bar.keyboard_shortcuts": "Hotkeys", + "navigation_bar.lists": "Lists", + "navigation_bar.logout": "Logout", + "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", + "navigation_bar.pins": "Pinned toots", + "navigation_bar.preferences": "Preferences", + "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", + "notification.favourite": "{name} favourited your status", + "notification.follow": "{name} followed you", + "notification.mention": "{name} mentioned you", + "notification.reblog": "{name} boosted your status", + "notifications.clear": "Clear notifications", + "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.favourite": "Favourites:", + "notifications.column_settings.filter_bar.advanced": "Display all categories", + "notifications.column_settings.filter_bar.category": "Quick filter bar", + "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.follow": "New followers:", + "notifications.column_settings.mention": "Mentions:", + "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.show": "Show in column", + "notifications.column_settings.sound": "Play sound", + "notifications.filter.all": "All", + "notifications.filter.boosts": "Boosts", + "notifications.filter.favourites": "Favourites", + "notifications.filter.follows": "Follows", + "notifications.filter.mentions": "Mentions", + "notifications.group": "{count} notifications", + "privacy.change": "Adjust status privacy", + "privacy.direct.long": "Post to mentioned users only", + "privacy.direct.short": "Direct", + "privacy.private.long": "Post to followers only", + "privacy.private.short": "Followers-only", + "privacy.public.long": "Post to public timelines", + "privacy.public.short": "Public", + "privacy.unlisted.long": "Do not show in public timelines", + "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}h", + "relative_time.just_now": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Cancel", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", + "report.placeholder": "Additional comments", + "report.submit": "Submit", + "report.target": "Report {target}", + "search.placeholder": "Search", + "search_popout.search_format": "Advanced search format", + "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.status": "status", + "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.user": "user", + "search_results.accounts": "People", + "search_results.hashtags": "Hashtags", + "search_results.statuses": "Toots", + "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "standalone.public_title": "A look inside...", + "status.admin_account": "Open moderation interface for @{name}", + "status.admin_status": "Open this status in the moderation interface", + "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", + "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", + "status.delete": "Delete", + "status.detailed_status": "Detailed conversation view", + "status.direct": "Direct message @{name}", + "status.embed": "Embed", + "status.favourite": "Favourite", + "status.filtered": "Filtered", + "status.load_more": "Load more", + "status.media_hidden": "Media hidden", + "status.mention": "Mention @{name}", + "status.more": "More", + "status.mute": "Mute @{name}", + "status.mute_conversation": "Mute conversation", + "status.open": "Expand this status", + "status.pin": "Pin on profile", + "status.pinned": "Pinned toot", + "status.read_more": "Read more", + "status.reblog": "Boost", + "status.reblog_private": "Boost to original audience", + "status.reblogged_by": "{name} boosted", + "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.redraft": "Delete & re-draft", + "status.reply": "Reply", + "status.replyAll": "Reply to thread", + "status.report": "Report @{name}", + "status.sensitive_toggle": "Click to view", + "status.sensitive_warning": "Sensitive content", + "status.share": "Share", + "status.show_less": "Show less", + "status.show_less_all": "Show less for all", + "status.show_more": "Show more", + "status.show_more_all": "Show more for all", + "status.show_thread": "Show thread", + "status.unmute_conversation": "Unmute conversation", + "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", + "tabs_bar.federated_timeline": "Federated", + "tabs_bar.home": "Home", + "tabs_bar.local_timeline": "Local", + "tabs_bar.notifications": "Notifications", + "tabs_bar.search": "Search", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", + "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", + "upload_area.title": "Drag & drop to upload", + "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", + "upload_form.description": "Describe for the visually impaired", + "upload_form.focus": "Crop", + "upload_form.undo": "Delete", + "upload_progress.label": "Uploading...", + "video.close": "Close video", + "video.exit_fullscreen": "Exit full screen", + "video.expand": "Expand video", + "video.fullscreen": "Full screen", + "video.hide": "Hide video", + "video.mute": "Mute sound", + "video.pause": "Pause", + "video.play": "Play", + "video.unmute": "Unmute sound" +} diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index c8513dbe18..484e2690dc 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Ovaj status ne može da se podrži", + "status.copy": "Copy link to status", "status.delete": "ObriÅ¡i", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Ako napustite Mastodont, izgubićete napisani nacrt.", "upload_area.title": "Prevucite ovde da otpremite", "upload_button.label": "Dodaj multimediju", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "OpiÅ¡i za slabovide osobe", "upload_form.focus": "Crop", "upload_form.undo": "Opozovi", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 6e0ac6eca7..284ceab47a 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -297,6 +297,7 @@ "status.block": "Блокирај @{name}", "status.cancel_reblog_private": "Уклони подршку", "status.cannot_reblog": "Овај ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ðµ може да Ñе подржи", + "status.copy": "Copy link to status", "status.delete": "Обриши", "status.detailed_status": "Детаљни преглед разговора", "status.direct": "Директна порука @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Ðко напуÑтите МаÑтодонт, изгубићете напиÑани нацрт.", "upload_area.title": "Превуците овде да отпремите", "upload_button.label": "Додај мултимедију (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Опишите за оÑобе Ñа оштећеним видом", "upload_form.focus": "ПодеÑите", "upload_form.undo": "Обриши", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 47ce8497a6..9acf2428ee 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Ta bort knuff", "status.cannot_reblog": "Detta inlägg kan inte knuffas", + "status.copy": "Copy link to status", "status.delete": "Ta bort", "status.detailed_status": "Detailed conversation view", "status.direct": "Direktmeddela @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Ditt utkast kommer att förloras om du lämnar Mastodon.", "upload_area.title": "Dra & släpp för att ladda upp", "upload_button.label": "Lägg till media", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Beskriv för synskadade", "upload_form.focus": "Beskär", "upload_form.undo": "Ta bort", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 0d510d011f..602a59ca08 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", "status.delete": "Delete", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", "upload_form.undo": "Delete", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 7306ec0019..b118c189f6 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -132,7 +132,7 @@ "follow_request.authorize": "à°…à°¨à±à°®à°¤à°¿à°‚à°šà±", "follow_request.reject": "తిరసà±à°•à°°à°¿à°‚à°šà±", "getting_started.developers": "డెవలపరà±à°²à±", - "getting_started.directory": "à°ªà±à°°à±Šà°«à±ˆà°²à± డైరెకà±à°Ÿà°°à±€Profile directory", + "getting_started.directory": "à°ªà±à°°à±Šà°«à±ˆà°²à± డైరెకà±à°Ÿà°°à±€", "getting_started.documentation": "డాకà±à°¯à±à°®à±†à°‚టేషనà±", "getting_started.heading": "మొదలà±à°ªà±†à°¡à°¦à°¾à°‚", "getting_started.invite": "à°µà±à°¯à°•à±à°¤à±à°²à°¨à± ఆహà±à°µà°¾à°¨à°¿à°‚à°šà°‚à°¡à°¿", @@ -292,11 +292,12 @@ "search_results.statuses": "టూటà±à°²à±", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "లోపలికి à°’à°• చూపà±...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "@{name} కొరకౠసమనà±à°µà°¯ వినిమయసీమనౠతెరà±à°µà±", + "status.admin_status": "సమనà±à°µà°¯ వినిమయసీమలో à°ˆ à°¸à±à°Ÿà±‡à°Ÿà°¸à± నౠతెరవండి", "status.block": "@{name} నౠబà±à°²à°¾à°•à± చేయి", "status.cancel_reblog_private": "బూసà±à°Ÿà±à°¨à± తొలగించà±", "status.cannot_reblog": "à°ˆ పోసà±à°Ÿà±à°¨à± బూసà±à°Ÿà± చేయడం సాధà±à°¯à°‚ కాదà±", + "status.copy": "Copy link to status", "status.delete": "తొలగించà±", "status.detailed_status": "వివరణాతà±à°®à°• సంà°à°¾à°·à°£ వీకà±à°·à°£", "status.direct": "@{name}కౠనేరà±à°—à°¾ సందేశం పంపà±", @@ -342,6 +343,7 @@ "ui.beforeunload": "మీరౠమాసà±à°Ÿà±Šà°¡à±Šà°¨à±à°¨à± వదిలివేసà±à°¤à±‡ మీ à°¡à±à°°à°¾à°«à±à°Ÿà±à°²à± పోతాయి.", "upload_area.title": "à°…à°ªà±à°²à±‹à°¡à± చేయడానికి à°¡à±à°°à°¾à°—à± & à°¡à±à°°à°¾à°ªà± చేయండి", "upload_button.label": "మీడియానౠజోడించండి (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "దృషà±à°Ÿà°¿ లోపమà±à°¨à±à°¨ వారి కోసం వివరించండి", "upload_form.focus": "à°ªà±à°°à°¿à°µà±à°¯à±‚నౠమారà±à°šà±", "upload_form.undo": "తొలగించà±", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 2683284f42..2b0fc40e2d 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", "status.delete": "Delete", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", "upload_form.undo": "Undo", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 5d8fc229e6..30dc06d8c4 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Bu gönderi boost edilemez", + "status.copy": "Copy link to status", "status.delete": "Sil", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Upload için sürükle bırak yapınız", "upload_button.label": "Görsel ekle", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", "upload_form.undo": "Geri al", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 606dda89fc..5dfda49335 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -297,6 +297,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Цей Ð´Ð¾Ð¿Ð¸Ñ Ð½Ðµ може бути передмухнутий", + "status.copy": "Copy link to status", "status.delete": "Видалити", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "Вашу чернетку буде втрачено, Ñкщо ви покинете Mastodon.", "upload_area.title": "ПеретÑгніть Ñюди, щоб завантажити", "upload_button.label": "Додати медіаконтент", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "Опишіть Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹ з вадами зору", "upload_form.focus": "Обрізати", "upload_form.undo": "Видалити", diff --git a/app/javascript/mastodon/locales/whitelist_sq.json b/app/javascript/mastodon/locales/whitelist_sq.json new file mode 100644 index 0000000000..0d4f101c7a --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_sq.json @@ -0,0 +1,2 @@ +[ +] diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index dfa261d6e4..0cfa3f7129 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -297,6 +297,7 @@ "status.block": "å±è”½ @{name}", "status.cancel_reblog_private": "å–消转嘟", "status.cannot_reblog": "æ— æ³•è½¬å˜Ÿè¿™æ¡å˜Ÿæ–‡", + "status.copy": "Copy link to status", "status.delete": "åˆ é™¤", "status.detailed_status": "Detailed conversation view", "status.direct": "å‘é€ç§ä¿¡ç»™ @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "å¦‚æžœä½ çŽ°åœ¨ç¦»å¼€ Mastodonï¼Œä½ çš„è‰ç¨¿å†…容将会被丢弃。", "upload_area.title": "将文件拖放到æ¤å¤„å¼€å§‹ä¸Šä¼ ", "upload_button.label": "ä¸Šä¼ åª’ä½“æ–‡ä»¶", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "为视觉障ç¢äººå£«æ·»åŠ æ–‡å—说明", "upload_form.focus": "剪è£", "upload_form.undo": "å–æ¶ˆä¸Šä¼ ", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index e57aa6d96d..999ca32168 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -297,6 +297,7 @@ "status.block": "å°éŽ– @{name}", "status.cancel_reblog_private": "å–消轉推", "status.cannot_reblog": "é€™ç¯‡æ–‡ç« ç„¡æ³•è¢«è½‰æŽ¨", + "status.copy": "Copy link to status", "status.delete": "刪除", "status.detailed_status": "Detailed conversation view", "status.direct": "ç§è¨Š @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "å¦‚æžœä½ ç¾åœ¨é›¢é–‹ Mastodonï¼Œä½ çš„è‰ç¨¿å…§å®¹å°‡æœƒè¢«ä¸Ÿæ£„。", "upload_area.title": "將檔案拖放至æ¤ä¸Šè¼‰", "upload_button.label": "上載媒體檔案", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "ç‚ºè¦–è¦ºéšœç¤™äººå£«æ·»åŠ æ–‡å—說明", "upload_form.focus": "è£åˆ‡", "upload_form.undo": "刪除", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 0cbe5da5aa..26328e12e3 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -297,6 +297,7 @@ "status.block": "å°éŽ– @{name}", "status.cancel_reblog_private": "å–消轉嘟", "status.cannot_reblog": "這篇嘟文無法被轉嘟", + "status.copy": "Copy link to status", "status.delete": "刪除", "status.detailed_status": "å°è©±çš„詳細內容", "status.direct": "發é€ç§è¨Šçµ¦ @{name}", @@ -342,6 +343,7 @@ "ui.beforeunload": "如果離開 Mastodonï¼Œä½ çš„è‰ç¨¿å°‡æœƒä¸è¦‹ã€‚", "upload_area.title": "拖放來上傳", "upload_button.label": "上傳媒體檔案 (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", "upload_form.description": "ç‚ºè¦–éšœäººå£«å¢žåŠ æ–‡å—說明", "upload_form.focus": "è£åˆ‡", "upload_form.undo": "刪除", diff --git a/config/locales/activerecord.sq.yml b/config/locales/activerecord.sq.yml new file mode 100644 index 0000000000..e52345978e --- /dev/null +++ b/config/locales/activerecord.sq.yml @@ -0,0 +1,13 @@ +--- +sq: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: vetëm shkronja, numra dhe nënvija + status: + attributes: + reblog: + taken: e gjendjes ekziston tashmë diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 08f5578ba5..ec8b15cbae 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -195,6 +195,7 @@ ar: assigned_to_self_report: قام %{name} بتعيين التقرير %{target} لأنÙسهم change_email_user: غيّر %{name} عنوان البريد الإلكتروني للمستخدم %{target} confirm_user: "%{name} قد قام بتأكيد عنوان البريد الإلكتروني لـ %{target}" + create_account_warning: قام %{name} بإرسال تØذير إلى %{target} create_custom_emoji: "%{name} قام برÙع إيموجي جديد %{target}" create_domain_block: "%{name} قام بØجب نطاق %{target}" create_email_domain_block: "%{name} قد قام بØظر نطاق البريد الإلكتروني %{target}" diff --git a/config/locales/co.yml b/config/locales/co.yml index a7264e754a..5f961b4663 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -553,8 +553,11 @@ co: warning_title: Dispunibilità di i cuntenuti sparsi directories: directory: Annuariu di i prufili + enabled: Site inscrittu·a indè l'annuariu. + enabled_but_waiting: Avete sceltu d'esse inscrittu·a indè l'annuariu, mà ùn avete micca ancu u numeru minimale d'abbunati (%{min_followers}) per esse listatu·a. explanation: Scopre utilizatori à partesi di i so centri d'interessu explore_mastodon: Scopre à %{title} + how_to_enable: Ùn site micca ancu inscrittu·a indè l'annuariu. Pudete inscrive vi quì sottu. Utilizate qualchi hashtag indè a vostra biugrafia per esse listatu·a indè tag specifichi! people: one: "%{count} persona" other: "%{count} persone" diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 424ec3dab6..d1f11261cc 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -3,11 +3,11 @@ cs: about: about_hashtag_html: Tohle jsou veÅ™ejné tooty oznaÄené hashtagem <strong>#%{hashtag}</strong>. Pokud máte úÄet kdekoliv na fediverse, můžete s nimi interagovat. about_mastodon_html: Mastodon je sociálnà sÃÅ¥ založená na otevÅ™ených webových protokolech a svobodném, otevÅ™eném softwaru. Je decentralizovaná jako e-mail. - about_this: O této instanci - administered_by: 'Instanci spravuje:' + about_this: O tomto serveru + administered_by: 'Server spravuje:' api: API apps: Mobilnà aplikace - closed_registrations: Registrace na této instanci jsou momentálnÄ› uzavÅ™ené. Ale pozor! Můžete si najÃt jinou instanci, vytvoÅ™it si na nà úÄet a zÃskat z nà pÅ™Ãstup do naprosto stejné sÃtÄ›. + closed_registrations: Registrace na tomto serveru jsou momentálnÄ› uzavÅ™ené. Ale pozor! Můžete si najÃt jiný server, vytvoÅ™it si na nÄ›m úÄet a zÃskat z nÄ›j pÅ™Ãstup do naprosto stejné sÃtÄ›. contact: Kontakt contact_missing: Nenastaveno contact_unavailable: Neuvedeno @@ -25,9 +25,9 @@ cs: within_reach_body: NÄ›kolik aplikacà pro iOS, Android a jiné platformy vám dÃky jednoduchému API ekosystému dovolujà držet krok s vaÅ¡imi přáteli, aÅ¥ už jste kdekoliv. within_reach_title: Vždy v dosahu generic_description: "%{domain} je jednÃm ze serverů v sÃti" - hosted_on: Instance Mastodon na adrese %{domain} + hosted_on: Server Mastodon na adrese %{domain} learn_more: Zjistit vÃce - other_instances: Seznam instancà + other_instances: Seznam serverů privacy_policy: Zásady soukromà source_code: Zdrojový kód status_count_after: @@ -47,8 +47,8 @@ cs: follow: Sledovat followers: few: Sledovatelé - one: Sledovatel - other: Sledovatelů + one: SledujÃcà + other: SledujÃcÃch following: Sledovaných joined: PÅ™ipojil/a se v %{date} last_active: naposledy aktivnà @@ -109,8 +109,8 @@ cs: enable: Povolit enabled: Povoleno feed_url: URL proudu - followers: Sledovatelé - followers_url: URL sledovatelů + followers: SledujÃcà + followers_url: URL sledujÃcÃch follows: Sledovanà header: HlaviÄka inbox_url: URL pÅ™ijatých zpráv @@ -157,7 +157,7 @@ cs: roles: admin: Administrátor moderator: Moderátor - staff: Personál + staff: ÄŒlen personálu user: Uživatel salmon_url: URL Salmon search: Hledat @@ -305,7 +305,7 @@ cs: title: ÄŒerná listina e-mailů followers: back_to_account: ZpÄ›t na úÄet - title: Sledovatelé uživatele %{acct} + title: SledujÃcà uživatele %{acct} instances: delivery_available: DoruÄenà je k dispozici known_accounts: @@ -318,9 +318,9 @@ cs: title: Moderace title: Federace total_blocked_by_us: Blokované námi - total_followed_by_them: Sledované jÃm + total_followed_by_them: Sledované jimi total_followed_by_us: Sledované námi - total_reported: Nahlášenà o nÄ›m + total_reported: Nahlášenà o nich total_storage: Mediálnà pÅ™Ãlohy invites: deactivate_all: Deaktivovat vÅ¡e @@ -392,14 +392,14 @@ cs: desc_html: PozmÄ›nit vzhled pomocà šablony CSS naÄtené na každé stránce title: Vlastnà CSS hero: - desc_html: Zobrazuje se na hlavnà stránce. DoporuÄuje se rozliÅ¡enà alespoň 600x100 px. Pokud toto nenà nastaveno, bude zobrazena miniatura instance + desc_html: Zobrazuje se na hlavnà stránce. DoporuÄuje se rozliÅ¡enà alespoň 600x100 px. Pokud toto nenà nastaveno, bude zobrazena miniatura serveru title: Hlavnà obrázek mascot: desc_html: Zobrazuje se na hlavnà stránce. DoporuÄuje se rozliÅ¡enà alespoň 293x205 px. Pokud toto nenà nastaveno, bude zobrazen výchozà maskot title: Obrázek maskota peers_api_enabled: - desc_html: Domény, na které tato instance narazila ve fediverse - title: ZveÅ™ejnit seznam objevených instancà + desc_html: Domény, na které tento server narazil ve fediverse + title: ZveÅ™ejnit seznam objevených serverů preview_sensitive_media: desc_html: Náhledy odkazů na jiných stránkách budou zobrazeny i pokud jsou media oznaÄena jako citlivá title: Zobrazovat v náhledech OpenGraph i citlivá média @@ -427,20 +427,20 @@ cs: title: Zobrazit odznak personálu site_description: desc_html: Úvodnà odstavec na hlavnà stranÄ›. PopiÅ¡te, dÃky Äemu je tento server Mastodon zvláštnÃ, a cokoliv jiného, co je důležité. Můžete zde použÃvat HTML znaÄky, hlavnÄ› <code><a></code> a <code><em></code>. - title: Popis instance + title: Popis serveru site_description_extended: - desc_html: Dobré mÃsto pro vaÅ¡e pravidla, pokyny a jiné vÄ›ci, které vaÅ¡i instanci odliÅ¡ujà od ostatnÃch. Lze použÃt HTML znaÄky + desc_html: Dobré mÃsto pro vaÅ¡e pravidla, pokyny a jiné vÄ›ci, které váš server odliÅ¡ujà od ostatnÃch. Lze použÃt HTML znaÄky title: Vlastnà doplňujÃcà informace site_short_description: - desc_html: Zobrazen v postrannÃm panelu a meta znaÄkách. PopiÅ¡te, co je Mastodon a dÃky Äemu je tento server zvláštnà v jediném odstavci. Je-li tohle prázdné, zobrazà se popis instance. - title: Krátký popis instance + desc_html: Zobrazen v postrannÃm panelu a meta znaÄkách. PopiÅ¡te, co je Mastodon a dÃky Äemu je tento server zvláštnà v jediném odstavci. Je-li tohle prázdné, zobrazà se popis serveru. + title: Krátký popis serveru site_terms: desc_html: Můžete si napsat vlastnà zásady soukromÃ, podmÃnky použÃvánà Äi jiné legality. Můžete použÃt HTML znaÄky title: Vlastnà podmÃnky použÃvánà - site_title: Název instance + site_title: Název serveru thumbnail: desc_html: PoužÃváno pro náhledy pÅ™es OpenGraph a API. DoporuÄuje se rozliÅ¡enà 1200x630px - title: Miniatura instance + title: Miniatura serveru timeline_preview: desc_html: Zobrazit na hlavnà stranÄ› veÅ™ejnou Äasovou osu title: Náhled Äasové osy @@ -501,7 +501,7 @@ cs: warning: BuÄte s tÄ›mito daty velmi opatrnÃ. Nikdy je s nikým nesdÃlejte! your_token: Váš pÅ™Ãstupový token auth: - agreement_html: KliknutÃm na tlaÄÃtko „Registrovat“ souhlasÃte s následovánÃm <a href="%{rules_path}">pravidel této instance</a> a <a href="%{terms_path}">naÅ¡ich podmÃnek použÃvánÃ</a>. + agreement_html: KliknutÃm na tlaÄÃtko „Registrovat“ souhlasÃte s následovánÃm <a href="%{rules_path}">pravidel tohoto serveru</a> a <a href="%{terms_path}">naÅ¡ich podmÃnek použÃvánÃ</a>. change_password: Heslo confirm_email: Potvrdit e-mail delete_account: Odstranit úÄet @@ -555,12 +555,12 @@ cs: description_html: TÃmto <strong>trvale a nenávratnÄ›</strong> odstranÃte obsah z vaÅ¡eho úÄtu a deaktivujete ho. VaÅ¡e uživatelské jméno zůstane rezervované pro zabránÄ›nà budoucÃm napodobovánÃm. proceed: Odstranit úÄet success_msg: Váš úÄet byl úspěšnÄ› odstranÄ›n - warning_html: Pouze vymazánà obsahu z této konkrétnà instance je zaruÄeno. Obsah, který byl Å¡iroce sdÃlen, po sobÄ› pravdÄ›podobnÄ› zanechá stopy. U offline serverů a serverů, které vaÅ¡e aktualizace již neodebÃrajÃ, nebudou databáze aktualizovány. + warning_html: Pouze vymazánà obsahu z tohoto konkrétnÃho serveru je zaruÄeno. Obsah, který byl Å¡iroce sdÃlen, po sobÄ› pravdÄ›podobnÄ› zanechá stopy. U offline serverů a serverů, které vaÅ¡e aktualizace již neodebÃrajÃ, nebudou databáze aktualizovány. warning_title: Dostupnost rozÅ¡ÃÅ™eného obsahu directories: directory: Adresář profilů enabled: AktuálnÄ› jste v adresáři uveden/a. - enabled_but_waiting: PÅ™ihlásil/a jste se k uvedenà v adresáři, ale jeÅ¡tÄ› nemáte minimálnà poÄet sledovatelů (%{min_followers}) pro uvedenÃ. + enabled_but_waiting: PÅ™ihlásil/a jste se k uvedenà v adresáři, ale jeÅ¡tÄ› nemáte minimálnà poÄet sledujÃcÃch (%{min_followers}) pro uvedenÃ. explanation: Objevujte uživatele podle jejich zájmů explore_mastodon: Prozkoumejte %{title} how_to_enable: AktuálnÄ› nejste pÅ™ihlášen/a do adresáře. PÅ™ihlásit se můžete nÞe. Použijte ve svém popisu profilu hashtagy, abyste mohl/a být uveden/a pod konkrétnÃmi hashtagy! @@ -613,17 +613,17 @@ cs: title: PÅ™idat nový filtr followers: domain: Doména - explanation_html: Chcete-li zaruÄit soukromà vaÅ¡ich pÅ™ÃspÄ›vků, musÃte mÃt na vÄ›domÃ, kdo vás sleduje. <strong>VaÅ¡e soukromé pÅ™ÃspÄ›vky jsou doruÄeny na vÅ¡echny instance, kde máte sledovatele</strong>. NejspÃÅ¡ si je budete chtÃt zkontrolovat a odstranit sledovatele na instancÃch, jejichž personálu Äi softwaru nedůvěřujete s respektovánÃm vaÅ¡eho soukromÃ. - followers_count: PoÄet sledovatelů + explanation_html: Chcete-li zaruÄit soukromà vaÅ¡ich pÅ™ÃspÄ›vků, musÃte mÃt na vÄ›domÃ, kdo vás sleduje. <strong>VaÅ¡e soukromé pÅ™ÃspÄ›vky jsou doruÄeny na vÅ¡echny servery, kde máte sledujÃcÃ</strong>. NejspÃÅ¡ si je budete chtÃt zkontrolovat a odstranit sledujÃcà na serverech, jejichž provozovatelům Äi softwaru nedůvěřujete s respektovánÃm vaÅ¡eho soukromÃ. + followers_count: PoÄet sledujÃcÃch lock_link: ZamknÄ›te svůj úÄet - purge: Odstranit ze sledovatelů + purge: Odstranit ze sledujÃcÃch success: few: V průbÄ›hu blokovánà sledovatelů ze %{count} domén... - one: V průbÄ›hu blokovánà sledovatelů z jedné domény... - other: V průbÄ›hu blokovánà sledovatelů z %{count} domén... + one: V průbÄ›hu blokovánà sledujÃcÃch z jedné domény... + other: V průbÄ›hu blokovánà sledujÃcÃch 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ý + 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 kontrolovat a odmÃtat sledujÃcÃ. + unlocked_warning_title: Váš úÄet nenà uzamÄen footer: developers: Vývojáři more: VÃce… @@ -637,7 +637,7 @@ cs: 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 imports: - preface: Můžete importovat data, která jste exportoval/a z jiné instance, jako napÅ™Ãklad seznam lidÃ, které sledujete Äi blokujete. + preface: Můžete importovat data, která jste exportoval/a z jiného serveru, 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 types: blocking: Seznam blokovaných @@ -663,7 +663,7 @@ cs: one: 1 použità other: "%{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 + prompt: Vygenerujte a sdÃlejte s ostatnÃmi odkazy a umožnÄ›te jim pÅ™Ãstup na tento server table: expires_at: VyprÅ¡Ã uses: Použità @@ -689,8 +689,8 @@ cs: mention: "%{name} vás zmÃnil/a v:" new_followers_summary: few: NavÃc jste zÃskal/a %{count} nové sledovatele, zatÃmco jste byl/a pryÄ! SkvÄ›lé! - 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Ä! Úžasné! + one: NavÃc jste zÃskal/a jednoho nového sledujÃcÃho, zatÃmco jste byl/a pryÄ! Hurá! + other: NavÃc jste zÃskal/a %{count} nových sledujÃcÃch, zatÃmco jste byl/a pryÄ! Úžasné! subject: few: "%{count} nová oznámenà od vaÅ¡Ã poslednà návÅ¡tÄ›vy \U0001F418" one: "1 nové oznámenà od vaÅ¡Ã poslednà návÅ¡tÄ›vy \U0001F418" @@ -703,11 +703,11 @@ cs: follow: body: "%{name} vás nynà sleduje!" subject: "%{name} vás nynà sleduje" - title: Nový sledovatel + title: Nový sledujÃcà follow_request: action: Spravovat požadavky o sledovánà body: "%{name} požádal/a o povolenà vás sledovat" - subject: 'ÄŒekajÃcà sledovatel: %{name}' + subject: 'ÄŒekajÃcà sledujÃcÃ: %{name}' title: Nový požadavek o sledovánà mention: action: OdpovÄ›dÄ›t @@ -812,7 +812,7 @@ cs: development: Vývoj edit_profile: Upravit profil export: Export dat - followers: Autorizovanà sledovatelé + followers: Autorizovanà sledujÃcà import: Import migrate: PÅ™esunutà úÄtu notifications: Oznámenà @@ -849,8 +849,8 @@ cs: sign_in_to_participate: Chcete-li se úÄastnit této konverzace, pÅ™ihlaste se title: "%{name}: „%{quote}“" visibilities: - private: Pouze pro sledovatele - private_long: Zobrazit pouze sledovatelům + private: Pouze pro sledujÃcà + private_long: Zobrazit pouze sledujÃcÃm public: VeÅ™ejné public_long: VÅ¡ichni mohou vidÄ›t unlisted: Neuvedené @@ -866,8 +866,8 @@ cs: <ul> <li><em>Základnà informace o úÄtu</em>: Pokud se na tomto serveru zaregistrujete, můžeme vás požádat o zadánà uživatelského jména, e-mailové adresy a hesla. Můžete také zadat dodateÄné profilové informace, jako napÅ™Ãklad zobrazované jméno a krátký životopis, a nahrát si profilovou fotografii a hlaviÄkový obrázek. Uživatelské i zobrazované jméno, životopis, profilová fotografie a hlaviÄkový obrázek jsou vždy uvedeny veÅ™ejnÄ›.</li> - <li><em>PÅ™ÃspÄ›vky, sledovatelé a dalÅ¡Ã veÅ™ejné informace</em>: Seznam lidÃ, které sledujete, je uveden veÅ™ejnÄ›, totéž platà i pro vaÅ¡e sledovatele. Když sem nahrajete zprávu, bude uloženo datum a Äas, spoleÄnÄ› s aplikacÃ, ze které jste zprávu odeslali. Zprávy mohou obsahovat mediálnà pÅ™Ãlohy, jako jsou obrázky a videa. VeÅ™ejné a neuvedené pÅ™ÃspÄ›vky jsou dostupné veÅ™ejnÄ›. Pokud na vaÅ¡em profilu uvedete pÅ™ÃspÄ›vek, je to také veÅ™ejnÄ› dostupná informace. VaÅ¡e pÅ™ÃspÄ›vky jsou doruÄeny vaÅ¡im sledovatelům, což v nÄ›kterých pÅ™Ãpadech znamená, že budou doruÄeny na různé servery, na kterých budou ukládány kopie. Pokud pÅ™ÃspÄ›vky smažete, bude tohle taktéž doruÄeno vaÅ¡im sledovatelům. Akce znovusdÃlenà nebo oblÃbenà jiného pÅ™ÃspÄ›vku je vždy veÅ™ejná.</li> - <li><em>PÅ™ÃspÄ›vky pÅ™Ãmé a pouze pro sledovatele</em>: VÅ¡echny pÅ™ÃspÄ›vky jsou uloženy a zpracovány na serveru. PÅ™ÃspÄ›vky pouze pro sledovatele jsou doruÄeny vaÅ¡im sledovatelům a uživatelům v nich zmÃnÄ›ným a pÅ™Ãmé pÅ™ÃspÄ›vky jsou doruÄeny pouze uživatelům v nich zmÃnÄ›ným. V nÄ›kterých pÅ™Ãpadech tohle znamená, že budou doruÄeny na různé servery, na kterých budou ukládány kopie. SnažÃme se omezit pÅ™Ãstup k tÄ›mto pÅ™ÃspÄ›vkům pouze na autorizované uživatele, ovÅ¡em jiné servery tak nemusejà uÄinit. Proto je důležité posoudit servery, ke kterým vaÅ¡i sledovatelé patÅ™Ã. V nastavenà si můžete zapnout volbu pro manuálnà schvalovánà Äi odmÃtnutà nových sledovatelů. <em>ProsÃm mÄ›jte na pamÄ›ti, že operátoÅ™i tohoto serveru a kteréhokoliv pÅ™ijÃmacÃho serveru mohou tyto zprávy vidÄ›t</em> a pÅ™Ãjemci mohou vytvoÅ™it jejich snÃmek, zkopÃrovat je, nebo je jinak sdÃlet. <em>NesdÃlejte pÅ™es Mastodon jakékoliv nebezpeÄné informace.</em></li> + <li><em>PÅ™ÃspÄ›vky, sledujÃcà a dalÅ¡Ã veÅ™ejné informace</em>: Seznam lidÃ, které sledujete, je uveden veÅ™ejnÄ›, totéž platà i pro vaÅ¡e sledujÃcÃ. Když sem nahrajete zprávu, bude uloženo datum a Äas, spoleÄnÄ› s aplikacÃ, ze které jste zprávu odeslali. Zprávy mohou obsahovat mediálnà pÅ™Ãlohy, jako jsou obrázky a videa. VeÅ™ejné a neuvedené pÅ™ÃspÄ›vky jsou dostupné veÅ™ejnÄ›. Pokud na vaÅ¡em profilu uvedete pÅ™ÃspÄ›vek, je to také veÅ™ejnÄ› dostupná informace. VaÅ¡e pÅ™ÃspÄ›vky jsou doruÄeny vaÅ¡im sledujÃcÃm, což v nÄ›kterých pÅ™Ãpadech znamená, že budou doruÄeny na různé servery, na kterých budou ukládány kopie. Pokud pÅ™ÃspÄ›vky smažete, bude tohle taktéž doruÄeno vaÅ¡im sledujÃcÃm. Akce znovusdÃlenà nebo oblÃbenà jiného pÅ™ÃspÄ›vku je vždy veÅ™ejná.</li> + <li><em>PÅ™ÃspÄ›vky pÅ™Ãmé a pouze pro sledujÃcÃ</em>: VÅ¡echny pÅ™ÃspÄ›vky jsou uloženy a zpracovány na serveru. PÅ™ÃspÄ›vky pouze pro sledujÃcà jsou doruÄeny vaÅ¡im sledujÃcÃm a uživatelům v nich zmÃnÄ›ným a pÅ™Ãmé pÅ™ÃspÄ›vky jsou doruÄeny pouze uživatelům v nich zmÃnÄ›ným. V nÄ›kterých pÅ™Ãpadech tohle znamená, že budou doruÄeny na různé servery, na kterých budou ukládány kopie. SnažÃme se omezit pÅ™Ãstup k tÄ›mto pÅ™ÃspÄ›vkům pouze na autorizované uživatele, ovÅ¡em jiné servery tak nemusejà uÄinit. Proto je důležité posoudit servery, ke kterým vaÅ¡i sledujÃcà patÅ™Ã. V nastavenà si můžete zapnout volbu pro manuálnà schvalovánà Äi odmÃtnutà nových sledujÃcÃch. <em>ProsÃm mÄ›jte na pamÄ›ti, že operátoÅ™i tohoto serveru a kteréhokoliv pÅ™ijÃmacÃho serveru mohou tyto zprávy vidÄ›t</em> a pÅ™Ãjemci mohou vytvoÅ™it jejich snÃmek, zkopÃrovat je, nebo je jinak sdÃlet. <em>NesdÃlejte pÅ™es Mastodon jakékoliv nebezpeÄné informace.</em></li> <li><em>IP adresy a dalÅ¡Ã metadata</em>: Když se pÅ™ihlásÃte, zaznamenáváme IP adresu, ze které se pÅ™ihlaÅ¡ujete, jakožto i název vaÅ¡eho webového prohlÞeÄe. VÅ¡echny vaÅ¡e webové relace jsou v nastavenà pÅ™Ãstupné k vaÅ¡emu posouzenà a odvolánÃ. NejpozdÄ›jÅ¡Ã IP adresa použita je uložena maximálnÄ› do 12 mÄ›sÃců. Můžeme také uchovávat serverové záznamy, které obsahujà IP adresy každého požadavku odeslaného na náš server.</li> </ul> @@ -908,7 +908,7 @@ cs: <h3 id="cookies">PoužÃváme cookies?</h3> - <p>Ano. Cookies jsou malé soubory, které stránka nebo jejà poskytovatel uložà na pevný disk vaÅ¡eho poÄÃtaÄe (pokud to dovolÃte). Tyto cookies umožňujà stránce rozpoznat váš prohlÞeÄ a, pokud máte registrovaný úÄet, pÅ™idružit ho s vaÅ¡Ãm registrovaným úÄtem.</p> + <p>Ano. Cookies jsou malé soubory, které stránka nebo jejà poskytovatel uložà na pevný disk vaÅ¡eho poÄÃtaÄe (pokud to dovolÃte). Tyto cookies umožňujà stránce rozpoznat váš prohlÞeÄ, a pokud máte registrovaný úÄet, pÅ™idružit ho s vaÅ¡Ãm registrovaným úÄtem.</p> <p>PoužÃváme cookies pro pochopenà a ukládánà vaÅ¡ich pÅ™edvoleb pro budoucà návÅ¡tÄ›vy.</p> @@ -918,15 +918,15 @@ cs: <p>VaÅ¡e osobnÄ› identifikovatelné informace neprodáváme, neobchodujeme s nimi, ani je nijak nepÅ™enášÃme vnÄ›jÅ¡Ãm stranám. Do tohoto se nepoÄÃtajà důvÄ›ryhodné tÅ™età strany, které nám pomáhajà provozovat naÅ¡i stránku, podnikat, nebo vás obsluhovat, pokud tyto strany souhlasà se zachovánÃm důvÄ›rnosti tÄ›chto informacÃ. Můžeme také uvolnit vaÅ¡e informace, pokud věřÃme, že je to nutné pro soulad se zákonem, prosazovánà naÅ¡ich zásad, nebo ochranu práv, majetku, Äi bezpeÄnost nás Äi ostatnÃch.</p> - <p>Váš veÅ™ejný obsah může být stažen jinými servery na sÃti. VaÅ¡e pÅ™ÃspÄ›vky veÅ™ejné a pouze pro sledovatele budou doruÄeny na servery vaÅ¡ich sledovatelů a pÅ™Ãmé zprávy budou doruÄeny na servery pÅ™Ãjemců, pokud jsou tito sledovatelé nebo pÅ™Ãjemci zaregistrováni na jiném serveru, než je tento.</p> + <p>Váš veÅ™ejný obsah může být stažen jinými servery na sÃti. VaÅ¡e pÅ™ÃspÄ›vky veÅ™ejné a pouze pro sledujÃcà budou doruÄeny na servery vaÅ¡ich sledujÃcÃch a pÅ™Ãmé zprávy budou doruÄeny na servery pÅ™Ãjemců, pokud jsou tito sledujÃcà nebo pÅ™Ãjemci zaregistrováni na jiném serveru, než je tento.</p> - <p>Když autorizujete aplikaci, aby použÃvala váš úÄet, může, v závislosti na rozsahu oprávnÄ›nÃ, které jà udÄ›lÃte, pÅ™istupovat k vaÅ¡im veÅ™ejným profilovým informacÃm, seznamu lidÃ, které sledujete, vaÅ¡im sledovatelům, vaÅ¡im seznamům, vÅ¡em vaÅ¡im pÅ™ÃspÄ›vkům a pÅ™ÃspÄ›vkům, které jste si oblÃbili. Aplikace nikdy nemohou zÃskat vaÅ¡i e-mailovou adresu Äi heslo.</p> + <p>Když autorizujete aplikaci, aby použÃvala váš úÄet, může, v závislosti na rozsahu oprávnÄ›nÃ, které jà udÄ›lÃte, pÅ™istupovat k vaÅ¡im veÅ™ejným profilovým informacÃm, seznamu lidÃ, které sledujete, vaÅ¡im sledujÃcÃm, vaÅ¡im seznamům, vÅ¡em vaÅ¡im pÅ™ÃspÄ›vkům a pÅ™ÃspÄ›vkům, které jste si oblÃbili. Aplikace nikdy nemohou zÃskat vaÅ¡i e-mailovou adresu Äi heslo.</p> <hr class="spacer" /> <h3 id="children">PoužÃvánà stránky dÄ›tmi</h3> - <p>Pokud se tento server nacházà v EU nebo EHP: NaÅ¡e stránka, produkty a služby jsou vÅ¡echny směřovány na lidi, kterým je alespoň 16 let. Pokud je vám ménÄ› než 16, dle požadavků naÅ™Ãzenà GDPR (<a href="https://cs.wikipedia.org/wiki/Obecn%C3%A9_na%C5%99%C3%ADzen%C3%AD_o_ochran%C4%9B_osobn%C3%ADch_%C3%BAdaj%C5%AF">Obecné naÅ™Ãzenà o ochranÄ› sobnÃch údajů</a>) tuto stránku nepoužÃvejte.</p> + <p>Pokud se tento server nacházà v EU nebo EHP: NaÅ¡e stránka, produkty a služby jsou vÅ¡echny směřovány na lidi, kterým je alespoň 16 let. Pokud je vám ménÄ› než 16, dle požadavků naÅ™Ãzenà GDPR (<a href="https://cs.wikipedia.org/wiki/Obecn%C3%A9_na%C5%99%C3%ADzen%C3%AD_o_ochran%C4%9B_osobn%C3%ADch_%C3%BAdaj%C5%AF">Obecné naÅ™Ãzenà o ochranÄ› osobnÃch údajů</a>) tuto stránku nepoužÃvejte.</p> <p>Pokud se tento server nacházà v USA: NaÅ¡e stránka, produkty a služby jsou vÅ¡echny směřovány na lidi, kterým je alespoň 13 let. Pokud je vám ménÄ› než 13, dle požadavků zákona COPPA (<a href="https://cs.wikipedia.org/wiki/Children%27s_online_privacy_protection_act">Children's Online Privacy Protection Act</a>) tuto stránku nepoužÃvejte.</p> @@ -975,7 +975,7 @@ cs: explanation: disable: ZatÃmco je váš úÄet zmražen, zůstávajà data vaÅ¡eho úÄtu nedotÄená, ale nemůžete vykonávat žádné akce, dokud nebude odemÄen. silence: ZatÃmco je váš úÄet omezen, mohou vaÅ¡e tooty na tomto serveru vidÄ›t pouze lidé, kteřà váš již sledujÃ, a můžete být vylouÄen/a z různých veÅ™ejných výpisů. Ostatnà vás vÅ¡ak pořád mohou manuálnÄ› sledovat. - suspend: Váš úÄet byl pozastaven a vÅ¡echny vaÅ¡e tooty a vaÅ¡e nahrané mediálnà soubory byly nenávratnÄ› odstranÄ›ny z tohoto serveru a serverů, na kterých jste mÄ›l/a sledovatele. + suspend: Váš úÄet byl pozastaven a vÅ¡echny vaÅ¡e tooty a vaÅ¡e nahrané mediálnà soubory byly nenávratnÄ› odstranÄ›ny z tohoto serveru a serverů, na kterých jste mÄ›l/a sledujÃcÃ. review_server_policies: Posoudit politiku serveru subject: disable: Váš úÄet %{acct} byl zmražen @@ -989,12 +989,12 @@ cs: suspend: ÚÄet pozastaven welcome: edit_profile_action: Nastavit profil - edit_profile_step: Můžete si pÅ™izpůsobit svůj profil nahránÃm avataru a obrázku na hlaviÄce, zmÄ›nou zobrazovaného jména a dalÅ¡Ãch. Chcete-li posoudit nové sledovatele pÅ™edtÃm, než vás mohou sledovat, můžete svůj úÄet uzamknout. + edit_profile_step: Můžete si pÅ™izpůsobit svůj profil nahránÃm avataru a obrázku na hlaviÄce, zmÄ›nou zobrazovaného jména a dalÅ¡Ãch. Chcete-li posoudit nové sledujÃcà pÅ™edtÃm, než vás mohou sledovat, můžete svůj úÄet uzamknout. explanation: Zde je pár tipů na zaÄátek final_action: ZaÄnÄ›te pÅ™ispÃvat - final_step: 'ZaÄnÄ›te pÅ™ispÃvat! I když nemáte sledovatele, mohou vaÅ¡e zprávy vidÄ›t jinà lidé, napÅ™Ãklad na mÃstnà Äasové ose a mezi hashtagy. Můžete se ostatnÃm pÅ™edstavit pomocà hashtagu #introductions.' + final_step: 'ZaÄnÄ›te pÅ™ispÃvat! I když nemáte sledujÃcÃ, mohou vaÅ¡e zprávy vidÄ›t jinà lidé, napÅ™Ãklad na mÃstnà Äasové ose a mezi hashtagy. Můžete se ostatnÃm pÅ™edstavit pomocà hashtagu #introductions.' full_handle: VaÅ¡e celá adresa profilu - full_handle_hint: Tohle je, co byste Å™ekl/a svým přátelům, aby vám mohli posÃlat zprávy nebo vás sledovat z jiné instance. + full_handle_hint: Tohle je, co byste Å™ekl/a svým přátelům, aby vám mohli posÃlat zprávy nebo vás sledovat z jiného serveru. review_preferences_action: ZmÄ›nit nastavenà review_preferences_step: Nezapomeňte si nastavit své volby, napÅ™Ãklad jaké e-maily chcete pÅ™ijÃmat Äi jak soukromé majà být vaÅ¡e pÅ™ÃspÄ›vky ve výchozÃm stavu. Nemáte-li epilepsii, můžete si nastavit automatické pÅ™ehrávánà obrázků GIF. subject: VÃtejte na Mastodonu diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 53b474c167..f225cc086d 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -60,6 +60,7 @@ cy: zero: Dilynwyr following: Yn dilyn joined: Ymunodd %{date} + last_active: diweddaraf link_verified_on: Gwiriwyd perchnogaeth y ddolen yma ar %{date} media: Cyfryngau moved_html: 'Mae %{name} wedi symud i %{new_profile_link}:' @@ -87,6 +88,7 @@ cy: admin: account_actions: action: Cyflawni gweithred + title: Perfformio cymedroli ar %{acct} account_moderation_notes: create: Gadael nodyn created_msg: Crewyd nodyn cymedroli yn llwyddiannus! @@ -155,6 +157,7 @@ cy: push_subscription_expires: Tanysgrifiad PuSH yn dod i ben redownload: Adnewyddu proffil remove_avatar: Dileu afatar + remove_header: Dileu pennawd resend_confirmation: already_confirmed: Mae'r defnyddiwr hwn wedi ei gadarnhau yn barod send: Ailanfonwch e-bost cadarnhad @@ -172,8 +175,8 @@ cy: search: Chwilio shared_inbox_url: URL Mewnflwch wedi ei rannu show: - created_reports: Adroddiadau a grewyd gan y cyfri hwn - targeted_reports: Adroddiadau am y cyfri hwn + created_reports: Adroddiadau a wnaed + targeted_reports: Adroddwyd gan eraill silence: Tawelu silenced: Tawelwyd statuses: Statysau @@ -192,6 +195,7 @@ cy: assigned_to_self_report: Aseiniodd %{name} adroddiad %{target} i'w hunan change_email_user: Newidodd %{name} gyfeiriad e-bost y defnyddiwr %{target} confirm_user: Cadarnhaodd %{name} gyfeiriad e-bost y defnyddiwr %{target} + create_account_warning: Anfonwyd rhybudd i %{target} gan %{name} create_custom_emoji: Uwchlwythodd %{name} emoji newydd %{target} create_domain_block: Blociodd %{name} y parth %{target} create_email_domain_block: Cosbrestrwyd parth e-bost %{target} gan %{name} @@ -250,6 +254,7 @@ cy: config: Cyfluniad feature_deletions: Dileadau cyfrif feature_invites: Dolenni gwahodd + feature_profile_directory: Cyfeiriadur proffil feature_registrations: Cofrestriadau feature_relay: Relái ffederasiwn features: Nodweddion @@ -267,7 +272,7 @@ cy: week_users_active: gweithredol yr wythnos hon week_users_new: defnyddwyr yr wythnos hon domain_blocks: - add_new: Ychwanegu + add_new: Ychwanegu bloc parth newydd created_msg: Mae'r bloc parth nawr yn cael ei brosesu destroyed_msg: Mae'r bloc parth wedi ei ddadwneud domain: Parth @@ -284,14 +289,25 @@ cy: reject_media_hint: Dileu dogfennau cyfryngau wedi eu cadw yn lleol ac yn gwrthod i lawrlwytho unrhyw rai yn y dyfodol. Amherthnasol i ataliadau reject_reports: Gwrthod adroddiadau reject_reports_hint: Anwybyddu'r holl adroddiadau sy'n dod o'r parth hwn. Amherthnasol i ataliadau + rejecting_media: Yn gwrthod ffeiliau cyfryngau + rejecting_reports: Yn gwrthod adroddiadau + severity: + silence: tawelu + suspend: ataliedig show: - affected_accounts: "%{count} o gyfrifoedd yn y bas data wedi eu hefeithio" + affected_accounts: + few: Effeithiwyd ar %{count} gyfrifon + many: Effeithiwyd ar %{count} gyfrifon + one: Effeithiwyd ar un cyfrif + other: Effeithiwyd ar %{count} gyfrifon + two: Effeithiwyd ar %{count} gyfrifon + zero: Effeithiwyd ar %{count} gyfrifon retroactive: silence: Dad-dawelu pob cyfri presennol o'r parth hwn suspend: Dad-atal pob cyfrif o'r parth hwn sy'n bodoli title: Dadwneud blocio parth ar gyfer %{domain} undo: Dadwneud - undo: Dadwneud + undo: Dadwneud bloc parth email_domain_blocks: add_new: Ychwanegu created_msg: Llwyddwyd i ychwanegu parth e-bost i'r gosbrestr @@ -302,11 +318,28 @@ cy: create: Ychwanegu parth title: Cofnod newydd yng nghosbrestr e-byst title: Cosbrestr e-bost + followers: + back_to_account: Nôl i'r gyfrif + title: Dilynwyr %{acct} instances: + delivery_available: Mae'r cyflenwad ar gael + known_accounts: + few: "%{count} cyfrifon hysbys" + many: "%{count} cyfrifon hysbys" + one: "%{count} cyfrif hysbys" + other: "%{count} cyfrifon hysbys" + two: "%{count} cyfrifon hysbys" + zero: "%{count} cyfrifon hysbys" moderation: all: Pob limited: Gyfyngedig + title: Cymedroli title: Ffederasiwn + total_blocked_by_us: Wedi'i bloc gan ni + total_followed_by_them: Yn dilyn ganynt + total_followed_by_us: Yn dilyn ganom ni + total_reported: Adroddiadau amdanynt + total_storage: Atodiadau cyfryngau invites: deactivate_all: Diffodd pob un filter: @@ -388,6 +421,9 @@ cy: preview_sensitive_media: desc_html: Bydd rhagolygon ar wefannau eraill yn dangos ciplun hyd yn oed os oes na gyfryngau wedi eu marcio'n sensitif title: Dangos cyfryngau sensitif mewn rhagolygon OpenGraph + profile_directory: + desc_html: Caniatáu i ddefnyddwyr gael eu gweld + title: Galluogi cyfeiriadur proffil registrations: closed_message: desc_html: I'w arddangos ar y dudalen flaen wedi i gofrestru cau. Mae modd defnyddio tagiau HTML @@ -450,9 +486,14 @@ cy: tags: accounts: Cyfrifon hidden: Cudd + hide: Cuddio o gyfeiriadur name: Hashnod + title: Hashnodau + unhide: Dangoswch yn y cyfeiriadur + visible: Gweladwy title: Gweinyddiaeth warning_presets: + add_new: Ychwanegu newydd delete: Dileu edit: Golygu admin_mailer: @@ -532,6 +573,20 @@ cy: success_msg: Llwyddwyd i ddileu eich cyfrif warning_html: Dim ond dileu cynnwys o'r achos hwn ellid bod yn sicr ei fod wedi ei ddileu. Mae cynnwys sydd wedi ei rannu'n eang yn debygol o adael olion. Ni fydd gweinyddwyr all-lein a gweinyddwyr sydd wedi dad-danysgrifio o'ch diwedderiadau ddim yn diweddaru eu cronfeydd data. warning_title: Argaeledd cynnwys wedi'i rannu + directories: + directory: Cyfeiriadur proffil + enabled: Rydych chi wedi'ch rhestru yn y cyfeiriadur ar hyn o bryd. + enabled_but_waiting: Rydych wedi dewis i chi gael eich rhestru yn y cyfeiriadur, ond nid oes gennych y nifer lleiaf o ddilynwyr (%{min_followers}) i'w rhestru eto. + explanation: Darganfod defnyddwyr yn seiliedig ar eu diddordebau + explore_mastodon: Archwilio %{title} + how_to_enable: Ar hyn o bryd nid ydych chi wedi dewis y cyfeiriadur. Gallwch ddewis i mewn isod. Defnyddiwch hashnodau yn eich bio-destun i'w restru dan hashnodau penodol! + people: + few: "%{count} personau" + many: "%{count} personau" + one: "%{count} person" + other: "%{count} personau" + two: "%{count} personau" + zero: "%{count} personau" errors: '403': Nid oes gennych ganiatad i weld y dudalen hon. '404': Nid yw'r dudalen yr oeddech yn chwilio amdani'n bodoli. @@ -554,7 +609,9 @@ cy: size: Maint blocks: Yr ydych yn blocio csv: CSV + domain_blocks: Blociau parth follows: Yr ydych yn dilyn + lists: Rhestrau mutes: Yr ydych yn tawelu storage: Storio cyfryngau filters: @@ -579,7 +636,13 @@ cy: followers_count: Nifer y dilynwyr lock_link: Cloi eich cyfrif purge: Dileu o dilynwyr - success: Yn y broses o ysgafn-flocio dilynwyr o %{count} parth... + success: + few: Yn y broses o ysgafn-flocio defnyddwyr o %{count} parth... + many: Yn y broses o ysgafn-flocio defnyddwyr o %{count} parth... + one: Yn y broses o ysgafn-flocio dilynwyr o un parth... + other: Yn y broses o ysgafn-flocio defnyddwyr o %{count} parth... + two: Yn y broses o ysgafn-flocio defnyddwyr o %{count} parth... + zero: Yn y broses o ysgafn-flocio defnyddwyr o %{count} parth... true_privacy_html: Cofiwch <strong>mai ond amgryptio pen-i-ben all sicrhau gwir breifatrwydd</strong>. unlocked_warning_html: Gall unrhywun eich dilyn yn syth i weld eich tŵtiau preifat. %{lock_link} i gael adolygu a gwrthod dilynwyr. unlocked_warning_title: Nid yw eich cyfrif wedi ei gloi @@ -591,7 +654,13 @@ cy: changes_saved_msg: Llwyddwyd i gadw y newidiadau! copy: Copïo save_changes: Cadw newidiadau - validation_errors: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda + validation_errors: + few: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda + many: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda + 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 + two: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda + zero: 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: Uwchlwythwyd eich data yn llwyddiannus ac fe fydd yn cael ei brosesu mewn da bryd @@ -614,7 +683,13 @@ cy: expires_in_prompt: Byth generate: Cynhyrchu invited_by: 'Cawsoch eich gwahodd gan:' - max_uses: "%{count} defnydd" + max_uses: + few: "%{count} defnydd" + many: "%{count} defnydd" + one: 1 iws + other: "%{count} defnydd" + two: "%{count} defnydd" + zero: "%{count} defnydd" max_uses_prompt: Dim terfyn prompt: Cynhyrchwch a rhannwch ddolenni gyda eraill i ganiatau mynediad i'r achos hwn table: @@ -640,8 +715,20 @@ cy: action: Gweld holl hysbysiadau body: Dyma grynodeb byr o'r holl negeseuon golloch chi ers eich ymweliad diwethaf ar %{since} mention: 'Soniodd %{name} amdanoch chi:' - new_followers_summary: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê! - subject: "%{count} hysbysiad newydd ers eich ymweliad diwethaf \U0001F418" + new_followers_summary: + few: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê! + many: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê! + one: Yr ydych wedi ennill dilynwr newydd tra eich bod i ffwrdd! Hwrê! + other: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê! + two: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê! + zero: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê! + subject: + few: "%{count} hysbysiad newydd ers eich ymweliad diwethaf" + many: "%{count} hysbysiad newydd ers eich ymweliad diwethaf" + one: 1 hysbysiad newydd ers eich ymweliad diwethaf + other: "%{count} hysbysiad newydd ers eich ymweliad diwethaf" + two: "%{count} hysbysiad newydd ers eich ymweliad diwethaf" + zero: "%{count} hysbysiad newydd ers eich ymweliad diwethaf" title: Yn eich absenoldeb... favourite: body: 'Cafodd eich statws ei hoffi gan %{name}:' @@ -755,7 +842,13 @@ cy: statuses: attached: description: 'Ynghlwm: %{attached}' - image: "%{count} o luniau" + image: + few: "%{count} o luniau" + many: "%{count} o luniau" + one: "%{count} llun" + other: "%{count} o luniau" + two: "%{count} o luniau" + zero: "%{count} o luniau" video: few: "%{count} fideo" many: "%{count} fideo" @@ -765,7 +858,13 @@ cy: zero: "%{count} fideo" boosted_from_html: Wedi ei fŵstio %{acct_link} content_warning: 'Rhybudd cynnwys: %{warning}' - disallowed_hashtags: 'yn cynnwys yr hashnod gwaharddedig: %{tags}' + disallowed_hashtags: + few: 'yn cynnwys yr hashnod gwaharddedig: %{tags}' + many: 'yn cynnwys yr hashnod gwaharddedig: %{tags}' + one: 'yn cynnwys hashnod gwaharddedig: %{tags}' + other: 'yn cynnwys yr hashnod gwaharddedig: %{tags}' + two: 'yn cynnwys yr hashnod gwaharddedig: %{tags}' + zero: 'yn cynnwys yr hashnod gwaharddedig: %{tags}' language_detection: Canfod iaith yn awtomataidd open_in_web: Agor yn y wê over_character_limit: wedi mynd heibio'r uchafswm nodyn o %{max} @@ -901,6 +1000,14 @@ cy: subject: Mae eich archif yn barod i'w lawrlwytho title: Allfudo archif warning: + explanation: + disable: Er bod eich cyfrif wedi'i rewi, mae eich data cyfrif yn parhau i fod yn gyfan, ond ni allwch chi berfformio unrhyw gamau nes ei ddatgloi. + review_server_policies: Adolygu polisïau'r gweinydd + subject: + disable: Mae'ch cyfrif %{acct} wedi'i rewi + none: Rhybudd am %{acct} + silence: Mae'ch cyfrif %{acct} wedi bod yn gyfyngedig + suspend: Mae'ch cyfrif %{acct} wedi'i atal title: disable: Cyfrif wedi'i rewi none: Rhybudd @@ -912,7 +1019,7 @@ cy: explanation: Dyma ambell nodyn i'ch helpu i ddechrau final_action: Dechrau postio final_step: 'Dechrau postio! Hyd yn oed heb ddilynwyr mae''n bosib i eraill weld eich negeseuon cyhoeddus, er enghraifft at y ffrwd leol ac mewn hashnodau. Mae''n bosib yr hoffech hi gyflwyno''ch hun ar yr hashnod #introductions.' - full_handle: Eich enw Mastodon llawn + full_handle: Eich enw llawn full_handle_hint: Dyma'r hyn y bysech yn dweud wrth eich ffrindiau er mwyn iddyn nhw gael anfon neges atoch o achos arall. review_preferences_action: Newid dewisiadau review_preferences_step: Gwnewch yn siŵr i chi osod eich dewisiadau, megis pa e-byst hoffech eu derbyn, neu ba lefel preifatrwydd hoffech eich tŵtiau ragosod i. Os nad oes gennych salwch symud, gallwch ddewis i ganiatau chwarae GIFs yn awtomatig. diff --git a/config/locales/devise.cs.yml b/config/locales/devise.cs.yml index 850ff1fe82..83534cccd9 100644 --- a/config/locales/devise.cs.yml +++ b/config/locales/devise.cs.yml @@ -20,17 +20,17 @@ cs: action: Potvrdit e-mailovou adresu action_with_app: Potvrdit a navrátit se do %{app} explanation: S touto e-mailovou adresou jste si vytvoÅ™il/a úÄet na %{host}. K jeho aktivaci vám zbývá jedno kliknutÃ. Pokud jste to nebyl/a vy, ignorujte této e-mail. - extra_html: ProsÃm podÃvejte se také na <a href="%{terms_path}">pravidla této instance</a> a <a href="%{policy_path}">naÅ¡e podmÃnky použÃvánÃ</a>. + extra_html: ProsÃm podÃvejte se také na <a href="%{terms_path}">pravidla tohoto serveru</a> a <a href="%{policy_path}">naÅ¡e podmÃnky použÃvánÃ</a>. subject: 'Mastodon: Potvrzovacà instrukce pro %{instance}' title: PotvrÄte e-mailovou adresu email_changed: explanation: 'E-mailová adresa vaÅ¡eho úÄtu byla zmÄ›nÄ›na na:' - extra: Pokud jste si e-mail nezmÄ›nil/a, je pravdÄ›podobné, že nÄ›kdo jiný zÃskal pÅ™Ãstup k vaÅ¡emu úÄtu. ProsÃm změňte si okamžitÄ› heslo, nebo, pokud se nemůžete na úÄet pÅ™ihlásit, kontaktujte administrátora instance. + extra: Pokud jste si e-mail nezmÄ›nil/a, je pravdÄ›podobné, že nÄ›kdo jiný zÃskal pÅ™Ãstup k vaÅ¡emu úÄtu. ProsÃm změňte si okamžitÄ› heslo, nebo, pokud se nemůžete na úÄet pÅ™ihlásit, kontaktujte administrátora serveru. subject: 'Mastodon: E-mail byl zmÄ›nÄ›n' title: Nová e-mailová adresa password_change: explanation: Heslo k vaÅ¡emu úÄtu bylo zmÄ›nÄ›no. - extra: Pokud jste si heslo nezmÄ›nil/a, je pravdÄ›podobné, že nÄ›kdo jiný zÃskal pÅ™Ãstup k vaÅ¡emu úÄtu. ProsÃm změňte si okamžitÄ› heslo, nebo, pokud se nemůžete na úÄet pÅ™ihlásit, kontaktujte administrátora instance. + extra: Pokud jste si heslo nezmÄ›nil/a, je pravdÄ›podobné, že nÄ›kdo jiný zÃskal pÅ™Ãstup k vaÅ¡emu úÄtu. ProsÃm změňte si okamžitÄ› heslo, nebo, pokud se nemůžete na úÄet pÅ™ihlásit, kontaktujte administrátora serveru. subject: 'Mastodon: Heslo bylo zmÄ›nÄ›no' title: Heslo bylo zmÄ›nÄ›no reconfirmation_instructions: @@ -60,8 +60,8 @@ cs: signed_up: VÃtejte! Registroval/a jste se úspěšnÄ›. signed_up_but_inactive: Registroval/a jste se úspěšnÄ›. Nemohli jsme vás vÅ¡ak pÅ™ihlásit, protože váš úÄet jeÅ¡tÄ› nenà aktivován. signed_up_but_locked: Registroval/a jste se úspěšnÄ›. Nemohli jsme vás vÅ¡ak pÅ™ihlásit, protože váš úÄet je uzamÄen. - signed_up_but_unconfirmed: Na vaÅ¡i e-mailovou adresu byla poslána zpráva s potvrzovacÃm odkazem. Pro aktivaci úÄtu pÅ™ejdÄ›te na danou adresu. ProsÃm zkontrolujte si složku spam, jestli jste tento e-mail neobdržel/a. - update_needs_confirmation: Váš úÄet byl úspěšnÄ› aktualizován, ale je potÅ™eba ověřit vaÅ¡i novou e-mailovou adresu. ProsÃm zkontrolujte si e-mail a kliknÄ›te na odkaz pro potvrzenà vaÅ¡i nové e-mailové adresy. ProsÃm zkontrolujte si složku spam, jestli jste tento e-mail neobdržel/a. + signed_up_but_unconfirmed: Na vaÅ¡i e-mailovou adresu byla poslána zpráva s potvrzovacÃm odkazem. Pro aktivaci úÄtu pÅ™ejdÄ›te na danou adresu. Pokud jste tento e-mail neobdržel/a, prosÃm zkontrolujte si složku spam. + update_needs_confirmation: Váš úÄet byl úspěšnÄ› aktualizován, ale je potÅ™eba ověřit vaÅ¡i novou e-mailovou adresu. ProsÃm zkontrolujte si e-mail a kliknÄ›te na odkaz pro potvrzenà vaÅ¡i nové e-mailové adresy. Pokud jste tento e-mail neobdržel/a, prosÃm zkontrolujte si složku spam. updated: Váš úÄet byl úspěšnÄ› aktualizován. sessions: already_signed_out: Odhlášenà probÄ›hlo úspěšnÄ›. diff --git a/config/locales/devise.cy.yml b/config/locales/devise.cy.yml index 7d96e57f9b..8ea7e1b4fa 100644 --- a/config/locales/devise.cy.yml +++ b/config/locales/devise.cy.yml @@ -18,6 +18,7 @@ cy: mailer: confirmation_instructions: action: Gwiriwch eich cyfeiriad e-bost + action_with_app: Cadarnhau a dychwelyd i %{app} explanation: Yr ydych wedi creu cyfrif ar %{host} gyda'r cyfrif e-bost hwn. Dim ond un clic sydd angen i'w wneud yn weithredol. Os nad chi oedd hyn, anwybyddwch yr e-bost hwn os gwelwch yn dda. extra_html: Gwnewch yn siŵr i edrych ar <a href="%{terms_path}">reolau'r achos</a> a <a href="%{policy_path}">ein telerau gwasanaeth</a>. subject: 'Mastodon: Canllawiau cadarnhau i %{instance}' @@ -77,4 +78,10 @@ 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: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:' + not_saved: + few: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:' + many: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:' + one: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd 1 gwall:' + other: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:' + two: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:' + zero: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:' diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml index 16cd9262e2..e054efb305 100644 --- a/config/locales/devise.sk.yml +++ b/config/locales/devise.sk.yml @@ -2,9 +2,9 @@ sk: devise: confirmations: - confirmed: Váš úÄet bol úspeÅ¡ne overený. - send_instructions: O niekoľko minút obdržÃte email s inÅ¡trukciami ako potvrdiÅ¥ váš úÄet. - send_paranoid_instructions: Ak sa váš email nachádza v naÅ¡ej databáze, obdržÃte email s inÅ¡trukciami ako potvrdiÅ¥ váš úÄet. + confirmed: Tvoja emailová adresa bola úspeÅ¡ne overená. + send_instructions: O niekoľko minút obdržÃÅ¡ email s inÅ¡trukciami ako potvrdiÅ¥ svoj úÄet. ProsÃm, skontroluj si aj zložku spam, ak sa k tebe toto potvrdenie nedostalo. + send_paranoid_instructions: Ak sa tvoja emailová adresa nachádza v naÅ¡ej databázi, o niekoľko minút obdržÃÅ¡ email s pokynmi ako potvrdiÅ¥ svoj úÄet. ProsÃm, skontroluj aj zložku spam, ak sa k tebe toto potvrdenie nedostalo. failure: already_authenticated: Už si prihlásený/á. inactive: Tvoj úÄet eÅ¡te nebol potvrdený. @@ -51,15 +51,15 @@ sk: success: ÚspeÅ¡né overenie z úÄtu %{kind}. passwords: no_token: Túto stránku nemôžete navÅ¡tÃviÅ¥ pokiaľ neprichádzate z emailu s inÅ¡trukciami na obnovu hesla. Pokiaľ prichádzate z tohto emailu, prosÃm uistite sa že ste použili celú URL z emailu. - send_instructions: Ak zadaný email existuje v naÅ¡ej databázi, tak o niekoľko minút obdržÃte email s inÅ¡trukciami ako nastaviÅ¥ nové heslo. - send_paranoid_instructions: Ak zadaný email existuje v naÅ¡ej databázi, zachvÃľu obdržÃte odkaz na obnovu hesla na svoj email. Skontrolujte aj spam ak tento email nevidÃte. + send_instructions: Pokiaľ sa tvoja emailová adresa nachádza v databázi, tak o niekoľko minút obdržÃÅ¡ email s inÅ¡trukciami ako nastaviÅ¥ nové heslo. Ak máš pocit, že si email neobdržal/a, prosÃm skontroluj aj svoju spam zložku. + send_paranoid_instructions: Ak sa tvoja emailová adresa nachádza v databázi, za chvÃľu obdržÃÅ¡ odkaz pre obnovu hesla na svoj email. Skontroluj ale prosÃm aj svoj spam, ak tento email nevidÃÅ¡. updated: Tvoje heslo bolo úspeÅ¡ne zmenené. Teraz si prihlásený/á. updated_not_active: Tvoje heslo bolo úspeÅ¡ne zmenené. registrations: destroyed: Dovidenia! Tvoj úÄet bol úspeÅ¡ne zruÅ¡ený. Dúfame ale, že Å¥a tu opäť niekedy uvidÃme. signed_up: Vitaj! Tvoja registrácia bola úspeÅ¡ná. - signed_up_but_inactive: Registrácia bola úspeÅ¡ná. AvÅ¡ak, úÄet eÅ¡te nebol aktivovaný, takže Å¥a nemôžeme prihlásiÅ¥. - signed_up_but_locked: Prihlasovanie úspeÅ¡né. AvÅ¡ak tvoj úÄet je zamknutý, takže Å¥a nieje možné prihlásiÅ¥. + signed_up_but_inactive: Registrácia bola úspeÅ¡ná. AvÅ¡ak, úÄet eÅ¡te nebol aktivovaný, takže Å¥a nemožno prihlásiÅ¥. + signed_up_but_locked: Registroval/a si sa úspeÅ¡né. AvÅ¡ak, tvoj úÄet je zamknutý, takže Å¥a nemožno prihlásiÅ¥. signed_up_but_unconfirmed: Správa s odkazom na potvrdenie registrácie bola odoslaná na tvoj email. Pre aktváciu úÄtu, klikni prosÃm na daný odkaz. Takisto ale skontroluj aj svoju spam zložku, pokiaľ sa ti zdá, že si tento email nedostal/a. update_needs_confirmation: ÚÄet bol úspeÅ¡ne zmenený ale eÅ¡te potrebujeme overiÅ¥ tvoju novú emailovú adresu. Pre overenie prosÃm klikni na link v správe ktorú si dostal/a na email. Takisto ale skontroluj aj svoju spam zložku, ak sa ti zdá, že si tento email nedostal/a. updated: Tvoj úÄet bol úspeÅ¡ne aktualizovaný. diff --git a/config/locales/devise.sq.yml b/config/locales/devise.sq.yml new file mode 100644 index 0000000000..906bece813 --- /dev/null +++ b/config/locales/devise.sq.yml @@ -0,0 +1,83 @@ +--- +sq: + devise: + confirmations: + confirmed: Adresa juaj email u ripohua me sukses. + send_instructions: Brenda pak minutash, do të merrni një email me udhëzime se si të ripohoni adresën tuaj email. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email. + send_paranoid_instructions: Nëse adresa juaj email gjendet në bazën tonë të të dhënave, brenda pak minutash, do të merrni një email me udhëzime se si të ripohoni adresën tuaj email. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email. + failure: + already_authenticated: Jeni tashmë i futur. + inactive: Llogaria juaj s’është aktivizuar ende. + invalid: "%{authentication_keys} ose fjalëkalim i pavlefshëm." + last_attempt: Mund të provoni edhe një herë, përpara se llogaria juaj të kyçet. + locked: Llogaria juaj është e kyçur. + not_found_in_database: "%{authentication_keys} ose fjalëkalim i pavlefshëm." + timeout: Sesioni juaj ka skaduar. Ju lutemi, që të vazhdohet, ribëni hyrjen. + unauthenticated: Përpara se të vazhdohet më tej, lypset të bëni hyrjen ose të regjistroheni. + unconfirmed: Përpara se të vazhdohet, lypset të ripohoni adresën tuaj email. + mailer: + confirmation_instructions: + action: Verifikoni adresë email + action_with_app: Ripohojeni dhe kthehuni te %{app} + explanation: Keni krijuar një llogari te %{host}, me këtë adresë email. Jeni një klikim larg aktivizimit të saj. Nëse s’jeni ju, shpërfilleni këtë email. + extra_html: Ju lutemi, shihni edhe <a href="%{terms_path}">rregullat e instancës</a> dhe <a href="%{policy_path}">kushtet tona të shërbimit</a>. + subject: 'Mastodon: Udhëzime ripohimi për %{instance}' + title: Verifikoni adresë email + email_changed: + explanation: 'Adresa email për llogarinë tuaj po ndryshohet në:' + extra: Nëse email-in tuaj nuk e ndryshuat ju, gjasat janë që dikush tjetër ka arritur të hyjë në llogarinë tuaj. Ju lutemi, ndryshoni menjëherë fjalëkalimin tuaj ose lidhuni me përgjegjësin e instancës, nëse jeni kyçur jashtë llogarisë tuaj. + subject: 'Mastodon: Email-i u ndryshua' + title: Adresë email e re + password_change: + explanation: Fjalëkalimi për llogarinë tuaj u ndryshua. + extra: Nëse fjalëkalimin tuaj nuk e ndryshuat ju, gjasat janë që dikush tjetër ka arritur të hyjë në llogarinë tuaj. Ju lutemi, ndryshoni menjëherë fjalëkalimin tuaj ose lidhuni me përgjegjësin e instancës, nëse jeni kyçur jashtë llogarisë tuaj. + subject: 'Mastodon: Fjalëkalimi u ndryshua' + title: Fjalëkalimi u ndryshua + reconfirmation_instructions: + explanation: Që të ndryshohet email-i juaj, ripohoni adresën e re. + extra: Nëse ky ndryshim s’qe filluar prej jush, ju lutemi, shpërfilleni këtë email. Adresa email për llogarinë Mastodon s’do të ndryshojë, para se të hyni në lidhjen më sipër. + subject: 'Mastodon: Ripohoni email-in për %{instance}' + title: Verifikoni adresë email + reset_password_instructions: + action: Ndryshoni fjalëkalimin + explanation: Kërkuat një fjalëkalim të ri për këtë llogari. + extra: Nëse këtë s’e kërkuat ju, ju lutemi, shpërfilleni këtë email. Fjalëkalimi juaj s’do të ndryshohet pa hyrë në lidhjen më sipër dhe krijimin e një të riu. + subject: 'Mastodon: Udhëzime ricaktimi fjalëkalimi' + title: Ricaktim fjalëkalimi + unlock_instructions: + subject: 'Mastodon: Udhëzime shkyçjeje' + omniauth_callbacks: + failure: S’u bë dot mirëfilltësimi juaj nga %{kind}, sepse "%{reason}". + success: Mirëfilltësimi nga llogaria %{kind} u bë me sukses. + passwords: + no_token: S’mund të hyni në këtë faqe paardhur nga një email ricaktimi fjalëkalimi. Nëse vini nga një email ricaktimi fjalëkalimi, ju lutemi, sigurohuni se përdorët URL-në e plotë dhënë për ju. + send_instructions: Nëse adresa juaj email gjendet në bazën tonë të të dhënave, brenda pak minutash, te adresa juaj email do të merrni një lidhje rimarrjeje fjalëkalimi. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email. + send_paranoid_instructions: Nëse adresa juaj email gjendet në bazën tonë të të dhënave, brenda pak minutash, te adresa juaj email do të merrni një lidhje rimarrjeje fjalëkalimi. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email. + updated: Fjalëkalimi juaj u ndryshua me sukses. Tani jeni i futur. + updated_not_active: Fjalëkalimi juaj u ndryshua me sukses. + registrations: + destroyed: Shëndet! Llogaria juaj u fshi me sukses. Shpresojmë t’ju rishohim së shpejti. + signed_up: Mirë se vini! U regjistruat me sukses. + signed_up_but_inactive: U regjistruat me sukses. Megjithatë, s’u bë dot hyrja juaj, ngaqë llogaria juaj s’është aktivizuar ende. + signed_up_but_locked: U regjistruat me sukses. Megjithatë, s’u bë dot hyrja juaj, ngaqë llogaria juaj është kyçur. + signed_up_but_unconfirmed: Te adresa juaj email u dërgua një mesazh me një lidhje ripohimi. Ju lutemi, që të aktivizoni llogarinë tuaj, ndiqni lidhjen. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email. + update_needs_confirmation: E përditësuat me sukses llogarinë tuaj, por na duhet të verifikojmë adresën tuaj të re email. Ju lutemi, që të ripohoni adresën tuaj të re email, kontrolloni email-in tuaj dhe ndiqni lidhjen. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email. + updated: Llogaria juaj u përditësua me sukses. + sessions: + already_signed_out: Dolët me sukses. + signed_in: Hytë me sukses. + signed_out: Dolët me sukses. + unlocks: + send_instructions: Brenda pak minutash, do të merrni një email me udhëzime se si të shkyçni llogarinë tuaj. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email. + send_paranoid_instructions: Nëse llogaria juaj ekziston, brenda pak minutash, do të merrni një email me udhëzime se si të shkyçni llogarinë tuaj. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email. + unlocked: Llogaria juaj u shkyç me sukses. Ju lutemi, që të vazhdohet, bëni hyrjen. + errors: + messages: + already_confirmed: qe e ripohuar tashmë, ju lutemi, provoni të bëni hyrjen + confirmation_period_expired: lyp të ripohohet brenda %{period}, ju lutemi, kërkoni një të ri + expired: ka skaduar, ju lutemi, kërkoni një të ri + not_found: s’u gjet + not_locked: s’qe kyçur + not_saved: + one: 'Ruajtjen e këtij %{resource} e pengoi 1 gabim:' + other: 'Ruajtjen e këtij %{resource} e penguan %{count} gabime:' diff --git a/config/locales/doorkeeper.cs.yml b/config/locales/doorkeeper.cs.yml index b9e9bc0349..03b66a0faf 100644 --- a/config/locales/doorkeeper.cs.yml +++ b/config/locales/doorkeeper.cs.yml @@ -54,7 +54,7 @@ cs: title: 'Aplikace: %{name}' authorizations: buttons: - authorize: Ověřit + authorize: Autorizovat deny: ZamÃtnout error: title: Vyskytla se chyba diff --git a/config/locales/doorkeeper.sq.yml b/config/locales/doorkeeper.sq.yml new file mode 100644 index 0000000000..a1f2121f9f --- /dev/null +++ b/config/locales/doorkeeper.sq.yml @@ -0,0 +1,142 @@ +--- +sq: + activerecord: + attributes: + doorkeeper/application: + name: Emër aplikacioni + redirect_uri: URI Ridrejtimi + scopes: Fushëveprime + website: Sajt aplikacioni + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: s’mund të përmbajë një fragment. + invalid_uri: duhet të jetë një URI e vlefshme. + relative_uri: duhet të jetë një URI absolute. + secured_uri: duhet të jetë një URI HTTPS/SSL. + doorkeeper: + applications: + buttons: + authorize: Autorizoje + cancel: Anuloje + destroy: Asgjësoje + edit: Përpunoni + submit: Parashtroje + confirmations: + destroy: A jeni i sigurt? + edit: + title: Përpunoni aplikacion + form: + error: Oh! Kontrolloni formularin tuaj për gabime të mundshme + help: + native_redirect_uri: Përdor %{native_redirect_uri} për teste vendore + redirect_uri: Përdorni një URI për rresht + scopes: Ndajini fushëveprimet me hapësira. Që të përdoren fushëveprimet parazgjedhje, lëreni të zbrazët. + index: + application: Aplikacion + callback_url: URL Callback-u + delete: Fshije + name: Emër + new: Aplikacion i ri + scopes: Fushëveprime + show: Shfaqe + title: Aplikacionet tuaja + new: + title: Aplikacion i ri + show: + actions: Veprime + application_id: Kyç klienti + callback_urls: URL-ra Callback + scopes: Fushëveprime + secret: E fshehtë klienti + title: 'Aplikacion: %{name}' + authorizations: + buttons: + authorize: Autorizoje + deny: Mohoje + error: + title: Ndodhi një gabim + new: + able_to: Do të jetë në gjendje të + prompt: "%{client_name} kërkesa hyrjeje aplikacionesh te llogaria juaj" + title: Lypset autorizim + show: + title: Kopjojeni këtë kod autorizimi dhe ngjiteni te aplikacioni. + authorized_applications: + buttons: + revoke: Shfuqizoje + confirmations: + revoke: A jeni i sigurt? + index: + application: Aplikacion + created_at: I autorizuar + date_format: "%d.%m.%Y, %H:%M:%S" + scopes: Fushëveprime + title: Aplikacionet tuaja të autorizuara + errors: + messages: + access_denied: I zoti i burimit ose shërbyesi i autorizimit e hodhi poshtë kërkesën. + credential_flow_not_configured: Rrjedha e Kredencialeve të Fjalëkalimit të të Zotit të Burimit dështoi për shkak se Doorkeeper.configure.resource_owner_from_credentials është i paformësuar. + invalid_client: Mirëfilltësimi i klientit dështoi për shkak klienti të panjohur, mospërfshirjeje mirëfilltësimi klienti, ose metode të pambuluar mirëfilltësimi. + invalid_grant: Autorizimi i dhënë është i pavlefshëm, ka skaduar, është shfuqizuar, nuk përputhet me URI-n e ridrejtimit të përdorur te kërkesa e autorizimit, ose është emetuar për klient tjetër. + invalid_redirect_uri: URI e ridrejtimit s’është e vlefshme. + invalid_request: Kërkesës i mungon një parametër i domosdoshëm, përfshin një vlerë të pambuluar parametri, ose përndryshe është e keqformuar. + invalid_resource_owner: Kredencialet e dhëna për të zotin e burimit s’janë të vlefshme, ose s’gjendet i zoti i burimit + invalid_scope: Fushëveprimi i kërkuar është i pavlefshëm, i panjohur ose i keqformuar. + invalid_token: + expired: Token-i i hyrjeve skadoi + revoked: Token-i i hyrjeve u shfuqizua + unknown: Token-i i hyrjeve është i pavlefshëm + resource_owner_authenticator_not_configured: Gjetja e të Zotit të Burimit dështoi, ngaqë Doorkeeper.configure.resource_owner_authenticator s’është i formësuar. + server_error: Shërbyesi i autorizimit hasi një kusht të papritur, i cili e pengoi të plotësonte kërkesën. + temporarily_unavailable: Shërbyesi i mirëfilltësimeve hëpërhë s’është në gjendje të trajtojë kërkesën, për shkak të një mbingarkese të përkohshme ose ndonjë mirëmbajtjeje të shërbyesit. + unauthorized_client: Klienti s’është i autorizuar të kryejë këtë kërkesë duke përdorur këtë metodë. + unsupported_grant_type: Lloji i autorizimit të dhënë nuk mbulohet nga shërbyesi i autorizimeve. + unsupported_response_type: Shërbyesi i autorizimeve nuk e mbulon këtë lloj përgjigjeje. + flash: + applications: + create: + notice: Aplikacioni u krijua. + destroy: + notice: Aplikacioni u fshi. + update: + notice: Aplikacioni u përditësua. + authorized_applications: + destroy: + notice: Aplikacioni u shfuqizua. + layouts: + admin: + nav: + applications: Aplikacione + oauth2_provider: Furnizues OAuth2 + application: + title: Lypset autorizim OAuth + scopes: + follow: të ndryshojë marrëdhënies llogarish + push: të marrë njoftime push për ju + read: të lexojë krejt të dhënat e llogarisë tuaj + read:accounts: të shohë të dhëna llogarish + read:blocks: të shohë blloqet tuaja + read:favourites: të shohë të parapëlqyerit tuaj + read:filters: të shohë filtrat tuaj + read:follows: të shohë ndjekësit tuaj + read:lists: të shohë listat tuaja + read:mutes: të shohë ç’keni heshtuar + read:notifications: të shohë njoftimet tuaja + read:reports: të shohë raportet tuaja + read:search: të bëjë kërkime në emrin tuaj + read:statuses: të shohë krejt gjendjet + write: të ndryshojë krejt të dhënat e llogarisë tuaj + write:accounts: të ndryshojë profilin tuaj + write:blocks: të bllokojë llogari dhe përkatësi + write:favourites: të parapëlqejë gjendje + write:filters: të krijojë filtra + write:follows: të ndjekë persona + write:lists: të krijojë lista + write:media: të ngarkojë kartela media + write:mutes: të heshtojë persona dhe biseda + write:notifications: të pastrojë njoftimet tuaja + write:reports: të raportojë persona të tjerë + write:statuses: të botojë gjendje diff --git a/config/locales/el.yml b/config/locales/el.yml index c29b8301e3..95a72571d3 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -115,7 +115,7 @@ el: joined: ΓÏάφτηκε location: all: Όλες - local: Τοπικά + local: Τοπική remote: ΑπομακÏυσμÎνα title: Τοποθεσία login_status: Κατάσταση σÏνδεσης @@ -556,7 +556,7 @@ el: enabled: ΠεÏιλαμβάνεσαι στον κατάλογο. enabled_but_waiting: Έχεις επιλÎξει να εμφανίζεσαι στον κατάλογο μεν, αλλά ακόμα δεν Îχεις τον ελάχιστο αÏιθμό ακόλουθων (%{min_followers}) που απαιτείται για να συμπεÏιληφθείς. explanation: Î’Ïες χÏήστες βάσει των ενδιαφεÏόντων τους - explore_mastodon: ΕξεÏεÏνησε %{title} + explore_mastodon: ΕξεÏεÏνησε το %{title} how_to_enable: Δεν Îχεις επιλÎξει να συμπεÏιληφθείς στον καταλογο. ΜποÏείς να επιλÎξεις παÏακάτω. ΧÏησιμοποίησε ταμπÎλες στο κείμενο του βιογÏÎ±Ï†Î¹ÎºÎ¿Ï ÏƒÎ¿Ï… για να εμφανίζεσαι κάτω από συγκεκÏιμÎνες ταμπÎλες! people: one: "%{count} άτομο" @@ -657,7 +657,7 @@ el: table: expires_at: Λήγει uses: ΧÏήσεις - title: Î Ïοσκάλεσε άτομα + title: Î Ïοσκάλεσε κόσμο lists: errors: limit: Έχεις φτάσει το μÎγιστο πλήθος επιτÏεπτών λιστών diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 6abf152010..84fbbbaf70 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -92,6 +92,7 @@ eu: confirm: Berretsi confirmed: Berretsita confirming: Berresten + deleted: Ezabatua demote: Jaitsi mailaz disable: Desgaitu disable_two_factor_authentication: Desgaitu 2FA @@ -109,7 +110,9 @@ eu: follows: Jarraitzen du header: Goiburua inbox_url: Sarrera ontziaren URL-a + invited_by: 'Honek gonbidatua:' ip: IP + joined: Elkartuta location: all: Denak local: Lokala @@ -136,7 +139,7 @@ eu: protocol: Protokoloa public: Publikoa push_subscription_expires: Push harpidetzaren iraugitzea - redownload: Freskatu abatarra + redownload: Freskatu profila remove_avatar: Kendu abatarra remove_header: Kendu goiburua resend_confirmation: @@ -156,8 +159,8 @@ eu: search: Bilatu shared_inbox_url: Partekatutako sarrera ontziaren URL-a show: - created_reports: Kontu honek sortutako txostenak - targeted_reports: Kontu honek egindako salaketak + created_reports: Sortutako txostenak + targeted_reports: Besteen salaketak silence: Isilarazi silenced: Isilarazita statuses: Mezuak @@ -169,6 +172,7 @@ eu: undo_suspension: Desegin kanporatzea unsubscribe: Kendu harpidetza username: Erabiltzaile-izena + warn: Abisatu web: Web action_logs: actions: @@ -252,7 +256,7 @@ eu: week_users_active: aktibo aste honetan week_users_new: erabiltzaile aste honetan domain_blocks: - add_new: Gehitu berria + add_new: Gehitu domeinuaren blokeo berria created_msg: Domeinuaren blokeoa orain prozesatzen ari da destroyed_msg: Domeinuaren blokeoa desegin da domain: Domeinua @@ -264,11 +268,16 @@ eu: noop: Bat ere ez silence: Isilarazi suspend: Kanporatu - title: Domeinu blokeo berria + title: Domeinuaren blokeo berria reject_media: Ukatu multimedia fitxategiak reject_media_hint: Lokalki gordetako multimedia fitxategiak ezabatzen ditu eta etorkizunean fitxategi berriak deskargatzeari uko egingo dio. Ez du garrantzirik kanporaketetan reject_reports: Errefusatu salaketak reject_reports_hint: Ezikusi domeinu honetatik jasotako salaketak. Kanporatzeentzako garrantzirik gabekoa + rejecting_media: errefusatu multimedia fitxategiak + rejecting_reports: txostenak errefusatzen + severity: + silence: isilarazia + suspend: kanporatua show: affected_accounts: one: Datu-baseko kontu bati eragiten dio @@ -278,7 +287,7 @@ eu: suspend: Kendu kanporatzeko agindua domeinu honetako kontu guztiei title: Desegin %{domain} domeinuko blokeoa undo: Desegin - undo: Desegin + undo: Desegin domeinuaren blokeoa email_domain_blocks: add_new: Gehitu berria created_msg: Ongi gehitu da e-mail helbidea domeinuen zerrenda beltzera @@ -293,7 +302,20 @@ eu: back_to_account: Itzuli kontura title: "%{acct} kontuaren jarraitzaileak" instances: - title: Instantzia ezagunak + delivery_available: Bidalketa eskuragarri dago + known_accounts: + one: Kontu ezagun %{count} + other: "%{count} kontu ezagun" + moderation: + all: Denak + limited: Mugatua + title: Moderazioa + title: Federazioa + total_blocked_by_us: Guk blokeatuta + total_followed_by_them: Haiek jarraitua + total_followed_by_us: Guk jarraitua + total_reported: Heiei buruzko txostenak + total_storage: Multimedia eranskinak invites: deactivate_all: Desgaitu guztiak filter: @@ -531,8 +553,11 @@ eu: warning_title: Sakabanatutako edukiaren eskuragarritasuna directories: directory: Profilen direktorioa + enabled: Direktorioan zerrendatuta zaude orain. + enabled_but_waiting: Direktorioan zerrendatuta izatea aukeratu duzu, baina ez duzu oraindik gutxieneko jarraitzaile kopurua (%{min_followers}) zerrendan agertzeko. explanation: Deskubritu erabiltzaileak interesen arabera explore_mastodon: Esploratu %{title} + how_to_enable: Ez duzu aukeratu direktorioan zerrendatua izatea aukeratu. Behean aukeratu dezakezu. Erabili traolak zure biografiaren testuan traola zehatzetan agertzeko! people: one: pertsona %{count} other: "%{count} pertsona" @@ -558,7 +583,9 @@ eu: size: Tamaina blocks: Zuk blokeatutakoak csv: CSV + domain_blocks: Domeinuen blokeoak follows: Zuk jarraitutakoak + lists: Zerrendak mutes: Zuk mututukoak storage: Multimedia biltegiratzea filters: @@ -707,10 +734,25 @@ eu: no_account_html: Ez duzu konturik? <a href='%{sign_up_path}' target='_blank'>Izena eman</a> dezakezu proceed: Ekin jarraitzeari prompt: 'Hau jarraituko duzu:' + reason_html: "<strong>Zergaitik eman behar da urrats hau?</strong><code>%{instance}</code> agian ez da izena eman duzun zerbitzaria, eta zure hasiera-zerbitzarira eraman behar zaitugu aurretik." + remote_interaction: + favourite: + proceed: Bihurtu gogoko + prompt: 'Toot hau gogoko bihurtu nahi duzu:' + reblog: + proceed: Eman bultzada + prompt: 'Toot honi bultzada eman nahi diozu:' + reply: + proceed: Ekin erantzuteari + prompt: 'Toot honi erantzun nahi diozu:' remote_unfollow: error: Errorea title: Izenburua unfollowed: Jarraitzeari utzita + scheduled_statuses: + over_daily_limit: Egun horretarako programatutako toot kopuruaren muga gainditu duzu (%{limit}) + over_total_limit: Programatutako toot kopuruaren muga gainditu duzu (%{limit}) + too_soon: Programatutako data etorkizunean egon behar du sessions: activity: Azken jarduera browser: Nabigatzailea @@ -919,15 +961,18 @@ eu: explanation: disable: Zure kontua izoztuta dagoen bitartean, zure kontua bere horretan dirau, baina ezin duzu ekintzarik burutu desblokeatzen den arte. silence: Zure kontua murriztua dagoen bitartean, jada zu jarraitzen zaituztenak besterik ez dituzte zure Toot-ak ikusiko zerbitzari honetan, eta agian zerrenda publikoetatik kenduko zaizu. Hala ere besteek oraindik zu jarraitu zaitzakete. + suspend: Zure kontua kanporatua izan da, zure toot guztiak eta multimedia fitxategiak behin betiko ezabatu dira zerbitzari honetatik, eta zure jarraitzaileen zerbitzarietatik. review_server_policies: Berrikusi zerbitzariko politikak subject: disable: Zure %{acct} kontua izoztu da none: "%{acct} konturako abisua" silence: Zure %{acct} kontua murriztu da + suspend: Zure %{acct} kontua kanporatua izan da title: disable: Kontu izoztua none: Abisua silence: Kontu murriztua + suspend: Kontu kanporatua welcome: edit_profile_action: Ezarri profila edit_profile_step: Pertsonalizatu profila abatar bat igoz, goiburu bat, zure pantaila-izena aldatuz eta gehiago. Jarraitzaile berriak onartu aurretik gainbegiratu nahi badituzu, kontua giltzaperatu dezakezu. @@ -935,7 +980,7 @@ eu: final_action: Hasi mezuak bidaltzen final_step: 'Hasi argitaratzen! Jarraitzailerik ez baduzu ere zure mezu publikoak besteek ikusi ditzakete, esaterako denbora-lerro lokalean eta traoletan. Zure burua aurkeztu nahi baduzu #aurkezpenak traola erabili zenezake.' full_handle: Zure erabiltzaile-izen osoa - full_handle_hint: Hau da lagunei esango zeniena beste instantzia batetik zu jarraitzeko edo zuri mezuak bidaltzeko. + full_handle_hint: Hau da lagunei esango zeniekeena beste instantzia batetik zu jarraitzeko edo zuri mezuak bidaltzeko. review_preferences_action: Aldatu hobespenak review_preferences_step: Ziurtatu hobespenak ezartzen dituzula, jaso nahi dituzu e-mail mezuak, lehenetsitako pribatutasuna mezu berrietarako. Mareatzen ez bazaitu GIF-ak automatikoki abiatzea ezarri dezakezu ere. subject: Ongi etorri Mastodon-era diff --git a/config/locales/ga.yml b/config/locales/ga.yml new file mode 100644 index 0000000000..9f586aa377 --- /dev/null +++ b/config/locales/ga.yml @@ -0,0 +1,4 @@ +--- +ga: + about: + about_hashtag_html: Is toots phoiblà iad seo atá clibáilte le <strong>#%{hashtag}</strong>. Is féidir leat idirghnÃomhú leo má tá cuntas agat áit ar bith sa fediverse. diff --git a/config/locales/id.yml b/config/locales/id.yml index fabf2746e3..d155ab0a79 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -4,6 +4,7 @@ id: about_hashtag_html: Ini adalah toot public yang ditandai dengan <strong>#%{hashtag}</strong>. Anda bisa berinteraksi dengan mereka jika anda memiliki akun dimanapun di fediverse. about_mastodon_html: Mastodon adalah sebuah jejaring sosial <em>terbuka, open-source</em. Sebuah alternatif <em>desentralisasi</em> dari platform komersial, menjauhkan anda resiko dari sebuah perusahaan yang memonopoli komunikasi anda. Pilih server yang anda percayai — apapun yang anda pilih, anda tetap dapat berinteraksi dengan semua orang. Semua orang dapat menjalankan server Mastodon sendiri dan berpartisipasi dalam <em>jejaring sosial</em> dengan mudah. about_this: Tentang server ini + administered_by: 'Dikelola oleh:' api: API apps: Aplikasi hp closed_registrations: Pendaftaran untuk server ini sedang ditutup. Tetapi, anda bisa mencari server lain untuk membuat akun dan mendapatkan akses dari jaringan yang sama di sana. @@ -70,52 +71,104 @@ id: admin: account_actions: action: Lakukan aksi + title: Lakukan moderasi pada %{acct} + account_moderation_notes: + create: Beri catatan + created_msg: Catatan moderasi berhasil dibuat! + delete: Hapus + destroyed_msg: Catatan moderasi berhasil dihapus! accounts: are_you_sure: Anda yakin? + avatar: Avatar + by_domain: Domain + change_email: + changed_msg: Email akun ini berhasil diubah! + current_email: Email saat ini + label: Ganti email + new_email: Email baru + submit: Ganti email + title: Ganti email untuk %{username} confirm: Konfirmasi confirmed: Dikonfirmasi confirming: Mengkonfirmasi + deleted: Terhapus + disable: Nonaktifkan + disable_two_factor_authentication: Nonaktifkan 2FA + disabled: Dinonaktifkan display_name: Nama domain: Domain edit: Ubah email: E-mail email_status: Status Email + enable: Aktifkan + enabled: Diaktifkan feed_url: URL Feed followers: Pengikut + followers_url: URL pengikut follows: Mengikut + inbox_url: URL Kotak masuk + invited_by: Diundang oleh + ip: IP + joined: Bergabung location: all: Semua local: Lokal remote: Remote title: Lokasi + login_status: Status login media_attachments: Lampiran media + memorialize: Ubah menjadi memoriam moderation: + active: Aktif all: Semua silenced: Didiamkan suspended: Disuspen title: Moderasi + moderation_notes: Catatan moderasi most_recent_activity: Aktivitas terbaru most_recent_ip: IP terbaru + no_limits_imposed: Tidak ada batasan not_subscribed: Tidak berlangganan + outbox_url: URL Kotak keluar perform_full_suspension: Lakukan suspen penuh profile_url: URL profil + promote: Promosikan + protocol: Protokol public: Publik push_subscription_expires: Langganan PuSH telah kadaluarsa + redownload: Muat ulang profil + remove_avatar: Hapus avatar + remove_header: Hapus header resend_confirmation: already_confirmed: Pengguna ini sudah dikonfirmasi send: Kirim ulang email konfirmasi success: Email konfirmasi berhasil dikirim! + reset: Reset reset_password: Reset kata sandi + resubscribe: Langganan ulang + role: Hak akses + roles: + admin: Administrator + moderator: Moderator + staff: Staf + user: Pengguna salmon_url: URL Salmon + search: Cari show: created_reports: Laporan yang dibuat oleh akun ini targeted_reports: Laporan yang dibuat tentang akun ini silence: Diam + silenced: Didiamkan statuses: Status + subscribe: Langganan + suspended: Disuspen title: Akun + unconfirmed_email: Email belum dikonfirmasi undo_silenced: Undo mendiamkan undo_suspension: Undo suspen + unsubscribe: Berhenti langganan username: Nama pengguna + warn: Beri Peringatan web: Web domain_blocks: add_new: Tambah diff --git a/config/locales/it.yml b/config/locales/it.yml index 339dadaf4b..fea39b1fd1 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -28,7 +28,7 @@ it: hosted_on: Mastodon ospitato su %{domain} learn_more: Scopri altro other_instances: Elenco istanze - privacy_policy: Policy su la Privacy + privacy_policy: Politica della privacy source_code: Codice sorgente status_count_after: one: status diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 1a2591cb4e..6d0e196847 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -939,8 +939,8 @@ ja: <p>オリジナルã®å‡ºå…¸: <a href="https://github.com/discourse/discourse">Discourse privacy policy</a></p> title: "%{instance} 利用è¦ç´„・プライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼" themes: - contrast: ãƒã‚¤ã‚³ãƒ³ãƒˆãƒ©ã‚¹ãƒˆ - default: Mastodon + contrast: Mastodon (ãƒã‚¤ã‚³ãƒ³ãƒˆãƒ©ã‚¹ãƒˆ) + default: Mastodon (ダーク) mastodon-light: Mastodon (ライト) time: formats: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index bf6a8b7705..0e95adf7b1 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -93,7 +93,7 @@ ko: confirmed: 확ì¸ë¨ confirming: í™•ì¸ ì¤‘ deleted: ì‚ì œë¨ - demote: 모ë”ë ˆì´í„° 강등 + demote: 강등 disable: 비활성화 disable_two_factor_authentication: 2단계 ì¸ì¦ì„ 비활성화 disabled: ë¹„í™œì„±í™”ëœ @@ -135,7 +135,7 @@ ko: outbox_url: ë°œì‹ í•¨ URL perform_full_suspension: ì •ì§€ì‹œí‚¤ê¸° profile_url: 프로필 URL - promote: 모ë”ë ˆì´í„°ë¡œ 승급 + promote: 승급 protocol: í”„ë¡œí† ì½œ public: ì „ì²´ 공개 push_subscription_expires: PuSH êµ¬ë… ê¸°ê°„ 만료 @@ -350,7 +350,7 @@ ko: report: 리í¬íŠ¸ action_taken_by: ì‹ ê³ ì²˜ë¦¬ìž are_you_sure: ì •ë§ë¡œ ì‹¤í–‰í•˜ì‹œê² ìŠµë‹ˆê¹Œ? - assign_to_self: 나ì—게 í• ë‹¹ ë¨ + assign_to_self: 나ì—게 í• ë‹¹í•˜ê¸° assigned: í• ë‹¹ ëœ ëª¨ë”ë ˆì´í„° comment: none: ì—†ìŒ diff --git a/config/locales/lt.yml b/config/locales/lt.yml new file mode 100644 index 0000000000..52aa868a60 --- /dev/null +++ b/config/locales/lt.yml @@ -0,0 +1,182 @@ +--- +lt: + about: + about_hashtag_html: ÄŒia visiems prieinamas įrankis <strong>#%{hashtag}</strong>. JÅ«s galite juo naudotis bet kur, jeigu turite paskyra fedi-visatoje. + about_mastodon_html: Mastodon, tai socialinis tinklas pagrįstas atviro kodo programavimu, ir atvirais web protokolais. VisiÅ¡kai nemokamas. Å i sistema decantrilizuota kaip jÅ«sų elektroninis paÅ¡tas. + about_this: Apie + administered_by: 'Administruoja:' + api: API + apps: Mobilioji Aplikacija + closed_registrations: Registracija Å¡iuo metu uždaryta prie Å¡ito tinklo. JÅ«s galite rasti kitÄ… bÅ«dÄ… susikurti paskyrÄ… ir gauti prieeiga prie to paties tinklo. + contact: Kontaktai + contact_missing: Nenustatyta + contact_unavailable: N/A + documentation: Dokumentacija + extended_description_html: | + <h3>TaisyklÄ—s</h3> + <p>Ilgas apraÅ¡ymas dar nÄ—ra sudartyas</p> + features: + humane_approach_body: Mokantis iÅ¡ kitų socialinių tinklų, bei jų daromu klaidų, Mastodon siekia sukurti etiÅ¡ka dizainÄ…, kovojant su netinkamu socialinių tinklų naudojimu. + humane_approach_title: HumaniÅ¡kesnis metodas + not_a_product_body: Mastodon nÄ—ra komercinis tinklas. Jokių reklamų, privaÄios informacijos rinkimo. ÄŒia nÄ—ra vieno žmogaus, kuris už viskÄ… atsako. + not_a_product_title: Tu esi žmogus, o ne produktas + real_conversation_body: Su 500 simbolių limitu, ir galimybe pažymÄ—ti savo įkeliama informacija su įspÄ—jamaisiais ženklais, galite iÅ¡sireikÅ¡ti kaip tik norite. + real_conversation_title: Sukurtas tikram bendravimui + within_reach_body: Mobiliosios aplikacijos skirtos iOS, Android, ir kitoms platformoms. DraugiÅ¡kos API ekosistemos dÄ—ka, JÅ«s galite palaikyti pokalbi su draugais bet kur. + within_reach_title: Visada pasiekama + generic_description: "%{domain} yra vienas serveris tinkle" + hosted_on: Mastodon palaikomas naudojantis %{domain} talpinimu + learn_more: Daugiau + privacy_policy: Privatumo Politika + source_code: Å altinio kodas + status_count_after: + few: statusai + one: statusas + other: statusai + status_count_before: Autorius + terms: Naudojimo sÄ…lygos + user_count_after: + few: vartotojai + one: vartotojas + other: vartotojai + user_count_before: Namai + what_is_mastodon: Kas tai, Mastodon? + accounts: + choices_html: "%{name} pasirinkimai:" + follow: Sekti + followers: + few: SekÄ—jai + one: SekÄ—jas + other: SekÄ—jai + following: Sekami + joined: Prisijungiai %{date} + last_active: paskutinį kartÄ… aktyvus + link_verified_on: Nuorodos nuosavybÄ— paskutinį kartÄ… tikrinta %{date} + media: Medija + moved_html: "%{name} persikÄ—lÄ— į %{new_profile_link}:" + network_hidden: Å i informacija neprieinama + nothing_here: ÄŒia nieko nÄ—ra! + people_followed_by: ŽmonÄ—s, kuriuos %{name} seka + people_who_follow: ŽmonÄ—s kurie seka %{name} + pin_errors: + following: Privalai sekti žmogų kurį nori pagerbti + posts: + few: Tootai + one: Tootas + other: Tootai + posts_tab_heading: Tootai + posts_with_replies: Tootai ir atsakymai + reserved_username: Vartotojo vardas rezervuotas + roles: + admin: Administratorius + bot: Bot'as + moderator: Moderatorius + unfollow: Nesekti + admin: + account_actions: + action: Veiksmas + title: Moderuoti %{acct} + account_moderation_notes: + create: Palikti žinutÄ™ + created_msg: Moderavimo žinutÄ— sÄ—kimngai sukurta! + delete: IÅ¡trinti + destroyed_msg: Moderacijos žinutÄ— sÄ—kmingai iÅ¡trinta! + accounts: + are_you_sure: Ar esate įsitikinÄ™s? + avatar: Profilio nuotrauka + by_domain: Domenas + change_email: + changed_msg: Paskyros el paÅ¡tas sÄ—kmingai pakeistas! + current_email: Dabartinis el paÅ¡tas + label: Pakeisti el paÅ¡to adresÄ… + new_email: Naujas el paÅ¡to adresas + submit: Pakeisti el paÅ¡to adresÄ… + title: Pakeisti el paÅ¡to adresÄ… vartotojui %{username} + confirm: Patvirtinti + confirmed: Patvirtinta + confirming: Tvirtinama + deleted: IÅ¡trinti + demote: Pažeminti + disable: IÅ¡jungti + disable_two_factor_authentication: IÅ¡jungti 2 faktorių autentifikacijÄ… + disabled: IÅ¡jungta + display_name: Matomas vardas + domain: Domenas + edit: Keisti + email: El paÅ¡tas + email_status: El paÅ¡to statusas + enable: Ä®jungti + enabled: Ä®jungta + followers: SekÄ—jai + followers_url: SekÄ—jų URL + follows: Seka + header: AntraÅ¡tÄ— + inbox_url: Gautųjų URL + invited_by: PakvietÄ— + ip: IP + joined: PrisijungÄ— + location: + all: Visi + local: Lokali + title: Lokacija + login_status: Prisijungimo statusas + media_attachments: Prisegti medijos failai + memorialize: Paversti į memorija + moderation: + active: Aktyvus + all: Visi + silenced: Užtildytas + suspended: Užrakintas + title: Moderacija + moderation_notes: Medaracijos žinutÄ—s + most_recent_activity: Paskutinioji veikla + most_recent_ip: Paskutinis IP + no_limits_imposed: Be limitu + not_subscribed: Ne prenumeruota + outbox_url: IÅ¡siustųjų URL + perform_full_suspension: Užrakinti + profile_url: Profilio URL + promote: PaaukÅ¡tinti + protocol: Protokolas + public: VieÅ¡as + push_subscription_expires: PuSH prenumeramivas pasibaigÄ— + redownload: Perkrauti profilį + remove_avatar: Panaikinti profilio nuotraukÄ… + remove_header: Panaikinti antraÅ¡tÄ™ + resend_confirmation: + already_confirmed: Å is vartotojas jau patvirtintas + send: Dar kartÄ… iÅ¡siųsti patvirtinimo žinutÄ™ + success: Patvirtinimo laiÅ¡kas sÄ—kmingai iÅ¡siųstas! + reset: IÅ¡ naujo + reset_password: Atkurti slaptažodį + resubscribe: Per prenumeruoti + role: Leidimai + roles: + admin: Administratorius + moderator: Moderatorius + staff: Personalas + user: Vartotojas + salmon_url: LaÅ¡iÅ¡os URL + search: IeÅ¡koti + shared_inbox_url: Bendroji gautųjų URL + show: + created_reports: ParaÅ¡yti raportai + targeted_reports: Reportuotas kitų + silence: Tyla + silenced: Užtildytas + statuses: Statusai + subscribe: Prenumeruoti + suspended: Užrakintas + title: Vartotojai + unconfirmed_email: Nepatvirtintas el paÅ¡to adresas + undo_silenced: AtÅ¡aukti užtildymÄ… + undo_suspension: AtÅ¡aukti užrakinimÄ… + unsubscribe: Nebeprenumeruoti + username: Slapyvardis + warn: Ä®spÄ—ti + web: Web + action_logs: + actions: + assigned_to_self_report: "%{name} paskyrÄ— reportÄ… %{target} saviems" + change_email_user: "%{name} pakeitÄ— el paÅ¡to adresÄ… vartotojui %{target}" + confirm_user: "%{name} patvirtino el paÅ¡to adresÄ… vartotojui %{target}" diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index 0e255e4dc1..99127c2b68 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -15,14 +15,14 @@ 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 - discoverable_html: <a href="%{path}" target="_blank">Adresář</a> dovoluje lidem najÃt úÄty podle zájmů a aktivity. Vyžaduje alespoň %{min_followers} sledovatelů + discoverable_html: <a href="%{path}" target="_blank">Adresář</a> dovoluje lidem najÃt úÄty podle zájmů a aktivity. Vyžaduje alespoň %{min_followers} sledujÃcÃch 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Å¡en na %{dimensions} px inbox_url: ZkopÃrujte URL z hlavnà stránky mostu, který chcete použÃt 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ů + locked: Vyžaduje, abyste ruÄnÄ› schvaloval/a sledujÃcà 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. @@ -37,7 +37,7 @@ cs: username: VaÅ¡e uživatelské jméno bude na %{domain} unikátnà whole_word: Je-li klÃÄové slovo Äi fráze pouze alfanumerická, bude aplikována pouze, pokud se shoduje s celým slovem imports: - data: Soubor CSV exportován z jiné instance Mastodon + data: Soubor CSV exportovaný z jiného serveru Mastodon sessions: otp: 'NapiÅ¡te dvoufaktorový kód vygenerovaný vaÅ¡Ã mobilnà aplikacÃ, nebo použijte jeden z vaÅ¡ich záložnÃch kódů:' user: diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index d3f9cb340d..24ae49a2a9 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -38,6 +38,18 @@ cy: fields: name: Label value: Cynnwys + account_warning_preset: + text: Testun rhagosodedig + admin_account_action: + send_email_notification: Hysbysu'r defnyddiwr trwy e-bost + text: Rhybudd wedi'i addasu + type: Gweithredu + types: + disable: Analluogi + none: Gwneud dim + silence: Tawelwch + suspend: Dileu data cyfrif + warning_preset_id: Defnyddiwch ragnod rhag rhybudd defaults: autofollow: Gwahodd i ddilyn eich cyfrif avatar: Afatar @@ -48,6 +60,7 @@ cy: context: Hidlo cyd-destunau current_password: Cyfrinair presennol data: Data + discoverable: Rhestrwch y cyfrif hwn ar y cyfeiriadur display_name: Enw arddangos email: Cyfeiriad e-bost expires_in: Yn dod i ben ar ôl @@ -63,6 +76,7 @@ cy: otp_attempt: Côd dau gam password: Cyfrinair phrase: Allweddair neu ymadrodd + setting_aggregate_reblogs: Grŵp hybiau mewn llinellau amser setting_auto_play_gif: Chwarae GIFs wedi'u hanimeiddio yn awtomatig setting_boost_modal: Dangos deialog cadarnhad cyn bŵstio setting_default_language: Cyhoeddi iaith diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 0ffc22b53d..2b9c2bb811 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -57,6 +57,7 @@ eu: disable: Desaktibatu none: Ez egin ezer silence: Isiltarazi + suspend: Kanporatu eta behin betiko ezabatu kontuko datuak warning_preset_id: Erabili aurre-ezarritako abisu bat defaults: autofollow: Gonbidatu zure kontua jarraitzera diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index d5e0ef574a..aebab52475 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -41,7 +41,7 @@ gl: sessions: otp: 'Introduza o código de doble-factor xerado no aplicativo do seu móbil ou utilice un dos seus códigos de recuperación:' user: - chosen_languages: Si se marca, só os toots nos idiomas seleccionados serán mostrados en liñas temporais públicas + chosen_languages: Se ten marca, só os toots nos idiomas seleccionados serán mostrados en liñas temporais públicas labels: account: fields: diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index f2d26cf026..41d045a4ad 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -14,7 +14,7 @@ sk: avatar: PNG, GIF alebo JPG. Maximálne %{size}. Bude zmenÅ¡ený na %{dimensions}px bot: Tento úÄet vykonáva hlavne automatizované akcie, a je pravdepodobne nespravovaný context: Jedno, alebo viac kritériÃ, v ktorých má byÅ¥ filtrovanie uplatnené - digest: Odoslané iba v prÃpade dlhodobej neprÃtomnosti, a len ak si obdŕžal/a nejaké osobné správy kým si bol/a preÄ + digest: Odoslané iba v prÃpade dlhodobej neprÃtomnosti, a len ak si obdržal/a nejaké osobné správy kým si bol/a preÄ discoverable_html: Táto <a href="%{path}" target="_blank">databáza</a> umožňuje ľudom nájsÅ¥ profily podľa záujmu a aktÃvnosti. Vyžaduje aby mali aspoň %{min_followers} sledovateľov email: Bude ti odoslaný potvrdzujúci email fields: Až Å¡tyri položky môžeÅ¡ maÅ¥ na svojom profile zobrazené vo forme tabuľky @@ -22,7 +22,7 @@ sk: inbox_url: SkopÃruj adresu z hlavnej stránky mostÃka, ktorý chceÅ¡ použÃvaÅ¥ irreversible: Vytriedené prÃspevky zmiznú nenávratne, aj keÄ triedenie neskôr zruÅ¡ÃÅ¡ locale: Jazyk užÃvateľského rozhrania, emailových, a nástenkových oboznámenà - locked: Vyžaduje, aby si manuálne schvaľoval/a následovateľov + locked: Vyžaduje sa manuálne schvaľovanie sledujúcich password: Zadaj aspoň osem znakov phrase: Zhoda sa nájde nezávisle od toho, Äi je text napÃsaný, veľkými, alebo malými pÃsmenami, Äi už v tele, alebo v hlaviÄke scopes: Ktoré API budú povolené aplikácii pre prÃstup. Ak vyberieÅ¡ vrcholný stupeň, nemusÃÅ¡ už potom vyberaÅ¥ po jednom. @@ -69,8 +69,8 @@ sk: context: Triedenie kontextov current_password: SúÄasné heslo data: Dáta - discoverable: ZaraÄ tento úÄet do databázy - display_name: Meno + discoverable: ZaraÄ tento úÄet do databázy profilov + display_name: Zobrazované meno email: Emailová adresa expires_in: ExpirovaÅ¥ po fields: Metadáta profilu @@ -99,8 +99,8 @@ sk: setting_expand_spoilers: Stále rozbaľ prÃspevky oznaÄené varovanÃm o obsahu setting_hide_network: Ukri svoju sieÅ¥ kontaktov setting_noindex: NezaraÄuj prÃspevky do indexu pre vyhľadávÄe - setting_reduce_motion: RedukovaÅ¥ pohyb v animáciách - setting_system_font_ui: PoužiÅ¥ základné systémové pÃsmo + setting_reduce_motion: Mierni pohyb pri animáciách + setting_system_font_ui: Použi základné systémové pÃsmo setting_theme: Vzhľad webu setting_unfollow_modal: Zobrazuj potvrdzovacie okno pred skonÄenÃm sledovania iného užÃvateľa severity: ZávažnosÅ¥ @@ -109,8 +109,8 @@ sk: username_or_email: PrezÃvka, alebo email whole_word: Celé slovo interactions: - must_be_follower: Blokuj oboznámenia ohľadom užÃvateľov, ktorà ťa nesledujú - must_be_following: Blokuj oboznámenia ohľadom ľudà ktorých nesledujeÅ¡ + must_be_follower: BlokovaÅ¥ oznámenia od nesledujúcich + must_be_following: BlokovaÅ¥ oznámenia od ľudÃ, ktorých nesledujeÅ¡ must_be_following_dm: Blokuj súkromné správy od ľudà ktorých nesledujeÅ¡ notification_emails: digest: Posielaj súhrnné emaily diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index 890cbac418..781485864f 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -96,7 +96,7 @@ sl: follow_request: PoÅ¡lji e-poÅ¡to, ko vam nekdo želi slediti mention: PoÅ¡lji e-poÅ¡to, ko vas nekdo omeni reblog: PoÅ¡lji e-poÅ¡to, ko nekdo sune vaÅ¡e stanje - report: PoÅ¡lji e-poÅ¡to, ko je oddano novo poroÄilo + report: PoÅ¡lji e-poÅ¡to, ko je oddana nova prijava 'no': Ne required: mark: "*" diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/config/locales/simple_form.sq.yml @@ -0,0 +1 @@ +{} diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 868358f09b..5c2dcd7e07 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -3,7 +3,7 @@ sk: about: about_hashtag_html: Toto sú verejné prÃspevky otagované pod <strong>#%{hashtag}</strong>. Ak máš úÄet hocikde v rámci fediversa, môžeÅ¡ ich využÃvaÅ¥. about_mastodon_html: Mastodon je sociálna sieÅ¥ založená na otvorených webových protokoloch a na slobodnom softvéri. Je decentralizovaná, podobne ako email. - about_this: O tejto instancii + about_this: O tomto serveri administered_by: 'Správcom je:' api: API apps: Aplikácie @@ -126,7 +126,7 @@ sk: media_attachments: PrÃlohy memorialize: ZmeniÅ¥ na "Navždy budeme spomÃnaÅ¥" moderation: - active: AktÃvny/a + active: AktÃvny all: VÅ¡etko silenced: UmlÄané suspended: VylúÄený/á @@ -215,8 +215,8 @@ sk: custom_emojis: by_domain: Doména copied_msg: Lokálna kópia emoji úspeÅ¡ne vytvorená - copy: KopÃrovaÅ¥ - copy_failed_msg: Nebolo možné vytvoriÅ¥ lokálnu kópiu tohto emoji + copy: KopÃruj + copy_failed_msg: Nebolo možné vytvoriÅ¥ miestnu kópiu tohto emoji created_msg: Emoji úspeÅ¡ne vytvorené! delete: ZmazaÅ¥ destroyed_msg: Emojo úspeÅ¡ne zniÄený! @@ -398,10 +398,10 @@ sk: desc_html: Zobrazované na viacerých stránkach. OdporúÄaná veľkosÅ¥ aspoň 293×205px. Pokiaľ nieje nahraté, bude zobrazený základný maskot title: Obrázok maskota peers_api_enabled: - desc_html: Domény na ktoré táto instancia už vo fediverse natrafila - title: ZverejniÅ¥ zoznam objavených instancià + desc_html: Domény, na ktoré tento server už vo fediverse natrafil + title: Zverejni zoznam objavených serverov preview_sensitive_media: - desc_html: Náhľad adresy z iných instanciÃ, bude zobrazený aj vtedy, keÄ sú dané médiá oznaÄené ako senzitÃvne + desc_html: Náhľad odkazov z iných serverov, bude zobrazený aj vtedy, keÄ sú médiá oznaÄené ako senzitÃvne title: Ukazuj aj chúlostivé médiá v náhľadoch OpenGraph profile_directory: desc_html: PovoliÅ¥ užÃvateľom aby boli nájdenà @@ -429,13 +429,13 @@ sk: desc_html: Oboznamujúci paragraf na hlavnej stránke a pri meta tagoch. OpÃÅ¡, Äo robà tento Mastodon server Å¡pecifickým, a Äalej hociÄo iné, Äo považujeÅ¡ za dôležité. MôžeÅ¡ použiÅ¥ HTML kód, hlavne <code>< a ></code>, ale tiež <code><></code>. title: Popis instancie site_description_extended: - desc_html: Toto je vhodné miesto pre vaÅ¡e pravidlá, oboznámenia a iné veci, ktorými je vaÅ¡a instancia Å¡pecifická. Je možné tu použÃvaÅ¥ HTML kód + desc_html: Toto je vhodné miesto pre tvoje pravidlá o prevádzke, pokyny a iné veci, ktorými je tvoja instancia Å¡pecifická. Je možné tu použÃvaÅ¥ HTML kód title: Vlastné doplňujúce informácie site_short_description: desc_html: Zobrazené na boÄnom paneli a pri meta tagoch. PopÃÅ¡ Äo je Mastodon, a Äo robà tento server iným, v jednom paragrafe. Pokiaľ toto necháš prázdne, bude tu zobrazený základný popis instancie. title: Krátky popis instancie site_terms: - desc_html: Môžete si napÃsaÅ¥ vaÅ¡e vlastné pravidla o súkromÃ, prevádzke, alebo aj iné legality. Môžete tu použÃvaÅ¥ HTML kód + desc_html: MôžeÅ¡ si napÃsaÅ¥ svoje vlastné pravidla o súkromÃ, prevádzke, alebo aj iné legality. MôžeÅ¡ tu použÃvaÅ¥ HTML kód title: Vlastné pravidlá prevádzky site_title: Názov instancie thumbnail: @@ -506,13 +506,13 @@ sk: confirm_email: PotvrdiÅ¥ email delete_account: VymazaÅ¥ úÄet delete_account_html: Pokiaľ chceÅ¡ vymazaÅ¥ svoj úÄet, môžeÅ¡ tak <a href="%{path}">urobiÅ¥ tu</a>. BudeÅ¡ požiadaný/á o potvrdenie tohto kroku. - didnt_get_confirmation: Neobdŕžal/a si kroky pre potvrdenie? + didnt_get_confirmation: Neobdržal/a si kroky pre potvrdenie? forgot_password: Zabudnuté heslo? invalid_reset_password_token: Token na obnovu hesla vyprÅ¡al. ProsÃm vypÃtaj si nový. login: Prihlás sa logout: Odhlás sa - migrate_account: Presunúť sa na iný úÄet - migrate_account_html: Pokiaľ si želáš presmerovaÅ¥ tento úÄet na nejaký iný, môžeÅ¡ to <a href="%{path}">urobiÅ¥ tu</a>. + migrate_account: Presúvam sa na iný úÄet + migrate_account_html: Pokiaľ si želáš presmerovaÅ¥ tento úÄet na nejaký iný, môžeÅ¡ si to <a href="%{path}">nastaviÅ¥ tu</a>. or: alebo or_log_in_with: Alebo prihlásiÅ¥ z providers: @@ -598,7 +598,7 @@ sk: filters: contexts: home: Domáca os - notifications: Oboznámenia + notifications: Oznámenia public: Verejné osi thread: Konverzácie edit: @@ -814,8 +814,8 @@ sk: export: ExportovaÅ¥ dáta followers: Povolenà následovatelia import: ImportovaÅ¥ - migrate: Presunúť úÄet - notifications: Oboznámenia + migrate: Presunutie úÄtu + notifications: Oznámenia preferences: Voľby settings: Nastavenia two_factor_authentication: Dvoj-faktorové overenie @@ -878,7 +878,15 @@ sk: <hr class="spacer" /> - <h3 id="use"> + <h3 id="use">NaÄo sú tvoje údaje použÃvané?</h3> + + <p>Hociktorá z informáciÃ, ktoré sú o tebe zozbierané, môže byÅ¥ použité následujúcimi spôsobmi:</p> + + <ul> + <li>Pre zabezpeÄenie základného fungovania Mastodonu. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.</li> + <li>Pre lepÅ¡ie moderovanie komunity sa naprÃklad môže tvoja IP adresa porovnaÅ¥ s ostatnými už známimi adresami, aby bolo možné zistiÅ¥, Äi nedochádza naprÃklad k obchádzaniu vylúÄenia, aleb k iným poruÅ¡eniam pravidiel.</li> + <li>Emailová adresa ktorú poskytneÅ¡ môže byÅ¥ použitá na zasielanie informáciÃ, oboznámenà keÄ ostatnà užÃvatelia interaktujú s tvojÃm obsahom, alebo na posielanie správ, odpovedà na otázky a iné požiadavky.</li> + </ul> title: Podmienky užÃvania, a pravidlá súkromia pre %{instance} themes: contrast: Vysoký kontrast @@ -930,7 +938,7 @@ sk: edit_profile_step: Profil si môžeÅ¡ prispôsobiÅ¥ nahratÃm portrétu a hlaviÄky, môžeÅ¡ upraviÅ¥ svoje meno a viac. Pokiaľ chceÅ¡ preverovaÅ¥ nových následovateľov predtým než Å¥a budú môcÅ¥ sledovaÅ¥, môžeÅ¡ uzamknúť svoj úÄet. explanation: Tu nájdeÅ¡ nejaké tipy do zaÄiatku final_action: ZaÄni prispievaÅ¥ - final_step: 'ZaÄnite pÃsaÅ¥! Aj bez následovnÃkov budú vaÅ¡e verejné správy videné ostatnými, naprÃklad na lokálnej osi a pod haÅ¡tagmi. Môžete sa ostatným predstaviÅ¥ pod haÅ¡tagom #introductions.' + final_step: 'ZaÄni pÃsaÅ¥! Aj bez následovateľov budú tvoje verejné prÃspevky videné ostatnými, naprÃklad na miestnej osi a pod haÅ¡tagmi. Ak chceÅ¡, môžeÅ¡ sa ostatným predstaviÅ¥ pod haÅ¡tagom #introductions.' full_handle: Adresa tvojho profilu v celom formáte full_handle_hint: Toto je Äo musÃÅ¡ daÅ¥ vedieÅ¥ svojÃm priateľom aby ti mohli posielaÅ¥ správy, alebo Å¥a následovaÅ¥ z inej instancie. review_preferences_action: ZmeniÅ¥ nastavenia diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 594c58acc1..35cba927be 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -54,6 +54,7 @@ sl: two: Sledilci following: Sledim joined: Se je pridružil na %{date} + last_active: zadnji aktivni link_verified_on: LastniÅ¡tvo te povezave je bilo preverjeno na %{date} media: Medij moved_html: "%{name} se je prestavil na %{new_profile_link}:" @@ -77,8 +78,11 @@ sl: moderator: Mod unfollow: Prenehaj slediti admin: + account_actions: + action: Izvedi dejanje + title: Izvedi moderirano dejanje %{acct} account_moderation_notes: - create: Pusti sporoÄilo + create: Pusti opombo created_msg: UspeÅ¡no ustvarjena opomba moderiranja! delete: IzbriÅ¡i destroyed_msg: Moderirana opomba je uspeÅ¡no uniÄena! @@ -96,6 +100,7 @@ sl: confirm: Potrdi confirmed: Potrjeno confirming: Potrjujem + deleted: Izbrisano demote: Ponižaj disable: OnemogoÄi disable_two_factor_authentication: OnemogoÄi 2FA @@ -111,8 +116,11 @@ sl: followers: Sledilci followers_url: URL sledilci follows: Sledi + header: Glava inbox_url: URl v mapi "Prejeto" + invited_by: Povabljen od ip: IP + joined: Pridružil location: all: Vse local: Lokalno @@ -122,6 +130,7 @@ sl: media_attachments: Medijske priloge memorialize: Spremenite v spomin moderation: + active: Dejaven all: Vse silenced: UtiÅ¡an suspended: Suspendiran @@ -129,7 +138,265 @@ sl: moderation_notes: Opombe moderiranja most_recent_activity: Zadnja aktivnost most_recent_ip: Zadnji IP + no_limits_imposed: Brez omejitev + not_subscribed: Ni naroÄeno + outbox_url: URl za poÅ¡iljanje + perform_full_suspension: ZaÄasno ustavi + profile_url: URL profila promote: Spodbujanje + protocol: Protokol + public: Javen + push_subscription_expires: NaroÄnina PuSH preteÄe + redownload: Osveži profil + remove_avatar: Odstrani podobo + remove_header: Odstrani glavo + resend_confirmation: + already_confirmed: Ta uporabnik je že potrjen + send: Ponovno poÅ¡lji potrditveno e-poÅ¡to + success: Potrditvena e-poÅ¡ta je uspeÅ¡no poslana! + reset: Ponastavi + reset_password: Ponastavi geslo + resubscribe: Ponovno se naroÄi + role: Dovoljenja + roles: + admin: Skrbnik + moderator: Moderator + staff: Osebje + user: Uporabnik + salmon_url: Salmon URL + search: PoiÅ¡Äi + shared_inbox_url: URL mape "Prejeto v skupni rabi" + show: + created_reports: Narejene prijave + targeted_reports: Prijavili drugi + silence: UtiÅ¡aj + silenced: UtiÅ¡an + statuses: Stanja + subscribe: NaroÄi + suspended: Suspendiran + title: RaÄuni + unconfirmed_email: Nepotrjena e-poÅ¡ta + undo_silenced: Razveljavi utiÅ¡anje + undo_suspension: Razveljavi suspendiranje + unsubscribe: Odjavi se od naroÄnine + username: UporabniÅ¡ko ime + warn: Opozori + web: Splet + action_logs: + actions: + assigned_to_self_report: "%{name} je prijavil %{target} sebi" + change_email_user: "%{name} je spremenil naslov e-poÅ¡te uporabnika %{target}" + confirm_user: "%{name} je potrdil naslov e-poÅ¡te uporabnika %{target}" + create_account_warning: "%{name} je poslal opozorilo %{target}" + create_custom_emoji: "%{name} je poslal nove emotikone %{target}" + create_domain_block: "%{name} je blokiral domeno %{target}" + create_email_domain_block: "%{name} je dal na Ärni seznam e-poÅ¡to domene %{target}" + demote_user: "%{name} je degradiral uporabnika %{target}" + destroy_custom_emoji: "%{name} je uniÄil emotikon %{target}" + destroy_domain_block: "%{name} je odblokiral domeno %{target}" + destroy_email_domain_block: "%{name} je dal na beli seznam e-poÅ¡to domene %{target}" + destroy_status: "%{name} je odstranil stanje od %{target}" + disable_2fa_user: "%{name} je onemogoÄil dvofaktorsko zahtevo za uporabnika %{target}" + disable_custom_emoji: "%{name} je onemogoÄil emotikon %{target}" + disable_user: "%{name} je onemogoÄil prijavo za uporabnika %{target}" + enable_custom_emoji: "%{name} je omogoÄil emotikon %{target}" + enable_user: "%{name} je omogoÄil prijavo za uporabnika %{target}" + memorialize_account: "%{name} je spremenil raÄun od %{target} v stran spominov" + promote_user: "%{name} je spodbudil uporabnika %{target}" + remove_avatar_user: "%{name} je odstranil podobo od %{target}" + reopen_report: "%{name} je ponovno odprl prijavo %{target}" + reset_password_user: "%{name} je ponastavil geslo od uporabnika %{target}" + resolve_report: "%{name} je razreÅ¡il prijavo %{target}" + silence_account: "%{name} je utiÅ¡al raÄun od %{target}" + suspend_account: "%{name} je zaÄasno ustavil raÄun od %{target}" + unassigned_report: "%{name} je nedodeljeno prijavil %{target}" + unsilence_account: "%{name} je preklical utiÅ¡anje raÄuna od %{target}" + unsuspend_account: "%{name} je aktiviral raÄun od %{target}" + update_custom_emoji: "%{name} je posodobil emotikone %{target}" + update_status: "%{name} je posodobil stanje od %{target}" + deleted_status: "(izbrisano stanje)" + title: Dnevnik revizije + custom_emojis: + by_domain: Domena + copied_msg: Lokalna kopija emotikona je bila uspeÅ¡no ustvarjena + copy: Kopiraj + copy_failed_msg: Lokalne kopije emotikona ni bilo mogoÄe ustvariti + created_msg: Emotikon je uspeÅ¡no ustvarjen! + delete: IzbriÅ¡i + destroyed_msg: Emotikon je uspeÅ¡no uniÄen! + disable: OnemogoÄi + disabled_msg: Ta emotikon je uspeÅ¡no onemogoÄen + emoji: Emotikon + enable: OmogoÄi + enabled_msg: Ta emotikon je uspeÅ¡no omogoÄen + image_hint: PNG do 50KB + listed: Navedeno + new: + title: Dodaj nove emotikone + overwrite: PrepiÅ¡i + shortcode: Kratka koda + shortcode_hint: Najmanj 2 znaka, samo alfanumeriÄni znaki in podÄrtaji + title: Emotikoni po meri + unlisted: NeuvrÅ¡Äeni + update_failed_msg: Tega emotikona ni bilo mogoÄe posodobiti + updated_msg: Emotikon je uspeÅ¡no posodobljen! + upload: PoÅ¡lji + dashboard: + backlog: Zaostala opravila + config: Nastavitve + feature_deletions: Brisanje raÄunov + feature_invites: Poveza povabil + feature_profile_directory: Mapa profila + feature_registrations: Registracije + feature_relay: Rele federacije + features: Zmožnosti + hidden_service: Federacija s skritimi storitvami + open_reports: odprte prijave + recent_users: Nedavni uporabniki + search: Iskanje po celotnem besedilu + single_user_mode: NaÄin enega uporabnika + software: Programska oprema + space: Uporaba prostora + title: Nadzorna ploÅ¡Äa + total_users: Skupaj uporabnikov + trends: Trendi + week_interactions: interakcije ta teden + week_users_active: aktivni ta teden + week_users_new: uporabniki ta teden + domain_blocks: + add_new: Dodaj nov domenski blok + created_msg: Domenski blok se sedaj obdeluje + destroyed_msg: Domenski blok je bil razveljavljen + domain: Domena + new: + create: Ustvari blok + hint: Domenski blok ne bo prepreÄil ustvarjanja vnosov raÄunov v zbirko podatkov, ampak bo retroaktivno in samodejno uporabil posebne metode moderiranja na teh raÄunih. + severity: + desc_html: "<strong>UtiÅ¡aj</strong> bo vse objave raÄuna naredil nevidne vsem, ki jih ne sledijo. <strong>Suspendiraj</strong> bo odstranil vso vsebino, medije in podatke profila raÄuna. Uporabi <strong>niÄ</strong>, Äe želite le zavrniti predstavnostne datoteke." + noop: NiÄ + silence: UtiÅ¡aj + suspend: Suspendiraj + title: Nov domenski blok + reject_media: Zavrni predstavnostne datoteke + reject_media_hint: Odstrani lokalno shranjene predstavnostne datoteke in zavraÄa prenaÅ¡anje le-teh v prihodnosti. Za suspenzije ni pomembno + reject_reports: Zavrnjene prijave + reject_reports_hint: Prezri vse prijave, ki pridejo iz te domene. Za suspenzije ni pomembno + rejecting_media: zavrnitev predstavnostnih datotek + rejecting_reports: zavrnitev prijav + severity: + silence: utiÅ¡ani + suspend: suspendirani + show: + affected_accounts: + few: "%{count} raÄunov v bazi podatkov so prizadeti" + one: En raÄun v bazi podatkov je prizadet + other: "%{count} raÄunov v bazi podatkov so prizadeti" + two: "%{count} raÄunov v bazi podatkov so prizadeti" + retroactive: + silence: PrekliÄi utiÅ¡anje za vse obstojeÄe raÄune iz te domene + suspend: Odsuspendiraj vse obstojeÄe raÄune iz te domene + title: Razveljavi domenski blok za %{domain} + undo: Razveljavi + undo: Razveljavi domenski blok + email_domain_blocks: + add_new: Dodaj novo + created_msg: Domena e-poÅ¡te je bila uspeÅ¡no dodana na Ärni seznam + delete: IzbriÅ¡i + destroyed_msg: Domena e-poÅ¡te je bila uspeÅ¡no izbrisana iz Ärnega seznama + domain: Domena + new: + create: Dodaj domeno + title: Nov vnos e-poÅ¡te na Ärni seznam + title: ÄŒrni seznam e-poÅ¡te + followers: + back_to_account: Nazaj na raÄun + title: Sledilci od %{acct} + instances: + delivery_available: Na voljo je dostava + known_accounts: + few: "%{count} znanih raÄunov" + one: "%{count} znan raÄun" + other: "%{count} znanih raÄunov" + two: "%{count} znanih raÄunov" + moderation: + all: Vse + limited: Omejeno + title: Moderiranje + title: Federacija + total_blocked_by_us: Blokirano iz naÅ¡e strani + total_followed_by_them: Oni ti sledijo + total_followed_by_us: Mi ti sledimo + total_reported: PoroÄila o njih + total_storage: Predstavnostne priloge + invites: + deactivate_all: OnemogoÄi vse + filter: + all: Vse + available: Razpoložljivo + expired: Potekel + title: Filter + title: Povabila + relays: + add_new: Dodaj nov rele + delete: IzbriÅ¡i + description_html: "<strong>Rele federacije</strong> je posredniÅ¡ki strežnik, ki si izmenjuje velike koliÄine javnih trobov med strežniki, ki so se naroÄili in objavili na njem. <strong>Majhnim in srednjim strežnikom lahko pomaga pri odkrivanju vsebine iz sistema fediverse</strong>, kar bi sicer zahtevalo, da lokalni uporabniki roÄno sledijo druge osebe na oddaljenih strežnikih." + disable: OnemogoÄi + disabled: OnemogoÄeno + enable: OmogoÄi + enable_hint: Ko je omogoÄen, se bo vaÅ¡ strežnik naroÄil na vse javne trobe iz tega releja in zaÄel poÅ¡iljati javne trobe tega strežnika. + enabled: OmogoÄeno + inbox_url: URL releja + pending: ÄŒakanje na odobritev releja + save_and_enable: Shrani in omogoÄi + setup: Nastavi povezavo releja + status: Stanje + title: Releji + report_notes: + created_msg: Opomba o prijavi je uspeÅ¡no ustvarjena! + destroyed_msg: Opomba o prijavi je uspeÅ¡no izbrisana! + reports: + account: + note: opomba + report: prijava + action_taken_by: Dejanje, ki ga je sprejel + are_you_sure: Ali ste prepriÄani? + assign_to_self: Dodeli meni + assigned: Dodeljen moderator + comment: + none: NiÄ + created_at: Prijavljeno + mark_as_resolved: OznaÄi kot reÅ¡eno + mark_as_unresolved: OznaÄi kot nereÅ¡eno + notes: + create: Dodaj opombo + create_and_resolve: RazreÅ¡i z opombo + create_and_unresolve: Ponovo odpri z opombo + delete: IzbriÅ¡i + placeholder: OpiÅ¡ite dejanja, ki ste jih izvedli, ali katere koli druge posodobitve... + reopen: Ponovno odpri prijavo + report: 'Prijavi #%{id}' + reported_account: Prijavljeni raÄun + reported_by: Prijavljen od + resolved: RazreÅ¡eno + resolved_msg: Prijava je uspeÅ¡no razreÅ¡ena! + status: Stanje + title: Prijave + unassign: Odstopi + unresolved: NereÅ¡eno + updated_at: Posodobljen + settings: + activity_api_enabled: + desc_html: Å tevilke lokalno objavljenih stanj, aktivnih uporabnikov in novih registracij na tedenskih seznamih + title: Objavi združeno statistiko o dejavnosti uporabnikov + bootstrap_timeline_accounts: + desc_html: VeÄ uporabniÅ¡kih imen loÄite z vejico. Deluje samo na lokalnih in odklenjenih raÄunih. Privzeto, ko je prazno, pri vseh lokalnih skrbnikih. + title: Privzeta sledenja za nove uporabnike + contact_information: + email: Poslovna e-poÅ¡ta + username: UporabniÅ¡ko ime stika + custom_css: + desc_html: Spremeni videz z naloženim CSS na vsaki strani + title: CSS po meri statuses: pin_errors: ownership: Trob nekoga drugega ne more biti pripet diff --git a/config/locales/sq.yml b/config/locales/sq.yml new file mode 100644 index 0000000000..e583b9309f --- /dev/null +++ b/config/locales/sq.yml @@ -0,0 +1,612 @@ +--- +sq: + about: + about_this: Mbi + administered_by: 'Administruar nga:' + api: API + apps: Aplikacione për celular + contact: Kontakt + contact_missing: I parregulluar + contact_unavailable: N/A + documentation: Dokumentim + features: + humane_approach_title: Një trajtim më njerëzor + not_a_product_title: Jeni një person, jo një produkt + real_conversation_title: Ndërtuar për bashkëbisedim të njëmendtë + within_reach_title: Përherë i kapshëm + generic_description: "%{domain} është një shërbyes te rrjeti" + hosted_on: Mastodon i strehuar në %{domain} + learn_more: Mësoni më tepër + other_instances: Listë instancash + privacy_policy: Rregulla privatësie + source_code: Kod burim + status_count_after: + one: gjendje + other: gjendje + status_count_before: Cili krijoi + terms: Kushte shërbimi + user_count_after: + one: përdorues + other: përdorues + what_is_mastodon: Ç’është Mastodon-i? + accounts: + choices_html: 'Zgjedhje të %{name}:' + follow: Ndiqeni + followers: + one: Ndjekës + other: Ndjekës + following: Ndjekje + joined: U bë pjesë më %{date} + last_active: aktiv së fundi + media: Media + nothing_here: S’ka gjë këtu! + people_followed_by: Persona të ndjekur nga %{name} + people_who_follow: Persona që ndjekin %{name} + reserved_username: Emri i përdoruesit është i ruajtur për dikë + roles: + admin: Përgjegjës + bot: Bot + moderator: Mod + unfollow: Resht së ndjekuri + admin: + account_actions: + action: Kryeje veprimin + account_moderation_notes: + create: Lini një shënim + created_msg: Shënimi i moderimit u krijua me sukses! + delete: Fshije + destroyed_msg: Shënimi i moderimit u asgjësua me sukses! + accounts: + are_you_sure: A jeni i sigurt? + avatar: Avatar + by_domain: Përkatësi + change_email: + changed_msg: Email-i i llogarisë u ndryshua me sukses! + current_email: Email-i i tanishëm + label: Ndrysho email-in + new_email: Email i ri + submit: Ndrysho email-in + title: Ndrysho email-in për %{username} + confirm: Ripohojeni + confirmed: U ripohua + confirming: Po ripohohet + deleted: U fshi + demote: Zhgradoje + disable: Çaktivizoje + disable_two_factor_authentication: Çaktivizoni 2FA + disabled: E çaktivizuar + display_name: Emër në ekran + domain: Përkatësi + edit: Përpunojeni + email: Email + email_status: Gjendje email-i + enable: Aktivizoje + enabled: E aktivizuar + feed_url: URL prurjeje + followers: Ndjekës + followers_url: URL Ndjekësish + follows: Ndjekje + header: Krye + inbox_url: URL Mesazhesh të Marrë + invited_by: Ftuar nga + ip: IP + joined: U bë pjesë + location: + all: Krejt + local: Vendore + remote: E largët + title: Vendndodhje + login_status: Gjendje hyrjeje + media_attachments: Bashkëngjitje media + moderation: + active: Aktiv + all: Krejt + suspended: Të pezulluara + title: Moderim + moderation_notes: Shënime moderimesh + most_recent_activity: Veprimtaria më e freskët + most_recent_ip: IP-ja më e freskët + no_limits_imposed: Pa imponim kufijsh + not_subscribed: Jo i pajtuar + outbox_url: URL Mesazhesh të Dërguar + perform_full_suspension: Pezulloje + profile_url: URL profili + protocol: Protokoll + public: Publike + push_subscription_expires: Pajtimi PuSH skadon më + redownload: Rifresko profilin + remove_avatar: Hiqe avatarin + remove_header: Hiqe kryen + resend_confirmation: + already_confirmed: Ky përdorues është i ripohuar tashmë + send: Ridërgo email ripohimi + success: Email-i i ripohimit u dërgua me sukses! + reset_password: Ricaktoni fjalëkalimin + resubscribe: Ripajtohuni + role: Leje + roles: + admin: Përgjegjës + moderator: Moderator + staff: Staf + user: Përdorues + search: Kërkoni + show: + created_reports: Ka bërë raporte + targeted_reports: Raportuar nga të tjerë + silence: Heshtje + statuses: Gjendje + subscribe: Pajtomë + suspended: Të pezulluara + title: Llogari + unconfirmed_email: Email i paripohuar + undo_silenced: Zhbëje heshtjen + undo_suspension: Zhbëje pezullimin + unsubscribe: Shpajtohuni + username: Emër përdoruesi + warn: Sinjalizoje + web: Web + action_logs: + actions: + change_email_user: "%{name} ndryshoi adresën email të përdoruesit %{target}" + confirm_user: "%{name} ripohoi adresën email të përdoruesit %{target}" + create_account_warning: "%{name} dërgoi një sinjalizim për %{target}" + create_custom_emoji: "%{name} ngarkoi emotikon të ri %{target}" + create_domain_block: "%{name} bllokoi përkatësinë %{target}" + create_email_domain_block: "%{name} e shtoi në listë bllokimesh përkatësinë %{target}" + demote_user: "%{name} zhgradoi përdoruesin %{target}" + destroy_custom_emoji: "%{name} asgjësoi emotikonin %{target}" + destroy_domain_block: "%{name} zhbllokoi përkatësinë %{target}" + disable_2fa_user: "%{name} çaktivizoi domosdoshmëritë për dyfaktorësh për përdoruesin %{target}" + disable_custom_emoji: "%{name} çaktivizoi emotikonin %{target}" + disable_user: "%{name} çaktivizoi hyrje për përdoruesin %{target}" + enable_custom_emoji: "%{name} aktivizoi emotikonin %{target}" + enable_user: "%{name} aktivizoi hyrje për përdoruesin %{target}" + promote_user: "%{name} gradoi përdoruesin %{target}" + remove_avatar_user: "%{name} hoqi avatarin e %{target}" + reopen_report: "%{name} rihapi raportin %{target}" + reset_password_user: "%{name} ricaktoi fjalëkalimi për përdoruesin %{target}" + silence_account: "%{name} heshtoi llogarinë e %{target}" + suspend_account: "%{name} pezulloi llogarinë e %{target}" + unsilence_account: "%{name} hoqi heshtimin për llogarinë %{target}" + unsuspend_account: "%{name} hoqi pezullimin për llogarinë e %{target}" + update_custom_emoji: "%{name} përditësoi emotikonin %{target}" + custom_emojis: + by_domain: Përkatësi + copy: Kopjoje + created_msg: Emotikoni u krijua me sukses! + delete: Fshije + destroyed_msg: Emotikoni u asgjësua me sukses! + disable: Çaktivizoje + disabled_msg: Ai emotikon u çaktivizua me sukses + emoji: Emotikon + enable: Aktivizoje + enabled_msg: Ai emotikon u aktivizua me sukses + image_hint: PNG deri 50KB + new: + title: Shtoni emotikon të ri vetjak + overwrite: Mbishkruaje + shortcode: Kod i shkurtër + title: Emotikone vetjake + update_failed_msg: S’u përditësua dot ai emotikon + updated_msg: Emotikoni u përditësua me sukses! + upload: Ngarkoje + dashboard: + config: Formësim + feature_invites: Lidhje ftesash + feature_profile_directory: Drejtori profilesh + feature_registrations: Regjistrime + feature_relay: Rele federimi + features: Veçori + search: Kërko tekstin e plotë + single_user_mode: Mënyrë me përdorues të vetëm + software: Software + space: Përdorim hapësire + title: Pult + total_users: përdorues gjithsej + trends: Tendenca + week_interactions: Ndërveprime këtë javë + week_users_active: aktivë këtë javë + week_users_new: përdorues këtë javë + domain_blocks: + add_new: Shtoni bllokim të ri përkatësie + created_msg: Bllokimi i përkatësisë tani po përpunohet + destroyed_msg: Bllokimi i përkatësisë u hoq + domain: Përkatësi + new: + create: Krijoni bllokim + severity: + noop: Asnjë + silence: Heshtje + suspend: Pezulloje + title: Shtoni Bllokim i ri përkatësie + show: + affected_accounts: Pat ndikim te një llogari në bazën e të dhënave + undo: Zhbëje + undo: Zhbëje bllokimin e përkatësisë + email_domain_blocks: + add_new: Shtoni të ri + delete: Fshije + domain: Përkatësi + new: + create: Shtoni përkatësi + followers: + back_to_account: Mbrapsht Te Llogaria + title: Ndjekës të %{acct} + instances: + moderation: + all: Krejt + limited: E kufizuar + title: Moderim + title: Federim + total_blocked_by_us: Bllokuar nga ne + total_followed_by_them: Ndjekur prej tyre + total_followed_by_us: Ndjekur nga ne + total_reported: Raportime rreth tyre + total_storage: Bashkëngjitje media + invites: + deactivate_all: Çaktivizoji krejt + filter: + all: Krejt + expired: Ka skaduar + title: Filtër + title: Ftesa + relays: + add_new: Shtoni rele të re + delete: Fshije + disable: Çaktivizoje + disabled: E çaktivizuar + enable: Aktivizoje + enabled: E aktivizuar + inbox_url: URL releje + pending: Në pritje të miratimit të relesë + save_and_enable: Ruaje dhe aktivizoje + setup: Ujdisni një lidhje rele + status: Gjendje + title: Rele + report_notes: + created_msg: Shënimi i raportimit u krijua me sukses! + destroyed_msg: Shënimi i raportimit u fshi me sukses! + reports: + account: + note: shënim + report: Raportoje + action_taken_by: 'Veprimi i ndërmarrë nga ' + are_you_sure: A jeni i sigurt? + assign_to_self: Caktojani vetes + comment: + none: Asnjë + created_at: Raportuar më + mark_as_resolved: Vëri shenjë si i zgjidhur + mark_as_unresolved: Vëri shenjë si të pazgjidhur + notes: + create: Shtoni shënim + create_and_resolve: Zgjidhe me shënim + create_and_unresolve: Rihape me shënim + delete: Fshije + reopen: Rihape raportimin + report: 'Raportim #%{id}' + reported_account: Llogari e raportuar + reported_by: Raportuar nga + status: Gjendje + title: Raportime + unresolved: Të pazgjidhur + updated_at: U përditësua më + settings: + custom_css: + title: CSS Vetjake + mascot: + title: Figurë simboli + peers_api_enabled: + title: Boto listë instancash të zbuluara + profile_directory: + desc_html: Lejoju përdoruesve të jenë të zbulueshëm + title: Aktivizo drejtori profilesh + registrations: + open: + title: Hap regjistrim + show_staff_badge: + desc_html: Shfaq një stemë stafi në faqen e një përdoruesi + title: Shfaq stemë stafi + site_description: + title: Përshkrim instance + site_terms: + title: Kushte vetjake shërbimi + site_title: Emër instance + thumbnail: + title: Miniaturë instance + timeline_preview: + title: Paraparje rrjedhe kohore + title: Rregullime sajti + statuses: + back_to_account: Mbrapsht te faqja e llogarisë + batch: + delete: Fshije + nsfw_off: Vëri shenjë si jo rezervat + nsfw_on: Vëri shenjë si rezervat + failed_to_execute: S’u arrit të përmbushej + media: + title: Media + no_media: S’ka media + no_status_selected: S’u ndryshua ndonjë gjendje, ngaqë s’u përzgjodh ndonjë e tillë + title: Gjendje llogarish + with_media: Me media + subscriptions: + callback_url: URL Callback-u + expires_in: Skadon më + topic: Temë + tags: + accounts: Llogari + hidden: Fshehur + hide: Fshihe prej drejtorie + name: Hashtag + title: Hashtage + unhide: Shfaqe në drejtori + visible: E dukshme + title: Administrim + warning_presets: + add_new: Shtoni të ri + delete: Fshije + edit: Përpunoni + admin_mailer: + new_report: + body: "%{reporter} ka raportuar %{target}" + subject: Raport i ri për %{instance} (#%{id}) + application_mailer: + notification_preferences: Ndryshoni parapëlqime email-i + salutation: "%{name}," + settings: 'Ndryshoni parapëlqime email-i: %{link}' + view: 'Parje:' + view_profile: Shihni Profilin + view_status: Shihini gjendjen + applications: + created: Aplikacioni u krijua me sukses + destroyed: Aplikacioni u fshi me sukses + invalid_url: URL-ja e dhënë është e pavlefshme + regenerate_token: Riprodho token hyrjesh + your_token: Token-i juaj për hyrje + auth: + change_password: Fjalëkalim + confirm_email: Ripohoni email-in + delete_account: Fshije llogarinë + didnt_get_confirmation: S’morët udhëzime ripohimi? + forgot_password: Harruat fjalëkalimin tuaj? + login: Hyni + logout: Dalje + migrate_account: Kaloni në një tjetër llogari + migrate_account_html: Nëse doni ta ridrejtoni këtë llogari te një tjetër, këtë mund <a href="%{path}">ta formësoni këtu</a>. + or: ose + or_log_in_with: Ose bëni hyrjen me + providers: + cas: CAS + register: Regjistrohuni + register_elsewhere: Regjistrohuni në një tjetër shërbyes + resend_confirmation: Ridërgo udhëzime ripohimi + reset_password: Ricaktoni fjalëkalimin + security: Siguri + set_new_password: Caktoni fjalëkalim të ri + authorize_follow: + already_following: E ndiqni tashmë këtë llogari + follow: Ndiqeni + follow_request: 'Keni dërguar një kërkesë ndjekjeje te:' + following: 'Sukses! Tani e ndiqni:' + post_follow: + return: Shfaq profilin e përdoruesit + title: Ndiq %{acct} + datetime: + distance_in_words: + about_x_hours: "%{count}o" + about_x_months: "%{count}mj" + about_x_years: "%{count}v" + almost_x_years: "%{count}v" + half_a_minute: Mu tani + less_than_x_minutes: "%{count}m" + less_than_x_seconds: Mu tani + over_x_years: "%{count}v" + x_days: "%{count}d" + x_minutes: "%{count}m" + x_months: "%{count}mj" + x_seconds: "%{count}s" + deletes: + proceed: Fshini llogarinë + directories: + directory: Drejtori profilesh + explore_mastodon: Eksploroni %{title} + people: + one: "%{count} person" + other: "%{count} persona" + errors: + '403': S’keni leje të shihni këtë faqe. + '404': Faqja që po kërkonit, nuk ekziston. + '410': Faqja që po kërkonit, nuk ekziston më. + '422': + title: Verifikimi i sigurisë dështoi + '500': + title: Kjo faqe s’është e saktë + exports: + archive_takeout: + date: Datë + size: Madhësi + csv: CSV + lists: Lista + storage: Depozitim për media + filters: + contexts: + notifications: Njoftime + thread: Biseda + edit: + title: Përpunoni filtër + index: + delete: Fshije + title: Filtra + new: + title: Shtoni filtër të ri + followers: + domain: Përkatësi + followers_count: Numër ndjekësish + purge: Hiqe nga ndjekësit + unlocked_warning_title: Llogaria juaj s’është kyçur + footer: + developers: Zhvillues + more: Më tepër… + resources: Burime + generic: + changes_saved_msg: Ndryshimet u ruajtën me sukses! + copy: Kopjoje + save_changes: Ruaji ndryshimet + imports: + types: + blocking: Listë bllokimesh + invites: + expires_in: + '1800': 30 minuta + '21600': 6 orë + '3600': 1 orë + '43200': 12 orë + '604800': 1 javë + '86400': 1 ditë + expires_in_prompt: Kurrë + generate: Prodhoje + invited_by: 'Qetë ftuar nga:' + max_uses: + one: 1 përdorim + other: "%{count} përdorime" + max_uses_prompt: Pa kufi + table: + expires_at: Skadon më + uses: Përdorime + title: Ftoni njerëz + migrations: + proceed: Ruaje + moderation: + title: Moderim + notification_mailer: + digest: + action: Shihini krejt njoftimet + favourite: + title: E parapëlqyer e re + follow: + title: Ndjekës i ri + mention: + body: 'U përmendët nga %{name} në:' + subject: U përmendët nga %{name} + title: Përmendje e re + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: K + thousand: K + trillion: T + pagination: + truncate: "…" + preferences: + languages: Gjuhë + other: Tjetër + publishing: Publikim + web: Web + remote_unfollow: + error: Gabim + title: Titull + sessions: + activity: Veprimtaria e fundit + browser: Shfletues + browsers: + blackberry: Blackberry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox + generic: Shfletues i panjohur + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Shfletues Nokia S40 Ovi + opera: Opera + otter: Otter + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UCBrowser + weibo: Weibo + current_session: Sesioni i tanishëm + description: "%{browser} në %{platform}" + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: Linux + mac: Mac + other: platformë e panjohur + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone + revoke: Shfuqizoje + title: Sesione + settings: + authorized_apps: Aplikacione të autorizuara + back: Mbrapsht te Mastodon + delete: Fshirje llogarie + development: Zhvillim + edit_profile: Përpunoni profilin + export: Eksportim të dhënash + followers: Ndjekës të autorizuar + import: Importo + migrate: Migrim llogarie + notifications: Njoftime + preferences: Parapëlqime + settings: Rregullime + your_apps: Aplikacionet tuaja + statuses: + attached: + image: + one: "%{count} figurë" + other: "%{count} figura" + video: + one: "%{count} video" + other: "%{count} video" + content_warning: 'Sinjalizim lënde: %{warning}' + show_more: Shfaq më tepër + title: '%{name}: "%{quote}"' + visibilities: + private: Vetëm ndjekësve + private_long: Shfaqua vetëm ndjekësve + public: Publike + public_long: Mund ta shohë kushdo + themes: + contrast: Me kontrast të lartë + default: Mastodon + mastodon-light: Mastodon (light) + time: + formats: + default: "%d %b, %Y, %H:%M" + month: "%b %Y" + two_factor_authentication: + disable: Çaktivizoje + enable: Aktivizoje + enabled_success: Mirëfilltësimi dyfaktorësh u aktivizua me sukses + user_mailer: + backup_ready: + subject: Arkivi juaj është gati për shkarkim + warning: + subject: + disable: Llogaria juaj %{acct} është ngrirë + none: Sinjalizim për %{acct} + silence: Llogaria juaj %{acct} është kufizuar + welcome: + explanation: Ja disa ndihmëza, sa për t’ia filluar + final_action: Filloni të postoni + subject: Mirë se vini te Mastodon-i + tips: Ndihmëza + title: Mirë se vini, %{name}! + users: + invalid_email: Adresa email është e pavlefshme + invalid_otp_token: Kod dyfaktorësh i pavlefshëm + signed_in_as: 'I futur si:' + verification: + verification: Verifikim diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 1d373ed679..331ec3f804 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -34,14 +34,14 @@ sr: few: ÑтатуÑи many: ÑтатуÑи one: ÑÑ‚Ð°Ñ‚ÑƒÑ - other: ÑтатуÑи + other: ÑтатуÑа status_count_before: Који Ñу напиÑали terms: УÑлови коришћења user_count_after: few: кориÑници many: кориÑници one: кориÑник - other: кориÑници + other: кориÑника user_count_before: Дом за what_is_mastodon: Шта је МаÑтодон? accounts: @@ -54,7 +54,7 @@ sr: other: Пратиоци following: Пратим joined: Придружио/ла Ñе %{date} - last_active: поÑледњи активни + last_active: поÑледњи пут активни link_verified_on: ВлаÑништво над овом везом је проверено %{date} media: Медији moved_html: "%{name} је прешао на %{new_profile_link}:" @@ -570,8 +570,8 @@ sr: people: few: "%{count} људе" many: "%{count} људе" - one: "%{count} оÑобу" - other: "%{count} људе" + one: "%{count} оÑоба/е" + other: "%{count} људи" errors: '403': Ðемате дозвола да видите ову Ñтрану. '404': Страна коју Ñте тражили не поÑтоји. -- GitLab From c0a564feaa11c072da9c2be892643db55659ae38 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Mon, 11 Feb 2019 13:19:06 +0100 Subject: [PATCH 051/192] Add available locales for lv, ms, sq (#10008) --- app/helpers/settings_helper.rb | 3 +++ config/application.rb | 3 +++ 2 files changed, 6 insertions(+) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 0e957e9465..7a3ceca786 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -30,7 +30,9 @@ module SettingsHelper ja: '日本語', ka: 'ქáƒáƒ თული', ko: 'í•œêµì–´', + lv: 'LatvieÅ¡u valoda', ml: 'മലയാളം', + ms: 'بهاس ملايو', nl: 'Nederlands', no: 'Norsk', oc: 'Occitan', @@ -41,6 +43,7 @@ module SettingsHelper ru: 'РуÑÑкий', sk: 'SlovenÄina', sl: 'SlovenÅ¡Äina', + sq: 'Shqip', sr: 'СрпÑки', 'sr-Latn': 'Srpski (latinica)', sv: 'Svenska', diff --git a/config/application.rb b/config/application.rb index b4a39b5c8a..ae9ce48970 100644 --- a/config/application.rb +++ b/config/application.rb @@ -64,6 +64,8 @@ module Mastodon :ja, :ka, :ko, + :lv, + :ms, :nl, :no, :oc, @@ -74,6 +76,7 @@ module Mastodon :ru, :sk, :sl, + :sq, :sr, :'sr-Latn', :sv, -- GitLab From aee93bfc9c7169f2e784de8572263de911922760 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Mon, 11 Feb 2019 13:19:59 +0100 Subject: [PATCH 052/192] Fix timeline jumps (#10001) * Avoid two-step rendering of statuses as much as possible Cache width shared by Video player, MediaGallery and Cards at the ScrollableList level, pass it down through StatusList and Notifications. * Adjust scroll when new preview cards appear * Adjust scroll when statuses above the current scroll position are deleted --- .../mastodon/components/media_gallery.js | 10 ++- .../mastodon/components/scrollable_list.js | 28 +++++++- app/javascript/mastodon/components/status.js | 67 +++++++++++++++++-- .../notifications/components/notification.js | 32 ++++++++- .../features/status/components/card.js | 5 +- .../mastodon/features/video/index.js | 4 +- 6 files changed, 134 insertions(+), 12 deletions(-) diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js index c507920d0e..a2bc952556 100644 --- a/app/javascript/mastodon/components/media_gallery.js +++ b/app/javascript/mastodon/components/media_gallery.js @@ -194,6 +194,8 @@ class MediaGallery extends React.PureComponent { height: PropTypes.number.isRequired, onOpenMedia: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, + defaultWidth: PropTypes.number, + cacheWidth: PropTypes.func, }; static defaultProps = { @@ -202,6 +204,7 @@ class MediaGallery extends React.PureComponent { state = { visible: displayMedia !== 'hide_all' && !this.props.sensitive || displayMedia === 'show_all', + width: this.props.defaultWidth, }; componentWillReceiveProps (nextProps) { @@ -221,6 +224,7 @@ class MediaGallery extends React.PureComponent { handleRef = (node) => { if (node /*&& this.isStandaloneEligible()*/) { // offsetWidth triggers a layout, so only calculate when we need to + if (this.props.cacheWidth) this.props.cacheWidth(node.offsetWidth); this.setState({ width: node.offsetWidth, }); @@ -233,8 +237,10 @@ class MediaGallery extends React.PureComponent { } render () { - const { media, intl, sensitive, height } = this.props; - const { width, visible } = this.state; + const { media, intl, sensitive, height, defaultWidth } = this.props; + const { visible } = this.state; + + const width = this.state.width || defaultWidth; let children; diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js index fec06e2637..0376cf85ac 100644 --- a/app/javascript/mastodon/components/scrollable_list.js +++ b/app/javascript/mastodon/components/scrollable_list.js @@ -40,6 +40,7 @@ export default class ScrollableList extends PureComponent { state = { fullscreen: null, + cachedMediaWidth: 250, // Default media/card width using default Mastodon theme }; intersectionObserverWrapper = new IntersectionObserverWrapper(); @@ -130,6 +131,20 @@ export default class ScrollableList extends PureComponent { this.handleScroll(); } + getScrollPosition = () => { + if (this.node && (this.node.scrollTop > 0 || this.mouseMovedRecently)) { + return { height: this.node.scrollHeight, top: this.node.scrollTop }; + } else { + return null; + } + } + + updateScrollBottom = (snapshot) => { + const newScrollTop = this.node.scrollHeight - snapshot; + + this.setScrollTop(newScrollTop); + } + getSnapshotBeforeUpdate (prevProps) { const someItemInserted = React.Children.count(prevProps.children) > 0 && React.Children.count(prevProps.children) < React.Children.count(this.props.children) && @@ -150,6 +165,12 @@ export default class ScrollableList extends PureComponent { } } + cacheMediaWidth = (width) => { + if (width && this.state.cachedMediaWidth !== width) { + this.setState({ cachedMediaWidth: width }); + } + } + componentWillUnmount () { this.clearMouseIdleTimer(); this.detachScrollListener(); @@ -239,7 +260,12 @@ export default class ScrollableList extends PureComponent { intersectionObserverWrapper={this.intersectionObserverWrapper} saveHeightKey={trackScroll ? `${this.context.router.route.location.key}:${scrollKey}` : null} > - {child} + {React.cloneElement(child, { + getScrollPosition: this.getScrollPosition, + updateScrollBottom: this.updateScrollBottom, + cachedMediaWidth: this.state.cachedMediaWidth, + cacheMediaWidth: this.cacheMediaWidth, + })} </IntersectionObserverArticleContainer> ))} diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 2be6c4b36c..386404b574 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -69,6 +69,10 @@ class Status extends ImmutablePureComponent { onMoveUp: PropTypes.func, onMoveDown: PropTypes.func, showThread: PropTypes.bool, + getScrollPosition: PropTypes.func, + updateScrollBottom: PropTypes.func, + cacheMediaWidth: PropTypes.func, + cachedMediaWidth: PropTypes.number, }; // Avoid checking props that are functions (and whose equality will always @@ -80,6 +84,43 @@ class Status extends ImmutablePureComponent { 'hidden', ]; + // Track height changes we know about to compensate scrolling + componentDidMount () { + this.didShowCard = !this.props.muted && !this.props.hidden && this.props.status.get('card'); + } + + getSnapshotBeforeUpdate () { + if (this.props.getScrollPosition) { + return this.props.getScrollPosition(); + } else { + return null; + } + } + + // Compensate height changes + componentDidUpdate (prevProps, prevState, snapshot) { + const doShowCard = !this.props.muted && !this.props.hidden && this.props.status.get('card'); + if (doShowCard && !this.didShowCard) { + this.didShowCard = true; + if (snapshot !== null && this.props.updateScrollBottom) { + if (this.node && this.node.offsetTop < snapshot.top) { + this.props.updateScrollBottom(snapshot.height - snapshot.top); + } + } + } + } + + componentWillUnmount() { + if (this.node && this.props.getScrollPosition) { + const position = this.props.getScrollPosition(); + if (position !== null && this.node.offsetTop < position.top) { + requestAnimationFrame(() => { + this.props.updateScrollBottom(position.height - position.top); + }); + } + } + } + handleClick = () => { if (this.props.onClick) { this.props.onClick(); @@ -166,6 +207,10 @@ class Status extends ImmutablePureComponent { } } + handleRef = c => { + this.node = c; + } + render () { let media = null; let statusAvatar, prepend, rebloggedByText; @@ -180,7 +225,7 @@ class Status extends ImmutablePureComponent { if (hidden) { return ( - <div> + <div ref={this.handleRef}> {status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])} {status.get('content')} </div> @@ -195,7 +240,7 @@ class Status extends ImmutablePureComponent { return ( <HotKeys handlers={minHandlers}> - <div className='status__wrapper status__wrapper--filtered focusable' tabIndex='0'> + <div className='status__wrapper status__wrapper--filtered focusable' tabIndex='0' ref={this.handleRef}> <FormattedMessage id='status.filtered' defaultMessage='Filtered' /> </div> </HotKeys> @@ -243,11 +288,12 @@ class Status extends ImmutablePureComponent { preview={video.get('preview_url')} src={video.get('url')} alt={video.get('description')} - width={239} + width={this.props.cachedMediaWidth} height={110} inline sensitive={status.get('sensitive')} onOpenVideo={this.handleOpenVideo} + cacheWidth={this.props.cacheMediaWidth} /> )} </Bundle> @@ -255,7 +301,16 @@ class Status extends ImmutablePureComponent { } else { media = ( <Bundle fetchComponent={MediaGallery} loading={this.renderLoadingMediaGallery}> - {Component => <Component media={status.get('media_attachments')} sensitive={status.get('sensitive')} height={110} onOpenMedia={this.props.onOpenMedia} />} + {Component => ( + <Component + media={status.get('media_attachments')} + sensitive={status.get('sensitive')} + height={110} + onOpenMedia={this.props.onOpenMedia} + cacheWidth={this.props.cacheMediaWidth} + defaultWidth={this.props.cachedMediaWidth} + /> + )} </Bundle> ); } @@ -265,6 +320,8 @@ class Status extends ImmutablePureComponent { onOpenMedia={this.props.onOpenMedia} card={status.get('card')} compact + cacheWidth={this.props.cacheMediaWidth} + defaultWidth={this.props.cachedMediaWidth} /> ); } @@ -291,7 +348,7 @@ class Status extends ImmutablePureComponent { return ( <HotKeys handlers={handlers}> - <div className={classNames('status__wrapper', `status__wrapper-${status.get('visibility')}`, { 'status__wrapper-reply': !!status.get('in_reply_to_id'), read: unread === false, focusable: !this.props.muted })} tabIndex={this.props.muted ? null : 0} data-featured={featured ? 'true' : null} aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))}> + <div className={classNames('status__wrapper', `status__wrapper-${status.get('visibility')}`, { 'status__wrapper-reply': !!status.get('in_reply_to_id'), read: unread === false, focusable: !this.props.muted })} tabIndex={this.props.muted ? null : 0} data-featured={featured ? 'true' : null} aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))} ref={this.handleRef}> {prepend} <div className={classNames('status', `status-${status.get('visibility')}`, { 'status-reply': !!status.get('in_reply_to_id'), muted: this.props.muted, read: unread === false })} data-id={status.get('id')}> diff --git a/app/javascript/mastodon/features/notifications/components/notification.js b/app/javascript/mastodon/features/notifications/components/notification.js index 0bd8d47c39..9669b6e7de 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.js +++ b/app/javascript/mastodon/features/notifications/components/notification.js @@ -35,6 +35,10 @@ class Notification extends ImmutablePureComponent { onToggleHidden: PropTypes.func.isRequired, status: PropTypes.option, intl: PropTypes.object.isRequired, + getScrollPosition: PropTypes.func, + updateScrollBottom: PropTypes.func, + cacheMediaWidth: PropTypes.func, + cachedMediaWidth: PropTypes.number, }; handleMoveUp = () => { @@ -129,6 +133,10 @@ class Notification extends ImmutablePureComponent { onMoveDown={this.handleMoveDown} onMoveUp={this.handleMoveUp} contextType='notifications' + getScrollPosition={this.props.getScrollPosition} + updateScrollBottom={this.props.updateScrollBottom} + cachedMediaWidth={this.props.cachedMediaWidth} + cacheMediaWidth={this.props.cacheMediaWidth} /> ); } @@ -149,7 +157,17 @@ class Notification extends ImmutablePureComponent { </span> </div> - <StatusContainer id={notification.get('status')} account={notification.get('account')} muted withDismiss hidden={!!this.props.hidden} /> + <StatusContainer + id={notification.get('status')} + account={notification.get('account')} + muted + withDismiss + hidden={!!this.props.hidden} + getScrollPosition={this.props.getScrollPosition} + updateScrollBottom={this.props.updateScrollBottom} + cachedMediaWidth={this.props.cachedMediaWidth} + cacheMediaWidth={this.props.cacheMediaWidth} + /> </div> </HotKeys> ); @@ -171,7 +189,17 @@ class Notification extends ImmutablePureComponent { </span> </div> - <StatusContainer id={notification.get('status')} account={notification.get('account')} muted withDismiss hidden={this.props.hidden} /> + <StatusContainer + id={notification.get('status')} + account={notification.get('account')} + muted + withDismiss + hidden={this.props.hidden} + getScrollPosition={this.props.getScrollPosition} + updateScrollBottom={this.props.updateScrollBottom} + cachedMediaWidth={this.props.cachedMediaWidth} + cacheMediaWidth={this.props.cacheMediaWidth} + /> </div> </HotKeys> ); diff --git a/app/javascript/mastodon/features/status/components/card.js b/app/javascript/mastodon/features/status/components/card.js index 8237de84d3..0eff544119 100644 --- a/app/javascript/mastodon/features/status/components/card.js +++ b/app/javascript/mastodon/features/status/components/card.js @@ -61,6 +61,8 @@ export default class Card extends React.PureComponent { maxDescription: PropTypes.number, onOpenMedia: PropTypes.func.isRequired, compact: PropTypes.bool, + defaultWidth: PropTypes.number, + cacheWidth: PropTypes.func, }; static defaultProps = { @@ -69,7 +71,7 @@ export default class Card extends React.PureComponent { }; state = { - width: 280, + width: this.props.defaultWidth || 280, embedded: false, }; @@ -112,6 +114,7 @@ export default class Card extends React.PureComponent { setRef = c => { if (c) { + if (this.props.cacheWidth) this.props.cacheWidth(c.offsetWidth); this.setState({ width: c.offsetWidth }); } } diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js index 15a5de4b80..894fe78d9e 100644 --- a/app/javascript/mastodon/features/video/index.js +++ b/app/javascript/mastodon/features/video/index.js @@ -100,6 +100,7 @@ class Video extends React.PureComponent { onCloseVideo: PropTypes.func, detailed: PropTypes.bool, inline: PropTypes.bool, + cacheWidth: PropTypes.func, intl: PropTypes.object.isRequired, }; @@ -109,7 +110,7 @@ class Video extends React.PureComponent { volume: 0.5, paused: true, dragging: false, - containerWidth: false, + containerWidth: this.props.width, fullscreen: false, hovered: false, muted: false, @@ -129,6 +130,7 @@ class Video extends React.PureComponent { this.player = c; if (c) { + if (this.props.cacheWidth) this.props.cacheWidth(this.player.offsetWidth); this.setState({ containerWidth: c.offsetWidth, }); -- GitLab From 0e513ff862faf7fa9e5b89d2ab7d22fd0ab540ff Mon Sep 17 00:00:00 2001 From: Hinaloe <hina@hinaloe.net> Date: Tue, 12 Feb 2019 13:10:31 +0900 Subject: [PATCH 053/192] Don't focus spiler input when disabled spoiler (#10017) --- .../mastodon/features/compose/components/compose_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index 9e7d391665..a990e74981 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -180,7 +180,7 @@ class ComposeForm extends ImmutablePureComponent { <div className={`spoiler-input ${this.props.spoiler ? 'spoiler-input--visible' : ''}`}> <label> <span style={{ display: 'none' }}>{intl.formatMessage(messages.spoiler_placeholder)}</span> - <input placeholder={intl.formatMessage(messages.spoiler_placeholder)} value={this.props.spoiler_text} onChange={this.handleChangeSpoilerText} onKeyDown={this.handleKeyDown} type='text' className='spoiler-input__input' id='cw-spoiler-input' ref={this.setSpoilerText} /> + <input placeholder={intl.formatMessage(messages.spoiler_placeholder)} value={this.props.spoiler_text} onChange={this.handleChangeSpoilerText} onKeyDown={this.handleKeyDown} tabIndex={this.props.spoiler ? 0 : -1} type='text' className='spoiler-input__input' id='cw-spoiler-input' ref={this.setSpoilerText} /> </label> </div> -- GitLab From 99c4b5b75ad8856f6e05e6a838abacc755a7b183 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Tue, 12 Feb 2019 05:10:43 +0100 Subject: [PATCH 054/192] =?UTF-8?q?Move=20sending=20account=20Delete=20to?= =?UTF-8?q?=20anyone=20but=20the=20account's=20followers=20to=20the=20pull?= =?UTF-8?q?=CC=80=20queue=20(#10016)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/suspend_account_service.rb | 10 +++++++++- .../activitypub/low_priority_delivery_worker.rb | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 app/workers/activitypub/low_priority_delivery_worker.rb diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb index 1bc2314de7..fc3bc03a53 100644 --- a/app/services/suspend_account_service.rb +++ b/app/services/suspend_account_service.rb @@ -102,6 +102,10 @@ class SuspendAccountService < BaseService ActivityPub::DeliveryWorker.push_bulk(delivery_inboxes) do |inbox_url| [delete_actor_json, @account.id, inbox_url] end + + ActivityPub::LowPriorityDeliveryWorker.push_bulk(low_priority_delivery_inboxes) do |inbox_url| + [delete_actor_json, @account.id, inbox_url] + end end def delete_actor_json @@ -117,7 +121,11 @@ class SuspendAccountService < BaseService end def delivery_inboxes - Account.inboxes + Relay.enabled.pluck(:inbox_url) + @delivery_inboxes ||= @account.followers.inboxes + Relay.enabled.pluck(:inbox_url) + end + + def low_priority_delivery_inboxes + Account.inboxes - delivery_inboxes end def associations_for_destruction diff --git a/app/workers/activitypub/low_priority_delivery_worker.rb b/app/workers/activitypub/low_priority_delivery_worker.rb new file mode 100644 index 0000000000..a141b8f780 --- /dev/null +++ b/app/workers/activitypub/low_priority_delivery_worker.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class ActivityPub::LowPriorityDeliveryWorker < ActivityPub::DeliveryWorker + sidekiq_options queue: 'pull', retry: 8, dead: false +end -- GitLab From 241661e009a7f3a9a458b5494910f39bec5e88e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Feb 2019 05:11:06 +0100 Subject: [PATCH 055/192] Bump rubocop from 0.63.1 to 0.64.0 (#10006) Bumps [rubocop](https://github.com/rubocop-hq/rubocop) from 0.63.1 to 0.64.0. - [Release notes](https://github.com/rubocop-hq/rubocop/releases) - [Changelog](https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop-hq/rubocop/compare/v0.63.1...v0.64.0) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 53c8b4602f..d924a546ba 100644 --- a/Gemfile +++ b/Gemfile @@ -127,7 +127,7 @@ group :development do gem 'letter_opener', '~> 1.7' gem 'letter_opener_web', '~> 1.3' gem 'memory_profiler' - gem 'rubocop', '~> 0.63', require: false + gem 'rubocop', '~> 0.64', require: false gem 'brakeman', '~> 4.4', require: false gem 'bundler-audit', '~> 0.6', require: false gem 'scss_lint', '~> 0.57', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 0c342064fc..6f8a53d181 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -525,7 +525,7 @@ GEM rspec-core (~> 3.0, >= 3.0.0) sidekiq (>= 2.4.0) rspec-support (3.8.0) - rubocop (0.63.1) + rubocop (0.64.0) jaro_winkler (~> 1.5.1) parallel (~> 1.10) parser (>= 2.5, != 2.5.1.1) @@ -746,7 +746,7 @@ DEPENDENCIES rqrcode (~> 0.10) rspec-rails (~> 3.8) rspec-sidekiq (~> 3.0) - rubocop (~> 0.63) + rubocop (~> 0.64) sanitize (~> 5.0) scss_lint (~> 0.57) sidekiq (~> 5.2) -- GitLab From 4f0322dcae8d68feecff880eabfd7339082647d0 Mon Sep 17 00:00:00 2001 From: Franck Zoccolo <franck@zoccolo.com> Date: Tue, 12 Feb 2019 14:48:04 +0100 Subject: [PATCH 056/192] Add support for IPv6 only MXes in Email validation (#10009) * Add support for IPv6 only MXes * Fixed email validator tests --- app/validators/email_mx_validator.rb | 1 + spec/validators/email_mx_validator_spec.rb | 38 ++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/app/validators/email_mx_validator.rb b/app/validators/email_mx_validator.rb index 5b4c684b2c..96fbedcfcf 100644 --- a/app/validators/email_mx_validator.rb +++ b/app/validators/email_mx_validator.rb @@ -24,6 +24,7 @@ class EmailMxValidator < ActiveModel::Validator ([domain] + hostnames).uniq.each do |hostname| ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::A).to_a.map { |e| e.address.to_s }) + ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::AAAA).to_a.map { |e| e.address.to_s }) end end diff --git a/spec/validators/email_mx_validator_spec.rb b/spec/validators/email_mx_validator_spec.rb index bc68f63cfb..48e17a4f10 100644 --- a/spec/validators/email_mx_validator_spec.rb +++ b/spec/validators/email_mx_validator_spec.rb @@ -11,6 +11,7 @@ describe EmailMxValidator do allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) allow(resolver).to receive(:timeouts=).and_return(nil) allow(Resolv::DNS).to receive(:open).and_yield(resolver) @@ -23,7 +24,9 @@ describe EmailMxValidator do allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) allow(resolver).to receive(:timeouts=).and_return(nil) allow(Resolv::DNS).to receive(:open).and_yield(resolver) @@ -37,6 +40,21 @@ describe EmailMxValidator do allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '1.2.3.4')]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) + allow(resolver).to receive(:timeouts=).and_return(nil) + allow(Resolv::DNS).to receive(:open).and_yield(resolver) + + subject.validate(user) + expect(user.errors).to have_received(:add) + end + + it 'adds an error if the AAAA record is blacklisted' do + EmailDomainBlock.create!(domain: 'fd00::1') + resolver = double + + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::1')]) allow(resolver).to receive(:timeouts=).and_return(nil) allow(Resolv::DNS).to receive(:open).and_yield(resolver) @@ -50,7 +68,25 @@ describe EmailMxValidator do allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '2.3.4.5')]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) + allow(resolver).to receive(:timeouts=).and_return(nil) + allow(Resolv::DNS).to receive(:open).and_yield(resolver) + + subject.validate(user) + expect(user.errors).to have_received(:add) + end + + it 'adds an error if the MX IPv6 record is blacklisted' do + EmailDomainBlock.create!(domain: 'fd00::2') + resolver = double + + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::2')]) allow(resolver).to receive(:timeouts=).and_return(nil) allow(Resolv::DNS).to receive(:open).and_yield(resolver) @@ -64,7 +100,9 @@ describe EmailMxValidator do allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '2.3.4.5')]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::2')]) allow(resolver).to receive(:timeouts=).and_return(nil) allow(Resolv::DNS).to receive(:open).and_yield(resolver) -- GitLab From 2f80a348c9de3de6dbf220f9e12d5906042b3f73 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Feb 2019 15:17:26 +0100 Subject: [PATCH 057/192] Bump active_model_serializers from 0.10.8 to 0.10.9 (#10018) Bumps [active_model_serializers](https://github.com/rails-api/active_model_serializers) from 0.10.8 to 0.10.9. - [Release notes](https://github.com/rails-api/active_model_serializers/releases) - [Changelog](https://github.com/rails-api/active_model_serializers/blob/v0.10.9/CHANGELOG.md) - [Commits](https://github.com/rails-api/active_model_serializers/compare/v0.10.8...v0.10.9) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6f8a53d181..c47f4e9307 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -38,7 +38,7 @@ GEM erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - active_model_serializers (0.10.8) + active_model_serializers (0.10.9) actionpack (>= 4.1, < 6) activemodel (>= 4.1, < 6) case_transform (>= 0.2) -- GitLab From e230b176fbb8ba9c29e8ed31131bac870b72c3e9 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Tue, 12 Feb 2019 21:16:02 +0100 Subject: [PATCH 058/192] [Glitch] Don't focus spoiler input when disabled spoiler Inspired by 0e513ff862faf7fa9e5b89d2ab7d22fd0ab540ff --- .../flavours/glitch/features/composer/spoiler/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/flavours/glitch/features/composer/spoiler/index.js b/app/javascript/flavours/glitch/features/composer/spoiler/index.js index 1c3c962f09..e2f9c70216 100644 --- a/app/javascript/flavours/glitch/features/composer/spoiler/index.js +++ b/app/javascript/flavours/glitch/features/composer/spoiler/index.js @@ -87,6 +87,7 @@ export default class ComposerSpoiler extends React.PureComponent { type='text' value={text} ref={handleRefSpoilerText} + disabled={hidden} /> </label> </div> -- GitLab From 67215692fc1764cb4311e4bbd1211d0cf38438bd Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Tue, 12 Feb 2019 22:24:14 +0100 Subject: [PATCH 059/192] Save IP address used for sign-up, not only sign-in (#10026) Fixes #9995 --- app/controllers/auth/registrations_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index f2a832542f..ad7b1859f6 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -28,6 +28,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController resource.invite_code = params[:invite_code] if resource.invite_code.blank? resource.agreement = true + resource.current_sign_in_ip = request.remote_ip if resource.current_sign_in_ip.nil? resource.build_account if resource.account.nil? end -- GitLab From fbe527ccfc85f9547fd807b3d1e2a7fcf3fc81ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Feb 2019 02:45:01 +0100 Subject: [PATCH 060/192] Bump sidekiq-unique-jobs from 6.0.8 to 6.0.9 (#10019) Bumps [sidekiq-unique-jobs](https://github.com/mhenrixon/sidekiq-unique-jobs) from 6.0.8 to 6.0.9. - [Release notes](https://github.com/mhenrixon/sidekiq-unique-jobs/releases) - [Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/blob/master/CHANGELOG.md) - [Commits](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v6.0.8...v6.0.9) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index c47f4e9307..9d4252f163 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -563,7 +563,7 @@ GEM rufus-scheduler (~> 3.2) sidekiq (>= 3) tilt (>= 1.4.0) - sidekiq-unique-jobs (6.0.8) + sidekiq-unique-jobs (6.0.9) concurrent-ruby (~> 1.0, >= 1.0.5) sidekiq (>= 4.0, < 6.0) thor (~> 0) -- GitLab From 3a2e44b62c408f2665f4faf6245f6a41e3a2c541 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Feb 2019 02:54:27 +0100 Subject: [PATCH 061/192] Bump pkg-config from 1.3.2 to 1.3.3 (#10023) Bumps [pkg-config](https://github.com/ruby-gnome2/pkg-config) from 1.3.2 to 1.3.3. - [Release notes](https://github.com/ruby-gnome2/pkg-config/releases) - [Changelog](https://github.com/ruby-gnome2/pkg-config/blob/master/NEWS) - [Commits](https://github.com/ruby-gnome2/pkg-config/compare/1.3.2...1.3.3) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9d4252f163..30c7d31d95 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -400,7 +400,7 @@ GEM pg (1.1.4) pghero (2.2.0) activerecord - pkg-config (1.3.2) + pkg-config (1.3.3) powerpack (0.1.2) premailer (1.11.1) addressable -- GitLab From 5977e6af322fd597c7e9a28d4686870a7e0ed539 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Feb 2019 02:54:48 +0100 Subject: [PATCH 062/192] Bump faker from 1.9.1 to 1.9.2 (#10020) Bumps [faker](https://github.com/stympy/faker) from 1.9.1 to 1.9.2. - [Release notes](https://github.com/stympy/faker/releases) - [Changelog](https://github.com/stympy/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/stympy/faker/compare/v1.9.1...v1.9.2) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 30c7d31d95..d60eb1c141 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -205,7 +205,7 @@ GEM tzinfo excon (0.62.0) fabrication (2.20.1) - faker (1.9.1) + faker (1.9.2) i18n (>= 0.7) faraday (0.15.0) multipart-post (>= 1.2, < 3) -- GitLab From 3d374ed18be3efc78e48ccd512f7e44f38d2bc7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Feb 2019 02:55:06 +0100 Subject: [PATCH 063/192] Bump bootsnap from 1.3.2 to 1.4.0 (#10022) Bumps [bootsnap](https://github.com/Shopify/bootsnap) from 1.3.2 to 1.4.0. - [Release notes](https://github.com/Shopify/bootsnap/releases) - [Changelog](https://github.com/Shopify/bootsnap/blob/master/CHANGELOG.md) - [Commits](https://github.com/Shopify/bootsnap/compare/v1.3.2...v1.4.0) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index d924a546ba..e01d168b63 100644 --- a/Gemfile +++ b/Gemfile @@ -24,7 +24,7 @@ gem 'streamio-ffmpeg', '~> 3.0' gem 'active_model_serializers', '~> 0.10' gem 'addressable', '~> 2.6' -gem 'bootsnap', '~> 1.3', require: false +gem 'bootsnap', '~> 1.4', require: false gem 'browser' gem 'charlock_holmes', '~> 0.7.6' gem 'iso-639' diff --git a/Gemfile.lock b/Gemfile.lock index d60eb1c141..05622340b7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -98,7 +98,7 @@ GEM rack (>= 0.9.0) binding_of_caller (0.8.0) debug_inspector (>= 0.0.1) - bootsnap (1.3.2) + bootsnap (1.4.0) msgpack (~> 1.0) brakeman (4.4.0) browser (2.5.3) @@ -345,7 +345,7 @@ GEM mini_mime (1.0.1) mini_portile2 (2.4.0) minitest (5.11.3) - msgpack (1.2.4) + msgpack (1.2.6) multi_json (1.13.1) multipart-post (2.0.0) necromancer (0.4.0) @@ -660,7 +660,7 @@ DEPENDENCIES aws-sdk-s3 (~> 1.30) better_errors (~> 2.5) binding_of_caller (~> 0.7) - bootsnap (~> 1.3) + bootsnap (~> 1.4) brakeman (~> 4.4) browser bullet (~> 5.9) -- GitLab From c6e7b97baa37c23a4853619ad3ff706f41a15237 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Wed, 13 Feb 2019 05:30:49 +0100 Subject: [PATCH 064/192] Fix color of static page links in high contrast theme (#10028) --- app/javascript/styles/contrast/diff.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/styles/contrast/diff.scss b/app/javascript/styles/contrast/diff.scss index 7d8993a508..8429103b8a 100644 --- a/app/javascript/styles/contrast/diff.scss +++ b/app/javascript/styles/contrast/diff.scss @@ -13,6 +13,10 @@ } } +.rich-formatting a, +.rich-formatting p a, +.rich-formatting li a, +.landing-page__short-description p a, .status__content a, .reply-indicator__content a { color: lighten($ui-highlight-color, 12%); -- GitLab From 614ea184bb911a5b86804e05350997bafc605580 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Wed, 13 Feb 2019 07:29:57 +0100 Subject: [PATCH 065/192] [Glitch] Add "copy link" item to status action bars Port 3cfadd875cc91b3fb893681ed7c2ef86148b3f85 to glitch-soc --- .../glitch/components/status_action_bar.js | 22 +++++++++++++++++++ .../features/status/components/action_bar.js | 21 ++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js index 16abcab4e2..7fb84bd1e7 100644 --- a/app/javascript/flavours/glitch/components/status_action_bar.js +++ b/app/javascript/flavours/glitch/components/status_action_bar.js @@ -34,6 +34,7 @@ const messages = defineMessages({ embed: { id: 'status.embed', defaultMessage: 'Embed' }, admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' }, admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' }, + copy: { id: 'status.copy', defaultMessage: 'Copy link to status' }, }); const obfuscatedCount = count => { @@ -148,6 +149,25 @@ export default class StatusActionBar extends ImmutablePureComponent { this.props.onMuteConversation(this.props.status); } + handleCopy = () => { + const url = this.props.status.get('url'); + const textarea = document.createElement('textarea'); + + textarea.textContent = url; + textarea.style.position = 'fixed'; + + document.body.appendChild(textarea); + + try { + textarea.select(); + document.execCommand('copy'); + } catch (e) { + + } finally { + document.body.removeChild(textarea); + } + } + render () { const { status, intl, withDismiss, showReplyCount } = this.props; @@ -165,6 +185,7 @@ export default class StatusActionBar extends ImmutablePureComponent { menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen }); if (publicStatus) { + menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy }); menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed }); } @@ -189,6 +210,7 @@ export default class StatusActionBar extends ImmutablePureComponent { menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick }); menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick }); menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport }); + if (isStaff && (accountAdminLink || statusAdminLink)) { menu.push(null); if (accountAdminLink !== undefined) { diff --git a/app/javascript/flavours/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js index be82bca5b4..66cc10d787 100644 --- a/app/javascript/flavours/glitch/features/status/components/action_bar.js +++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js @@ -29,6 +29,7 @@ const messages = defineMessages({ embed: { id: 'status.embed', defaultMessage: 'Embed' }, admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' }, admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' }, + copy: { id: 'status.copy', defaultMessage: 'Copy link to status' }, }); @injectIntl @@ -119,6 +120,25 @@ export default class ActionBar extends React.PureComponent { this.props.onEmbed(this.props.status); } + handleCopy = () => { + const url = this.props.status.get('url'); + const textarea = document.createElement('textarea'); + + textarea.textContent = url; + textarea.style.position = 'fixed'; + + document.body.appendChild(textarea); + + try { + textarea.select(); + document.execCommand('copy'); + } catch (e) { + + } finally { + document.body.removeChild(textarea); + } + } + render () { const { status, intl } = this.props; @@ -128,6 +148,7 @@ export default class ActionBar extends React.PureComponent { let menu = []; if (publicStatus) { + menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy }); menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed }); menu.push(null); } -- GitLab From 98d1a1f117452a5e12d73eaf43a10f36e187402e Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Wed, 13 Feb 2019 18:33:03 +0100 Subject: [PATCH 066/192] Disable box shadows for featured hashtags in light theme (#10034) Fixes #9990 --- app/javascript/styles/mastodon-light/diff.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index 78bc2dbb6d..de03cf1a66 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -352,6 +352,8 @@ .moved-account-widget, .memoriam-widget, .activity-stream, -.nothing-here { +.nothing-here, +.directory__tag > a, +.directory__tag > div { box-shadow: none; } -- GitLab From 169b9d4428d8e54d7bee365fd76be9a6e2a92da5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Wed, 13 Feb 2019 18:34:58 +0100 Subject: [PATCH 067/192] Fix hashtags select styling in default and high contrast themes (#10029) --- .../components/column_settings.js | 55 ++++++----- app/javascript/styles/mastodon/_mixins.scss | 31 ++++++ .../styles/mastodon/components.scss | 95 +++++++++++++------ 3 files changed, 128 insertions(+), 53 deletions(-) diff --git a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js index 9c9f62d821..cdc138c8bf 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js +++ b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js @@ -1,10 +1,15 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import Toggle from 'react-toggle'; import AsyncSelect from 'react-select/lib/Async'; +const messages = defineMessages({ + placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' }, + noOptions: { id: 'hashtag.column_settings.select.no_options_message', defaultMessage: 'No suggestions found' }, +}); + export default @injectIntl class ColumnSettings extends React.PureComponent { @@ -25,6 +30,7 @@ class ColumnSettings extends React.PureComponent { tags (mode) { let tags = this.props.settings.getIn(['tags', mode]) || []; + if (tags.toJSON) { return tags.toJSON(); } else { @@ -32,33 +38,36 @@ class ColumnSettings extends React.PureComponent { } }; - onSelect = (mode) => { - return (value) => { - this.props.onChange(['tags', mode], value); - }; - }; + onSelect = mode => value => this.props.onChange(['tags', mode], value); onToggle = () => { if (this.state.open && this.hasTags()) { this.props.onChange('tags', {}); } + this.setState({ open: !this.state.open }); }; + noOptionsMessage = () => this.props.intl.formatMessage(messages.noOptions); + modeSelect (mode) { return ( - <div className='column-settings__section'> - {this.modeLabel(mode)} + <div className='column-settings__row'> + <span className='column-settings__section'> + {this.modeLabel(mode)} + </span> + <AsyncSelect isMulti autoFocus value={this.tags(mode)} - settings={this.props.settings} - settingPath={['tags', mode]} onChange={this.onSelect(mode)} loadOptions={this.props.onLoad} - classNamePrefix='column-settings__hashtag-select' + className='column-select__container' + classNamePrefix='column-select' name='tags' + placeholder={this.props.intl.formatMessage(messages.placeholder)} + noOptionsMessage={this.noOptionsMessage} /> </div> ); @@ -66,11 +75,15 @@ class ColumnSettings extends React.PureComponent { modeLabel (mode) { switch(mode) { - case 'any': return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />; - case 'all': return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />; - case 'none': return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />; + case 'any': + return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />; + case 'all': + return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />; + case 'none': + return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />; + default: + return ''; } - return ''; }; render () { @@ -78,23 +91,21 @@ class ColumnSettings extends React.PureComponent { <div> <div className='column-settings__row'> <div className='setting-toggle'> - <Toggle - id='hashtag.column_settings.tag_toggle' - onChange={this.onToggle} - checked={this.state.open} - /> + <Toggle id='hashtag.column_settings.tag_toggle' onChange={this.onToggle} checked={this.state.open} /> + <span className='setting-toggle__label'> <FormattedMessage id='hashtag.column_settings.tag_toggle' defaultMessage='Include additional tags in this column' /> </span> </div> </div> - {this.state.open && + + {this.state.open && ( <div className='column-settings__hashtags'> {this.modeSelect('any')} {this.modeSelect('all')} {this.modeSelect('none')} </div> - } + )} </div> ); } diff --git a/app/javascript/styles/mastodon/_mixins.scss b/app/javascript/styles/mastodon/_mixins.scss index d5bafe6b6a..08806599e8 100644 --- a/app/javascript/styles/mastodon/_mixins.scss +++ b/app/javascript/styles/mastodon/_mixins.scss @@ -41,3 +41,34 @@ font-size: 16px; } } + +@mixin search-popout() { + background: $simple-background-color; + border-radius: 4px; + padding: 10px 14px; + padding-bottom: 14px; + margin-top: 10px; + color: $light-text-color; + box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); + + h4 { + text-transform: uppercase; + color: $light-text-color; + font-size: 13px; + font-weight: 500; + margin-bottom: 10px; + } + + li { + padding: 4px 0; + } + + ul { + margin-bottom: 10px; + } + + em { + font-weight: 500; + color: $inverted-text-color; + } +} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 32fd773859..02bbd345a7 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3056,14 +3056,41 @@ a.status-card.compact:hover { display: block; font-weight: 500; margin-bottom: 10px; +} + +.column-settings__hashtags { + .column-settings__row { + margin-bottom: 15px; + } - .column-settings__hashtag-select { + .column-select { &__control { @include search-input(); } + &__placeholder { + color: $dark-text-color; + padding-left: 2px; + font-size: 12px; + } + + &__value-container { + padding-left: 6px; + } + &__multi-value { background: lighten($ui-base-color, 8%); + + &__remove { + cursor: pointer; + + &:hover, + &:active, + &:focus { + background: lighten($ui-base-color, 12%); + color: lighten($darker-text-color, 4%); + } + } } &__multi-value__label, @@ -3071,9 +3098,42 @@ a.status-card.compact:hover { color: $darker-text-color; } - &__indicator-separator, + &__clear-indicator, &__dropdown-indicator { - display: none; + cursor: pointer; + transition: none; + color: $dark-text-color; + + &:hover, + &:active, + &:focus { + color: lighten($dark-text-color, 4%); + } + } + + &__indicator-separator { + background-color: lighten($ui-base-color, 8%); + } + + &__menu { + @include search-popout(); + padding: 0; + background: $ui-secondary-color; + } + + &__menu-list { + padding: 6px; + } + + &__option { + color: $inverted-text-color; + border-radius: 4px; + font-size: 14px; + + &--is-focused, + &--is-selected { + background: darken($ui-secondary-color, 10%); + } } } } @@ -4867,34 +4927,7 @@ a.status-card.compact:hover { } .search-popout { - background: $simple-background-color; - border-radius: 4px; - padding: 10px 14px; - padding-bottom: 14px; - margin-top: 10px; - color: $light-text-color; - box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); - - h4 { - text-transform: uppercase; - color: $light-text-color; - font-size: 13px; - font-weight: 500; - margin-bottom: 10px; - } - - li { - padding: 4px 0; - } - - ul { - margin-bottom: 10px; - } - - em { - font-weight: 500; - color: $inverted-text-color; - } + @include search-popout(); } noscript { -- GitLab From 6a5307a5733e7872e7827f32b27111434e0307c4 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Wed, 13 Feb 2019 18:36:23 +0100 Subject: [PATCH 068/192] Alternative handling of private self-boosts (#9998) * When self-boosting, embed original toot into Announce serialization * Process unknown self-boosts from Announce object if it is more than an URI * Add some self-boost specs * Only serialize private toots in self-Announces --- app/lib/activitypub/activity.rb | 32 +++++++++++ app/lib/activitypub/activity/announce.rb | 4 +- app/lib/activitypub/activity/create.rb | 15 ------ .../activitypub/activity_serializer.rb | 8 ++- .../lib/activitypub/activity/announce_spec.rb | 53 ++++++++++++++++--- 5 files changed, 86 insertions(+), 26 deletions(-) diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 919678618a..7e4e195313 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -4,6 +4,9 @@ class ActivityPub::Activity include JsonLdHelper include Redisable + SUPPORTED_TYPES = %w(Note).freeze + CONVERTED_TYPES = %w(Image Video Article Page).freeze + def initialize(json, account, **options) @json = json @account = account @@ -71,6 +74,18 @@ class ActivityPub::Activity @object_uri ||= value_or_id(@object) end + def unsupported_object_type? + @object.is_a?(String) || !(supported_object_type? || converted_object_type?) + end + + def supported_object_type? + equals_or_includes_any?(@object['type'], SUPPORTED_TYPES) + end + + def converted_object_type? + equals_or_includes_any?(@object['type'], CONVERTED_TYPES) + end + def distribute(status) crawl_links(status) @@ -120,6 +135,23 @@ class ActivityPub::Activity redis.setex("delete_upon_arrival:#{@account.id}:#{uri}", 6.hours.seconds, uri) end + def status_from_object + # If the status is already known, return it + status = status_from_uri(object_uri) + return status unless status.nil? + + # If the boosted toot is embedded and it is a self-boost, handle it like a Create + unless unsupported_object_type? + actor_id = value_or_id(first_of_value(@object['attributedTo'])) || @account.uri + if actor_id == @account.uri + return ActivityPub::Activity.factory({ 'type' => 'Create', 'actor' => actor_id, 'object' => @object }, @account).perform + end + end + + # If the status is not from the actor, try to fetch it + return fetch_remote_original_status if value_or_id(first_of_value(@json['attributedTo'])) == @account.uri + end + def fetch_remote_original_status if object_uri.start_with?('http') return if ActivityPub::TagManager.instance.local_uri?(object_uri) diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb index 34d1b7cbd0..04afeea202 100644 --- a/app/lib/activitypub/activity/announce.rb +++ b/app/lib/activitypub/activity/announce.rb @@ -2,9 +2,7 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity def perform - original_status = status_from_uri(object_uri) - original_status ||= fetch_remote_original_status - + original_status = status_from_object return if original_status.nil? || delete_arrived_first?(@json['id']) || !announceable?(original_status) status = Status.find_by(account: @account, reblog: original_status) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index b49657d4b1..9a3db51dd9 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -1,9 +1,6 @@ # frozen_string_literal: true class ActivityPub::Activity::Create < ActivityPub::Activity - SUPPORTED_TYPES = %w(Note).freeze - CONVERTED_TYPES = %w(Image Video Article Page).freeze - def perform return if unsupported_object_type? || invalid_origin?(@object['id']) return if Tombstone.exists?(uri: @object['id']) @@ -318,22 +315,10 @@ class ActivityPub::Activity::Create < ActivityPub::Activity @object['nameMap'].is_a?(Hash) && !@object['nameMap'].empty? end - def unsupported_object_type? - @object.is_a?(String) || !(supported_object_type? || converted_object_type?) - end - def unsupported_media_type?(mime_type) mime_type.present? && !(MediaAttachment::IMAGE_MIME_TYPES + MediaAttachment::VIDEO_MIME_TYPES).include?(mime_type) end - def supported_object_type? - equals_or_includes_any?(@object['type'], SUPPORTED_TYPES) - end - - def converted_object_type? - equals_or_includes_any?(@object['type'], CONVERTED_TYPES) - end - def skip_download? return @skip_download if defined?(@skip_download) @skip_download ||= DomainBlock.find_by(domain: @account.domain)&.reject_media? diff --git a/app/serializers/activitypub/activity_serializer.rb b/app/serializers/activitypub/activity_serializer.rb index 50c4f6a049..b51e8c5442 100644 --- a/app/serializers/activitypub/activity_serializer.rb +++ b/app/serializers/activitypub/activity_serializer.rb @@ -3,8 +3,8 @@ class ActivityPub::ActivitySerializer < ActiveModel::Serializer attributes :id, :type, :actor, :published, :to, :cc - has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, unless: :announce? - attribute :proper_uri, key: :object, if: :announce? + has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, unless: :owned_announce? + attribute :proper_uri, key: :object, if: :owned_announce? attribute :atom_uri, if: :announce? def id @@ -42,4 +42,8 @@ class ActivityPub::ActivitySerializer < ActiveModel::Serializer def announce? object.reblog? end + + def owned_announce? + announce? && object.account == object.proper.account && object.proper.private_visibility? + end end diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb index 54dd52a604..1725c2843b 100644 --- a/spec/lib/activitypub/activity/announce_spec.rb +++ b/spec/lib/activitypub/activity/announce_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe ActivityPub::Activity::Announce do - let(:sender) { Fabricate(:account) } + let(:sender) { Fabricate(:account, followers_url: 'http://example.com/followers') } let(:recipient) { Fabricate(:account) } let(:status) { Fabricate(:status, account: recipient) } @@ -11,19 +11,60 @@ RSpec.describe ActivityPub::Activity::Announce do id: 'foo', type: 'Announce', actor: ActivityPub::TagManager.instance.uri_for(sender), - object: ActivityPub::TagManager.instance.uri_for(status), + object: object_json, }.with_indifferent_access end - describe '#perform' do - subject { described_class.new(json, sender) } + subject { described_class.new(json, sender) } + + before do + sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender)) + end + describe '#perform' do before do subject.perform end - it 'creates a reblog by sender of status' do - expect(sender.reblogged?(status)).to be true + context 'a known status' do + let(:object_json) do + ActivityPub::TagManager.instance.uri_for(status) + end + + it 'creates a reblog by sender of status' do + expect(sender.reblogged?(status)).to be true + end + end + + context 'self-boost of a previously unknown status with missing attributedTo' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'http://example.com/followers', + } + end + + it 'creates a reblog by sender of status' do + expect(sender.reblogged?(sender.statuses.first)).to be true + end + end + + context 'self-boost of a previously unknown status with correct attributedTo' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + attributedTo: ActivityPub::TagManager.instance.uri_for(sender), + to: 'http://example.com/followers', + } + end + + it 'creates a reblog by sender of status' do + expect(sender.reblogged?(sender.statuses.first)).to be true + end end end end -- GitLab From 114cdc36aad7247ffa886674ae40021516d53420 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Wed, 13 Feb 2019 18:36:40 +0100 Subject: [PATCH 069/192] Fix style regressions on landing page (#10030) --- app/javascript/styles/mastodon/about.scss | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index b6c92a09e7..b078d4d24d 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -49,15 +49,9 @@ $small-breakpoint: 960px; } } + strong, em { - display: inline; - margin: 0; - padding: 0; font-weight: 700; - background: transparent; - font-family: inherit; - font-size: inherit; - line-height: inherit; color: lighten($darker-text-color, 10%); } @@ -796,7 +790,7 @@ $small-breakpoint: 960px; width: 100%; display: flex; flex-direction: row-reverse; - flex-wrap: wrap; + flex-wrap: nowrap; justify-content: space-between; align-items: center; } @@ -846,14 +840,7 @@ $small-breakpoint: 960px; } strong { - display: inline; - margin: 0; - padding: 0; - font-weight: 700; - background: transparent; - font-family: inherit; - font-size: inherit; - line-height: inherit; + font-weight: 500; color: lighten($darker-text-color, 10%); } -- GitLab From 011b476d38663656988ae21ca29689aae01cb7c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Feb 2019 18:37:27 +0100 Subject: [PATCH 070/192] Bump faker from 1.9.2 to 1.9.3 (#10031) Bumps [faker](https://github.com/stympy/faker) from 1.9.2 to 1.9.3. - [Release notes](https://github.com/stympy/faker/releases) - [Changelog](https://github.com/stympy/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/stympy/faker/compare/v1.9.2...v1.9.3) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 05622340b7..ee536f2ab6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -205,7 +205,7 @@ GEM tzinfo excon (0.62.0) fabrication (2.20.1) - faker (1.9.2) + faker (1.9.3) i18n (>= 0.7) faraday (0.15.0) multipart-post (>= 1.2, < 3) -- GitLab From dad339da6d19679f0361bfd49d9bcf3a3517af0c Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Wed, 13 Feb 2019 18:42:47 +0100 Subject: [PATCH 071/192] Filter incoming Create activities by relation to local activity (#10005) Reject those from accounts with no local followers, from relays that are not enabled, which do not address local accounts and are not replies to accounts that do have local followers --- app/lib/activitypub/activity/create.rb | 34 +++++++++++++++++-- .../activitypub/process_collection_service.rb | 1 + app/workers/activitypub/processing_worker.rb | 2 +- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 9a3db51dd9..1b31768d96 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -2,8 +2,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def perform - return if unsupported_object_type? || invalid_origin?(@object['id']) - return if Tombstone.exists?(uri: @object['id']) + return if unsupported_object_type? || invalid_origin?(@object['id']) || Tombstone.exists?(uri: @object['id']) || !related_to_local_activity? RedisLock.acquire(lock_options) do |lock| if lock.acquired? @@ -337,6 +336,37 @@ class ActivityPub::Activity::Create < ActivityPub::Activity !replied_to_status.nil? && replied_to_status.account.local? end + def related_to_local_activity? + fetch? || followed_by_local_accounts? || requested_through_relay? || + responds_to_followed_account? || addresses_local_accounts? + end + + def fetch? + !@options[:delivery] + end + + def followed_by_local_accounts? + @account.passive_relationships.exists? + end + + def requested_through_relay? + @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled? + end + + def responds_to_followed_account? + !replied_to_status.nil? && (replied_to_status.account.local? || replied_to_status.account.passive_relationships.exists?) + end + + def addresses_local_accounts? + return true if @options[:delivered_to_account_id] + + local_usernames = (as_array(@object['to']) + as_array(@object['cc'])).uniq.select { |uri| ActivityPub::TagManager.instance.local_uri?(uri) }.map { |uri| ActivityPub::TagManager.instance.uri_to_local_id(uri, :username) } + + return false if local_usernames.empty? + + Account.local.where(username: local_usernames).exists? + end + def forward_for_reply return unless @json['signature'].present? && reply_to_local? ActivityPub::RawDistributionWorker.perform_async(Oj.dump(@json), replied_to_status.account_id, [@account.preferred_inbox_url]) diff --git a/app/services/activitypub/process_collection_service.rb b/app/services/activitypub/process_collection_service.rb index 5c54aad89f..881df478bf 100644 --- a/app/services/activitypub/process_collection_service.rb +++ b/app/services/activitypub/process_collection_service.rb @@ -44,6 +44,7 @@ class ActivityPub::ProcessCollectionService < BaseService end def verify_account! + @options[:relayed_through_account] = @account @account = ActivityPub::LinkedDataSignature.new(@json).verify_account! rescue JSON::LD::JsonLdError => e Rails.logger.debug "Could not verify LD-Signature for #{value_or_id(@json['actor'])}: #{e.message}" diff --git a/app/workers/activitypub/processing_worker.rb b/app/workers/activitypub/processing_worker.rb index a8a3ebf0f5..a3abe72cf6 100644 --- a/app/workers/activitypub/processing_worker.rb +++ b/app/workers/activitypub/processing_worker.rb @@ -6,6 +6,6 @@ class ActivityPub::ProcessingWorker sidekiq_options backtrace: true def perform(account_id, body, delivered_to_account_id = nil) - ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true, delivered_to_account_id: delivered_to_account_id) + ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true, delivered_to_account_id: delivered_to_account_id, delivery: true) end end -- GitLab From 188f1c7c89d6fc7349302a9680bac9a82515cb90 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Wed, 13 Feb 2019 18:52:02 +0100 Subject: [PATCH 072/192] Add list title editing (#9748) * Add list title editing Port changes made by ash for glitch-soc * Code style fixes --- .../list_editor/components/edit_list_form.js | 70 +++++++++++++++++++ .../mastodon/features/list_editor/index.js | 7 +- .../mastodon/reducers/list_editor.js | 11 ++- .../styles/mastodon/components.scss | 2 +- 4 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 app/javascript/mastodon/features/list_editor/components/edit_list_form.js diff --git a/app/javascript/mastodon/features/list_editor/components/edit_list_form.js b/app/javascript/mastodon/features/list_editor/components/edit_list_form.js new file mode 100644 index 0000000000..3dc59c12e7 --- /dev/null +++ b/app/javascript/mastodon/features/list_editor/components/edit_list_form.js @@ -0,0 +1,70 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import PropTypes from 'prop-types'; +import { changeListEditorTitle, submitListEditor } from '../../../actions/lists'; +import IconButton from '../../../components/icon_button'; +import { defineMessages, injectIntl } from 'react-intl'; + +const messages = defineMessages({ + title: { id: 'lists.edit.submit', defaultMessage: 'Change title' }, +}); + +const mapStateToProps = state => ({ + value: state.getIn(['listEditor', 'title']), + disabled: !state.getIn(['listEditor', 'isChanged']), +}); + +const mapDispatchToProps = dispatch => ({ + onChange: value => dispatch(changeListEditorTitle(value)), + onSubmit: () => dispatch(submitListEditor(false)), +}); + +export default @connect(mapStateToProps, mapDispatchToProps) +@injectIntl +class ListForm extends React.PureComponent { + + static propTypes = { + value: PropTypes.string.isRequired, + disabled: PropTypes.bool, + intl: PropTypes.object.isRequired, + onChange: PropTypes.func.isRequired, + onSubmit: PropTypes.func.isRequired, + }; + + handleChange = e => { + this.props.onChange(e.target.value); + } + + handleSubmit = e => { + e.preventDefault(); + this.props.onSubmit(); + } + + handleClick = () => { + this.props.onSubmit(); + } + + render () { + const { value, disabled, intl } = this.props; + + const title = intl.formatMessage(messages.title); + + return ( + <form className='column-inline-form' onSubmit={this.handleSubmit}> + <input + className='setting-text' + value={value} + onChange={this.handleChange} + /> + + <IconButton + disabled={disabled} + icon='check' + title={title} + onClick={this.handleClick} + /> + </form> + ); + } + +} diff --git a/app/javascript/mastodon/features/list_editor/index.js b/app/javascript/mastodon/features/list_editor/index.js index aab0cdd0c0..48466604a7 100644 --- a/app/javascript/mastodon/features/list_editor/index.js +++ b/app/javascript/mastodon/features/list_editor/index.js @@ -7,11 +7,11 @@ import { injectIntl } from 'react-intl'; import { setupListEditor, clearListSuggestions, resetListEditor } from '../../actions/lists'; import Account from './components/account'; import Search from './components/search'; +import EditListForm from './components/edit_list_form'; import Motion from '../ui/util/optional_motion'; import spring from 'react-motion/lib/spring'; const mapStateToProps = state => ({ - title: state.getIn(['listEditor', 'title']), accountIds: state.getIn(['listEditor', 'accounts', 'items']), searchAccountIds: state.getIn(['listEditor', 'suggestions', 'items']), }); @@ -33,7 +33,6 @@ class ListEditor extends ImmutablePureComponent { onInitialize: PropTypes.func.isRequired, onClear: PropTypes.func.isRequired, onReset: PropTypes.func.isRequired, - title: PropTypes.string.isRequired, accountIds: ImmutablePropTypes.list.isRequired, searchAccountIds: ImmutablePropTypes.list.isRequired, }; @@ -49,12 +48,12 @@ class ListEditor extends ImmutablePureComponent { } render () { - const { title, accountIds, searchAccountIds, onClear } = this.props; + const { accountIds, searchAccountIds, onClear } = this.props; const showSearch = searchAccountIds.size > 0; return ( <div className='modal-root__modal list-editor'> - <h4>{title}</h4> + <EditListForm /> <Search /> diff --git a/app/javascript/mastodon/reducers/list_editor.js b/app/javascript/mastodon/reducers/list_editor.js index 02a0dabb14..91e524dd55 100644 --- a/app/javascript/mastodon/reducers/list_editor.js +++ b/app/javascript/mastodon/reducers/list_editor.js @@ -22,6 +22,7 @@ import { const initialState = ImmutableMap({ listId: null, isSubmitting: false, + isChanged: false, title: '', accounts: ImmutableMap({ @@ -47,10 +48,16 @@ export default function listEditorReducer(state = initialState, action) { map.set('isSubmitting', false); }); case LIST_EDITOR_TITLE_CHANGE: - return state.set('title', action.value); + return state.withMutations(map => { + map.set('title', action.value); + map.set('isChanged', true); + }); case LIST_CREATE_REQUEST: case LIST_UPDATE_REQUEST: - return state.set('isSubmitting', true); + return state.withMutations(map => { + map.set('isSubmitting', true); + map.set('isChanged', false); + }); case LIST_CREATE_FAIL: case LIST_UPDATE_FAIL: return state.set('isSubmitting', false); diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 02bbd345a7..8533e4eb5b 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -5163,7 +5163,7 @@ noscript { .icon-button { flex: 0 0 auto; - margin-left: 5px; + margin: 0 5px; } } -- GitLab From 658b4621a622364d8daf699a7e46c65f3f63486b Mon Sep 17 00:00:00 2001 From: Nolan Lawson <nolan@nolanlawson.com> Date: Wed, 13 Feb 2019 09:52:36 -0800 Subject: [PATCH 073/192] perf: run node directly when streaming (#10032) --- dist/mastodon-streaming.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/mastodon-streaming.service b/dist/mastodon-streaming.service index 5d7c129dfb..c324fccf46 100644 --- a/dist/mastodon-streaming.service +++ b/dist/mastodon-streaming.service @@ -9,7 +9,7 @@ WorkingDirectory=/home/mastodon/live Environment="NODE_ENV=production" Environment="PORT=4000" Environment="STREAMING_CLUSTER_NUM=1" -ExecStart=/usr/bin/npm run start +ExecStart=/usr/bin/node ./streaming TimeoutSec=15 Restart=always -- GitLab From 7750416597e4d172b1d4751215aac2a50cf528e3 Mon Sep 17 00:00:00 2001 From: Aditoo17 <42938951+Aditoo17@users.noreply.github.com> Date: Wed, 13 Feb 2019 17:53:01 +0000 Subject: [PATCH 074/192] I18n: Update Czech pluralization and fix some language names (#10015) * I18n: Update Czech pluralization * I18n: Fix some language names * I18n: Fix some language names --- app/helpers/settings_helper.rb | 12 ++++++------ config/locales/cs.yml | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 7a3ceca786..e868b45c01 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -4,7 +4,7 @@ module SettingsHelper HUMAN_LOCALES = { en: 'English', ar: 'العربية', - ast: 'l\'asturianu', + ast: 'Asturianu', bg: 'БългарÑки', ca: 'Català ', co: 'Corsu', @@ -30,16 +30,16 @@ module SettingsHelper ja: '日本語', ka: 'ქáƒáƒ თული', ko: 'í•œêµì–´', - lv: 'LatvieÅ¡u valoda', + lv: 'LatvieÅ¡u', ml: 'മലയാളം', - ms: 'بهاس ملايو', + ms: 'Bahasa Melayu', nl: 'Nederlands', no: 'Norsk', oc: 'Occitan', - pl: 'Polszczyzna', + pl: 'Polski', pt: 'Português', 'pt-BR': 'Português do Brasil', - ro: 'Limba română', + ro: 'Română', ru: 'РуÑÑкий', sk: 'SlovenÄina', sl: 'SlovenÅ¡Äina', @@ -49,7 +49,7 @@ module SettingsHelper sv: 'Svenska', ta: 'தமிழà¯', te: 'తెలà±à°—à±', - th: 'ภาษาไทย', + th: 'ไทย', tr: 'Türkçe', uk: 'УкраїнÑька', zh: 'ä¸æ–‡', diff --git a/config/locales/cs.yml b/config/locales/cs.yml index d1f11261cc..c75d0b643c 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -46,7 +46,7 @@ cs: choices_html: 'Volby uživatele %{name}:' follow: Sledovat followers: - few: Sledovatelé + few: SledujÃcà one: SledujÃcà other: SledujÃcÃch following: Sledovaných @@ -618,7 +618,7 @@ cs: lock_link: ZamknÄ›te svůj úÄet purge: Odstranit ze sledujÃcÃch success: - few: V průbÄ›hu blokovánà sledovatelů ze %{count} domén... + few: V průbÄ›hu blokovánà sledujÃcÃch ze %{count} domén... one: V průbÄ›hu blokovánà sledujÃcÃch z jedné domény... other: V průbÄ›hu blokovánà sledujÃcÃch 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>. @@ -688,7 +688,7 @@ cs: 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: - few: NavÃc jste zÃskal/a %{count} nové sledovatele, zatÃmco jste byl/a pryÄ! SkvÄ›lé! + few: NavÃc jste zÃskal/a %{count} nové sledujÃcÃ, zatÃmco jste byl/a pryÄ! SkvÄ›lé! one: NavÃc jste zÃskal/a jednoho nového sledujÃcÃho, zatÃmco jste byl/a pryÄ! Hurá! other: NavÃc jste zÃskal/a %{count} nových sledujÃcÃch, zatÃmco jste byl/a pryÄ! Úžasné! subject: -- GitLab From 80161f43510ad9316c60c9b50dd5c09c2dae4d54 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Wed, 13 Feb 2019 21:28:18 +0100 Subject: [PATCH 075/192] Change robots.txt to exclude some URLs (#10037) - Exclude static assets - Exclude uploaded files - Exclude alternate versions of the profile page - Exclude media proxy URLs --- public/robots.txt | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/public/robots.txt b/public/robots.txt index 3c9c7c01f3..36afc85eff 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,5 +1,13 @@ -# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file -# -# To ban all spiders from the entire site uncomment the next two lines: -# User-agent: * -# Disallow: / +User-Agent: * +Disallow: /users/*/followers +Disallow: /users/*/following +Disallow: /@*/media +Disallow: /@*/with_replies +Disallow: /@*/tagged/* +Disallow: /media_proxy/* +Disallow: /emoji/* +Disallow: /packs/* +Disallow: /sounds/* +Disallow: /system/* +Disallow: /avatars/* +Disallow: /headers/* -- GitLab From 309043b158f5a4187b6f603f346ed17ee6ddb190 Mon Sep 17 00:00:00 2001 From: Ben Lubar <ben.lubar+github@gmail.com> Date: Wed, 13 Feb 2019 18:04:43 -0600 Subject: [PATCH 076/192] Improve image description user experience (#10036) * Add image descriptions to searchable post content. * Allow multi-line image descriptions. * Request image descriptions in the same query as posts when creating the search index. (see https://github.com/tootsuite/mastodon/pull/10036#discussion_r256551624) --- app/chewy/statuses_index.rb | 4 ++-- app/javascript/mastodon/features/compose/components/upload.js | 3 +-- app/javascript/styles/mastodon/components.scss | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb index d3104172c4..eafc1818b8 100644 --- a/app/chewy/statuses_index.rb +++ b/app/chewy/statuses_index.rb @@ -31,7 +31,7 @@ class StatusesIndex < Chewy::Index }, } - define_type ::Status.unscoped.without_reblogs do + define_type ::Status.unscoped.without_reblogs.includes(:media_attachments) do crutch :mentions do |collection| data = ::Mention.where(status_id: collection.map(&:id)).pluck(:status_id, :account_id) data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) } @@ -50,7 +50,7 @@ class StatusesIndex < Chewy::Index root date_detection: false do field :account_id, type: 'long' - field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].join("\n\n") } do + field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).join("\n\n") } do field :stemmed, type: 'text', analyzer: 'content' end diff --git a/app/javascript/mastodon/features/compose/components/upload.js b/app/javascript/mastodon/features/compose/components/upload.js index 038d7ee28a..629cbc36ac 100644 --- a/app/javascript/mastodon/features/compose/components/upload.js +++ b/app/javascript/mastodon/features/compose/components/upload.js @@ -108,9 +108,8 @@ class Upload extends ImmutablePureComponent { <label> <span style={{ display: 'none' }}>{intl.formatMessage(messages.description)}</span> - <input + <textarea placeholder={intl.formatMessage(messages.description)} - type='text' value={description} maxLength={420} onFocus={this.handleInputFocus} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 8533e4eb5b..d88557559e 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -476,7 +476,7 @@ opacity: 0; transition: opacity .1s ease; - input { + textarea { background: transparent; color: $secondary-text-color; border: 0; -- GitLab From a5992e58832fdc0199f70ed2fa791a619fcad258 Mon Sep 17 00:00:00 2001 From: nightpool <nightpool@users.noreply.github.com> Date: Wed, 13 Feb 2019 21:11:47 -0500 Subject: [PATCH 077/192] Change robots.txt to exclude only media proxy URLs (#10038) * Revert "Change robots.txt to exclude some URLs (#10037)" This reverts commit 80161f43510ad9316c60c9b50dd5c09c2dae4d54. * Let's block media_proxy /media_proxy/ is a dynamic route used for requesting uncached media, so it's probably bad to let crawlers use it * misleading comment --- public/robots.txt | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/public/robots.txt b/public/robots.txt index 36afc85eff..d93648beee 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,13 +1,4 @@ -User-Agent: * -Disallow: /users/*/followers -Disallow: /users/*/following -Disallow: /@*/media -Disallow: /@*/with_replies -Disallow: /@*/tagged/* -Disallow: /media_proxy/* -Disallow: /emoji/* -Disallow: /packs/* -Disallow: /sounds/* -Disallow: /system/* -Disallow: /avatars/* -Disallow: /headers/* +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file + +User-agent: * +Disallow: /media_proxy/ -- GitLab From 99fa1ce93d02ef4ee8bde9311f4cc56a64fe35f4 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Thu, 14 Feb 2019 06:27:54 +0100 Subject: [PATCH 078/192] Add tight rate-limit for API deletions (#10042) Deletions take a lot of resources to execute and cause a lot of federation traffic, so it makes sense to decrease the number someone can queue up through the API. 30 per 30 minutes --- config/initializers/rack_attack.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb index 35302e37b1..28201cc64c 100644 --- a/config/initializers/rack_attack.rb +++ b/config/initializers/rack_attack.rb @@ -46,14 +46,14 @@ class Rack::Attack end throttle('throttle_authenticated_api', limit: 300, period: 5.minutes) do |req| - req.api_request? && req.authenticated_user_id + req.authenticated_user_id if req.api_request? end throttle('throttle_unauthenticated_api', limit: 7_500, period: 5.minutes) do |req| req.ip if req.api_request? end - throttle('throttle_media', limit: 30, period: 30.minutes) do |req| + throttle('throttle_api_media', limit: 30, period: 30.minutes) do |req| req.authenticated_user_id if req.post? && req.path.start_with?('/api/v1/media') end @@ -61,6 +61,13 @@ class Rack::Attack req.ip if req.post? && req.path == '/api/v1/accounts' end + API_DELETE_REBLOG_REGEX = /\A\/api\/v1\/statuses\/[\d]+\/unreblog/.freeze + API_DELETE_STATUS_REGEX = /\A\/api\/v1\/statuses\/[\d]+/.freeze + + throttle('throttle_api_delete', limit: 30, period: 30.minutes) do |req| + req.authenticated_user_id if (req.post? && req.path =~ API_DELETE_REBLOG_REGEX) || (req.delete? && req.path =~ API_DELETE_STATUS_REGEX) + end + throttle('protected_paths', limit: 25, period: 5.minutes) do |req| req.ip if req.post? && req.path =~ PROTECTED_PATHS_REGEX end -- GitLab From aa832198750f99303b1555f412e5405954863a63 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Thu, 14 Feb 2019 15:46:42 +0100 Subject: [PATCH 079/192] Fix hashtag column not subscribing to stream on mount (#10040) Fix #9895 --- .../mastodon/features/hashtag_timeline/index.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/javascript/mastodon/features/hashtag_timeline/index.js b/app/javascript/mastodon/features/hashtag_timeline/index.js index c2e026d136..0d3c97a648 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/index.js +++ b/app/javascript/mastodon/features/hashtag_timeline/index.js @@ -41,15 +41,19 @@ class HashtagTimeline extends React.PureComponent { title = () => { let title = [this.props.params.id]; + if (this.additionalFor('any')) { - title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.any' values={{ additional: this.additionalFor('any') }} defaultMessage='or {additional}' />); + title.push(' ', <FormattedMessage key='any' id='hashtag.column_header.tag_mode.any' values={{ additional: this.additionalFor('any') }} defaultMessage='or {additional}' />); } + if (this.additionalFor('all')) { - title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.all' values={{ additional: this.additionalFor('all') }} defaultMessage='and {additional}' />); + title.push(' ', <FormattedMessage key='all' id='hashtag.column_header.tag_mode.all' values={{ additional: this.additionalFor('all') }} defaultMessage='and {additional}' />); } + if (this.additionalFor('none')) { - title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.none' values={{ additional: this.additionalFor('none') }} defaultMessage='without {additional}' />); + title.push(' ', <FormattedMessage key='none' id='hashtag.column_header.tag_mode.none' values={{ additional: this.additionalFor('none') }} defaultMessage='without {additional}' />); } + return title; } @@ -77,9 +81,10 @@ class HashtagTimeline extends React.PureComponent { let all = (tags.all || []).map(tag => tag.value); let none = (tags.none || []).map(tag => tag.value); - [id, ...any].map((tag) => { - this.disconnects.push(dispatch(connectHashtagStream(id, tag, (status) => { + [id, ...any].map(tag => { + this.disconnects.push(dispatch(connectHashtagStream(id, tag, status => { let tags = status.tags.map(tag => tag.name); + return all.filter(tag => tags.includes(tag)).length === all.length && none.filter(tag => tags.includes(tag)).length === 0; }))); @@ -95,12 +100,14 @@ class HashtagTimeline extends React.PureComponent { const { dispatch } = this.props; const { id, tags } = this.props.params; + this._subscribe(dispatch, id, tags); dispatch(expandHashtagTimeline(id, { tags })); } componentWillReceiveProps (nextProps) { const { dispatch, params } = this.props; const { id, tags } = nextProps.params; + if (id !== params.id || !isEqual(tags, params.tags)) { this._unsubscribe(); this._subscribe(dispatch, id, tags); -- GitLab From f9a338b473e181dd725f9185d09394624088efac Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Fri, 15 Feb 2019 01:03:01 +0900 Subject: [PATCH 080/192] Fix breaks when opening a reply tree in WebUI (#10046) fix #10045 --- app/javascript/mastodon/components/status.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 386404b574..3e98d374b8 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -86,7 +86,7 @@ class Status extends ImmutablePureComponent { // Track height changes we know about to compensate scrolling componentDidMount () { - this.didShowCard = !this.props.muted && !this.props.hidden && this.props.status.get('card'); + this.didShowCard = !this.props.muted && !this.props.hidden && this.props.status && this.props.status.get('card'); } getSnapshotBeforeUpdate () { @@ -99,7 +99,7 @@ class Status extends ImmutablePureComponent { // Compensate height changes componentDidUpdate (prevProps, prevState, snapshot) { - const doShowCard = !this.props.muted && !this.props.hidden && this.props.status.get('card'); + const doShowCard = !this.props.muted && !this.props.hidden && this.props.status && this.props.status.get('card'); if (doShowCard && !this.didShowCard) { this.didShowCard = true; if (snapshot !== null && this.props.updateScrollBottom) { -- GitLab From 57c2fc8454b84de3b9be49e5f614c9d0df48cbdc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Feb 2019 15:38:29 +0100 Subject: [PATCH 081/192] Bump better_errors from 2.5.0 to 2.5.1 (#10050) Bumps [better_errors](https://github.com/BetterErrors/better_errors) from 2.5.0 to 2.5.1. - [Release notes](https://github.com/BetterErrors/better_errors/releases) - [Changelog](https://github.com/BetterErrors/better_errors/blob/master/CHANGELOG.md) - [Commits](https://github.com/BetterErrors/better_errors/compare/v2.5.0...v2.5.1) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index ee536f2ab6..1e4f085a9a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -92,7 +92,7 @@ GEM aws-sigv4 (1.0.3) bcrypt (3.1.12) benchmark-ips (2.7.2) - better_errors (2.5.0) + better_errors (2.5.1) coderay (>= 1.0.0) erubi (>= 1.0.0) rack (>= 0.9.0) -- GitLab From b01f26ffbd7cf1ca42a6a16798c1f10e56a8e82e Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Fri, 15 Feb 2019 16:08:48 +0100 Subject: [PATCH 082/192] Change conversations to always show names of other participants (#10047) Fix #9190 --- .../mastodon/components/display_name.js | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/components/display_name.js b/app/javascript/mastodon/components/display_name.js index acddf77c54..32809778ae 100644 --- a/app/javascript/mastodon/components/display_name.js +++ b/app/javascript/mastodon/components/display_name.js @@ -11,26 +11,36 @@ export default class DisplayName extends React.PureComponent { }; render () { - const { account, others, localDomain } = this.props; - const displayNameHtml = { __html: account.get('display_name_html') }; + const { others, localDomain } = this.props; - let suffix; + let displayName, suffix, account; if (others && others.size > 1) { - suffix = `+${others.size}`; + displayName = others.take(2).map(a => <bdi key={a.get('id')}><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: a.get('display_name_html') }} /></bdi>).reduce((prev, cur) => [prev, ', ', cur]); + + if (others.size - 2 > 0) { + suffix = `+${others.size - 2}`; + } } else { + if (others) { + account = others.first(); + } else { + account = this.props.account; + } + let acct = account.get('acct'); if (acct.indexOf('@') === -1 && localDomain) { acct = `${acct}@${localDomain}`; } - suffix = <span className='display-name__account'>@{acct}</span>; + displayName = <bdi><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }} /></bdi>; + suffix = <span className='display-name__account'>@{acct}</span>; } return ( <span className='display-name'> - <bdi><strong className='display-name__html' dangerouslySetInnerHTML={displayNameHtml} /></bdi> {suffix} + {displayName} {suffix} </span> ); } -- GitLab From 8ef50706a11e115e8b4aa31b30de93738bc7e754 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Fri, 15 Feb 2019 16:08:59 +0100 Subject: [PATCH 083/192] Fix relay enabling/disabling not resetting inbox availability status (#10048) Fix #10033 --- app/models/relay.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/relay.rb b/app/models/relay.rb index 7478c110d4..6934a5c628 100644 --- a/app/models/relay.rb +++ b/app/models/relay.rb @@ -29,6 +29,7 @@ class Relay < ApplicationRecord payload = Oj.dump(follow_activity(activity_id)) update!(state: :pending, follow_activity_id: activity_id) + DeliveryFailureTracker.new(inbox_url).track_success! ActivityPub::DeliveryWorker.perform_async(payload, some_local_account.id, inbox_url) end @@ -37,6 +38,7 @@ class Relay < ApplicationRecord payload = Oj.dump(unfollow_activity(activity_id)) update!(state: :idle, follow_activity_id: nil) + DeliveryFailureTracker.new(inbox_url).track_success! ActivityPub::DeliveryWorker.perform_async(payload, some_local_account.id, inbox_url) end -- GitLab From 2769b5446681898e8332cb505f499dac2a6e5717 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Fri, 15 Feb 2019 17:13:32 +0100 Subject: [PATCH 084/192] [Glitch] Fix occasional crash in detailed toot view Port f9a338b473e181dd725f9185d09394624088efac to glitch-soc --- app/javascript/flavours/glitch/components/status.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index 51fee0eec5..349f9c6cc4 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -217,7 +217,7 @@ export default class Status extends ImmutablePureComponent { this.setState({ autoCollapsed: true }); } - this.didShowCard = !this.props.muted && !this.props.hidden && this.props.status.get('card') && this.props.settings.get('inline_preview_cards'); + this.didShowCard = !this.props.muted && !this.props.hidden && this.props.status && this.props.status.get('card') && this.props.settings.get('inline_preview_cards'); } getSnapshotBeforeUpdate (prevProps, prevState) { @@ -230,7 +230,7 @@ export default class Status extends ImmutablePureComponent { // Hack to fix timeline jumps on second rendering when auto-collapsing componentDidUpdate (prevProps, prevState, snapshot) { - const doShowCard = !this.props.muted && !this.props.hidden && this.props.status.get('card') && this.props.settings.get('inline_preview_cards'); + const doShowCard = !this.props.muted && !this.props.hidden && this.props.status && this.props.status.get('card') && this.props.settings.get('inline_preview_cards'); if (this.state.autoCollapsed || (doShowCard && !this.didShowCard)) { if (doShowCard) this.didShowCard = true; if (this.state.autoCollapsed) this.setState({ autoCollapsed: false }); -- GitLab From 4dcb04b888dafd9745829f9e4f5665c84523fe5c Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Wed, 13 Feb 2019 05:30:49 +0100 Subject: [PATCH 085/192] Fix color of static page links in high contrast theme (#10028) --- app/javascript/flavours/glitch/styles/contrast/diff.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/flavours/glitch/styles/contrast/diff.scss b/app/javascript/flavours/glitch/styles/contrast/diff.scss index 7d8993a508..8429103b8a 100644 --- a/app/javascript/flavours/glitch/styles/contrast/diff.scss +++ b/app/javascript/flavours/glitch/styles/contrast/diff.scss @@ -13,6 +13,10 @@ } } +.rich-formatting a, +.rich-formatting p a, +.rich-formatting li a, +.landing-page__short-description p a, .status__content a, .reply-indicator__content a { color: lighten($ui-highlight-color, 12%); -- GitLab From c417e8c198238f80396c0e4e89c2653e4217108a Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Fri, 15 Feb 2019 18:19:45 +0100 Subject: [PATCH 086/192] Filter incoming Announce activities by relation to local activity (#10041) * Filter incoming Announce activities by relation to local activity Reject if announcer is not followed by local accounts, and is not from an enabled relay, and the object is not a local status Follow-up to #10005 * Fix tests --- app/lib/activitypub/activity.rb | 14 ++++++++++++++ app/lib/activitypub/activity/announce.rb | 11 ++++++++++- app/lib/activitypub/activity/create.rb | 12 ------------ spec/lib/activitypub/activity/announce_spec.rb | 1 + 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 7e4e195313..3cf38764a9 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -138,11 +138,13 @@ class ActivityPub::Activity def status_from_object # If the status is already known, return it status = status_from_uri(object_uri) + return status unless status.nil? # If the boosted toot is embedded and it is a self-boost, handle it like a Create unless unsupported_object_type? actor_id = value_or_id(first_of_value(@object['attributedTo'])) || @account.uri + if actor_id == @account.uri return ActivityPub::Activity.factory({ 'type' => 'Create', 'actor' => actor_id, 'object' => @object }, @account).perform end @@ -166,4 +168,16 @@ class ActivityPub::Activity ensure redis.del(key) end + + def fetch? + !@options[:delivery] + end + + def followed_by_local_accounts? + @account.passive_relationships.exists? + end + + def requested_through_relay? + @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled? + end end diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb index 04afeea202..28a1cda024 100644 --- a/app/lib/activitypub/activity/announce.rb +++ b/app/lib/activitypub/activity/announce.rb @@ -3,7 +3,8 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity def perform original_status = status_from_object - return if original_status.nil? || delete_arrived_first?(@json['id']) || !announceable?(original_status) + + return if original_status.nil? || delete_arrived_first?(@json['id']) || !announceable?(original_status) || !related_to_local_activity? status = Status.find_by(account: @account, reblog: original_status) @@ -39,4 +40,12 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity def announceable?(status) status.account_id == @account.id || status.public_visibility? || status.unlisted_visibility? end + + def related_to_local_activity? + followed_by_local_accounts? || requested_through_relay? || reblog_of_local_status? + end + + def reblog_of_local_status? + status_from_uri(object_uri)&.account&.local? + end end diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 1b31768d96..4fc37fb4b5 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -341,18 +341,6 @@ class ActivityPub::Activity::Create < ActivityPub::Activity responds_to_followed_account? || addresses_local_accounts? end - def fetch? - !@options[:delivery] - end - - def followed_by_local_accounts? - @account.passive_relationships.exists? - end - - def requested_through_relay? - @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled? - end - def responds_to_followed_account? !replied_to_status.nil? && (replied_to_status.account.local? || replied_to_status.account.passive_relationships.exists?) end diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb index 1725c2843b..5e6f008ec0 100644 --- a/spec/lib/activitypub/activity/announce_spec.rb +++ b/spec/lib/activitypub/activity/announce_spec.rb @@ -18,6 +18,7 @@ RSpec.describe ActivityPub::Activity::Announce do subject { described_class.new(json, sender) } before do + Fabricate(:account).follow!(sender) sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender)) end -- GitLab From a151c5566a9268930b4b4728121f8f1692019238 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Fri, 15 Feb 2019 18:21:00 +0100 Subject: [PATCH 087/192] [Glitch] Fix hashtags select styling in default and high contrast skins Port 169b9d4428d8e54d7bee365fd76be9a6e2a92da5 to glitch-soc --- .../components/column_settings.js | 55 +++++++++------- .../flavours/glitch/styles/_mixins.scss | 31 +++++++++ .../glitch/styles/components/accounts.scss | 66 ++++++++++++++++++- .../glitch/styles/components/drawer.scss | 24 +------ 4 files changed, 128 insertions(+), 48 deletions(-) diff --git a/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js b/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js index 82936c8380..dc0ffee85f 100644 --- a/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js +++ b/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js @@ -1,10 +1,15 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import Toggle from 'react-toggle'; import AsyncSelect from 'react-select/lib/Async'; +const messages = defineMessages({ + placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' }, + noOptions: { id: 'hashtag.column_settings.select.no_options_message', defaultMessage: 'No suggestions found' }, +}); + @injectIntl export default class ColumnSettings extends React.PureComponent { @@ -25,6 +30,7 @@ export default class ColumnSettings extends React.PureComponent { tags (mode) { let tags = this.props.settings.getIn(['tags', mode]) || []; + if (tags.toJSON) { return tags.toJSON(); } else { @@ -32,33 +38,36 @@ export default class ColumnSettings extends React.PureComponent { } }; - onSelect = (mode) => { - return (value) => { - this.props.onChange(['tags', mode], value); - }; - }; + onSelect = mode => value => this.props.onChange(['tags', mode], value); onToggle = () => { if (this.state.open && this.hasTags()) { this.props.onChange('tags', {}); } + this.setState({ open: !this.state.open }); }; + noOptionsMessage = () => this.props.intl.formatMessage(messages.noOptions); + modeSelect (mode) { return ( - <div className='column-settings__section'> - {this.modeLabel(mode)} + <div className='column-settings__row'> + <span className='column-settings__section'> + {this.modeLabel(mode)} + </span> + <AsyncSelect isMulti autoFocus value={this.tags(mode)} - settings={this.props.settings} - settingPath={['tags', mode]} onChange={this.onSelect(mode)} loadOptions={this.props.onLoad} - classNamePrefix='column-settings__hashtag-select' + className='column-select__container' + classNamePrefix='column-select' name='tags' + placeholder={this.props.intl.formatMessage(messages.placeholder)} + noOptionsMessage={this.noOptionsMessage} /> </div> ); @@ -66,11 +75,15 @@ export default class ColumnSettings extends React.PureComponent { modeLabel (mode) { switch(mode) { - case 'any': return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />; - case 'all': return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />; - case 'none': return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />; + case 'any': + return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />; + case 'all': + return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />; + case 'none': + return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />; + default: + return ''; } - return ''; }; render () { @@ -78,23 +91,21 @@ export default class ColumnSettings extends React.PureComponent { <div> <div className='column-settings__row'> <div className='setting-toggle'> - <Toggle - id='hashtag.column_settings.tag_toggle' - onChange={this.onToggle} - checked={this.state.open} - /> + <Toggle id='hashtag.column_settings.tag_toggle' onChange={this.onToggle} checked={this.state.open} /> + <span className='setting-toggle__label'> <FormattedMessage id='hashtag.column_settings.tag_toggle' defaultMessage='Include additional tags in this column' /> </span> </div> </div> - {this.state.open && + + {this.state.open && ( <div className='column-settings__hashtags'> {this.modeSelect('any')} {this.modeSelect('all')} {this.modeSelect('none')} </div> - } + )} </div> ); } diff --git a/app/javascript/flavours/glitch/styles/_mixins.scss b/app/javascript/flavours/glitch/styles/_mixins.scss index c46d7260de..586802185c 100644 --- a/app/javascript/flavours/glitch/styles/_mixins.scss +++ b/app/javascript/flavours/glitch/styles/_mixins.scss @@ -82,3 +82,34 @@ font-size: 16px; } } + +@mixin search-popout() { + background: $simple-background-color; + border-radius: 4px; + padding: 10px 14px; + padding-bottom: 14px; + margin-top: 10px; + color: $light-text-color; + box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); + + h4 { + text-transform: uppercase; + color: $light-text-color; + font-size: 13px; + font-weight: 500; + margin-bottom: 10px; + } + + li { + padding: 4px 0; + } + + ul { + margin-bottom: 10px; + } + + em { + font-weight: 500; + color: $inverted-text-color; + } +} diff --git a/app/javascript/flavours/glitch/styles/components/accounts.scss b/app/javascript/flavours/glitch/styles/components/accounts.scss index ce6cc8b293..0b7b58bb0d 100644 --- a/app/javascript/flavours/glitch/styles/components/accounts.scss +++ b/app/javascript/flavours/glitch/styles/components/accounts.scss @@ -339,14 +339,41 @@ display: block; font-weight: 500; margin-bottom: 10px; +} + +.column-settings__hashtags { + .column-settings__row { + margin-bottom: 15px; + } - .column-settings__hashtag-select { + .column-select { &__control { @include search-input(); } + &__placeholder { + color: $dark-text-color; + padding-left: 2px; + font-size: 12px; + } + + &__value-container { + padding-left: 6px; + } + &__multi-value { background: lighten($ui-base-color, 8%); + + &__remove { + cursor: pointer; + + &:hover, + &:active, + &:focus { + background: lighten($ui-base-color, 12%); + color: lighten($darker-text-color, 4%); + } + } } &__multi-value__label, @@ -354,9 +381,42 @@ color: $darker-text-color; } - &__indicator-separator, + &__clear-indicator, &__dropdown-indicator { - display: none; + cursor: pointer; + transition: none; + color: $dark-text-color; + + &:hover, + &:active, + &:focus { + color: lighten($dark-text-color, 4%); + } + } + + &__indicator-separator { + background-color: lighten($ui-base-color, 8%); + } + + &__menu { + @include search-popout(); + padding: 0; + background: $ui-secondary-color; + } + + &__menu-list { + padding: 6px; + } + + &__option { + color: $inverted-text-color; + border-radius: 4px; + font-size: 14px; + + &--is-focused, + &--is-selected { + background: darken($ui-secondary-color, 10%); + } } } } diff --git a/app/javascript/flavours/glitch/styles/components/drawer.scss b/app/javascript/flavours/glitch/styles/components/drawer.scss index 2821deec72..f4931c36cc 100644 --- a/app/javascript/flavours/glitch/styles/components/drawer.scss +++ b/app/javascript/flavours/glitch/styles/components/drawer.scss @@ -157,29 +157,7 @@ } .drawer--search--popout { - box-sizing: border-box; - margin-top: 10px; - border-radius: 4px; - padding: 10px 14px 14px 14px; - box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); - color: $light-text-color; - background: $simple-background-color; - - h4 { - margin-bottom: 10px; - color: $light-text-color; - font-size: 13px; - font-weight: 500; - text-transform: uppercase; - } - - ul { margin-bottom: 10px } - li { padding: 4px 0 } - - em { - color: $inverted-text-color; - font-weight: 500; - } + @include search-popout(); } .drawer--account { -- GitLab From 59fa38a4f6b9f19d674b3f9da97253b586814f94 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Wed, 13 Feb 2019 18:36:40 +0100 Subject: [PATCH 088/192] Fix style regressions on landing page (#10030) --- .../flavours/glitch/styles/about.scss | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/app/javascript/flavours/glitch/styles/about.scss b/app/javascript/flavours/glitch/styles/about.scss index 302de020bd..329482458c 100644 --- a/app/javascript/flavours/glitch/styles/about.scss +++ b/app/javascript/flavours/glitch/styles/about.scss @@ -49,15 +49,9 @@ $small-breakpoint: 960px; } } + strong, em { - display: inline; - margin: 0; - padding: 0; font-weight: 700; - background: transparent; - font-family: inherit; - font-size: inherit; - line-height: inherit; color: lighten($darker-text-color, 10%); } @@ -798,7 +792,7 @@ $small-breakpoint: 960px; width: 100%; display: flex; flex-direction: row-reverse; - flex-wrap: wrap; + flex-wrap: nowrap; justify-content: space-between; align-items: center; } @@ -848,14 +842,7 @@ $small-breakpoint: 960px; } strong { - display: inline; - margin: 0; - padding: 0; - font-weight: 700; - background: transparent; - font-family: inherit; - font-size: inherit; - line-height: inherit; + font-weight: 500; color: lighten($darker-text-color, 10%); } -- GitLab From 71e28ba39993d6eb3c5966e20214214c9d81b173 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Fri, 15 Feb 2019 19:43:09 +0100 Subject: [PATCH 089/192] Change buttons on timeline preview to open the interaction dialog (#10054) Fix #9922 --- .../mastodon/components/status_action_bar.js | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index 16c7caf1c1..53d17d4180 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -78,7 +78,11 @@ class StatusActionBar extends ImmutablePureComponent { ] handleReplyClick = () => { - this.props.onReply(this.props.status, this.context.router.history); + if (me) { + this.props.onReply(this.props.status, this.context.router.history); + } else { + this._openInteractionDialog('reply'); + } } handleShareClick = () => { @@ -91,11 +95,23 @@ class StatusActionBar extends ImmutablePureComponent { } handleFavouriteClick = () => { - this.props.onFavourite(this.props.status); + if (me) { + this.props.onFavourite(this.props.status); + } else { + this._openInteractionDialog('favourite'); + } + } + + handleReblogClick = e => { + if (me) { + this.props.onReblog(this.props.status, e); + } else { + this._openInteractionDialog('reblog'); + } } - handleReblogClick = (e) => { - this.props.onReblog(this.props.status, e); + _openInteractionDialog = type => { + window.open(`/interact/${this.props.status.get('id')}?type=${type}`, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes'); } handleDeleteClick = () => { @@ -233,9 +249,9 @@ class StatusActionBar extends ImmutablePureComponent { return ( <div className='status__action-bar'> - <div className='status__action-bar__counter'><IconButton className='status__action-bar-button' disabled={anonymousAccess} title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} /><span className='status__action-bar__counter__label' >{obfuscatedCount(status.get('replies_count'))}</span></div> - <IconButton className='status__action-bar-button' disabled={anonymousAccess || !publicStatus} active={status.get('reblogged')} pressed={status.get('reblogged')} title={!publicStatus ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} /> - <IconButton className='status__action-bar-button star-icon' disabled={anonymousAccess} animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /> + <div className='status__action-bar__counter'><IconButton className='status__action-bar-button' title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} /><span className='status__action-bar__counter__label' >{obfuscatedCount(status.get('replies_count'))}</span></div> + <IconButton className='status__action-bar-button' disabled={!publicStatus} active={status.get('reblogged')} pressed={status.get('reblogged')} title={!publicStatus ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} /> + <IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /> {shareButton} <div className='status__action-bar-dropdown'> -- GitLab From 80388a3ffe654f5aec0dc94ce9976b4e9fe257ae Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Fri, 15 Feb 2019 23:33:25 +0100 Subject: [PATCH 090/192] Change error graphic to hover-to-play (#10055) Fix #6060 --- app/javascript/packs/error.js | 13 +++++++++++++ app/javascript/styles/mastodon/basics.scss | 14 ++++++++------ app/views/layouts/error.html.haml | 7 +++++-- public/oops.png | Bin 0 -> 20552 bytes 4 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 app/javascript/packs/error.js create mode 100644 public/oops.png diff --git a/app/javascript/packs/error.js b/app/javascript/packs/error.js new file mode 100644 index 0000000000..685c890658 --- /dev/null +++ b/app/javascript/packs/error.js @@ -0,0 +1,13 @@ +import ready from '../mastodon/ready'; + +ready(() => { + const image = document.querySelector('img'); + + image.addEventListener('mouseenter', () => { + image.src = '/oops.gif'; + }); + + image.addEventListener('mouseleave', () => { + image.src = '/oops.png'; + }); +}); diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss index 746def6251..4411ca0b4c 100644 --- a/app/javascript/styles/mastodon/basics.scss +++ b/app/javascript/styles/mastodon/basics.scss @@ -100,12 +100,14 @@ body { vertical-align: middle; margin: 20px; - img { - display: block; - max-width: 470px; - width: 100%; - height: auto; - margin-top: -120px; + &__illustration { + img { + display: block; + max-width: 470px; + width: 100%; + height: auto; + margin-top: -120px; + } } h1 { diff --git a/app/views/layouts/error.html.haml b/app/views/layouts/error.html.haml index 37359b89b9..25c85abf9e 100644 --- a/app/views/layouts/error.html.haml +++ b/app/views/layouts/error.html.haml @@ -7,8 +7,11 @@ %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/ = stylesheet_pack_tag 'common', media: 'all' = stylesheet_pack_tag Setting.default_settings['theme'], media: 'all' + = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' + = javascript_pack_tag 'error', integrity: true, crossorigin: 'anonymous' %body.error .dialog - %img{ alt: Setting.default_settings['site_title'], src: '/oops.gif' }/ - %div + .dialog__illustration + %img{ alt: Setting.default_settings['site_title'], src: '/oops.png' }/ + .dialog__message %h1= yield :content diff --git a/public/oops.png b/public/oops.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac779f2551c4997c06851b0b41d0fb4ad24dee0 GIT binary patch literal 20552 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 literal 0 HcmV?d00001 -- GitLab From a006d4afbe0b57cba9c7bcbd656131319c5c2965 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Sat, 16 Feb 2019 05:23:47 +0100 Subject: [PATCH 091/192] Add registrations attribute to instance entity in REST API (#10060) Fix #9350 --- app/serializers/rest/instance_serializer.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index e3e64ea876..216808ffb9 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -5,7 +5,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer attributes :uri, :title, :description, :email, :version, :urls, :stats, :thumbnail, - :languages + :languages, :registrations has_one :contact_account, serializer: REST::AccountSerializer @@ -51,6 +51,10 @@ class REST::InstanceSerializer < ActiveModel::Serializer [I18n.default_locale] end + def registrations + Setting.open_registrations && !Rails.configuration.x.single_user_mode + end + private def instance_presenter -- GitLab From cc84a407f4cf8096b08bcd26b7ab4f61e9a47694 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Sat, 16 Feb 2019 05:27:05 +0100 Subject: [PATCH 092/192] Add vapid_key to the application entity in the REST API (#10058) Fix #8785 --- app/controllers/api/v1/apps/credentials_controller.rb | 2 +- app/serializers/rest/application_serializer.rb | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v1/apps/credentials_controller.rb b/app/controllers/api/v1/apps/credentials_controller.rb index e469c7d210..8b63d0490d 100644 --- a/app/controllers/api/v1/apps/credentials_controller.rb +++ b/app/controllers/api/v1/apps/credentials_controller.rb @@ -6,6 +6,6 @@ class Api::V1::Apps::CredentialsController < Api::BaseController respond_to :json def show - render json: doorkeeper_token.application, serializer: REST::StatusSerializer::ApplicationSerializer + render json: doorkeeper_token.application, serializer: REST::ApplicationSerializer, fields: %i(name website vapid_key) end end diff --git a/app/serializers/rest/application_serializer.rb b/app/serializers/rest/application_serializer.rb index a9316cd4b7..ab68219ade 100644 --- a/app/serializers/rest/application_serializer.rb +++ b/app/serializers/rest/application_serializer.rb @@ -2,7 +2,7 @@ class REST::ApplicationSerializer < ActiveModel::Serializer attributes :id, :name, :website, :redirect_uri, - :client_id, :client_secret + :client_id, :client_secret, :vapid_key def id object.id.to_s @@ -19,4 +19,8 @@ class REST::ApplicationSerializer < ActiveModel::Serializer def website object.website.presence end + + def vapid_key + Rails.configuration.x.vapid_public_key + end end -- GitLab From ea7ad59af20af2aa6817b3b40dca34c8fba3373a Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Sat, 16 Feb 2019 11:56:09 +0100 Subject: [PATCH 093/192] Fix mutes, blocks, domain blocks and follow requests not paginating (#10057) Regression from #9581 --- app/javascript/mastodon/features/blocks/index.js | 5 ++++- app/javascript/mastodon/features/domain_blocks/index.js | 5 ++++- app/javascript/mastodon/features/follow_requests/index.js | 5 ++++- app/javascript/mastodon/features/mutes/index.js | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/javascript/mastodon/features/blocks/index.js b/app/javascript/mastodon/features/blocks/index.js index ca7ce6f8ea..96a219c947 100644 --- a/app/javascript/mastodon/features/blocks/index.js +++ b/app/javascript/mastodon/features/blocks/index.js @@ -18,6 +18,7 @@ const messages = defineMessages({ const mapStateToProps = state => ({ accountIds: state.getIn(['user_lists', 'blocks', 'items']), + hasMore: !!state.getIn(['user_lists', 'blocks', 'next']), }); export default @connect(mapStateToProps) @@ -29,6 +30,7 @@ class Blocks extends ImmutablePureComponent { dispatch: PropTypes.func.isRequired, shouldUpdateScroll: PropTypes.func, accountIds: ImmutablePropTypes.list, + hasMore: PropTypes.bool, intl: PropTypes.object.isRequired, }; @@ -41,7 +43,7 @@ class Blocks extends ImmutablePureComponent { }, 300, { leading: true }); render () { - const { intl, accountIds, shouldUpdateScroll } = this.props; + const { intl, accountIds, shouldUpdateScroll, hasMore } = this.props; if (!accountIds) { return ( @@ -59,6 +61,7 @@ class Blocks extends ImmutablePureComponent { <ScrollableList scrollKey='blocks' onLoadMore={this.handleLoadMore} + hasMore={hasMore} shouldUpdateScroll={shouldUpdateScroll} emptyMessage={emptyMessage} > diff --git a/app/javascript/mastodon/features/domain_blocks/index.js b/app/javascript/mastodon/features/domain_blocks/index.js index 5c1bd11610..7c075f5a5c 100644 --- a/app/javascript/mastodon/features/domain_blocks/index.js +++ b/app/javascript/mastodon/features/domain_blocks/index.js @@ -19,6 +19,7 @@ const messages = defineMessages({ const mapStateToProps = state => ({ domains: state.getIn(['domain_lists', 'blocks', 'items']), + hasMore: !!state.getIn(['domain_lists', 'blocks', 'next']), }); export default @connect(mapStateToProps) @@ -29,6 +30,7 @@ class Blocks extends ImmutablePureComponent { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, shouldUpdateScroll: PropTypes.func, + hasMore: PropTypes.bool, domains: ImmutablePropTypes.orderedSet, intl: PropTypes.object.isRequired, }; @@ -42,7 +44,7 @@ class Blocks extends ImmutablePureComponent { }, 300, { leading: true }); render () { - const { intl, domains, shouldUpdateScroll } = this.props; + const { intl, domains, shouldUpdateScroll, hasMore } = this.props; if (!domains) { return ( @@ -60,6 +62,7 @@ class Blocks extends ImmutablePureComponent { <ScrollableList scrollKey='domain_blocks' onLoadMore={this.handleLoadMore} + hasMore={hasMore} shouldUpdateScroll={shouldUpdateScroll} emptyMessage={emptyMessage} > diff --git a/app/javascript/mastodon/features/follow_requests/index.js b/app/javascript/mastodon/features/follow_requests/index.js index 56ae8764b4..3871e0e5d1 100644 --- a/app/javascript/mastodon/features/follow_requests/index.js +++ b/app/javascript/mastodon/features/follow_requests/index.js @@ -18,6 +18,7 @@ const messages = defineMessages({ const mapStateToProps = state => ({ accountIds: state.getIn(['user_lists', 'follow_requests', 'items']), + hasMore: !!state.getIn(['user_lists', 'follow_requests', 'next']), }); export default @connect(mapStateToProps) @@ -28,6 +29,7 @@ class FollowRequests extends ImmutablePureComponent { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, shouldUpdateScroll: PropTypes.func, + hasMore: PropTypes.bool, accountIds: ImmutablePropTypes.list, intl: PropTypes.object.isRequired, }; @@ -41,7 +43,7 @@ class FollowRequests extends ImmutablePureComponent { }, 300, { leading: true }); render () { - const { intl, shouldUpdateScroll, accountIds } = this.props; + const { intl, shouldUpdateScroll, accountIds, hasMore } = this.props; if (!accountIds) { return ( @@ -59,6 +61,7 @@ class FollowRequests extends ImmutablePureComponent { <ScrollableList scrollKey='follow_requests' onLoadMore={this.handleLoadMore} + hasMore={hasMore} shouldUpdateScroll={shouldUpdateScroll} emptyMessage={emptyMessage} > diff --git a/app/javascript/mastodon/features/mutes/index.js b/app/javascript/mastodon/features/mutes/index.js index f979ef72f9..4ed29a1ce6 100644 --- a/app/javascript/mastodon/features/mutes/index.js +++ b/app/javascript/mastodon/features/mutes/index.js @@ -18,6 +18,7 @@ const messages = defineMessages({ const mapStateToProps = state => ({ accountIds: state.getIn(['user_lists', 'mutes', 'items']), + hasMore: !!state.getIn(['user_lists', 'mutes', 'next']), }); export default @connect(mapStateToProps) @@ -28,6 +29,7 @@ class Mutes extends ImmutablePureComponent { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, shouldUpdateScroll: PropTypes.func, + hasMore: PropTypes.bool, accountIds: ImmutablePropTypes.list, intl: PropTypes.object.isRequired, }; @@ -41,7 +43,7 @@ class Mutes extends ImmutablePureComponent { }, 300, { leading: true }); render () { - const { intl, shouldUpdateScroll, accountIds } = this.props; + const { intl, shouldUpdateScroll, hasMore, accountIds } = this.props; if (!accountIds) { return ( @@ -59,6 +61,7 @@ class Mutes extends ImmutablePureComponent { <ScrollableList scrollKey='mutes' onLoadMore={this.handleLoadMore} + hasMore={hasMore} shouldUpdateScroll={shouldUpdateScroll} emptyMessage={emptyMessage} > -- GitLab From 041ff5fa9a45f7b8d1048a05a35611622b6f5fdb Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Sat, 16 Feb 2019 14:53:27 +0100 Subject: [PATCH 094/192] Fix crash on public hashtag pages when streaming fails (#10061) --- .../mastodon/features/status/components/detailed_status.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js index 734353c9bd..49bc43a7ba 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.js +++ b/app/javascript/mastodon/features/status/components/detailed_status.js @@ -87,7 +87,7 @@ export default class DetailedStatus extends ImmutablePureComponent { } render () { - const status = this.props.status.get('reblog') ? this.props.status.get('reblog') : this.props.status; + const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status; const outerStyle = { boxSizing: 'border-box' }; const { compact } = this.props; -- GitLab From 147b4c2c3afacd6ad9d5c1353c072861eaca5fd2 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Sun, 17 Feb 2019 03:38:25 +0100 Subject: [PATCH 095/192] Add logging for rejected ActivityPub payloads and add tests (#10062) --- app/lib/activitypub/activity.rb | 5 + app/lib/activitypub/activity/announce.rb | 4 +- app/lib/activitypub/activity/create.rb | 2 +- .../lib/activitypub/activity/announce_spec.rb | 117 ++- spec/lib/activitypub/activity/create_spec.rb | 710 ++++++++++-------- 5 files changed, 525 insertions(+), 313 deletions(-) diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 3cf38764a9..8265810a00 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -180,4 +180,9 @@ class ActivityPub::Activity def requested_through_relay? @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled? end + + def reject_payload! + Rails.logger.info("Rejected #{@json['type']} activity #{@json['id']} from #{@account.uri}#{@options[:relayed_through_account] && "via #{@options[:relayed_through_account].uri}"}") + nil + end end diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb index 28a1cda024..9f8ffd9fb7 100644 --- a/app/lib/activitypub/activity/announce.rb +++ b/app/lib/activitypub/activity/announce.rb @@ -2,9 +2,11 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity def perform + return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity? + original_status = status_from_object - return if original_status.nil? || delete_arrived_first?(@json['id']) || !announceable?(original_status) || !related_to_local_activity? + return reject_payload! if original_status.nil? || !announceable?(original_status) status = Status.find_by(account: @account, reblog: original_status) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 4fc37fb4b5..d7bd65c806 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -2,7 +2,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def perform - return if unsupported_object_type? || invalid_origin?(@object['id']) || Tombstone.exists?(uri: @object['id']) || !related_to_local_activity? + return reject_payload! if unsupported_object_type? || invalid_origin?(@object['id']) || Tombstone.exists?(uri: @object['id']) || !related_to_local_activity? RedisLock.acquire(lock_options) do |lock| if lock.acquired? diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb index 5e6f008ec0..94b9d348d0 100644 --- a/spec/lib/activitypub/activity/announce_spec.rb +++ b/spec/lib/activitypub/activity/announce_spec.rb @@ -18,16 +18,63 @@ RSpec.describe ActivityPub::Activity::Announce do subject { described_class.new(json, sender) } before do - Fabricate(:account).follow!(sender) sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender)) end describe '#perform' do - before do - subject.perform + context 'when sender is followed by a local account' do + before do + Fabricate(:account).follow!(sender) + subject.perform + end + + context 'a known status' do + let(:object_json) do + ActivityPub::TagManager.instance.uri_for(status) + end + + it 'creates a reblog by sender of status' do + expect(sender.reblogged?(status)).to be true + end + end + + context 'self-boost of a previously unknown status with missing attributedTo' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'http://example.com/followers', + } + end + + it 'creates a reblog by sender of status' do + expect(sender.reblogged?(sender.statuses.first)).to be true + end + end + + context 'self-boost of a previously unknown status with correct attributedTo' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + attributedTo: ActivityPub::TagManager.instance.uri_for(sender), + to: 'http://example.com/followers', + } + end + + it 'creates a reblog by sender of status' do + expect(sender.reblogged?(sender.statuses.first)).to be true + end + end end - context 'a known status' do + context 'when the status belongs to a local user' do + before do + subject.perform + end + let(:object_json) do ActivityPub::TagManager.instance.uri_for(status) end @@ -37,34 +84,68 @@ RSpec.describe ActivityPub::Activity::Announce do end end - context 'self-boost of a previously unknown status with missing attributedTo' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - to: 'http://example.com/followers', - } + context 'when the sender is relayed' do + let!(:relay_account) { Fabricate(:account, inbox_url: 'https://relay.example.com/inbox') } + let!(:relay) { Fabricate(:relay, inbox_url: 'https://relay.example.com/inbox') } + + subject { described_class.new(json, sender, relayed_through_account: relay_account) } + + context 'and the relay is enabled' do + before do + relay.update(state: :accepted) + subject.perform + end + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'http://example.com/followers', + } + end + + it 'creates a reblog by sender of status' do + expect(sender.statuses.count).to eq 2 + end end - it 'creates a reblog by sender of status' do - expect(sender.reblogged?(sender.statuses.first)).to be true + context 'and the relay is disabled' do + before do + subject.perform + end + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'http://example.com/followers', + } + end + + it 'does not create anything' do + expect(sender.statuses.count).to eq 0 + end end end - context 'self-boost of a previously unknown status with correct attributedTo' do + context 'when the sender has no relevance to local activity' do + before do + subject.perform + end + let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, type: 'Note', content: 'Lorem ipsum', - attributedTo: ActivityPub::TagManager.instance.uri_for(sender), to: 'http://example.com/followers', } end - it 'creates a reblog by sender of status' do - expect(sender.reblogged?(sender.statuses.first)).to be true + it 'does not create anything' do + expect(sender.statuses.count).to eq 0 end end end diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb index cd20b7c7cb..26cb84871c 100644 --- a/spec/lib/activitypub/activity/create_spec.rb +++ b/spec/lib/activitypub/activity/create_spec.rb @@ -13,8 +13,6 @@ RSpec.describe ActivityPub::Activity::Create do }.with_indifferent_access end - subject { described_class.new(json, sender) } - before do sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender)) @@ -23,59 +21,407 @@ RSpec.describe ActivityPub::Activity::Create do end describe '#perform' do - before do - subject.perform - end - - context 'standalone' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - } - end - - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.text).to eq 'Lorem ipsum' - end - - it 'missing to/cc defaults to direct privacy' do - status = sender.statuses.first + context 'when fetching' do + subject { described_class.new(json, sender) } + + before do + subject.perform + end + + context 'standalone' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.text).to eq 'Lorem ipsum' + end + + it 'missing to/cc defaults to direct privacy' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'direct' + end + end + + context 'public' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'https://www.w3.org/ns/activitystreams#Public', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'public' + end + end + + context 'unlisted' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + cc: 'https://www.w3.org/ns/activitystreams#Public', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'unlisted' + end + end + + context 'private' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: 'http://example.com/followers', + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'private' + end + end + + context 'limited' do + let(:recipient) { Fabricate(:account) } + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: ActivityPub::TagManager.instance.uri_for(recipient), + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'limited' + end + + it 'creates silent mention' do + status = sender.statuses.first + expect(status.mentions.first).to be_silent + end + end + + context 'direct' do + let(:recipient) { Fabricate(:account) } + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: ActivityPub::TagManager.instance.uri_for(recipient), + tag: { + type: 'Mention', + href: ActivityPub::TagManager.instance.uri_for(recipient), + }, + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'direct' + end + end + + context 'as a reply' do + let(:original_status) { Fabricate(:status) } + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + inReplyTo: ActivityPub::TagManager.instance.uri_for(original_status), + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.thread).to eq original_status + expect(status.reply?).to be true + expect(status.in_reply_to_account).to eq original_status.account + expect(status.conversation).to eq original_status.conversation + end + end + + context 'with mentions' do + let(:recipient) { Fabricate(:account) } + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + tag: [ + { + type: 'Mention', + href: ActivityPub::TagManager.instance.uri_for(recipient), + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.mentions.map(&:account)).to include(recipient) + end + end + + context 'with mentions missing href' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + tag: [ + { + type: 'Mention', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + expect(status).to_not be_nil + end + end + + context 'with media attachments' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + attachment: [ + { + type: 'Document', + mediaType: 'image/png', + url: 'http://example.com/attachment.png', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.media_attachments.map(&:remote_url)).to include('http://example.com/attachment.png') + end + end + + context 'with media attachments with focal points' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + attachment: [ + { + type: 'Document', + mediaType: 'image/png', + url: 'http://example.com/attachment.png', + focalPoint: [0.5, -0.7], + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.media_attachments.map(&:focus)).to include('0.5,-0.7') + end + end + + context 'with media attachments missing url' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + attachment: [ + { + type: 'Document', + mediaType: 'image/png', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + expect(status).to_not be_nil + end + end + + context 'with hashtags' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + tag: [ + { + type: 'Hashtag', + href: 'http://example.com/blah', + name: '#test', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.tags.map(&:name)).to include('test') + end + end + + context 'with hashtags missing name' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + tag: [ + { + type: 'Hashtag', + href: 'http://example.com/blah', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + expect(status).to_not be_nil + end + end + + context 'with emojis' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum :tinking:', + tag: [ + { + type: 'Emoji', + icon: { + url: 'http://example.com/emoji.png', + }, + name: 'tinking', + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.emojis.map(&:shortcode)).to include('tinking') + end + end + + context 'with emojis missing name' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum :tinking:', + tag: [ + { + type: 'Emoji', + icon: { + url: 'http://example.com/emoji.png', + }, + }, + ], + } + end + + it 'creates status' do + status = sender.statuses.first + expect(status).to_not be_nil + end + end + + context 'with emojis missing icon' do + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum :tinking:', + tag: [ + { + type: 'Emoji', + name: 'tinking', + }, + ], + } + end - expect(status).to_not be_nil - expect(status.visibility).to eq 'direct' + it 'creates status' do + status = sender.statuses.first + expect(status).to_not be_nil + end end end - context 'public' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - to: 'https://www.w3.org/ns/activitystreams#Public', - } - end - - it 'creates status' do - status = sender.statuses.first + context 'when sender is followed by local users' do + subject { described_class.new(json, sender, delivery: true) } - expect(status).to_not be_nil - expect(status.visibility).to eq 'public' + before do + Fabricate(:account).follow!(sender) + subject.perform end - end - context 'unlisted' do let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, type: 'Note', content: 'Lorem ipsum', - cc: 'https://www.w3.org/ns/activitystreams#Public', } end @@ -83,66 +429,25 @@ RSpec.describe ActivityPub::Activity::Create do status = sender.statuses.first expect(status).to_not be_nil - expect(status.visibility).to eq 'unlisted' - end - end - - context 'private' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - to: 'http://example.com/followers', - } - end - - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.visibility).to eq 'private' + expect(status.text).to eq 'Lorem ipsum' end end - context 'limited' do - let(:recipient) { Fabricate(:account) } + context 'when sender replies to local status' do + let!(:local_status) { Fabricate(:status) } - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - to: ActivityPub::TagManager.instance.uri_for(recipient), - } - end - - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.visibility).to eq 'limited' - end + subject { described_class.new(json, sender, delivery: true) } - it 'creates silent mention' do - status = sender.statuses.first - expect(status.mentions.first).to be_silent + before do + subject.perform end - end - - context 'direct' do - let(:recipient) { Fabricate(:account) } let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, type: 'Note', content: 'Lorem ipsum', - to: ActivityPub::TagManager.instance.uri_for(recipient), - tag: { - type: 'Mention', - href: ActivityPub::TagManager.instance.uri_for(recipient), - }, + inReplyTo: ActivityPub::TagManager.instance.uri_for(local_status), } end @@ -150,47 +455,25 @@ RSpec.describe ActivityPub::Activity::Create do status = sender.statuses.first expect(status).to_not be_nil - expect(status.visibility).to eq 'direct' + expect(status.text).to eq 'Lorem ipsum' end end - context 'as a reply' do - let(:original_status) { Fabricate(:status) } + context 'when sender targets a local user' do + let!(:local_account) { Fabricate(:account) } - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - inReplyTo: ActivityPub::TagManager.instance.uri_for(original_status), - } - end - - it 'creates status' do - status = sender.statuses.first + subject { described_class.new(json, sender, delivery: true) } - expect(status).to_not be_nil - expect(status.thread).to eq original_status - expect(status.reply?).to be true - expect(status.in_reply_to_account).to eq original_status.account - expect(status.conversation).to eq original_status.conversation + before do + subject.perform end - end - - context 'with mentions' do - let(:recipient) { Fabricate(:account) } let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, type: 'Note', content: 'Lorem ipsum', - tag: [ - { - type: 'Mention', - href: ActivityPub::TagManager.instance.uri_for(recipient), - }, - ], + to: ActivityPub::TagManager.instance.uri_for(local_account), } end @@ -198,68 +481,25 @@ RSpec.describe ActivityPub::Activity::Create do status = sender.statuses.first expect(status).to_not be_nil - expect(status.mentions.map(&:account)).to include(recipient) - end - end - - context 'with mentions missing href' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - tag: [ - { - type: 'Mention', - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - expect(status).to_not be_nil + expect(status.text).to eq 'Lorem ipsum' end end - context 'with media attachments' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - attachment: [ - { - type: 'Document', - mediaType: 'image/png', - url: 'http://example.com/attachment.png', - }, - ], - } - end + context 'when sender cc\'s a local user' do + let!(:local_account) { Fabricate(:account) } - it 'creates status' do - status = sender.statuses.first + subject { described_class.new(json, sender, delivery: true) } - expect(status).to_not be_nil - expect(status.media_attachments.map(&:remote_url)).to include('http://example.com/attachment.png') + before do + subject.perform end - end - context 'with media attachments with focal points' do let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, type: 'Note', content: 'Lorem ipsum', - attachment: [ - { - type: 'Document', - mediaType: 'image/png', - url: 'http://example.com/attachment.png', - focalPoint: [0.5, -0.7], - }, - ], + cc: ActivityPub::TagManager.instance.uri_for(local_account), } end @@ -267,143 +507,27 @@ RSpec.describe ActivityPub::Activity::Create do status = sender.statuses.first expect(status).to_not be_nil - expect(status.media_attachments.map(&:focus)).to include('0.5,-0.7') + expect(status.text).to eq 'Lorem ipsum' end end - context 'with media attachments missing url' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - attachment: [ - { - type: 'Document', - mediaType: 'image/png', - }, - ], - } - end + context 'when the sender has no relevance to local activity' do + subject { described_class.new(json, sender, delivery: true) } - it 'creates status' do - status = sender.statuses.first - expect(status).to_not be_nil + before do + subject.perform end - end - context 'with hashtags' do let(:object_json) do { id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, type: 'Note', content: 'Lorem ipsum', - tag: [ - { - type: 'Hashtag', - href: 'http://example.com/blah', - name: '#test', - }, - ], } end - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.tags.map(&:name)).to include('test') - end - end - - context 'with hashtags missing name' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum', - tag: [ - { - type: 'Hashtag', - href: 'http://example.com/blah', - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - expect(status).to_not be_nil - end - end - - context 'with emojis' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum :tinking:', - tag: [ - { - type: 'Emoji', - icon: { - url: 'http://example.com/emoji.png', - }, - name: 'tinking', - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - - expect(status).to_not be_nil - expect(status.emojis.map(&:shortcode)).to include('tinking') - end - end - - context 'with emojis missing name' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum :tinking:', - tag: [ - { - type: 'Emoji', - icon: { - url: 'http://example.com/emoji.png', - }, - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - expect(status).to_not be_nil - end - end - - context 'with emojis missing icon' do - let(:object_json) do - { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, - type: 'Note', - content: 'Lorem ipsum :tinking:', - tag: [ - { - type: 'Emoji', - name: 'tinking', - }, - ], - } - end - - it 'creates status' do - status = sender.statuses.first - expect(status).to_not be_nil + it 'does not create anything' do + expect(sender.statuses.count).to eq 0 end end end -- GitLab From 9a47f2cbdf8ef70cb93ac2b5ee2947948d1a1d04 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 17 Feb 2019 12:02:47 +0100 Subject: [PATCH 096/192] Port upstream's javascript to the error page --- app/javascript/flavours/glitch/packs/error.js | 13 +++++++++++++ app/javascript/flavours/glitch/theme.yml | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 app/javascript/flavours/glitch/packs/error.js diff --git a/app/javascript/flavours/glitch/packs/error.js b/app/javascript/flavours/glitch/packs/error.js new file mode 100644 index 0000000000..81c86c3abb --- /dev/null +++ b/app/javascript/flavours/glitch/packs/error.js @@ -0,0 +1,13 @@ +import ready from 'flavours/glitch/util/ready'; + +ready(() => { + const image = document.querySelector('img'); + + image.addEventListener('mouseenter', () => { + image.src = '/oops.gif'; + }); + + image.addEventListener('mouseleave', () => { + image.src = '/oops.png'; + }); +}); diff --git a/app/javascript/flavours/glitch/theme.yml b/app/javascript/flavours/glitch/theme.yml index 0c8342c443..d8f3133818 100644 --- a/app/javascript/flavours/glitch/theme.yml +++ b/app/javascript/flavours/glitch/theme.yml @@ -7,7 +7,7 @@ pack: filename: packs/common.js stylesheet: true embed: packs/public.js - error: + error: packs/error.js home: filename: packs/home.js preload: -- GitLab From 91c9cb602215a8feb2e171fadd580dfe4dd75830 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 17 Feb 2019 12:39:44 +0100 Subject: [PATCH 097/192] [Glitch] Change buttons on timeline preview to open the interaction dialog Port 71e28ba39993d6eb3c5966e20214214c9d81b173 to glitch-soc --- .../glitch/components/status_action_bar.js | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js index 7fb84bd1e7..1d3130604c 100644 --- a/app/javascript/flavours/glitch/components/status_action_bar.js +++ b/app/javascript/flavours/glitch/components/status_action_bar.js @@ -83,7 +83,11 @@ export default class StatusActionBar extends ImmutablePureComponent { ] handleReplyClick = () => { - this.props.onReply(this.props.status, this.context.router.history); + if (me) { + this.props.onReply(this.props.status, this.context.router.history); + } else { + this._openInteractionDialog('reply'); + } } handleShareClick = () => { @@ -94,17 +98,29 @@ export default class StatusActionBar extends ImmutablePureComponent { } handleFavouriteClick = (e) => { - this.props.onFavourite(this.props.status, e); + if (me) { + this.props.onFavourite(this.props.status, e); + } else { + this._openInteractionDialog('favourite'); + } } handleBookmarkClick = (e) => { this.props.onBookmark(this.props.status, e); } - handleReblogClick = (e) => { - this.props.onReblog(this.props.status, e); + handleReblogClick = e => { + if (me) { + this.props.onReblog(this.props.status, e); + } else { + this._openInteractionDialog('reblog'); + } } + _openInteractionDialog = type => { + window.open(`/interact/${this.props.status.get('id')}?type=${type}`, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes'); + } + handleDeleteClick = () => { this.props.onDelete(this.props.status, this.context.router.history); } @@ -174,7 +190,7 @@ export default class StatusActionBar extends ImmutablePureComponent { const mutingConversation = status.get('muted'); const anonymousAccess = !me; const publicStatus = ['public', 'unlisted'].includes(status.get('visibility')); - const reblogDisabled = anonymousAccess || (status.get('visibility') === 'direct' || (status.get('visibility') === 'private' && me !== status.getIn(['account', 'id']))); + const reblogDisabled = status.get('visibility') === 'direct' || (status.get('visibility') === 'private' && me !== status.getIn(['account', 'id'])); const reblogMessage = status.get('visibility') === 'private' ? messages.reblog_private : messages.reblog; let menu = []; @@ -243,7 +259,6 @@ export default class StatusActionBar extends ImmutablePureComponent { let replyButton = ( <IconButton className='status__action-bar-button' - disabled={anonymousAccess} title={replyTitle} icon={replyIcon} onClick={this.handleReplyClick} @@ -262,7 +277,7 @@ export default class StatusActionBar extends ImmutablePureComponent { <div className='status__action-bar'> {replyButton} <IconButton className='status__action-bar-button' disabled={reblogDisabled} active={status.get('reblogged')} pressed={status.get('reblogged')} title={reblogDisabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(reblogMessage)} icon={reblogIcon} onClick={this.handleReblogClick} /> - <IconButton className='status__action-bar-button star-icon' disabled={anonymousAccess} animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /> + <IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /> {shareButton} <IconButton className='status__action-bar-button bookmark-icon' disabled={anonymousAccess} active={status.get('bookmarked')} pressed={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /> -- GitLab From cac75e01b8ba840ddfd09bc6ba1539a03d03880f Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 17 Feb 2019 12:53:51 +0100 Subject: [PATCH 098/192] Fix static error page to use the correct pack --- app/views/layouts/error.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/error.html.haml b/app/views/layouts/error.html.haml index e9c474082b..f8315afb56 100644 --- a/app/views/layouts/error.html.haml +++ b/app/views/layouts/error.html.haml @@ -7,7 +7,7 @@ %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/ = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous' = render partial: 'layouts/theme', object: (@core || { pack: 'common' }) - = render partial: 'layouts/theme', object: (@theme || { pack: 'common', flavour: 'glitch', skin: 'default' }) + = render partial: 'layouts/theme', object: (@theme || { pack: 'error', flavour: 'glitch', common: { pack: 'common', flavour: 'glitch', skin: 'default' } }) %body.error .dialog .dialog__illustration -- GitLab From e31fc2b458579fea3602e25a798d1f3cfcac2807 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 17 Feb 2019 14:28:25 +0100 Subject: [PATCH 099/192] [Glitch] Fix crash on public hashtag pages when streaming fails Port 041ff5fa9a45f7b8d1048a05a35611622b6f5fdb to glitch-soc --- .../glitch/features/status/components/detailed_status.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js index 8f49a9a301..120ae68172 100644 --- a/app/javascript/flavours/glitch/features/status/components/detailed_status.js +++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js @@ -98,7 +98,7 @@ export default class DetailedStatus extends ImmutablePureComponent { } render () { - const status = this.props.status.get('reblog') ? this.props.status.get('reblog') : this.props.status; + const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status; const { expanded, onToggleHidden, settings } = this.props; const outerStyle = { boxSizing: 'border-box' }; const { compact } = this.props; -- GitLab From 1a1b8170bbb1e8cfd5591a8ea8085de41fa90cc5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Sun, 17 Feb 2019 15:16:36 +0100 Subject: [PATCH 100/192] Fix Announce activities of unknown statuses not fetching those statuses (#10065) Regression from #9998 --- app/lib/activitypub/activity.rb | 3 +- .../lib/activitypub/activity/announce_spec.rb | 43 +++++++++++++------ 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 8265810a00..11fa3363af 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -150,8 +150,7 @@ class ActivityPub::Activity end end - # If the status is not from the actor, try to fetch it - return fetch_remote_original_status if value_or_id(first_of_value(@json['attributedTo'])) == @account.uri + fetch_remote_original_status end def fetch_remote_original_status diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb index 94b9d348d0..aa58d9e234 100644 --- a/spec/lib/activitypub/activity/announce_spec.rb +++ b/spec/lib/activitypub/activity/announce_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe ActivityPub::Activity::Announce do - let(:sender) { Fabricate(:account, followers_url: 'http://example.com/followers') } + let(:sender) { Fabricate(:account, followers_url: 'http://example.com/followers', uri: 'https://example.com/actor') } let(:recipient) { Fabricate(:account) } let(:status) { Fabricate(:status, account: recipient) } @@ -10,21 +10,29 @@ RSpec.describe ActivityPub::Activity::Announce do '@context': 'https://www.w3.org/ns/activitystreams', id: 'foo', type: 'Announce', - actor: ActivityPub::TagManager.instance.uri_for(sender), + actor: 'https://example.com/actor', object: object_json, }.with_indifferent_access end - subject { described_class.new(json, sender) } - - before do - sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender)) + let(:unknown_object_json) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: 'https://example.com/actor/hello-world', + type: 'Note', + attributedTo: 'https://example.com/actor', + content: 'Hello world', + to: 'http://example.com/followers', + } end + subject { described_class.new(json, sender) } + describe '#perform' do context 'when sender is followed by a local account' do before do Fabricate(:account).follow!(sender) + stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json)) subject.perform end @@ -38,10 +46,21 @@ RSpec.describe ActivityPub::Activity::Announce do end end + context 'an unknown status' do + let(:object_json) { 'https://example.com/actor/hello-world' } + + it 'creates a reblog by sender of status' do + reblog = sender.statuses.first + + expect(reblog).to_not be_nil + expect(reblog.reblog.text).to eq 'Hello world' + end + end + context 'self-boost of a previously unknown status with missing attributedTo' do let(:object_json) do { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + id: 'https://example.com/actor#bar', type: 'Note', content: 'Lorem ipsum', to: 'http://example.com/followers', @@ -56,10 +75,10 @@ RSpec.describe ActivityPub::Activity::Announce do context 'self-boost of a previously unknown status with correct attributedTo' do let(:object_json) do { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + id: 'https://example.com/actor#bar', type: 'Note', content: 'Lorem ipsum', - attributedTo: ActivityPub::TagManager.instance.uri_for(sender), + attributedTo: 'https://example.com/actor', to: 'http://example.com/followers', } end @@ -98,7 +117,7 @@ RSpec.describe ActivityPub::Activity::Announce do let(:object_json) do { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + id: 'https://example.com/actor#bar', type: 'Note', content: 'Lorem ipsum', to: 'http://example.com/followers', @@ -117,7 +136,7 @@ RSpec.describe ActivityPub::Activity::Announce do let(:object_json) do { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + id: 'https://example.com/actor#bar', type: 'Note', content: 'Lorem ipsum', to: 'http://example.com/followers', @@ -137,7 +156,7 @@ RSpec.describe ActivityPub::Activity::Announce do let(:object_json) do { - id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + id: 'https://example.com/actor#bar', type: 'Note', content: 'Lorem ipsum', to: 'http://example.com/followers', -- GitLab From fa9635c7417361104342e9c108c08ed821634167 Mon Sep 17 00:00:00 2001 From: Ben Lubar <ben.lubar@gmail.com> Date: Wed, 13 Feb 2019 12:51:33 -0600 Subject: [PATCH 101/192] Allow multi-line image descriptions. (Glitch) --- .../glitch/features/composer/upload_form/item/index.js | 3 +-- .../flavours/glitch/styles/components/composer.scss | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/javascript/flavours/glitch/features/composer/upload_form/item/index.js b/app/javascript/flavours/glitch/features/composer/upload_form/item/index.js index 93fa4e39e1..4f5f66f04f 100644 --- a/app/javascript/flavours/glitch/features/composer/upload_form/item/index.js +++ b/app/javascript/flavours/glitch/features/composer/upload_form/item/index.js @@ -169,13 +169,12 @@ export default class ComposerUploadFormItem extends React.PureComponent { </div> <label> <span style={{ display: 'none' }}><FormattedMessage {...messages.description} /></span> - <input + <textarea maxLength={420} onBlur={handleBlur} onChange={handleChange} onFocus={handleFocus} placeholder={intl.formatMessage(messages.description)} - type='text' value={description} /> </label> diff --git a/app/javascript/flavours/glitch/styles/components/composer.scss b/app/javascript/flavours/glitch/styles/components/composer.scss index 2267b798c1..fa24cabf27 100644 --- a/app/javascript/flavours/glitch/styles/components/composer.scss +++ b/app/javascript/flavours/glitch/styles/components/composer.scss @@ -262,7 +262,7 @@ background-repeat: no-repeat; overflow: hidden; - input { + textarea { display: block; position: absolute; box-sizing: border-box; @@ -294,7 +294,7 @@ &.active { & > div { - input { opacity: 1 } + textarea { opacity: 1 } } } } -- GitLab From ec18359c3d1996d3bb4676b826bceda88f5a535f Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 17 Feb 2019 15:14:22 +0100 Subject: [PATCH 102/192] Fix CW fold/unfold in remote interaction dialog --- app/javascript/core/theme.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/core/theme.yml b/app/javascript/core/theme.yml index f48ab40c06..32787bcab9 100644 --- a/app/javascript/core/theme.yml +++ b/app/javascript/core/theme.yml @@ -13,7 +13,7 @@ pack: mailer: filename: mailer.js stylesheet: true - modal: + modal: public.js public: public.js settings: settings.js share: -- GitLab From 7853be1f06e2a22582cf664a0957f98c46e00a6d Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Sun, 17 Feb 2019 20:24:12 +0100 Subject: [PATCH 103/192] Bump version to 2.7.2 (#10067) --- AUTHORS.md | 70 +++++++++++++++++++++++------------------ CHANGELOG.md | 41 ++++++++++++++++++++++++ lib/mastodon/version.rb | 2 +- 3 files changed, 82 insertions(+), 31 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index 1bcf455b11..3171214e0e 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -9,18 +9,18 @@ and provided thanks to the work of the following contributors: * [akihikodaki](https://github.com/akihikodaki) * [ThibG](https://github.com/ThibG) * [mjankowski](https://github.com/mjankowski) +* [dependabot[bot]](https://github.com/apps/dependabot) * [unarist](https://github.com/unarist) * [m4sk1n](https://github.com/m4sk1n) -* [dependabot[bot]](https://github.com/apps/dependabot) * [yiskah](https://github.com/yiskah) * [nolanlawson](https://github.com/nolanlawson) -* [sorin-davidoi](https://github.com/sorin-davidoi) * [ysksn](https://github.com/ysksn) +* [sorin-davidoi](https://github.com/sorin-davidoi) * [abcang](https://github.com/abcang) * [lynlynlynx](https://github.com/lynlynlynx) -* [alpaca-tc](https://github.com/alpaca-tc) * [mayaeh](https://github.com/mayaeh) * [renatolond](https://github.com/renatolond) +* [alpaca-tc](https://github.com/alpaca-tc) * [nclm](https://github.com/nclm) * [ineffyble](https://github.com/ineffyble) * [jeroenpraat](https://github.com/jeroenpraat) @@ -28,9 +28,9 @@ and provided thanks to the work of the following contributors: * [Quent-in](https://github.com/Quent-in) * [JantsoP](https://github.com/JantsoP) * [mabkenar](https://github.com/mabkenar) +* [Kjwon15](https://github.com/Kjwon15) * [nullkal](https://github.com/nullkal) * [yookoala](https://github.com/yookoala) -* [Kjwon15](https://github.com/Kjwon15) * [shuheiktgw](https://github.com/shuheiktgw) * [ashfurrow](https://github.com/ashfurrow) * [Quenty31](https://github.com/Quenty31) @@ -48,16 +48,16 @@ and provided thanks to the work of the following contributors: * [rkarabut](https://github.com/rkarabut) * [yukimochi](https://github.com/yukimochi) * [Artoria2e5](https://github.com/Artoria2e5) +* [nightpool](https://github.com/nightpool) * [marrus-sh](https://github.com/marrus-sh) * [krainboltgreene](https://github.com/krainboltgreene) -* [patf](https://github.com/patf) +* [pfigel](https://github.com/pfigel) * [Aldarone](https://github.com/Aldarone) * [BoFFire](https://github.com/BoFFire) * [clworld](https://github.com/clworld) * [dracos](https://github.com/dracos) * [SerCom_KC](mailto:sercom-kc@users.noreply.github.com) * [Sylvhem](https://github.com/Sylvhem) -* [nightpool](https://github.com/nightpool) * [MasterGroosha](https://github.com/MasterGroosha) * [JeanGauthier](https://github.com/JeanGauthier) * [kschaper](https://github.com/kschaper) @@ -77,11 +77,14 @@ and provided thanks to the work of the following contributors: * [johnsudaar](https://github.com/johnsudaar) * [trebmuh](https://github.com/trebmuh) * [Rakib Hasan](mailto:rmhasan@gmail.com) +* [ashleyhull-versent](https://github.com/ashleyhull-versent) * [lindwurm](https://github.com/lindwurm) * [victorhck](mailto:victorhck@geeko.site) * [voidsatisfaction](https://github.com/voidsatisfaction) +* [rinsuki](https://github.com/rinsuki) * [hikari-no-yume](https://github.com/hikari-no-yume) * [angristan](https://github.com/angristan) +* [hinaloe](https://github.com/hinaloe) * [seefood](https://github.com/seefood) * [jackjennings](https://github.com/jackjennings) * [spla](mailto:spla@mastodont.cat) @@ -92,20 +95,20 @@ and provided thanks to the work of the following contributors: * [dunn](https://github.com/dunn) * [xqus](https://github.com/xqus) * [hugogameiro](https://github.com/hugogameiro) +* [ariasuni](https://github.com/ariasuni) * [pfm-eyesightjp](https://github.com/pfm-eyesightjp) * [fakenine](https://github.com/fakenine) * [tsuwatch](https://github.com/tsuwatch) * [victorhck](https://github.com/victorhck) -* [ashleyhull-versent](https://github.com/ashleyhull-versent) * [kedamaDQ](https://github.com/kedamaDQ) * [puckipedia](https://github.com/puckipedia) * [fvh-P](https://github.com/fvh-P) * [contraexemplo](https://github.com/contraexemplo) +* [Aditoo17](https://github.com/Aditoo17) * [kazu9su](https://github.com/kazu9su) * [Komic](https://github.com/Komic) * [lmorchard](https://github.com/lmorchard) * [diomed](https://github.com/diomed) -* [ariasuni](https://github.com/ariasuni) * [Neetshin](mailto:neetshin@neetsh.in) * [rainyday](https://github.com/rainyday) * [ProgVal](https://github.com/ProgVal) @@ -114,7 +117,8 @@ and provided thanks to the work of the following contributors: * [goofy-bz](mailto:goofy@babelzilla.org) * [kadiix](https://github.com/kadiix) * [kodacs](https://github.com/kodacs) -* [rtucker](https://github.com/rtucker) +* [trwnh](https://github.com/trwnh) +* [JMendyk](https://github.com/JMendyk) * [KScl](https://github.com/KScl) * [sterdev](https://github.com/sterdev) * [TheKinrar](https://github.com/TheKinrar) @@ -125,16 +129,16 @@ and provided thanks to the work of the following contributors: * [fhemberger](https://github.com/fhemberger) * [greysteil](https://github.com/greysteil) * [hensmith](https://github.com/hensmith) -* [hinaloe](https://github.com/hinaloe) * [d6rkaiz](https://github.com/d6rkaiz) * [Reverite](https://github.com/Reverite) -* [JMendyk](https://github.com/JMendyk) * [JohnD28](https://github.com/JohnD28) * [znz](https://github.com/znz) * [Naouak](https://github.com/Naouak) * [pawelngei](https://github.com/pawelngei) +* [rtucker](https://github.com/rtucker) * [reneklacan](https://github.com/reneklacan) * [ekiru](https://github.com/ekiru) +* [noellabo](https://github.com/noellabo) * [tcitworld](https://github.com/tcitworld) * [geta6](https://github.com/geta6) * [happycoloredbanana](https://github.com/happycoloredbanana) @@ -144,9 +148,9 @@ and provided thanks to the work of the following contributors: * [noraworld](https://github.com/noraworld) * [theboss](https://github.com/theboss) * [178inaba](https://github.com/178inaba) -* [Aditoo17](https://github.com/Aditoo17) * [alyssais](https://github.com/alyssais) -* [kodnaplakal](https://github.com/kodnaplakal) +* [hiphref](https://github.com/hiphref) +* [BenLubar](https://github.com/BenLubar) * [stalker314314](https://github.com/stalker314314) * [huertanix](https://github.com/huertanix) * [genesixx](https://github.com/genesixx) @@ -157,6 +161,7 @@ and provided thanks to the work of the following contributors: * [kmichl](https://github.com/kmichl) * [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name) * [saper](https://github.com/saper) +* [marek-lach](https://github.com/marek-lach) * [nevillepark](https://github.com/nevillepark) * [ornithocoder](https://github.com/ornithocoder) * [pierreozoux](https://github.com/pierreozoux) @@ -164,7 +169,6 @@ and provided thanks to the work of the following contributors: * [Ram Lmn](mailto:ramlmn@users.noreply.github.com) * [harukasan](https://github.com/harukasan) * [stamak](https://github.com/stamak) -* [noellabo](https://github.com/noellabo) * [Technowix](mailto:technowix@users.noreply.github.com) * [Eychics](https://github.com/Eychics) * [Thor Harald Johansen](mailto:thj@thj.no) @@ -179,21 +183,20 @@ and provided thanks to the work of the following contributors: * [hoodie](mailto:hoodiekitten@outlook.com) * [luzi82](https://github.com/luzi82) * [duxovni](https://github.com/duxovni) -* [trwnh](https://github.com/trwnh) +* [tmm576](https://github.com/tmm576) * [unsmell](https://github.com/unsmell) * [valerauko](https://github.com/valerauko) * [chriswmartin](https://github.com/chriswmartin) * [vahnj](https://github.com/vahnj) * [ikuradon](https://github.com/ikuradon) * [AndreLewin](https://github.com/AndreLewin) -* [rinsuki](https://github.com/rinsuki) * [0xflotus](https://github.com/0xflotus) * [redtachyons](https://github.com/redtachyons) * [thurloat](https://github.com/thurloat) * [aaribaud](https://github.com/aaribaud) +* [pointlessone](https://github.com/pointlessone) * [Andrew](mailto:andrewlchronister@gmail.com) * [estuans](https://github.com/estuans) -* [BenLubar](https://github.com/BenLubar) * [dissolve](https://github.com/dissolve) * [PurpleBooth](https://github.com/PurpleBooth) * [bradurani](https://github.com/bradurani) @@ -216,6 +219,7 @@ and provided thanks to the work of the following contributors: * [ErikXXon](https://github.com/ErikXXon) * [ian-kelling](https://github.com/ian-kelling) * [immae](https://github.com/immae) +* [J0WI](https://github.com/J0WI) * [foozmeat](https://github.com/foozmeat) * [jasonrhodes](https://github.com/jasonrhodes) * [Jason Snell](mailto:jason@newrelic.com) @@ -230,6 +234,7 @@ and provided thanks to the work of the following contributors: * [Lorenz Diener](mailto:halcyon@icosahedron.website) * [alimony](https://github.com/alimony) * [mig5](https://github.com/mig5) +* [moritzheiber](https://github.com/moritzheiber) * [ndarville](https://github.com/ndarville) * [Abzol](https://github.com/Abzol) * [pwoolcoc](https://github.com/pwoolcoc) @@ -238,6 +243,7 @@ and provided thanks to the work of the following contributors: * [ignisf](https://github.com/ignisf) * [raymestalez](https://github.com/raymestalez) * [remram44](https://github.com/remram44) +* [sts10](https://github.com/sts10) * [sascha-sl](https://github.com/sascha-sl) * [u1-liquid](https://github.com/u1-liquid) * [sim6](https://github.com/sim6) @@ -288,6 +294,7 @@ and provided thanks to the work of the following contributors: * [857b](https://github.com/857b) * [insom](https://github.com/insom) * [tachyons](https://github.com/tachyons) +* [acid-chicken](https://github.com/acid-chicken) * [Esteth](https://github.com/Esteth) * [unascribed](https://github.com/unascribed) * [Aguay-val](https://github.com/Aguay-val) @@ -297,7 +304,6 @@ and provided thanks to the work of the following contributors: * [unleashed](https://github.com/unleashed) * [alxrcs](https://github.com/alxrcs) * [console-cowboy](https://github.com/console-cowboy) -* [pointlessone](https://github.com/pointlessone) * [Alkarex](https://github.com/Alkarex) * [a2](https://github.com/a2) * [0xa](https://github.com/0xa) @@ -329,6 +335,7 @@ and provided thanks to the work of the following contributors: * [Motoma](https://github.com/Motoma) * [chriswk](https://github.com/chriswk) * [csu](https://github.com/csu) +* [clarcharr](https://github.com/clarcharr) * [kklleemm](https://github.com/kklleemm) * [colindean](https://github.com/colindean) * [dachinat](https://github.com/dachinat) @@ -356,6 +363,7 @@ and provided thanks to the work of the following contributors: * [espenronnevik](https://github.com/espenronnevik) * [Finariel](https://github.com/Finariel) * [siuying](https://github.com/siuying) +* [zoc](https://github.com/zoc) * [fwenzel](https://github.com/fwenzel) * [GenbuHase](https://github.com/GenbuHase) * [hattori6789](https://github.com/hattori6789) @@ -416,6 +424,7 @@ and provided thanks to the work of the following contributors: * [martymcguire](https://github.com/martymcguire) * [marvinkopf](https://github.com/marvinkopf) * [otsune](https://github.com/otsune) +* [mbugowski](https://github.com/mbugowski) * [Mathias B](mailto:10813340+mathias-b@users.noreply.github.com) * [matt-auckland](https://github.com/matt-auckland) * [webroo](https://github.com/webroo) @@ -434,7 +443,6 @@ and provided thanks to the work of the following contributors: * [premist](https://github.com/premist) * [Mnkai](https://github.com/Mnkai) * [mitchhentges](https://github.com/mitchhentges) -* [moritzheiber](https://github.com/moritzheiber) * [mouse-reeve](https://github.com/mouse-reeve) * [Mozinet-fr](https://github.com/Mozinet-fr) * [lae](https://github.com/lae) @@ -458,17 +466,17 @@ and provided thanks to the work of the following contributors: * [Pangoraw](https://github.com/Pangoraw) * [peterkeen](https://github.com/peterkeen) * [pgate](https://github.com/pgate) -* [retokromer](https://github.com/retokromer) -* [rfwatson](https://github.com/rfwatson) -* [rfreebern](https://github.com/rfreebern) +* [Reto Kromer](mailto:retokromer@users.noreply.github.com) +* [Rey Tucker](mailto:git@reytucker.us) +* [Rob Watson](mailto:rfwatson@users.noreply.github.com) +* [Ryan Freebern](mailto:ryan@freebern.org) * [Ryan Wade](mailto:ryan.wade@protonmail.com) -* [sylph01](https://github.com/sylph01) -* [S-H-GAMELINKS](https://github.com/S-H-GAMELINKS) -* [staticsafe](https://github.com/staticsafe) -* [snwh](https://github.com/snwh) -* [sts10](https://github.com/sts10) -* [skoji](https://github.com/skoji) -* [ScienJus](https://github.com/ScienJus) +* [Ryo Kajiwara](mailto:kfe-fecn6.prussian@s01.info) +* [S.H](mailto:gamelinks007@gmail.com) +* [Sadiq Saif](mailto:staticsafe@users.noreply.github.com) +* [Sam Hewitt](mailto:hewittsamuel@gmail.com) +* [Satoshi KOJIMA](mailto:skoji@mac.com) +* [ScienJus](mailto:i@scienjus.com) * [Scott Larkin](mailto:scott@codeclimate.com) * [Sebastian Hübner](mailto:imolein@users.noreply.github.com) * [Sebastian Morr](mailto:sebastian@morr.cc) @@ -483,6 +491,7 @@ and provided thanks to the work of the following contributors: * [Sir-Boops](mailto:admin@boops.me) * [Soshi Kato](mailto:mail@sossii.com) * [Spanky](mailto:2788886+spankyworks@users.noreply.github.com) +* [Stanislas](mailto:angristan@pm.me) * [StefOfficiel](mailto:pichard.stephane@free.fr) * [Steven Tappert](mailto:admin@dark-it.net) * [Svetlozar Todorov](mailto:svetlik@users.noreply.github.com) @@ -532,6 +541,7 @@ and provided thanks to the work of the following contributors: * [fsubal](mailto:fsubal@users.noreply.github.com) * [fusshi-](mailto:dikky1218@users.noreply.github.com) * [gentaro](mailto:gentaroooo@gmail.com) +* [gol-cha](mailto:info@mevo.xyz) * [hakoai](mailto:hk--76@qa2.so-net.ne.jp) * [haosbvnker](mailto:github@chaosbunker.com) * [isati](mailto:phil@juchnowi.cz) @@ -549,12 +559,12 @@ and provided thanks to the work of the following contributors: * [luzpaz](mailto:luzpaz@users.noreply.github.com) * [maxypy](mailto:maxime@mpigou.fr) * [mhe](mailto:mail@marcus-herrmann.com) +* [mike castleman](mailto:m@mlcastle.net) * [mimikun](mailto:dzdzble_effort_311@outlook.jp) * [mshrtkch](mailto:mshrtkch@users.noreply.github.com) * [muan](mailto:muan@github.com) * [namelessGonbai](mailto:43787036+namelessgonbai@users.noreply.github.com) * [neetshin](mailto:neetshin@neetsh.in) -* [nightpool](mailto:nightpool@users.noreply.github.com) * [rch850](mailto:rich850@gmail.com) * [roikale](mailto:roikale@users.noreply.github.com) * [rysiekpl](mailto:rysiek@hackerspace.pl) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfb6b15f5a..f3356d5422 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,47 @@ Changelog All notable changes to this project will be documented in this file. +## [2.7.2] - 2019-02-17 +### Added + +- Add support for IPv6 in e-mail validation ([zoc](https://github.com/tootsuite/mastodon/pull/10009)) +- Add record of IP address used for signing up ([ThibG](https://github.com/tootsuite/mastodon/pull/10026)) +- Add tight rate-limit for API deletions (30 per 30 minutes) ([Gargron](https://github.com/tootsuite/mastodon/pull/10042)) +- Add support for embedded `Announce` objects attributed to the same actor ([ThibG](https://github.com/tootsuite/mastodon/pull/9998), [Gargron](https://github.com/tootsuite/mastodon/pull/10065)) +- Add spam filter for `Create` and `Announce` activities ([Gargron](https://github.com/tootsuite/mastodon/pull/10005), [Gargron](https://github.com/tootsuite/mastodon/pull/10041), [Gargron](https://github.com/tootsuite/mastodon/pull/10062)) +- Add `registrations` attribute to `GET /api/v1/instance` ([Gargron](https://github.com/tootsuite/mastodon/pull/10060)) +- Add `vapid_key` to `POST /api/v1/apps` and `GET /api/v1/apps/verify_credentials` ([Gargron](https://github.com/tootsuite/mastodon/pull/10058)) + +### Fixed + +- Fix link color and add link underlines in high-contrast theme ([Gargron](https://github.com/tootsuite/mastodon/pull/9949), [Gargron](https://github.com/tootsuite/mastodon/pull/10028)) +- Fix unicode characters in URLs not being linkified ([JMendyk](https://github.com/tootsuite/mastodon/pull/8447), [hinaloe](https://github.com/tootsuite/mastodon/pull/9991)) +- Fix URLs linkifier grabbing ending quotation as part of the link ([Gargron](https://github.com/tootsuite/mastodon/pull/9997)) +- Fix authorized applications page design ([rinsuki](https://github.com/tootsuite/mastodon/pull/9969)) +- Fix custom emojis not showing up in share page emoji picker ([rinsuki](https://github.com/tootsuite/mastodon/pull/9970)) +- Fix too liberal application of whitespace in toots ([trwnh](https://github.com/tootsuite/mastodon/pull/9968)) +- Fix misleading e-mail hint being displayed in admin view ([ThibG](https://github.com/tootsuite/mastodon/pull/9973)) +- Fix tombstones not being cleared out ([abcang](https://github.com/tootsuite/mastodon/pull/9978)) +- Fix some timeline jumps ([ThibG](https://github.com/tootsuite/mastodon/pull/9982), [ThibG](https://github.com/tootsuite/mastodon/pull/10001), [rinsuki](https://github.com/tootsuite/mastodon/pull/10046)) +- Fix content warning input taking keyboard focus even when hidden ([hinaloe](https://github.com/tootsuite/mastodon/pull/10017)) +- Fix hashtags select styling in default and high-contrast themes ([Gargron](https://github.com/tootsuite/mastodon/pull/10029)) +- Fix style regressions on landing page ([Gargron](https://github.com/tootsuite/mastodon/pull/10030)) +- Fix hashtag column not subscribing to stream on mount ([Gargron](https://github.com/tootsuite/mastodon/pull/10040)) +- Fix relay enabling/disabling not resetting inbox availability status ([Gargron](https://github.com/tootsuite/mastodon/pull/10048)) +- Fix mutes, blocks, domain blocks and follow requests not paginating ([Gargron](https://github.com/tootsuite/mastodon/pull/10057)) +- Fix crash on public hashtag pages when streaming fails ([ThibG](https://github.com/tootsuite/mastodon/pull/10061)) + +### Changed + +- Change icon for unlisted visibility level ([clarcharr](https://github.com/tootsuite/mastodon/pull/9952)) +- Change queue of actor deletes from push to pull for non-follower recipients ([ThibG](https://github.com/tootsuite/mastodon/pull/10016)) +- Change robots.txt to exclude media proxy URLs ([nightpool](https://github.com/tootsuite/mastodon/pull/10038)) +- Change upload description input to allow line breaks ([BenLubar](https://github.com/tootsuite/mastodon/pull/10036)) +- Change `dist/mastodon-streaming.service` to recommend running node without intermediary npm command ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10032)) +- Change conversations to always show names of other participants ([Gargron](https://github.com/tootsuite/mastodon/pull/10047)) +- Change buttons on timeline preview to open the interaction dialog ([Gargron](https://github.com/tootsuite/mastodon/pull/10054)) +- Change error graphic to hover-to-play ([Gargron](https://github.com/tootsuite/mastodon/pull/10055)) + ## [2.7.1] - 2019-01-28 ### Fixed diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index cf32e2f637..81dd253ae9 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 1 + 2 end def pre -- GitLab From d1d7d14f77733be2e0938488752e94d65eedc6aa Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Mon, 18 Feb 2019 00:10:21 +0100 Subject: [PATCH 104/192] Fix video player width not being updated to fit container width (#10069) --- app/javascript/mastodon/features/video/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js index 894fe78d9e..55dd249e14 100644 --- a/app/javascript/mastodon/features/video/index.js +++ b/app/javascript/mastodon/features/video/index.js @@ -347,7 +347,6 @@ class Video extends React.PureComponent { width = containerWidth; height = containerWidth / (16/9); - playerStyle.width = width; playerStyle.height = height; } -- GitLab From d974988541237419495e86b534f63259a28d0642 Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Sun, 17 Feb 2019 21:58:02 +0100 Subject: [PATCH 105/192] Fix video player width not being updated to fit container width --- app/javascript/flavours/glitch/features/video/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/javascript/flavours/glitch/features/video/index.js b/app/javascript/flavours/glitch/features/video/index.js index a6f651db65..cf66536c41 100644 --- a/app/javascript/flavours/glitch/features/video/index.js +++ b/app/javascript/flavours/glitch/features/video/index.js @@ -366,7 +366,6 @@ export default class Video extends React.PureComponent { width = containerWidth; height = containerWidth / (16/9); - playerStyle.width = width; playerStyle.height = height; } else if (inline) { return (<div className={computedClass} ref={this.setPlayerRef} tabindex={0}></div>); -- GitLab From 2f7f6af26a40fb9981c99d131cf021c71f24fb99 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Mon, 18 Feb 2019 13:37:13 +0100 Subject: [PATCH 106/192] =?UTF-8?q?Hide=20domain=20filter=20in=20admin=20p?= =?UTF-8?q?age=20when=20=E2=80=9Clocal=E2=80=9D=20filter=20is=20active=20(?= =?UTF-8?q?#10074)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since the “domain†field is ignored in this case. --- app/views/admin/accounts/index.html.haml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/views/admin/accounts/index.html.haml b/app/views/admin/accounts/index.html.haml index 91fddadf81..345f74f909 100644 --- a/app/views/admin/accounts/index.html.haml +++ b/app/views/admin/accounts/index.html.haml @@ -26,8 +26,9 @@ = hidden_field_tag key, params[key] - %i(username by_domain display_name email ip).each do |key| - .input.string.optional - = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.accounts.#{key}") + - unless key == :by_domain && params[:remote].blank? + .input.string.optional + = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.accounts.#{key}") .actions %button= t('admin.accounts.search') -- GitLab From 6840a77711b2d536b9227b5a96ec565117d80205 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Mon, 18 Feb 2019 14:59:19 +0100 Subject: [PATCH 107/192] Add domain search/filter to the "Federation" (/admin/instances) page (#10071) --- app/controllers/admin/instances_controller.rb | 2 +- app/helpers/admin/filter_helper.rb | 2 +- app/models/domain_block.rb | 2 ++ app/models/instance_filter.rb | 8 ++++++-- app/views/admin/instances/index.html.haml | 14 ++++++++++++++ config/locales/en.yml | 1 + 6 files changed, 25 insertions(+), 4 deletions(-) diff --git a/app/controllers/admin/instances_controller.rb b/app/controllers/admin/instances_controller.rb index 431ce6f4de..6dd659a304 100644 --- a/app/controllers/admin/instances_controller.rb +++ b/app/controllers/admin/instances_controller.rb @@ -38,7 +38,7 @@ module Admin end def filter_params - params.permit(:limited) + params.permit(:limited, :by_domain) end end end diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb index 97beb587fc..275b5f2fe0 100644 --- a/app/helpers/admin/filter_helper.rb +++ b/app/helpers/admin/filter_helper.rb @@ -6,7 +6,7 @@ module Admin::FilterHelper INVITE_FILTER = %i(available expired).freeze CUSTOM_EMOJI_FILTERS = %i(local remote by_domain shortcode).freeze TAGS_FILTERS = %i(hidden).freeze - INSTANCES_FILTERS = %i(limited).freeze + INSTANCES_FILTERS = %i(limited by_domain).freeze FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS + INVITE_FILTER + CUSTOM_EMOJI_FILTERS + TAGS_FILTERS + INSTANCES_FILTERS diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb index 1064ea7c8f..069cda3673 100644 --- a/app/models/domain_block.rb +++ b/app/models/domain_block.rb @@ -24,6 +24,8 @@ class DomainBlock < ApplicationRecord has_many :accounts, foreign_key: :domain, primary_key: :domain delegate :count, to: :accounts, prefix: true + scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) } + def self.blocked?(domain) where(domain: domain, severity: :suspend).exists? end diff --git a/app/models/instance_filter.rb b/app/models/instance_filter.rb index 3483d8cd6e..848fff53e1 100644 --- a/app/models/instance_filter.rb +++ b/app/models/instance_filter.rb @@ -9,9 +9,13 @@ class InstanceFilter def results if params[:limited].present? - DomainBlock.order(id: :desc) + scope = DomainBlock + scope = scope.matches_domain(params[:by_domain]) if params[:by_domain].present? + scope.order(id: :desc) else - Account.remote.by_domain_accounts + scope = Account.remote + scope = scope.matches_domain(params[:by_domain]) if params[:by_domain].present? + scope.by_domain_accounts end end end diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml index ce35b5db47..2a5af3b5d6 100644 --- a/app/views/admin/instances/index.html.haml +++ b/app/views/admin/instances/index.html.haml @@ -11,6 +11,20 @@ %div{ style: 'flex: 1 1 auto; text-align: right' } = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path, class: 'button' += form_tag admin_instances_url, method: 'GET', class: 'simple_form' do + .fields-group + - Admin::FilterHelper::INSTANCES_FILTERS.each do |key| + - if params[key].present? + = hidden_field_tag key, params[key] + + - %i(by_domain).each do |key| + .input.string.optional + = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.instances.#{key}") + + .actions + %button= t('admin.accounts.search') + = link_to t('admin.accounts.reset'), admin_custom_emojis_path, class: 'button negative' + %hr.spacer/ - @instances.each do |instance| diff --git a/config/locales/en.yml b/config/locales/en.yml index dacf16d563..7363a7457f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -302,6 +302,7 @@ en: back_to_account: Back To Account title: "%{acct}'s Followers" instances: + by_domain: Domain delivery_available: Delivery is available known_accounts: one: "%{count} known account" -- GitLab From 3a8cb6c73715919a61709bd7ce67fc5ec8d192f9 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Mon, 18 Feb 2019 14:59:46 +0100 Subject: [PATCH 108/192] Add quick link from admin account view to block/unblock instance (#10073) --- app/views/admin/accounts/show.html.haml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml index 280a834ba2..7ac73bd072 100644 --- a/app/views/admin/accounts/show.html.haml +++ b/app/views/admin/accounts/show.html.haml @@ -166,6 +166,12 @@ - else = link_to t('admin.accounts.perform_full_suspension'), new_admin_account_action_path(@account.id, type: 'suspend'), class: 'button button--destructive' if can?(:suspend, @account) + - unless @account.local? + - if DomainBlock.where(domain: @account.domain).exists? + = link_to t('admin.domain_blocks.undo'), admin_instance_path(@account.domain), class: 'button' + - else + = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path(_domain: @account.domain), class: 'button button--destructive' + %hr.spacer/ - unless @warnings.empty? -- GitLab From be9352266c9ec7595c6354a8d98c990a2dc91bf8 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Thu, 14 Feb 2019 15:46:42 +0100 Subject: [PATCH 109/192] Fix hashtag column not subscribing to stream on mount (#10040) Fix #9895 --- .../glitch/features/hashtag_timeline/index.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/javascript/flavours/glitch/features/hashtag_timeline/index.js b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js index d04e9cafa7..21efaceea6 100644 --- a/app/javascript/flavours/glitch/features/hashtag_timeline/index.js +++ b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js @@ -40,15 +40,19 @@ export default class HashtagTimeline extends React.PureComponent { title = () => { let title = [this.props.params.id]; + if (this.additionalFor('any')) { - title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.any' values={{ additional: this.additionalFor('any') }} defaultMessage='or {additional}' />); + title.push(' ', <FormattedMessage key='any' id='hashtag.column_header.tag_mode.any' values={{ additional: this.additionalFor('any') }} defaultMessage='or {additional}' />); } + if (this.additionalFor('all')) { - title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.all' values={{ additional: this.additionalFor('all') }} defaultMessage='and {additional}' />); + title.push(' ', <FormattedMessage key='all' id='hashtag.column_header.tag_mode.all' values={{ additional: this.additionalFor('all') }} defaultMessage='and {additional}' />); } + if (this.additionalFor('none')) { - title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.none' values={{ additional: this.additionalFor('none') }} defaultMessage='without {additional}' />); + title.push(' ', <FormattedMessage key='none' id='hashtag.column_header.tag_mode.none' values={{ additional: this.additionalFor('none') }} defaultMessage='without {additional}' />); } + return title; } @@ -76,9 +80,10 @@ export default class HashtagTimeline extends React.PureComponent { let all = (tags.all || []).map(tag => tag.value); let none = (tags.none || []).map(tag => tag.value); - [id, ...any].map((tag) => { - this.disconnects.push(dispatch(connectHashtagStream(id, tag, (status) => { + [id, ...any].map(tag => { + this.disconnects.push(dispatch(connectHashtagStream(id, tag, status => { let tags = status.tags.map(tag => tag.name); + return all.filter(tag => tags.includes(tag)).length === all.length && none.filter(tag => tags.includes(tag)).length === 0; }))); @@ -94,12 +99,14 @@ export default class HashtagTimeline extends React.PureComponent { const { dispatch } = this.props; const { id, tags } = this.props.params; + this._subscribe(dispatch, id, tags); dispatch(expandHashtagTimeline(id, { tags })); } componentWillReceiveProps (nextProps) { const { dispatch, params } = this.props; const { id, tags } = nextProps.params; + if (id !== params.id || !isEqual(tags, params.tags)) { this._unsubscribe(); this._subscribe(dispatch, id, tags); -- GitLab From 896beb16c5318b8ce59867a06545ae6a00ccc84c Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Mon, 18 Feb 2019 19:29:32 +0100 Subject: [PATCH 110/192] [Glitch] Internationalize unexpected error message Port 4e71b104e6d5f02069120c7a56b26888c6f0fef5 to glitch-soc, fixing a crash in the process --- .../ui/containers/notifications_container.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js b/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js index 88d482bcf2..283aa2373d 100644 --- a/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js +++ b/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js @@ -1,11 +1,22 @@ +import { injectIntl } from 'react-intl'; import { connect } from 'react-redux'; import { NotificationStack } from 'react-notification'; import { dismissAlert } from 'flavours/glitch/actions/alerts'; import { getAlerts } from 'flavours/glitch/selectors'; -const mapStateToProps = state => ({ - notifications: getAlerts(state), -}); +const mapStateToProps = (state, { intl }) => { + const notifications = getAlerts(state); + + notifications.forEach(notification => ['title', 'message'].forEach(key => { + const value = notification[key]; + + if (typeof value === 'object') { + notification[key] = intl.formatMessage(value); + } + })); + + return { notifications }; +}; const mapDispatchToProps = (dispatch) => { return { @@ -15,4 +26,4 @@ const mapDispatchToProps = (dispatch) => { }; }; -export default connect(mapStateToProps, mapDispatchToProps)(NotificationStack); +export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(NotificationStack)); -- GitLab From 359d26a05345895f295a91b7728fe711cd280f84 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Tue, 19 Feb 2019 14:01:22 +0100 Subject: [PATCH 111/192] =?UTF-8?q?Fix=20=E2=80=9Creset=E2=80=9D=20button?= =?UTF-8?q?=20of=20instance=20filter=20switching=20to=20custom=20emoji=20a?= =?UTF-8?q?dmin=20panel=20(#10076)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/admin/instances/index.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml index 2a5af3b5d6..2359271407 100644 --- a/app/views/admin/instances/index.html.haml +++ b/app/views/admin/instances/index.html.haml @@ -23,7 +23,7 @@ .actions %button= t('admin.accounts.search') - = link_to t('admin.accounts.reset'), admin_custom_emojis_path, class: 'button negative' + = link_to t('admin.accounts.reset'), admin_instances_path, class: 'button negative' %hr.spacer/ -- GitLab From 8e7fc7ec73c0743df378403ad2e704c9fae70400 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Tue, 19 Feb 2019 20:00:41 +0100 Subject: [PATCH 112/192] Fix crash when conversations have no valid participants (#10078) * Never return empty participants for conversations Fixes #10068 * Fix client-side crash when conversations have no participants --- app/javascript/mastodon/components/display_name.js | 2 +- app/javascript/mastodon/components/status.js | 2 +- app/models/account_conversation.rb | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/components/display_name.js b/app/javascript/mastodon/components/display_name.js index 32809778ae..6b9dd6f81b 100644 --- a/app/javascript/mastodon/components/display_name.js +++ b/app/javascript/mastodon/components/display_name.js @@ -22,7 +22,7 @@ export default class DisplayName extends React.PureComponent { suffix = `+${others.size - 2}`; } } else { - if (others) { + if (others && others.size > 0) { account = others.first(); } else { account = this.props.account; diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 3e98d374b8..6270d3c92b 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -326,7 +326,7 @@ class Status extends ImmutablePureComponent { ); } - if (otherAccounts) { + if (otherAccounts && otherAccounts.size > 0) { statusAvatar = <AvatarComposite accounts={otherAccounts} size={48} />; } else if (account === undefined || account === null) { statusAvatar = <Avatar account={status.get('account')} size={48} />; diff --git a/app/models/account_conversation.rb b/app/models/account_conversation.rb index cc6b392798..0c03747e2a 100644 --- a/app/models/account_conversation.rb +++ b/app/models/account_conversation.rb @@ -30,7 +30,8 @@ class AccountConversation < ApplicationRecord if participant_account_ids.empty? [account] else - Account.where(id: participant_account_ids) + participants = Account.where(id: participant_account_ids) + participants.empty? ? [account] : participants end end -- GitLab From b8acdfedf1ccd4d235eb9bfc2cd3f1e9c8c82c71 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Feb 2019 15:55:50 +0900 Subject: [PATCH 113/192] Bump oj from 3.7.8 to 3.7.9 (#10082) Bumps [oj](https://github.com/ohler55/oj) from 3.7.8 to 3.7.9. - [Release notes](https://github.com/ohler55/oj/releases) - [Changelog](https://github.com/ohler55/oj/blob/master/CHANGELOG.md) - [Commits](https://github.com/ohler55/oj/compare/v3.7.8...v3.7.9) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1e4f085a9a..1bfd5a1451 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -363,7 +363,7 @@ GEM concurrent-ruby (~> 1.0, >= 1.0.2) sidekiq (>= 3.5) statsd-ruby (~> 1.4, >= 1.4.0) - oj (3.7.8) + oj (3.7.9) omniauth (1.9.0) hashie (>= 3.4.6, < 3.7.0) rack (>= 1.6.2, < 3) -- GitLab From addc8393e27268092980dc30dd589a8f33fe5227 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Feb 2019 15:56:12 +0900 Subject: [PATCH 114/192] Bump pkg-config from 1.3.3 to 1.3.4 (#10081) Bumps [pkg-config](https://github.com/ruby-gnome2/pkg-config) from 1.3.3 to 1.3.4. - [Release notes](https://github.com/ruby-gnome2/pkg-config/releases) - [Changelog](https://github.com/ruby-gnome2/pkg-config/blob/master/NEWS) - [Commits](https://github.com/ruby-gnome2/pkg-config/compare/1.3.3...1.3.4) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1bfd5a1451..dd446869f1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -400,7 +400,7 @@ GEM pg (1.1.4) pghero (2.2.0) activerecord - pkg-config (1.3.3) + pkg-config (1.3.4) powerpack (0.1.2) premailer (1.11.1) addressable -- GitLab From aa6a4b7b8aa55383f7cecbd9bc9cd2db1db13596 Mon Sep 17 00:00:00 2001 From: Daigo 3 Dango <zunda@users.noreply.github.com> Date: Wed, 20 Feb 2019 10:57:08 +0000 Subject: [PATCH 115/192] Upgrade Ruby to 2.6.1 (#9956) --- .ruby-version | 2 +- Gemfile.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.ruby-version b/.ruby-version index e70b4523ae..6a6a3d8e35 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.6.0 +2.6.1 diff --git a/Gemfile.lock b/Gemfile.lock index dd446869f1..a4691cbdf0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -771,7 +771,7 @@ DEPENDENCIES webpush RUBY VERSION - ruby 2.6.0p0 + ruby 2.6.1p33 BUNDLED WITH 1.17.3 -- GitLab From 4340d338fd2aa5665ffb2eb0cd54d689997234fe Mon Sep 17 00:00:00 2001 From: Hinaloe <hina@hinaloe.net> Date: Thu, 21 Feb 2019 01:47:38 +0900 Subject: [PATCH 116/192] correct opt-out showing application (#10086) * correct opt-out showing application refs #9994 * Revert "correct opt-out showing application" This reverts commit 0e9bb70f145be42962416a6b87c08d59a2896486. * User#shows_application? calls wrong value --- app/models/user.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 7432e3da88..83816def57 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -245,7 +245,7 @@ class User < ApplicationRecord end def shows_application? - @shows_application ||= settings.shows_application + @shows_application ||= settings.show_application end def token_for_app(a) -- GitLab From 738c03421323fdc3b474307961fdaf1dbc0c37f8 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Thu, 21 Feb 2019 19:36:48 +0100 Subject: [PATCH 117/192] Do not error out when performing admin actions on no statuses (#10094) Same as #8220 but for reports --- app/controllers/admin/reported_statuses_controller.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/controllers/admin/reported_statuses_controller.rb b/app/controllers/admin/reported_statuses_controller.rb index d3c2f5e9e9..3ba9f5df21 100644 --- a/app/controllers/admin/reported_statuses_controller.rb +++ b/app/controllers/admin/reported_statuses_controller.rb @@ -10,6 +10,10 @@ module Admin @form = Form::StatusBatch.new(form_status_batch_params.merge(current_account: current_account, action: action_from_button)) flash[:alert] = I18n.t('admin.statuses.failed_to_execute') unless @form.save + redirect_to admin_report_path(@report) + rescue ActionController::ParameterMissing + flash[:alert] = I18n.t('admin.statuses.no_status_selected') + redirect_to admin_report_path(@report) end -- GitLab From 4532833498aca159e22ba43f47f705da39170cf5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Feb 2019 20:06:01 +0900 Subject: [PATCH 118/192] Bump pry-byebug from 3.6.0 to 3.7.0 (#10098) Bumps [pry-byebug](https://github.com/deivid-rodriguez/pry-byebug) from 3.6.0 to 3.7.0. - [Release notes](https://github.com/deivid-rodriguez/pry-byebug/releases) - [Changelog](https://github.com/deivid-rodriguez/pry-byebug/blob/master/CHANGELOG.md) - [Commits](https://github.com/deivid-rodriguez/pry-byebug/compare/v3.6.0...v3.7.0) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index e01d168b63..3309be52be 100644 --- a/Gemfile +++ b/Gemfile @@ -97,7 +97,7 @@ group :development, :test do gem 'fabrication', '~> 2.20' gem 'fuubar', '~> 2.3' gem 'i18n-tasks', '~> 0.9', require: false - gem 'pry-byebug', '~> 3.6' + gem 'pry-byebug', '~> 3.7' gem 'pry-rails', '~> 0.3' gem 'rspec-rails', '~> 3.8' end diff --git a/Gemfile.lock b/Gemfile.lock index a4691cbdf0..8d46764e78 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -109,7 +109,7 @@ GEM bundler-audit (0.6.1) bundler (>= 1.2.0, < 3) thor (~> 0.18) - byebug (10.0.2) + byebug (11.0.0) capistrano (3.11.0) airbrussh (>= 1.0.0) i18n @@ -413,8 +413,8 @@ GEM pry (0.12.2) coderay (~> 1.1.0) method_source (~> 0.9.0) - pry-byebug (3.6.0) - byebug (~> 10.0) + pry-byebug (3.7.0) + byebug (~> 11.0) pry (~> 0.10) pry-rails (0.3.9) pry (>= 0.10.4) @@ -729,7 +729,7 @@ DEPENDENCIES posix-spawn! premailer-rails private_address_check (~> 0.5) - pry-byebug (~> 3.6) + pry-byebug (~> 3.7) pry-rails (~> 0.3) puma (~> 3.12) pundit (~> 2.0) -- GitLab From d7ad42a8884d8d77d4a1c0240e629071e82ed996 Mon Sep 17 00:00:00 2001 From: Hinaloe <hina@hinaloe.net> Date: Sat, 23 Feb 2019 00:52:04 +0900 Subject: [PATCH 119/192] Randomize emoji filename (#10090) --- app/controllers/admin/custom_emojis_controller.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/controllers/admin/custom_emojis_controller.rb b/app/controllers/admin/custom_emojis_controller.rb index d61bafdf02..f776991667 100644 --- a/app/controllers/admin/custom_emojis_controller.rb +++ b/app/controllers/admin/custom_emojis_controller.rb @@ -5,6 +5,9 @@ module Admin before_action :set_custom_emoji, except: [:index, :new, :create] before_action :set_filter_params + include ObfuscateFilename + obfuscate_filename [:custom_emoji, :image] + def index authorize :custom_emoji, :index? @custom_emojis = filtered_custom_emojis.eager_load(:local_counterpart).page(params[:page]) -- GitLab From d82de360c13894746d3974d11c9505c8937ebdee Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Thu, 21 Feb 2019 21:13:12 +0100 Subject: [PATCH 120/192] Fix non-numeric account identifiers leading to /web/accounts/NaN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I'm not sure what purpose these “+†served?! --- app/javascript/flavours/glitch/components/status_header.js | 2 +- app/javascript/flavours/glitch/components/status_prepend.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/flavours/glitch/components/status_header.js b/app/javascript/flavours/glitch/components/status_header.js index 65458e3f03..f9321904ca 100644 --- a/app/javascript/flavours/glitch/components/status_header.js +++ b/app/javascript/flavours/glitch/components/status_header.js @@ -19,7 +19,7 @@ export default class StatusHeader extends React.PureComponent { // Handles clicks on account name/image handleAccountClick = (e) => { const { status, parseClick } = this.props; - parseClick(e, `/accounts/${+status.getIn(['account', 'id'])}`); + parseClick(e, `/accounts/${status.getIn(['account', 'id'])}`); } // Rendering. diff --git a/app/javascript/flavours/glitch/components/status_prepend.js b/app/javascript/flavours/glitch/components/status_prepend.js index f4ef83135f..4e329f546e 100644 --- a/app/javascript/flavours/glitch/components/status_prepend.js +++ b/app/javascript/flavours/glitch/components/status_prepend.js @@ -15,7 +15,7 @@ export default class StatusPrepend extends React.PureComponent { handleClick = (e) => { const { account, parseClick } = this.props; - parseClick(e, `/accounts/${+account.get('id')}`); + parseClick(e, `/accounts/${account.get('id')}`); } Message = () => { -- GitLab From 3c86a7856f3e8a35b6bb05d79b4ddf96802ee459 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Sat, 23 Feb 2019 18:41:28 +0100 Subject: [PATCH 121/192] Weblate translations (2019-02-23) (#10103) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Translated using Weblate (Japanese) Currently translated at 98,9% (354 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/ * Translated using Weblate (Greek) Currently translated at 96,9% (739 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/el/ * Translated using Weblate (Greek) Currently translated at 100,0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/ * Translated using Weblate (Greek) Currently translated at 100,0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/ * Translated using Weblate (Greek) Currently translated at 100,0% (111 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/el/ * Translated using Weblate (Czech) Currently translated at 100,0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/ rename from "instance" to "server" * Translated using Weblate (Czech) Currently translated at 99,9% (762 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/ * Translated using Weblate (Czech) Currently translated at 100.0% (111 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/cs/ * Translated using Weblate (Finnish) Currently translated at 93,7% (59 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fi/ * Translated using Weblate (Finnish) Currently translated at 87,4% (313 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/ * Translated using Weblate (Finnish) Currently translated at 72,6% (554 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fi/ * Translated using Weblate (Galician) Currently translated at 100,0% (763 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/gl/ * Translated using Weblate (Galician) Currently translated at 100,0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/ * Translated using Weblate (Galician) Currently translated at 100,0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/gl/ * Translated using Weblate (Galician) Currently translated at 100,0% (111 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/gl/ * Translated using Weblate (Slovak) Currently translated at 96,9% (739 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Slovak) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/ * Translated using Weblate (Dutch) Currently translated at 100,0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/ * Translated using Weblate (Dutch) Currently translated at 100,0% (111 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/nl/ * Translated using Weblate (Dutch) Currently translated at 100,0% (763 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/ * Translated using Weblate (Dutch) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/ * Translated using Weblate (Lithuanian) Currently translated at 53.6% (409 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/lt/ * Translated using Weblate (Lithuanian) Currently translated at 62.6% (478 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/lt/ Check if "Sign up" is changed. * Translated using Weblate (Slovak) Currently translated at 100.0% (111 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/ * Translated using Weblate (Esperanto) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/ * Translated using Weblate (French) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fr/ * Translated using Weblate (Finnish) Currently translated at 73.4% (560 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fi/ * Translated using Weblate (Lithuanian) Currently translated at 66.7% (509 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/lt/ * Translated using Weblate (Finnish) Currently translated at 89.1% (319 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/ * Translated using Weblate (Slovak) Currently translated at 99.7% (761 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Esperanto) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/ * Translated using Weblate (Finnish) Currently translated at 47.7% (53 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fi/ * Translated using Weblate (Esperanto) Currently translated at 80.2% (89 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eo/ * Translated using Weblate (French) Currently translated at 97.3% (108 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fr/ * Translated using Weblate (Corsican) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/co/ * Translated using Weblate (French) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Translated using Weblate (French) Currently translated at 97.8% (746 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (Corsican) Currently translated at 100.0% (111 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/co/ * Translated using Weblate (Corsican) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/co/ * Translated using Weblate (Corsican) Currently translated at 99.6% (760 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/co/ * Translated using Weblate (Corsican) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/co/ * Translated using Weblate (Occitan) Currently translated at 96.4% (107 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/oc/ * Translated using Weblate (French) Currently translated at 100.0% (111 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fr/ * Translated using Weblate (Corsican) Currently translated at 99.9% (762 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/co/ * Translated using Weblate (French) Currently translated at 99.6% (760 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (French) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Translated using Weblate (French) Currently translated at 99.6% (760 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (French) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Translated using Weblate (Occitan) Currently translated at 98.2% (109 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/oc/ * Translated using Weblate (French) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fr/ * Translated using Weblate (Czech) Currently translated at 99.9% (762 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/ * Translated using Weblate (French) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fr/ * Translated using Weblate (French) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Translated using Weblate (Slovak) Currently translated at 99.7% (761 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (French) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Translated using Weblate (Slovak) Currently translated at 99.7% (761 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Turkish) Currently translated at 29.8% (227 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/tr/ * Added translation using Weblate (Turkish) * Translated using Weblate (French) Currently translated at 99.9% (762 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (Turkish) Currently translated at 36.0% (275 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/tr/ * Translated using Weblate (French) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Translated using Weblate (Turkish) Currently translated at 64.2% (230 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/tr/ * Translated using Weblate (Turkish) Currently translated at 32.4% (36 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/tr/ * Added translation using Weblate (Turkish) * Translated using Weblate (Turkish) Currently translated at 12.7% (8 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/tr/ * Added translation using Weblate (Turkish) * Translated using Weblate (Turkish) Currently translated at 100.0% (2 of 2 strings) Translation: Mastodon/Activerecord Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/tr/ * Translated using Weblate (Turkish) Currently translated at 36.8% (281 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/tr/ * Translated using Weblate (Turkish) Currently translated at 9.2% (9 of 98 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/tr/ * Translated using Weblate (Turkish) Currently translated at 64.2% (230 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/tr/ * Translated using Weblate (Slovak) Currently translated at 99.7% (761 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Turkish) Currently translated at 40.0% (305 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/tr/ * Translated using Weblate (Basque) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/eu/ * Translated using Weblate (Greek) Currently translated at 96.9% (739 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/el/ * Translated using Weblate (Slovak) Currently translated at 99.7% (761 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Basque) Currently translated at 100.0% (111 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eu/ * Translated using Weblate (Basque) Currently translated at 100.0% (763 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/ * Translated using Weblate (Basque) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eu/ * Translated using Weblate (German) Currently translated at 100,0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/de/ * Translated using Weblate (German) Currently translated at 100,0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/de/ * Translated using Weblate (German) Currently translated at 100,0% (111 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/de/ * Translated using Weblate (German) Currently translated at 100,0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/de/ * Translated using Weblate (Arabic) Currently translated at 95.5% (106 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/ * Translated using Weblate (German) Currently translated at 99.9% (762 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/ * Translated using Weblate (German) Currently translated at 100.0% (111 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/de/ * Translated using Weblate (Danish) Currently translated at 100,0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/da/ * Translated using Weblate (Arabic) Currently translated at 95,5% (106 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/ يمكن ان تكون هاش تاج ايضا ؟؟ * Translated using Weblate (Arabic) Currently translated at 98,9% (354 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ar/ * Translated using Weblate (Danish) Currently translated at 82,9% (92 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/da/ * Translated using Weblate (Albanian) Currently translated at 63.2% (482 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/ * Translated using Weblate (Albanian) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sq/ * Translated using Weblate (Albanian) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sq/ * Translated using Weblate (Albanian) Currently translated at 92.7% (332 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sq/ * Translated using Weblate (Albanian) Currently translated at 93.9% (336 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sq/ * Translated using Weblate (Albanian) Currently translated at 94.1% (337 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sq/ * Translated using Weblate (Albanian) Currently translated at 66.7% (74 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sq/ * Translated using Weblate (Albanian) Currently translated at 94.4% (338 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sq/ * Translated using Weblate (Greek) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/ * Translated using Weblate (Albanian) Currently translated at 89.2% (99 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sq/ * Translated using Weblate (Albanian) Currently translated at 92.8% (103 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sq/ * Translated using Weblate (Albanian) Currently translated at 93.7% (104 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sq/ * Translated using Weblate (Albanian) Currently translated at 79.9% (610 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/ * Translated using Weblate (Galician) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/ * Translated using Weblate (Albanian) Currently translated at 88.9% (678 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/ * Translated using Weblate (Dutch) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/ * Translated using Weblate (Albanian) Currently translated at 89.1% (680 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/ * Translated using Weblate (Dutch) Currently translated at 100.0% (763 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/ * Translated using Weblate (Dutch) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/ * Translated using Weblate (Albanian) Currently translated at 93.1% (710 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/ * Translated using Weblate (Korean) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ko/ * Translated using Weblate (Korean) Currently translated at 99.0% (755 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ko/ * Translated using Weblate (Korean) Currently translated at 100.0% (111 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ko/ * Translated using Weblate (Korean) Currently translated at 100.0% (763 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ko/ * Translated using Weblate (Korean) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ko/ * Translated using Weblate (Albanian) Currently translated at 96.1% (733 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/ * Translated using Weblate (Persian) Currently translated at 94.1% (337 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fa/ * Translated using Weblate (Lithuanian) Currently translated at 91.0% (694 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/lt/ * Translated using Weblate (Persian) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fa/ * Translated using Weblate (Czech) Currently translated at 99.9% (762 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/ * Translated using Weblate (Lithuanian) Currently translated at 99.9% (762 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/lt/ * Translated using Weblate (Persian) Currently translated at 85.3% (651 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fa/ * Translated using Weblate (Czech) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/ * Translated using Weblate (Persian) Currently translated at 100.0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fa/ * Translated using Weblate (Persian) Currently translated at 88.7% (677 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fa/ * Translated using Weblate (Albanian) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sq/ * Translated using Weblate (Albanian) Currently translated at 97.5% (744 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/ * Translated using Weblate (Albanian) Currently translated at 99.6% (760 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/ * Translated using Weblate (Albanian) Currently translated at 100.0% (111 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sq/ * Translated using Weblate (Slovak) Currently translated at 99.7% (761 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/ * Translated using Weblate (Persian) Currently translated at 99.7% (761 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fa/ * Translated using Weblate (Persian) Currently translated at 100.0% (358 of 358 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fa/ * Translated using Weblate (Persian) Currently translated at 81.1% (90 of 111 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fa/ * Added translation using Weblate (Kazakh) * Added translation using Weblate (Kazakh) * Translated using Weblate (Kazakh) Currently translated at 48,5% (370 of 763 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/kk/ * Translated using Weblate (Kazakh) Currently translated at 100,0% (2 of 2 strings) Translation: Mastodon/Activerecord Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/kk/ * Added translation using Weblate (Kazakh) * Translated using Weblate (Kazakh) Currently translated at 100,0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/kk/ * Added translation using Weblate (Kazakh) * Added translation using Weblate (Kazakh) * Translated using Weblate (Kazakh) Currently translated at 100,0% (63 of 63 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/kk/ * Translated using Weblate (Kazakh) Currently translated at 100,0% (98 of 98 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/kk/ * i18n-tasks normalize * yarn manage:translations * Fix inconsistent interpolations * Add missing plural forms --- app/javascript/mastodon/locales/ar.json | 33 +- app/javascript/mastodon/locales/ast.json | 3 + app/javascript/mastodon/locales/bg.json | 3 + app/javascript/mastodon/locales/ca.json | 3 + app/javascript/mastodon/locales/co.json | 13 +- app/javascript/mastodon/locales/cs.json | 11 +- app/javascript/mastodon/locales/cy.json | 3 + app/javascript/mastodon/locales/da.json | 3 + app/javascript/mastodon/locales/de.json | 13 +- .../mastodon/locales/defaultMessages.json | 17 + app/javascript/mastodon/locales/el.json | 13 +- app/javascript/mastodon/locales/en.json | 3 + app/javascript/mastodon/locales/eo.json | 63 +- app/javascript/mastodon/locales/es.json | 3 + app/javascript/mastodon/locales/eu.json | 13 +- app/javascript/mastodon/locales/fa.json | 93 +- app/javascript/mastodon/locales/fi.json | 27 +- app/javascript/mastodon/locales/fr.json | 75 +- app/javascript/mastodon/locales/gl.json | 11 +- app/javascript/mastodon/locales/he.json | 3 + app/javascript/mastodon/locales/hr.json | 3 + app/javascript/mastodon/locales/hu.json | 3 + app/javascript/mastodon/locales/hy.json | 3 + app/javascript/mastodon/locales/id.json | 3 + app/javascript/mastodon/locales/io.json | 3 + app/javascript/mastodon/locales/it.json | 3 + app/javascript/mastodon/locales/ja.json | 5 +- app/javascript/mastodon/locales/ka.json | 3 + app/javascript/mastodon/locales/kk.json | 363 ++++++++ app/javascript/mastodon/locales/ko.json | 11 +- app/javascript/mastodon/locales/lv.json | 3 + app/javascript/mastodon/locales/ms.json | 3 + app/javascript/mastodon/locales/nl.json | 15 +- app/javascript/mastodon/locales/no.json | 3 + app/javascript/mastodon/locales/oc.json | 3 + app/javascript/mastodon/locales/pl.json | 3 + app/javascript/mastodon/locales/pt-BR.json | 3 + app/javascript/mastodon/locales/pt.json | 3 + app/javascript/mastodon/locales/ro.json | 3 + app/javascript/mastodon/locales/ru.json | 3 + app/javascript/mastodon/locales/sk.json | 7 +- app/javascript/mastodon/locales/sl.json | 3 + app/javascript/mastodon/locales/sq.json | 705 +++++++-------- app/javascript/mastodon/locales/sr-Latn.json | 3 + app/javascript/mastodon/locales/sr.json | 3 + app/javascript/mastodon/locales/sv.json | 3 + app/javascript/mastodon/locales/ta.json | 3 + app/javascript/mastodon/locales/te.json | 3 + app/javascript/mastodon/locales/th.json | 3 + app/javascript/mastodon/locales/tr.json | 195 ++-- app/javascript/mastodon/locales/uk.json | 3 + .../mastodon/locales/whitelist_kk.json | 2 + app/javascript/mastodon/locales/zh-CN.json | 3 + app/javascript/mastodon/locales/zh-HK.json | 3 + app/javascript/mastodon/locales/zh-TW.json | 3 + config/locales/activerecord.kk.yml | 13 + config/locales/activerecord.tr.yml | 13 + config/locales/co.yml | 53 +- config/locales/cs.yml | 31 +- config/locales/de.yml | 57 +- config/locales/devise.co.yml | 6 +- config/locales/devise.da.yml | 6 +- config/locales/devise.de.yml | 6 +- config/locales/devise.eu.yml | 6 +- config/locales/devise.fa.yml | 1 + config/locales/devise.fi.yml | 1 + config/locales/devise.fr.yml | 16 +- config/locales/devise.gl.yml | 6 +- config/locales/devise.kk.yml | 83 ++ config/locales/devise.sq.yml | 6 +- config/locales/devise.tr.yml | 15 + config/locales/doorkeeper.kk.yml | 142 +++ config/locales/doorkeeper.tr.yml | 19 + config/locales/el.yml | 13 +- config/locales/eu.yml | 53 +- config/locales/fa.yml | 133 ++- config/locales/fi.yml | 28 +- config/locales/fr.yml | 45 +- config/locales/gl.yml | 57 +- config/locales/kk.yml | 445 +++++++++ config/locales/ko.yml | 49 +- config/locales/lt.yml | 849 +++++++++++++++++- config/locales/nl.yml | 21 +- config/locales/simple_form.ar.yml | 7 +- config/locales/simple_form.co.yml | 8 +- config/locales/simple_form.cs.yml | 6 + config/locales/simple_form.da.yml | 2 +- config/locales/simple_form.de.yml | 10 +- config/locales/simple_form.el.yml | 6 + config/locales/simple_form.eo.yml | 4 + config/locales/simple_form.eu.yml | 8 +- config/locales/simple_form.fa.yml | 2 + config/locales/simple_form.fi.yml | 3 + config/locales/simple_form.fr.yml | 6 + config/locales/simple_form.gl.yml | 8 +- config/locales/simple_form.ko.yml | 8 +- config/locales/simple_form.nl.yml | 6 + config/locales/simple_form.oc.yml | 5 +- config/locales/simple_form.sk.yml | 8 +- config/locales/simple_form.sq.yml | 134 ++- config/locales/simple_form.tr.yml | 4 + config/locales/sk.yml | 68 +- config/locales/sq.yml | 442 ++++++++- config/locales/tr.yml | 132 ++- 104 files changed, 3959 insertions(+), 881 deletions(-) create mode 100644 app/javascript/mastodon/locales/kk.json create mode 100644 app/javascript/mastodon/locales/whitelist_kk.json create mode 100644 config/locales/activerecord.kk.yml create mode 100644 config/locales/activerecord.tr.yml create mode 100644 config/locales/devise.kk.yml create mode 100644 config/locales/devise.tr.yml create mode 100644 config/locales/doorkeeper.kk.yml create mode 100644 config/locales/doorkeeper.tr.yml create mode 100644 config/locales/kk.yml diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 78e63e5e68..7de65f91fa 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -1,5 +1,5 @@ { - "account.add_or_remove_from_list": "اضاÙÙˆ أو ØØ°Ù Ù…ÙÙ† القوائم", + "account.add_or_remove_from_list": "أضيÙ/ÙŠ أو Ø£ØØ°Ù/ÙŠ من القائمة", "account.badges.bot": "روبوت", "account.block": "Øظر @{name}", "account.block_domain": "إخÙاء كل شيئ قادم من إسم النطاق {domain}", @@ -8,30 +8,30 @@ "account.disclaimer_full": "قد لا تعكس المعلومات أدناه المل٠الشخصي الكامل للمستخدم.", "account.domain_blocked": "النطاق مخÙÙŠ", "account.edit_profile": "تعديل المل٠الشخصي", - "account.endorse": "إبرازه على المل٠الشخصي", + "account.endorse": "خاصّية على المل٠الشخصي", "account.follow": "تابÙع", - "account.followers": "المتابعون", + "account.followers": "متابعون", "account.followers.empty": "لا Ø£Øد يتبع هذا الØساب بعد.", "account.follows": "يتبع", - "account.follows.empty": "هذا المستخدÙÙ… لا يتبع Ø£Øدًا بعد.", + "account.follows.empty": "هذا الØساب لا يتبع Ø£Øدًا بعد.", "account.follows_you": "يتابعك", "account.hide_reblogs": "إخÙاء ترقيات @{name}", - "account.link_verified_on": "تم التØقق Ù…ÙÙ† مالك هذا الرابط بتاريخ {date}", - "account.locked_info": "تم تأمين خصوصية هذا الØساب عبر Ù‚ÙÙÙ„. ÙصاØب الØساب ÙŠÙراجÙع يدويا طلبات المتابَعة Ùˆ الاشتراك بØسابه.", + "account.link_verified_on": "تم التØقق Ù…ÙÙ† Ù…Ùلْكية هذا الرابط بتاريخ {date}", + "account.locked_info": "تم تأمين خصوصية هذا الØساب عبر Ù‚ÙÙ„. صاØب الØساب ÙŠÙراجÙع يدويا طلبات المتابَعة Ùˆ الاشتراك بØسابه.", "account.media": "وسائط", - "account.mention": "Ø£ÙذكÙر @{name}", + "account.mention": "Ø£ÙذكÙر/ÙŠ @{name}", "account.moved_to": "{name} إنتقل إلى :", - "account.mute": "أكتم @{name}", - "account.mute_notifications": "كتم إخطارات @{name}", + "account.mute": "كتم @{name}", + "account.mute_notifications": "كتم الإخطارات من @{name}", "account.muted": "مكتوم", "account.posts": "التبويقات", "account.posts_with_replies": "التبويقات Ùˆ الردود", - "account.report": "أبلغ عن @{name}", - "account.requested": "ÙÙŠ انتظار المواÙقة", - "account.share": "مشاركة @{name}'s profile", + "account.report": "أبلغ/ÙŠ عن @{name}", + "account.requested": "ÙÙŠ انتظار المواÙقة. اضْغَطْ/ÙŠ لإلغاء طلب المتابعة", + "account.share": "مشاركة Øساب @{name}", "account.show_reblogs": "عرض ترقيات @{name}", "account.unblock": "إلغاء الØظر عن @{name}", - "account.unblock_domain": "ÙÙƒ Øظر {domain}", + "account.unblock_domain": "ÙÙƒ الخْÙÙ‰ عن {domain}", "account.unendorse": "إزالة ترويجه Ù…ÙÙ† المل٠الشخصي", "account.unfollow": "إلغاء المتابعة", "account.unmute": "إلغاء الكتم عن @{name}", @@ -39,7 +39,7 @@ "account.view_full_profile": "عرض المل٠الشخصي كاملا", "alert.unexpected.message": "لقد طرأ هناك خطأ غير متوقّع.", "alert.unexpected.title": "المعذرة !", - "boost_modal.combo": "يمكنك ضغط {combo} لتخطّي هذه ÙÙŠ المرّة القادمة", + "boost_modal.combo": "يمكنك/ÙŠ ضغط {combo} لتخطّي هذه ÙÙŠ المرّة القادمة", "bundle_column_error.body": "لقد وقع هناك خطأ أثناء عملية تØميل هذا العنصر.", "bundle_column_error.retry": "إعادة المØاولة", "bundle_column_error.title": "خطأ ÙÙŠ الشبكة", @@ -47,7 +47,7 @@ "bundle_modal_error.message": "لقد وقع هناك خطأ أثناء عملية تØميل هذا العنصر.", "bundle_modal_error.retry": "إعادة المØاولة", "column.blocks": "الØسابات المØجوبة", - "column.community": "الخيط العام المØلي", + "column.community": "التَسَلْسÙÙ„ الزَمني المØلي", "column.direct": "الرسائل المباشرة", "column.domain_blocks": "النطاقات المخÙية", "column.favourites": "المÙضلة", @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "Ùˆ {additional}", "hashtag.column_header.tag_mode.any": "أو {additional}", "hashtag.column_header.tag_mode.none": "بدون {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "كلها", "hashtag.column_settings.tag_mode.any": "أي كان Ù…ÙÙ† هذه", "hashtag.column_settings.tag_mode.none": "لا شيء Ù…ÙÙ† هذه", @@ -204,6 +206,7 @@ "lists.account.remove": "Ø¥Øذ٠من القائمة", "lists.delete": "Delete list", "lists.edit": "تعديل القائمة", + "lists.edit.submit": "Change title", "lists.new.create": "إنشاء قائمة", "lists.new.title_placeholder": "عنوان القائمة الجديدة", "lists.search": "إبØØ« ÙÙŠ قائمة الØسابات التي تÙتابÙعها", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index a94e235722..1e7ecb550b 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Desaniciar de la llista", "lists.delete": "Desaniciar la llista", "lists.edit": "Editar la llista", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "TÃtulu nuevu de la llista", "lists.search": "Guetar ente la xente que sigues", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index a5ab165b75..9e5d46503d 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 8519590b75..8d1d4777b9 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "i {additional}", "hashtag.column_header.tag_mode.any": "o {additional}", "hashtag.column_header.tag_mode.none": "sense {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Tots aquests", "hashtag.column_settings.tag_mode.any": "Qualsevol d’aquests", "hashtag.column_settings.tag_mode.none": "Cap d’aquests", @@ -204,6 +206,7 @@ "lists.account.remove": "Treure de la llista", "lists.delete": "Delete list", "lists.edit": "Editar llista", + "lists.edit.submit": "Change title", "lists.new.create": "Afegir llista", "lists.new.title_placeholder": "Nova llista", "lists.search": "Cercar entre les persones que segueixes", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index b4d8f9781f..c308d807a6 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -128,7 +128,7 @@ "empty_column.lists": "Ùn avete manc'una lista. Quandu farete una, sarà mustrata quì.", "empty_column.mutes": "Per avà ùn avete manc'un utilizatore piattatu.", "empty_column.notifications": "Ùn avete ancu nisuna nutificazione. Interact with others to start the conversation.", - "empty_column.public": "Ùn c'hè nunda quì! Scrivete qualcosa in pubblicu o seguitate utilizatori d'altre istanze per empie a linea pubblica", + "empty_column.public": "Ùn c'hè nunda quì! Scrivete qualcosa in pubblicu o seguitate utilizatori d'altri servori per empie a linea pubblica", "follow_request.authorize": "Auturizà ", "follow_request.reject": "Righjittà ", "getting_started.developers": "Sviluppatori", @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "è {additional}", "hashtag.column_header.tag_mode.any": "o {additional}", "hashtag.column_header.tag_mode.none": "senza {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Tutti quessi", "hashtag.column_settings.tag_mode.any": "Unu di quessi", "hashtag.column_settings.tag_mode.none": "Nisunu di quessi", @@ -204,6 +206,7 @@ "lists.account.remove": "Toglie di a lista", "lists.delete": "Supprime a lista", "lists.edit": "Mudificà a lista", + "lists.edit.submit": "Change title", "lists.new.create": "Aghjustà una lista", "lists.new.title_placeholder": "Titulu di a lista", "lists.search": "Circà indè i vostr'abbunamenti", @@ -224,7 +227,7 @@ "navigation_bar.favourites": "Favuriti", "navigation_bar.filters": "Parolle silenzate", "navigation_bar.follow_requests": "Dumande d'abbunamentu", - "navigation_bar.info": "À prupositu di l'istanza", + "navigation_bar.info": "À prupositu di u servore", "navigation_bar.keyboard_shortcuts": "Accorte cù a tastera", "navigation_bar.lists": "Liste", "navigation_bar.logout": "Scunnettassi", @@ -276,7 +279,7 @@ "reply_indicator.cancel": "Annullà ", "report.forward": "Trasferisce à {target}", "report.forward_hint": "U contu hè nant'à un'altru servore. Vulete ancu mandà una copia anonima di u signalamentu quallà ?", - "report.hint": "U signalamentu sarà mandatu à i muderatori di l'istanza. Pudete spiegà perchè avete palisatu stu contu quì sottu:", + "report.hint": "U signalamentu sarà mandatu à i muderatori di u servore. Pudete spiegà perchè avete palisatu stu contu quì sottu:", "report.placeholder": "Altri cummenti", "report.submit": "Mandà ", "report.target": "Signalamentu", @@ -297,7 +300,7 @@ "status.block": "Bluccà @{name}", "status.cancel_reblog_private": "Ùn sparte più", "status.cannot_reblog": "Stu statutu ùn pò micca esse spartutu", - "status.copy": "Copy link to status", + "status.copy": "Cupià ligame indè u statutu", "status.delete": "Toglie", "status.detailed_status": "Vista in ditagliu di a cunversazione", "status.direct": "Mandà un missaghju @{name}", @@ -343,7 +346,7 @@ "ui.beforeunload": "A bruttacopia sarà persa s'ellu hè chjosu Mastodon.", "upload_area.title": "Drag & drop per caricà un fugliale", "upload_button.label": "Aghjunghje un media (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "File upload limit exceeded.", + "upload_error.limit": "Limita di caricamentu di fugliali trapassata.", "upload_form.description": "Discrive per i malvistosi", "upload_form.focus": "Cambià a vista", "upload_form.undo": "Sguassà ", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 508b5debeb..d26ef82845 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -105,7 +105,7 @@ "emoji_button.food": "JÃdla a nápoje", "emoji_button.label": "Vložit emoji", "emoji_button.nature": "PÅ™Ãroda", - "emoji_button.not_found": "Žádné emoji!! (╯°□°)╯︵ â”»â”â”»", + "emoji_button.not_found": "Žádná emoji!! (╯°□°)╯︵ â”»â”â”»", "emoji_button.objects": "PÅ™edmÄ›ty", "emoji_button.people": "Lidé", "emoji_button.recent": "ÄŒasto použÃvané", @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "a {additional}", "hashtag.column_header.tag_mode.any": "nebo {additional}", "hashtag.column_header.tag_mode.none": "bez {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "VÅ¡echny z tÄ›chto", "hashtag.column_settings.tag_mode.any": "Jakékoliv z tÄ›chto", "hashtag.column_settings.tag_mode.none": "Žádné z tÄ›chto", @@ -155,7 +157,7 @@ "introduction.federation.home.headline": "Domů", "introduction.federation.home.text": "PÅ™ÃspÄ›vky od lidÃ, které sledujete, se objevà ve vaÅ¡em domovském proudu. Můžete sledovat kohokoliv na jakémkoliv serveru!", "introduction.federation.local.headline": "MÃstnÃ", - "introduction.federation.local.text": "VeÅ™ejné pÅ™ÃspÄ›vky od lidà ze stejného serveru, jako vy, se zobrazà na mÃstnà Äasové ose.", + "introduction.federation.local.text": "VeÅ™ejné pÅ™ÃspÄ›vky od lidà ze stejného serveru jako vy se zobrazà na mÃstnà Äasové ose.", "introduction.interactions.action": "DokonÄit tutoriál!", "introduction.interactions.favourite.headline": "OblÃbenÃ", "introduction.interactions.favourite.text": "OblÃbenÃm si můžete uložit toot na pozdÄ›ji a dát jeho autorovi vÄ›dÄ›t, že se vám lÃbÃ.", @@ -204,6 +206,7 @@ "lists.account.remove": "Odebrat ze seznamu", "lists.delete": "Smazat seznam", "lists.edit": "Upravit seznam", + "lists.edit.submit": "Change title", "lists.new.create": "PÅ™idat seznam", "lists.new.title_placeholder": "Název nového seznamu", "lists.search": "Hledejte mezi lidmi, které sledujete", @@ -297,7 +300,7 @@ "status.block": "Zablokovat uživatele @{name}", "status.cancel_reblog_private": "ZruÅ¡it boost", "status.cannot_reblog": "Tento pÅ™ÃspÄ›vek nemůže být boostnutý", - "status.copy": "Copy link to status", + "status.copy": "KopÃrovat odkaz k pÅ™ÃspÄ›vku", "status.delete": "Smazat", "status.detailed_status": "Detailnà zobrazenà konverzace", "status.direct": "Poslat pÅ™Ãmou zprávu uživateli @{name}", @@ -343,7 +346,7 @@ "ui.beforeunload": "Váš koncept se ztratÃ, pokud Mastodon opustÃte.", "upload_area.title": "PÅ™etaženÃm nahrajete", "upload_button.label": "PÅ™idat média (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "File upload limit exceeded.", + "upload_error.limit": "Byl pÅ™ekroÄen limit nahraných souborů.", "upload_form.description": "Popis pro zrakovÄ› postižené", "upload_form.focus": "ZmÄ›nit náhled", "upload_form.undo": "Smazat", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index df08b907c1..95c8632f73 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "a {additional}", "hashtag.column_header.tag_mode.any": "neu {additional}", "hashtag.column_header.tag_mode.none": "heb {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Pob un o'r rhain", "hashtag.column_settings.tag_mode.any": "Unrhyw un o'r rhain", "hashtag.column_settings.tag_mode.none": "Dim o'r rhain", @@ -204,6 +206,7 @@ "lists.account.remove": "Dileu o'r rhestr", "lists.delete": "Dileu rhestr", "lists.edit": "Golygwch rhestr", + "lists.edit.submit": "Change title", "lists.new.create": "Ychwanegu rhestr", "lists.new.title_placeholder": "Teitl rhestr newydd", "lists.search": "Chwilio ymysg pobl yr ydych yn ei ddilyn", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index f418d26f79..f383f2c9c2 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Fjern fra liste", "lists.delete": "Slet liste", "lists.edit": "Rediger liste", + "lists.edit.submit": "Change title", "lists.new.create": "Tilføj liste", "lists.new.title_placeholder": "Ny liste titel", "lists.search": "Søg iblandt folk du følger", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index e7cfd48b72..18e496b0ed 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -128,7 +128,7 @@ "empty_column.lists": "Du hast noch keine Listen. Wenn du eine anlegst, wird sie hier angezeigt.", "empty_column.mutes": "Du hast keine Profile stummgeschaltet.", "empty_column.notifications": "Du hast noch keine Mitteilungen. Interagiere mit anderen, um ins Gespräch zu kommen.", - "empty_column.public": "Hier ist nichts zu sehen! Schreibe etwas öffentlich oder folge Profilen von anderen Instanzen, um die Zeitleiste aufzufüllen", + "empty_column.public": "Hier ist nichts zu sehen! Schreibe etwas öffentlich oder folge Profilen von anderen Servern, um die Zeitleiste aufzufüllen", "follow_request.authorize": "Erlauben", "follow_request.reject": "Ablehnen", "getting_started.developers": "Entwickler", @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "und {additional}", "hashtag.column_header.tag_mode.any": "oder {additional}", "hashtag.column_header.tag_mode.none": "ohne {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All diese", "hashtag.column_settings.tag_mode.any": "Eine von diesen", "hashtag.column_settings.tag_mode.none": "Keine von diesen", @@ -204,6 +206,7 @@ "lists.account.remove": "Von der Liste entfernen", "lists.delete": "Delete list", "lists.edit": "Liste bearbeiten", + "lists.edit.submit": "Change title", "lists.new.create": "Liste hinzufügen", "lists.new.title_placeholder": "Neuer Titel der Liste", "lists.search": "Suche nach Leuten denen du folgst", @@ -224,7 +227,7 @@ "navigation_bar.favourites": "Favoriten", "navigation_bar.filters": "Stummgeschaltene Wörter", "navigation_bar.follow_requests": "Folgeanfragen", - "navigation_bar.info": "Ãœber diese Instanz", + "navigation_bar.info": "Ãœber diesen Server", "navigation_bar.keyboard_shortcuts": "Tastenkombinationen", "navigation_bar.lists": "Listen", "navigation_bar.logout": "Abmelden", @@ -276,7 +279,7 @@ "reply_indicator.cancel": "Abbrechen", "report.forward": "An {target} weiterleiten", "report.forward_hint": "Dieses Konto ist von einem anderen Server. Soll eine anonymisierte Kopie des Berichts auch dorthin geschickt werden?", - "report.hint": "Der Bericht wird an die Moderatoren deiner Instanz geschickt. Du kannst hier eine Erklärung angeben, warum du dieses Konto meldest:", + "report.hint": "Der Bericht wird an die Moderatoren des Servers geschickt. Du kannst hier eine Erklärung angeben, warum du dieses Konto meldest:", "report.placeholder": "Zusätzliche Kommentare", "report.submit": "Absenden", "report.target": "{target} melden", @@ -297,7 +300,7 @@ "status.block": "Blockiere @{name}", "status.cancel_reblog_private": "Nicht mehr teilen", "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden", - "status.copy": "Copy link to status", + "status.copy": "Kopiere Link zum Status", "status.delete": "Löschen", "status.detailed_status": "Detaillierte Ansicht der Konversation", "status.direct": "Direktnachricht @{name}", @@ -343,7 +346,7 @@ "ui.beforeunload": "Dein Entwurf geht verloren, wenn du Mastodon verlässt.", "upload_area.title": "Zum Hochladen hereinziehen", "upload_button.label": "Mediendatei hinzufügen (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "File upload limit exceeded.", + "upload_error.limit": "Dateiupload-Limit erreicht.", "upload_form.description": "Für Menschen mit Sehbehinderung beschreiben", "upload_form.focus": "Thumbnail bearbeiten", "upload_form.undo": "Löschen", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 86b2a4a1d6..157b69847c 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -1320,6 +1320,14 @@ }, { "descriptors": [ + { + "defaultMessage": "Enter hashtags…", + "id": "hashtag.column_settings.select.placeholder" + }, + { + "defaultMessage": "No suggestions found", + "id": "hashtag.column_settings.select.no_options_message" + }, { "defaultMessage": "Any of these", "id": "hashtag.column_settings.tag_mode.any" @@ -1622,6 +1630,15 @@ ], "path": "app/javascript/mastodon/features/list_editor/components/account.json" }, + { + "descriptors": [ + { + "defaultMessage": "Change title", + "id": "lists.edit.submit" + } + ], + "path": "app/javascript/mastodon/features/list_editor/components/edit_list_form.json" + }, { "descriptors": [ { diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 165f90f0cb..a36f41ce54 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -128,7 +128,7 @@ "empty_column.lists": "Δεν Îχεις καμία λίστα ακόμα. Μόλις φτιάξεις μια, θα εμφανιστεί εδώ.", "empty_column.mutes": "Δεν Îχεις αποσιωπήσει κανÎνα χÏήστη ακόμα.", "empty_column.notifications": "Δεν Îχεις ειδοποιήσεις ακόμα. ΑλληλεπίδÏασε με άλλους χÏήστες για να ξεκινήσεις την κουβÎντα.", - "empty_column.public": "Δεν υπάÏχει τίποτα εδώ! ΓÏάψε κάτι δημόσιο, ή ακολοÏθησε χειÏοκίνητα χÏήστες από άλλα instances για να τη γεμίσεις", + "empty_column.public": "Δεν υπάÏχει τίποτα εδώ! ΓÏάψε κάτι δημόσιο, ή ακολοÏθησε χειÏοκίνητα χÏήστες από άλλους κόμβους για να τη γεμίσεις", "follow_request.authorize": "ΕνÎκÏινε", "follow_request.reject": "ΑπÎÏÏιψε", "getting_started.developers": "Ανάπτυξη", @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "και {additional}", "hashtag.column_header.tag_mode.any": "ή {additional}", "hashtag.column_header.tag_mode.none": "χωÏίς {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Όλα αυτα", "hashtag.column_settings.tag_mode.any": "Οποιοδήποτε από αυτά", "hashtag.column_settings.tag_mode.none": "ΚανÎνα από αυτά", @@ -204,6 +206,7 @@ "lists.account.remove": "Βγάλε από τη λίστα", "lists.delete": "ΔιαγÏαφή λίστας", "lists.edit": "ΕπεξεÏγασία λίστας", + "lists.edit.submit": "Change title", "lists.new.create": "Î Ïοσθήκη λίστας", "lists.new.title_placeholder": "Τίτλος νÎας λίστα", "lists.search": "Αναζήτησε Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ ανθÏώπων που ακουλουθείς", @@ -276,7 +279,7 @@ "reply_indicator.cancel": "ΆκυÏο", "report.forward": "Î Ïοώθηση Ï€Ïος {target}", "report.forward_hint": "Ο λογαÏιασμός είναι από διαφοÏετικό διακομιστή. Îα σταλεί ανώνυμο αντίγÏαφο της καταγγελίας κι εκεί;", - "report.hint": "Η καταγγελία θα σταλεί στους διαχειÏιστÎÏ‚ του κόμβου σου. ΜποÏείς να πεÏιγÏάψεις γιατί καταγγÎλεις το λογαÏιασμό παÏακάτω:", + "report.hint": "Η καταγγελία θα σταλεί στους διαχειÏιστÎÏ‚ του κόμβου σου. ΜποÏείς να πεÏιγÏάψεις γιατί καταγγÎλεις αυτόν το λογαÏιασμό παÏακάτω:", "report.placeholder": "ΕπιπλÎον σχόλια", "report.submit": "Υποβολή", "report.target": "Καταγγελία {target}", @@ -290,14 +293,14 @@ "search_results.accounts": "ΆνθÏωποι", "search_results.hashtags": "ΤαμπÎλες", "search_results.statuses": "Τουτ", - "search_results.total": "{count, number} {count, plural, Îνα {result} υπόλοιπα {results}}", + "search_results.total": "{count, number} {count, plural, zero {αποτελÎσματα} one {αποτÎλεσμα} other {αποτελÎσματα}}", "standalone.public_title": "Μια Ï€Ïώτη γεÏση...", "status.admin_account": "Άνοιγμα λειτουÏγίας διαμεσολάβησης για τον/την @{name}", "status.admin_status": "Άνοιγμα αυτής της δημοσίευσης στη λειτουÏγία διαμεσολάβησης", "status.block": "Αποκλεισμός @{name}", "status.cancel_reblog_private": "ΑκÏÏωσε την Ï€Ïοώθηση", "status.cannot_reblog": "Αυτή η δημοσίευση δεν μποÏεί να Ï€Ïοωθηθεί", - "status.copy": "Copy link to status", + "status.copy": "ΑντιγÏαφή συνδÎσμου της δημοσίευσης", "status.delete": "ΔιαγÏαφή", "status.detailed_status": "Î Ïοβολή λεπτομεÏειών συζήτησης", "status.direct": "Î Ïοσωπικό μήνυμα Ï€Ïος @{name}", @@ -343,7 +346,7 @@ "ui.beforeunload": "Το Ï€ÏοσχÎδιό σου θα χαθεί αν φÏγεις από το Mastodon.", "upload_area.title": "Drag & drop για να ανεβάσεις", "upload_button.label": "Î Ïόσθεσε πολυμÎσα (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "File upload limit exceeded.", + "upload_error.limit": "ΥπÎÏβαση οÏίου μεγÎθους ανεβασμÎνων αÏχείων.", "upload_form.description": "ΠεÏιÎγÏαψε για όσους & όσες Îχουν Ï€Ïοβλήματα ÏŒÏασης", "upload_form.focus": "Αλλαγή Ï€Ïοεπισκόπησης", "upload_form.undo": "ΔιαγÏαφή", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 58e672aa53..7f7abf3720 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 759eed46a0..f8d427c804 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -128,11 +128,11 @@ "empty_column.lists": "Vi ankoraÅ ne havas liston. Kiam vi kreos iun, Äi aperos ĉi tie.", "empty_column.mutes": "Vi ne ankoraÅ silentigis iun uzanton.", "empty_column.notifications": "Vi ankoraÅ ne havas sciigojn. Interagu kun aliaj por komenci konversacion.", - "empty_column.public": "Estas nenio ĉi tie! Publike skribu ion, aÅ mane sekvu uzantojn de aliaj nodoj por plenigi la publikan tempolinion", + "empty_column.public": "Estas nenio ĉi tie! Publike skribu ion, aÅ mane sekvu uzantojn de aliaj serviloj por plenigi la publikan tempolinion", "follow_request.authorize": "Rajtigi", "follow_request.reject": "Rifuzi", "getting_started.developers": "Programistoj", - "getting_started.directory": "Profile directory", + "getting_started.directory": "Profilujo", "getting_started.documentation": "Dokumentado", "getting_started.heading": "Por komenci", "getting_started.invite": "Inviti homojn", @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "kaj {additional}", "hashtag.column_header.tag_mode.any": "aÅ {additional}", "hashtag.column_header.tag_mode.none": "sen {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Ĉiuj", "hashtag.column_settings.tag_mode.any": "Iu ajn", "hashtag.column_settings.tag_mode.none": "Neniu", @@ -151,21 +153,21 @@ "home.column_settings.show_replies": "Montri respondojn", "introduction.federation.action": "Sekva", "introduction.federation.federated.headline": "Federated", - "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", + "introduction.federation.federated.text": "Publikaj mesaÄoj el aliaj serviloj de la Fediverse aperos en la fratara tempolinio.", "introduction.federation.home.headline": "Home", - "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", + "introduction.federation.home.text": "MesaÄoj de homoj, kiujn vi sekvas, aperos en via hejma fluo. Vi povas sekvi iun ajn de ajna servilo!", "introduction.federation.local.headline": "Local", - "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", - "introduction.interactions.action": "Finish tutorial!", - "introduction.interactions.favourite.headline": "Favourite", - "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", - "introduction.interactions.reblog.headline": "Boost", - "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", - "introduction.interactions.reply.headline": "Reply", - "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", - "introduction.welcome.action": "Let's go!", - "introduction.welcome.headline": "First steps", - "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", + "introduction.federation.local.text": "Publikaj mesaÄoj de homoj de via servilo aperos en la loka tempolinio.", + "introduction.interactions.action": "Fini la lernilon!", + "introduction.interactions.favourite.headline": "Stelumi", + "introduction.interactions.favourite.text": "Vi povas konservi mesaÄon por posta uzo, kaj sciigi al Äia aÅtoro ke vi Åatis Äin, per stelumo.", + "introduction.interactions.reblog.headline": "Diskonigi", + "introduction.interactions.reblog.text": "Vi povas diskonigi mesaÄojn al viaj sekvantoj per diskonigo.", + "introduction.interactions.reply.headline": "Respondi", + "introduction.interactions.reply.text": "Vi povas respondi al mesaÄoj aliulaj kaj viaj, kio kreos ĉenon de mesaÄoj nomata konversacio.", + "introduction.welcome.action": "Ek!", + "introduction.welcome.headline": "Unuaj paÅoj", + "introduction.welcome.text": "Bonvenon en Fediverse! Tre baldaÅ, vi povos disdoni mesaÄojn kaj paroli al viaj amikoj tra granda servila diverseco. Sed ĉi tiu servilo, {domain}, estas speciala: Äi enhavas vian profilon, do memoru Äian nomon.", "keyboard_shortcuts.back": "por reveni", "keyboard_shortcuts.blocked": "por malfermi la liston de blokitaj uzantoj", "keyboard_shortcuts.boost": "por diskonigi", @@ -204,6 +206,7 @@ "lists.account.remove": "Forigi de la listo", "lists.delete": "Forigi la liston", "lists.edit": "Redakti la liston", + "lists.edit.submit": "Change title", "lists.new.create": "Aldoni liston", "lists.new.title_placeholder": "Titolo de la nova listo", "lists.search": "Serĉi inter la homoj, kiujn vi sekvas", @@ -224,7 +227,7 @@ "navigation_bar.favourites": "Stelumoj", "navigation_bar.filters": "Silentigitaj vortoj", "navigation_bar.follow_requests": "Petoj de sekvado", - "navigation_bar.info": "Pri ĉi tiu nodo", + "navigation_bar.info": "Pri ĉi tiu servilo", "navigation_bar.keyboard_shortcuts": "Rapidklavoj", "navigation_bar.lists": "Listoj", "navigation_bar.logout": "Elsaluti", @@ -242,20 +245,20 @@ "notifications.clear_confirmation": "Ĉu vi certas, ke vi volas porĉiame forviÅi ĉiujn viajn sciigojn?", "notifications.column_settings.alert": "Retumilaj sciigoj", "notifications.column_settings.favourite": "Stelumoj:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", - "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.filter_bar.advanced": "Montri ĉiujn kategoriojn", + "notifications.column_settings.filter_bar.category": "Rapida filtra breto", + "notifications.column_settings.filter_bar.show": "Montri", "notifications.column_settings.follow": "Novaj sekvantoj:", "notifications.column_settings.mention": "Mencioj:", "notifications.column_settings.push": "PuÅsciigoj", "notifications.column_settings.reblog": "Diskonigoj:", "notifications.column_settings.show": "Montri en kolumno", "notifications.column_settings.sound": "Eligi sonon", - "notifications.filter.all": "All", - "notifications.filter.boosts": "Boosts", - "notifications.filter.favourites": "Favourites", - "notifications.filter.follows": "Follows", - "notifications.filter.mentions": "Mentions", + "notifications.filter.all": "Ĉiuj", + "notifications.filter.boosts": "Diskonigoj", + "notifications.filter.favourites": "Stelumoj", + "notifications.filter.follows": "Sekvoj", + "notifications.filter.mentions": "Mencioj", "notifications.group": "{count} sciigoj", "privacy.change": "Agordi mesaÄan privatecon", "privacy.direct.long": "AfiÅi nur al menciitaj uzantoj", @@ -276,7 +279,7 @@ "reply_indicator.cancel": "Nuligi", "report.forward": "Plusendi al {target}", "report.forward_hint": "La konto estas en alia servilo. Ĉu sendi sennomigitan kopion de la signalo ankaÅ tien?", - "report.hint": "La signalo estos sendita al la kontrolantoj de via nodo. Vi povas doni klarigon pri kial vi signalas ĉi tiun konton sube:", + "report.hint": "La signalo estos sendita al la kontrolantoj de via servilo. Vi povas doni klarigon pri kial vi signalas ĉi tiun konton sube:", "report.placeholder": "Pliaj komentoj", "report.submit": "Sendi", "report.target": "Signali {target}", @@ -292,12 +295,12 @@ "search_results.statuses": "MesaÄoj", "search_results.total": "{count, number} {count, plural, one {rezulto} other {rezultoj}}", "standalone.public_title": "Enrigardo…", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Malfermi la kontrolan interfacon por @{name}", + "status.admin_status": "Malfermi ĉi tiun mesaÄon en la kontrola interfaco", "status.block": "Bloki @{name}", "status.cancel_reblog_private": "Eksdiskonigi", "status.cannot_reblog": "Ĉi tiu mesaÄo ne diskonigeblas", - "status.copy": "Copy link to status", + "status.copy": "Kopii la ligilon al la mesaÄo", "status.delete": "Forigi", "status.detailed_status": "Detala konversacia vido", "status.direct": "Rekte mesaÄi @{name}", @@ -343,9 +346,9 @@ "ui.beforeunload": "Via malneto perdiÄos se vi eliras de Mastodon.", "upload_area.title": "Altreni kaj lasi por alÅuti", "upload_button.label": "Aldoni aÅdovidaĵon (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "File upload limit exceeded.", + "upload_error.limit": "Limo de dosiera alÅutado transpasita.", "upload_form.description": "Priskribi por misvidantaj homoj", - "upload_form.focus": "Stuci", + "upload_form.focus": "AntaÅvido de ÅanÄo", "upload_form.undo": "Forigi", "upload_progress.label": "AlÅutado…", "video.close": "Fermi videon", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 43bfe039ca..99dce8ffef 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Quitar de lista", "lists.delete": "Delete list", "lists.edit": "Editar lista", + "lists.edit.submit": "Change title", "lists.new.create": "Añadir lista", "lists.new.title_placeholder": "TÃtulo de la nueva lista", "lists.search": "Buscar entre la gente a la que sigues", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 747348e718..63a2354aea 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -128,7 +128,7 @@ "empty_column.lists": "Ez duzu zerrendarik oraindik. Baten bat sortzen duzunean hemen agertuko da.", "empty_column.mutes": "Ez duzu erabiltzailerik mututu oraindik.", "empty_column.notifications": "Ez duzu jakinarazpenik oraindik. Jarri besteekin harremanetan elkarrizketa abiatzeko.", - "empty_column.public": "Ez dago ezer hemen! Idatzi zerbait publikoki edo jarraitu eskuz beste instantzia batzuetako erabiltzailean hau betetzeko", + "empty_column.public": "Ez dago ezer hemen! Idatzi zerbait publikoki edo jarraitu eskuz beste zerbitzari batzuetako erabiltzaileak hau betetzen joateko", "follow_request.authorize": "Baimendu", "follow_request.reject": "Ukatu", "getting_started.developers": "Garatzaileak", @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "eta {osagarria}", "hashtag.column_header.tag_mode.any": "edo {osagarria}", "hashtag.column_header.tag_mode.none": "gabe {osagarria}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Hauetako guztiak", "hashtag.column_settings.tag_mode.any": "Hautako edozein", "hashtag.column_settings.tag_mode.none": "Hauetako bat ere ez", @@ -204,6 +206,7 @@ "lists.account.remove": "Kendu zerrendatik", "lists.delete": "Ezabatu zerrenda", "lists.edit": "Editatu zerrenda", + "lists.edit.submit": "Change title", "lists.new.create": "Gehitu zerrenda", "lists.new.title_placeholder": "Zerrenda berriaren izena", "lists.search": "Bilatu jarraitzen dituzun pertsonen artean", @@ -224,7 +227,7 @@ "navigation_bar.favourites": "Gogokoak", "navigation_bar.filters": "Mutututako hitzak", "navigation_bar.follow_requests": "Jarraitzeko eskariak", - "navigation_bar.info": "Instantzia honi buruz", + "navigation_bar.info": "Zerbitzari honi buruz", "navigation_bar.keyboard_shortcuts": "Laster-teklak", "navigation_bar.lists": "Zerrendak", "navigation_bar.logout": "Amaitu saioa", @@ -276,7 +279,7 @@ "reply_indicator.cancel": "Utzi", "report.forward": "Birbidali hona: {target}", "report.forward_hint": "Kontu hau beste zerbitzari batekoa da. Bidali txostenaren kopia anonimo hara ere?", - "report.hint": "Txostena zure instantziaren moderatzaileei bidaliko zaio. Kontu hau zergatik salatzen duzun behean azaldu dezakezu:", + "report.hint": "Txostena zure zerbitzariaren moderatzaileei bidaliko zaie. Kontu hau zergatik salatzen duzun behean azaldu dezakezu:", "report.placeholder": "Iruzkin gehigarriak", "report.submit": "Submit", "report.target": "{target} salatzen", @@ -297,7 +300,7 @@ "status.block": "Block @{name}", "status.cancel_reblog_private": "Kendu bultzada", "status.cannot_reblog": "Mezu honi ezin zaio bultzada eman", - "status.copy": "Copy link to status", + "status.copy": "Kopiatu mezuaren esteka", "status.delete": "Ezabatu", "status.detailed_status": "Elkarrizketaren ikuspegi xehetsua", "status.direct": "Mezu zuzena @{name}(r)i", @@ -343,7 +346,7 @@ "ui.beforeunload": "Zure zirriborroa galduko da Mastodon uzten baduzu.", "upload_area.title": "Arrastatu eta jaregin igotzeko", "upload_button.label": "Gehitu multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "File upload limit exceeded.", + "upload_error.limit": "Fitxategi igoera muga gaindituta.", "upload_form.description": "Deskribatu ikusmen arazoak dituztenentzat", "upload_form.focus": "Aldatu aurrebista", "upload_form.undo": "Ezabatu", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 44c39802a1..f2f144e782 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -1,5 +1,5 @@ { - "account.add_or_remove_from_list": "Add or Remove from lists", + "account.add_or_remove_from_list": "اÙزودن یا برداشتن از Ùهرست", "account.badges.bot": "ربات", "account.block": "مسدودسازی @{name}", "account.block_domain": "پنهان‌سازی همه چیز از سرور {domain}", @@ -17,7 +17,7 @@ "account.follows_you": "پیگیر شماست", "account.hide_reblogs": "پنهان کردن بازبوق‌های @{name}", "account.link_verified_on": "مالکیت این نشانی در تایخ {date} بررسی شد", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.locked_info": "این Øساب خصوصی است. صاØب این Øساب تصمیم می‌گیرد Ú©Ù‡ Ú†Ù‡ کسی می‌تواند پیگیرش باشد.", "account.media": "عکس Ùˆ ویدیو", "account.mention": "نام‌بردن از @{name}", "account.moved_to": "{name} منتقل شده است به:", @@ -113,7 +113,7 @@ "emoji_button.search_results": "نتایج جستجو", "emoji_button.symbols": "نمادها", "emoji_button.travel": "سÙر Ùˆ مکان", - "empty_column.account_timeline": "No toots here!", + "empty_column.account_timeline": "هیچ بوقی این‌جا نیست!", "empty_column.blocks": "شما هنوز هیچ کسی را مسدود نکرده‌اید.", "empty_column.community": "Ùهرست نوشته‌های Ù…ØÙ„ÛŒ خالی است. چیزی بنویسید تا چرخش بچرخد!", "empty_column.direct": "شما هیچ پیغام مستقیمی ندارید. اگر چنین پیغامی بگیرید یا بÙرستید این‌جا نمایش خواهد یاÙت.", @@ -128,44 +128,46 @@ "empty_column.lists": "شما هنوز هیچ Ùهرستی ندارید. اگر Ùهرستی بسازید، این‌جا نمایش خواهد یاÙت.", "empty_column.mutes": "شما هنوز هیچ کاربری را بی‌صدا نکرده‌اید.", "empty_column.notifications": "هنوز هیچ اعلانی ندارید. به نوشته‌های دیگران واکنش نشان دهید تا Ú¯Ùتگو آغاز شود.", - "empty_column.public": "این‌جا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران دیگر را Ù¾ÛŒ بگیرید تا این‌جا پر شود", + "empty_column.public": "این‌جا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران سرورهای دیگر را Ù¾ÛŒ بگیرید تا این‌جا پر شود", "follow_request.authorize": "اجازه دهید", "follow_request.reject": "اجازه ندهید", "getting_started.developers": "برای برنامه‌نویسان", - "getting_started.directory": "Profile directory", + "getting_started.directory": "Ùهرست گزیدهٔ کاربران", "getting_started.documentation": "راهنما", "getting_started.heading": "آغاز کنید", "getting_started.invite": "دعوت از دوستان", "getting_started.open_source_notice": "ماستدون یک نرم‌اÙزار آزاد است. می‌توانید در ساخت آن مشارکت کنید یا مشکلاتش را در {github} گزارش دهید.", "getting_started.security": "امنیت", "getting_started.terms": "شرایط استÙاده", - "hashtag.column_header.tag_mode.all": "and {additional}", - "hashtag.column_header.tag_mode.any": "or {additional}", - "hashtag.column_header.tag_mode.none": "without {additional}", - "hashtag.column_settings.tag_mode.all": "All of these", - "hashtag.column_settings.tag_mode.any": "Any of these", - "hashtag.column_settings.tag_mode.none": "None of these", - "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "hashtag.column_header.tag_mode.all": "Ùˆ {additional}", + "hashtag.column_header.tag_mode.any": "یا {additional}", + "hashtag.column_header.tag_mode.none": "بدون {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", + "hashtag.column_settings.tag_mode.all": "همهٔ این‌ها", + "hashtag.column_settings.tag_mode.any": "هرکدام از این‌ها", + "hashtag.column_settings.tag_mode.none": "هیچ‌کدام از این‌ها", + "hashtag.column_settings.tag_toggle": "برچسب‌های بیشتری به این ستون بیÙزایید", "home.column_settings.basic": "اصلی", "home.column_settings.show_reblogs": "نمایش بازبوق‌ها", "home.column_settings.show_replies": "نمایش پاسخ‌ها", - "introduction.federation.action": "Next", - "introduction.federation.federated.headline": "Federated", - "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", - "introduction.federation.home.headline": "Home", - "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", - "introduction.federation.local.headline": "Local", - "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", - "introduction.interactions.action": "Finish tutorial!", - "introduction.interactions.favourite.headline": "Favourite", - "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", - "introduction.interactions.reblog.headline": "Boost", - "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", - "introduction.interactions.reply.headline": "Reply", - "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", - "introduction.welcome.action": "Let's go!", - "introduction.welcome.headline": "First steps", - "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", + "introduction.federation.action": "بعدی", + "introduction.federation.federated.headline": "Ùهرست همهٔ سرورها", + "introduction.federation.federated.text": "نوشته‌های عمومی سرورهای دیگر در این Ùهرست نمایش می‌یابند.", + "introduction.federation.home.headline": "خانه", + "introduction.federation.home.text": "نوشته‌های کسانی Ú©Ù‡ شما آن‌ها را Ù¾ÛŒ می‌گیرید این‌جا نمایش می‌یابند. شما می‌توانید هر کسی را از هر سروری Ù¾ÛŒ بگیرید!", + "introduction.federation.local.headline": "Ù…ØÙ„ÛŒ", + "introduction.federation.local.text": "نوشته‌های عمومی کسانی Ú©Ù‡ روی سرور شما هستند در Ùهرست نوشته‌های Ù…ØÙ„ÛŒ نمایش می‌یابند.", + "introduction.interactions.action": "پایان خودآموز!", + "introduction.interactions.favourite.headline": "پسندیدن", + "introduction.interactions.favourite.text": "با پسندیدن یک بوق، شما آن را برای آینده ذخیره می‌کنید Ùˆ به نویسنده می‌گویید Ú©Ù‡ از بوقش خوشتان آمده.", + "introduction.interactions.reblog.headline": "بازبوقیدن", + "introduction.interactions.reblog.text": "اگر بخواهید نوشته‌ای را با پیگیران خودتان به اشتراک بگذارید، آن را بازمی‌بوقید.", + "introduction.interactions.reply.headline": "پاسخ", + "introduction.interactions.reply.text": "شما می‌توانید به بوق‌های خودتان Ùˆ دیگران پاسخ دهید، تا همهٔ این بوق‌ها به Ø´Ú©Ù„ رشتهٔ به‌هم‌پیوسته‌ای در یک Ú¯Ùتگو درآیند.", + "introduction.welcome.action": "بزن بریم!", + "introduction.welcome.headline": "نخستین گام‌ها", + "introduction.welcome.text": "به دنیای شبکه‌های اجتماعی غیرمتمرکز خوش آمدید! به زودی می‌توانید نوشته‌های خودتان را منتشر کنید Ùˆ با دوستانتان Ú©Ù‡ روی سرورهای مختلÙÛŒ هستند Øر٠بزنید. ولی این سرور، {domain}ØŒ با بقیه Ùرق دارد زیرا Øساب شما روی آن ساخته شده است، پس نامش را یادتان Ù†Ú¯Ù‡ دارید.", "keyboard_shortcuts.back": "برای بازگشت", "keyboard_shortcuts.blocked": "برای گشودن کاربران بی‌صداشده", "keyboard_shortcuts.boost": "برای بازبوقیدن", @@ -204,6 +206,7 @@ "lists.account.remove": "پاک‌کردن از Ùهرست", "lists.delete": "ØØ°Ù Ùهرست", "lists.edit": "ویرایش Ùهرست", + "lists.edit.submit": "Change title", "lists.new.create": "اÙزودن Ùهرست", "lists.new.title_placeholder": "نام Ùهرست تازه", "lists.search": "بین کسانی Ú©Ù‡ Ù¾ÛŒ می‌گیرید بگردید", @@ -224,7 +227,7 @@ "navigation_bar.favourites": "پسندیده‌ها", "navigation_bar.filters": "واژگان بی‌صداشده", "navigation_bar.follow_requests": "درخواست‌های پیگیری", - "navigation_bar.info": "اطلاعات تکمیلی", + "navigation_bar.info": "دربارهٔ این سرور", "navigation_bar.keyboard_shortcuts": "میان‌برهای صÙØه‌کلید", "navigation_bar.lists": "Ùهرست‌ها", "navigation_bar.logout": "خروج", @@ -242,20 +245,20 @@ "notifications.clear_confirmation": "واقعاً می‌خواهید همهٔ اعلان‌هایتان را برای همیشه پاک کنید؟", "notifications.column_settings.alert": "اعلان در کامپیوتر", "notifications.column_settings.favourite": "پسندیده‌ها:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", - "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.filter_bar.advanced": "نمایش همهٔ گروه‌ها", + "notifications.column_settings.filter_bar.category": "Ùیلتر سریع", + "notifications.column_settings.filter_bar.show": "نمایش", "notifications.column_settings.follow": "پیگیران تازه:", "notifications.column_settings.mention": "نام‌بردن‌ها:", "notifications.column_settings.push": "اعلان‌ها از سمت سرور", "notifications.column_settings.reblog": "بازبوق‌ها:", "notifications.column_settings.show": "نمایش در ستون", "notifications.column_settings.sound": "پخش صدا", - "notifications.filter.all": "All", - "notifications.filter.boosts": "Boosts", - "notifications.filter.favourites": "Favourites", - "notifications.filter.follows": "Follows", - "notifications.filter.mentions": "Mentions", + "notifications.filter.all": "همه", + "notifications.filter.boosts": "بازبوق‌ها", + "notifications.filter.favourites": "پسندیده‌ها", + "notifications.filter.follows": "پیگیری‌ها", + "notifications.filter.mentions": "نام‌بردن‌ها", "notifications.group": "{count} اعلان", "privacy.change": "تنظیم Øریم خصوصی نوشته‌ها", "privacy.direct.long": "تنها به کاربران نام‌برده‌شده نشان بده", @@ -292,12 +295,12 @@ "search_results.statuses": "بوق‌ها", "search_results.total": "{count, number} {count, plural, one {نتیجه} other {نتیجه}}", "standalone.public_title": "نگاهی به کاربران این سرور...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "Ù…Øیط مدیریت مربوط به @{name} را باز Ú©Ù†", + "status.admin_status": "این نوشته را در Ù…Øیط مدیریت باز Ú©Ù†", "status.block": "مسدودسازی @{name}", "status.cancel_reblog_private": "Øذ٠بازبوق", "status.cannot_reblog": "این نوشته را نمی‌شود بازبوقید", - "status.copy": "Copy link to status", + "status.copy": "رونوشت‌برداری از نشانی این نوشته", "status.delete": "پاک‌کردن", "status.detailed_status": "نمایش کامل Ú¯Ùتگو", "status.direct": "پیغام مستقیم به @{name}", @@ -329,11 +332,11 @@ "status.show_less_all": "نمایش کمتر همه", "status.show_more": "نمایش", "status.show_more_all": "نمایش بیشتر همه", - "status.show_thread": "Show thread", + "status.show_thread": "نمایش Ú¯Ùتگو", "status.unmute_conversation": "باصداکردن Ú¯Ùتگو", "status.unpin": "برداشتن نوشتهٔ ثابت نمایه", - "suggestions.dismiss": "Dismiss suggestion", - "suggestions.header": "You might be interested in…", + "suggestions.dismiss": "پیشنهاد را نادیده بگیر", + "suggestions.header": "شاید این هم برایتان جالب باشد…", "tabs_bar.federated_timeline": "همگانی", "tabs_bar.home": "خانه", "tabs_bar.local_timeline": "Ù…ØÙ„ÛŒ", @@ -343,7 +346,7 @@ "ui.beforeunload": "اگر از ماستدون خارج شوید پیش‌نویس شما پاک خواهد شد.", "upload_area.title": "برای بارگذاری به این‌جا بکشید", "upload_button.label": "اÙزودن عکس Ùˆ ویدیو (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "File upload limit exceeded.", + "upload_error.limit": "از Øد مجاز باگذاری Ùراتر رÙتید.", "upload_form.description": "نوشتهٔ توضیØÛŒ برای کم‌بینایان Ùˆ نابینایان", "upload_form.focus": "بریدن لبه‌ها", "upload_form.undo": "ØØ°Ù", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 6e878d7ff6..537280223a 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -1,5 +1,5 @@ { - "account.add_or_remove_from_list": "Add or Remove from lists", + "account.add_or_remove_from_list": "Lisää tai poista listoilta", "account.badges.bot": "Botti", "account.block": "Estä @{name}", "account.block_domain": "Piilota kaikki sisältö verkkotunnuksesta {domain}", @@ -17,7 +17,7 @@ "account.follows_you": "Seuraa sinua", "account.hide_reblogs": "Piilota buustaukset käyttäjältä @{name}", "account.link_verified_on": "Tämän linkin omistaja tarkistettiin {date}", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.locked_info": "Tämän tili on yksityinen. Käyttäjä vahvistaa itse kuka voi seurata häntä.", "account.media": "Media", "account.mention": "Mainitse @{name}", "account.moved_to": "{name} on muuttanut instanssiin:", @@ -113,7 +113,7 @@ "emoji_button.search_results": "Hakutulokset", "emoji_button.symbols": "Symbolit", "emoji_button.travel": "Matkailu", - "empty_column.account_timeline": "No toots here!", + "empty_column.account_timeline": "Ei ole 'toots' täällä!", "empty_column.blocks": "Et ole vielä estänyt yhtään käyttäjää.", "empty_column.community": "Paikallinen aikajana on tyhjä. Homma lähtee käyntiin, kun kirjoitat jotain julkista!", "empty_column.direct": "Sinulla ei ole vielä yhtään viestiä yksittäiselle käyttäjälle. Kun lähetät tai vastaanotat sellaisen, se näkyy täällä.", @@ -128,28 +128,30 @@ "empty_column.lists": "Sinulla ei ole vielä yhtään listaa. Kun luot sellaisen, näkyy se tässä.", "empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.", "empty_column.notifications": "Sinulle ei ole vielä ilmoituksia. Aloita keskustelu juttelemalla muille.", - "empty_column.public": "Täällä ei ole mitään! Saat sisältöä, kun kirjoitat jotain julkisesti tai käyt manuaalisesti seuraamassa muiden instanssien käyttäjiä", + "empty_column.public": "Täällä ei ole mitään! Saat sisältöä, kun kirjoitat jotain julkisesti tai käyt seuraamassa muiden instanssien käyttäjiä", "follow_request.authorize": "Valtuuta", "follow_request.reject": "Hylkää", "getting_started.developers": "Kehittäjille", - "getting_started.directory": "Profile directory", + "getting_started.directory": "Profiili hakemisto", "getting_started.documentation": "Documentation", "getting_started.heading": "Aloitus", "getting_started.invite": "Kutsu ihmisiä", "getting_started.open_source_notice": "Mastodon on avoimen lähdekoodin ohjelma. Voit avustaa tai raportoida ongelmia GitHubissa: {github}.", "getting_started.security": "Tunnukset", "getting_started.terms": "Käyttöehdot", - "hashtag.column_header.tag_mode.all": "and {additional}", - "hashtag.column_header.tag_mode.any": "or {additional}", - "hashtag.column_header.tag_mode.none": "without {additional}", - "hashtag.column_settings.tag_mode.all": "All of these", - "hashtag.column_settings.tag_mode.any": "Any of these", - "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_header.tag_mode.all": "ja {additional}", + "hashtag.column_header.tag_mode.any": "tai {additional}", + "hashtag.column_header.tag_mode.none": "ilman {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", + "hashtag.column_settings.tag_mode.all": "Kaikki", + "hashtag.column_settings.tag_mode.any": "Kaikki", + "hashtag.column_settings.tag_mode.none": "Ei mikään", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "home.column_settings.basic": "Perusasetukset", "home.column_settings.show_reblogs": "Näytä buustaukset", "home.column_settings.show_replies": "Näytä vastaukset", - "introduction.federation.action": "Next", + "introduction.federation.action": "Seuraava", "introduction.federation.federated.headline": "Federated", "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", "introduction.federation.home.headline": "Home", @@ -204,6 +206,7 @@ "lists.account.remove": "Poista listasta", "lists.delete": "Poista lista", "lists.edit": "Muokkaa listaa", + "lists.edit.submit": "Change title", "lists.new.create": "Lisää lista", "lists.new.title_placeholder": "Uuden listan nimi", "lists.search": "Etsi seuraamistasi henkilöistä", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 24182c00b9..f88f29b110 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -11,33 +11,33 @@ "account.endorse": "Figure sur le profil", "account.follow": "Suivre", "account.followers": "Abonné⋅eâ‹…s", - "account.followers.empty": "Personne ne suit cet utilisateur pour l’instant.", + "account.followers.empty": "Personne ne suit cet utilisateur·rice pour l’instant.", "account.follows": "Abonnements", - "account.follows.empty": "Cet utilisateur ne suit personne pour l’instant.", + "account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.", "account.follows_you": "Vous suit", "account.hide_reblogs": "Masquer les partages de @{name}", "account.link_verified_on": "La propriété de ce lien a été vérifiée le {date}", "account.locked_info": "Ce compte est verrouillé. Son propriétaire approuve manuellement qui peut le ou la suivre.", "account.media": "Média", - "account.mention": "Mentionner", + "account.mention": "Mentionner @{name}", "account.moved_to": "{name} a déménagé vers :", "account.mute": "Masquer @{name}", "account.mute_notifications": "Ignorer les notifications de @{name}", "account.muted": "Silencé", "account.posts": "Pouets", "account.posts_with_replies": "Pouets et réponses", - "account.report": "Signaler", + "account.report": "Signaler @{name}", "account.requested": "En attente d’approbation. Cliquez pour annuler la requête", "account.share": "Partager le profil de @{name}", "account.show_reblogs": "Afficher les partages de @{name}", - "account.unblock": "Débloquer", + "account.unblock": "Débloquer @{name}", "account.unblock_domain": "Ne plus masquer {domain}", "account.unendorse": "Ne figure pas sur le profil", "account.unfollow": "Ne plus suivre", - "account.unmute": "Ne plus masquer", + "account.unmute": "Ne plus masquer @{name}", "account.unmute_notifications": "Réactiver les notifications de @{name}", "account.view_full_profile": "Afficher le profil complet", - "alert.unexpected.message": "Une erreur non attendue s’est produite.", + "alert.unexpected.message": "Une erreur inattendue s’est produite.", "alert.unexpected.title": "Oups !", "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour pouvoir passer ceci, la prochaine fois", "bundle_column_error.body": "Une erreur s’est produite lors du chargement de ce composant.", @@ -86,7 +86,7 @@ "confirmations.delete.confirm": "Supprimer", "confirmations.delete.message": "Confirmez-vous la suppression de ce pouet ?", "confirmations.delete_list.confirm": "Supprimer", - "confirmations.delete_list.message": "Êtes-vous sûr de vouloir supprimer définitivement cette liste ?", + "confirmations.delete_list.message": "Êtes-vous sûr·e de vouloir supprimer définitivement cette liste ?", "confirmations.domain_block.confirm": "Masquer le domaine entier", "confirmations.domain_block.message": "Êtes-vous vraiment, vraiment sûrâ‹…e de vouloir bloquer {domain} en entier ? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.", "confirmations.mute.confirm": "Masquer", @@ -114,7 +114,7 @@ "emoji_button.symbols": "Symboles", "emoji_button.travel": "Lieux & Voyages", "empty_column.account_timeline": "Aucun pouet ici !", - "empty_column.blocks": "Vous n’avez bloqué aucun utilisateur pour le moment.", + "empty_column.blocks": "Vous n’avez bloqué aucun·e utilisateur·rice pour le moment.", "empty_column.community": "Le fil public local est vide. Écrivez donc quelque chose pour le remplir !", "empty_column.direct": "Vous n’avez pas encore de messages directs. Lorsque vous en enverrez ou recevrez un, il s’affichera ici.", "empty_column.domain_blocks": "Il n’y a aucun domaine caché pour le moment.", @@ -126,12 +126,12 @@ "empty_column.home.public_timeline": "le fil public", "empty_column.list": "Il n’y a rien dans cette liste pour l’instant. Dès que des personnes de cette liste publieront de nouveaux statuts, ils apparaîtront ici.", "empty_column.lists": "Vous n’avez pas encore de liste. Lorsque vous en créerez une, elle apparaîtra ici.", - "empty_column.mutes": "Vous n’avez pas encore mis des utilisateurs en silence.", + "empty_column.mutes": "Vous n’avez pas encore mis d'utilisateur·rice·s en silence.", "empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres personnes pour débuter la conversation.", "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres instances pour remplir le fil public", "follow_request.authorize": "Accepter", "follow_request.reject": "Rejeter", - "getting_started.developers": "Développeurs", + "getting_started.developers": "Développeur·euse·s", "getting_started.directory": "Annuaire des profils", "getting_started.documentation": "Documentation", "getting_started.heading": "Pour commencer", @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "et {additional}", "hashtag.column_header.tag_mode.any": "ou {additional}", "hashtag.column_header.tag_mode.none": "sans {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Tous ces éléments", "hashtag.column_settings.tag_mode.any": "Au moins un de ces éléments", "hashtag.column_settings.tag_mode.none": "Aucun de ces éléments", @@ -150,32 +152,32 @@ "home.column_settings.show_reblogs": "Afficher les partages", "home.column_settings.show_replies": "Afficher les réponses", "introduction.federation.action": "Suivant", - "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.headline": "Fil public global", "introduction.federation.federated.text": "Les messages publics provenant d'autres serveurs du fediverse apparaîtront dans le fil public global.", - "introduction.federation.home.headline": "Home", + "introduction.federation.home.headline": "Accueil", "introduction.federation.home.text": "Les messages des personnes que vous suivez apparaîtront dans votre fil d'accueil. Vous pouvez suivre n'importe qui sur n'importe quel serveur !", - "introduction.federation.local.headline": "Local", + "introduction.federation.local.headline": "Fil public local", "introduction.federation.local.text": "Les messages publics de personnes se trouvant sur le même serveur que vous apparaîtront sur le fil public local.", "introduction.interactions.action": "Finir le tutoriel !", "introduction.interactions.favourite.headline": "Favoris", - "introduction.interactions.favourite.text": "Vous pouvez garder un pouet pour plus tard, et faire savoir à l'auteur que vous l'avez aimé, en le favorisant.", + "introduction.interactions.favourite.text": "Vous pouvez garder un pouet pour plus tard, et faire savoir à son auteur·ice que vous l'avez aimé, en le favorisant.", "introduction.interactions.reblog.headline": "Repartager", - "introduction.interactions.reblog.text": "Vous pouvez partager les pouets d'autres personnes avec vos suiveurs en les repartageant.", + "introduction.interactions.reblog.text": "Vous pouvez partager les pouets d'autres personnes avec vos abonné·e·s en les repartageant.", "introduction.interactions.reply.headline": "Répondre", "introduction.interactions.reply.text": "Vous pouvez répondre aux pouets d'autres personnes et à vos propres pouets, ce qui les enchaînera dans une conversation.", "introduction.welcome.action": "Allons-y !", "introduction.welcome.headline": "Premiers pas", "introduction.welcome.text": "Bienvenue dans le fediverse ! Dans quelques instants, vous pourrez diffuser des messages et parler à vos amis sur une grande variété de serveurs. Mais ce serveur, {domain}, est spécial - il héberge votre profil, alors souvenez-vous de son nom.", - "keyboard_shortcuts.back": "revenir en arrière", - "keyboard_shortcuts.blocked": "pour ouvrir une liste d’utilisateurs bloqués", - "keyboard_shortcuts.boost": "partager", - "keyboard_shortcuts.column": "focaliser un statut dans l’une des colonnes", + "keyboard_shortcuts.back": "pour revenir en arrière", + "keyboard_shortcuts.blocked": "pour ouvrir une liste d’utilisateur·rice·s bloqué·e·s", + "keyboard_shortcuts.boost": "pour partager", + "keyboard_shortcuts.column": "pour focaliser un statut dans l’une des colonnes", "keyboard_shortcuts.compose": "pour centrer la zone de rédaction", "keyboard_shortcuts.description": "Description", "keyboard_shortcuts.direct": "pour ouvrir une colonne des messages directs", "keyboard_shortcuts.down": "pour descendre dans la liste", "keyboard_shortcuts.enter": "pour ouvrir le statut", - "keyboard_shortcuts.favourite": "vers les favoris", + "keyboard_shortcuts.favourite": "pour ajouter aux favoris", "keyboard_shortcuts.favourites": "pour ouvrir une liste de favoris", "keyboard_shortcuts.federated": "pour ouvrir le fil public global", "keyboard_shortcuts.heading": "Raccourcis clavier", @@ -184,7 +186,7 @@ "keyboard_shortcuts.legend": "pour afficher cette légende", "keyboard_shortcuts.local": "pour ouvrir le fil public local", "keyboard_shortcuts.mention": "pour mentionner l’auteur·rice", - "keyboard_shortcuts.muted": "pour ouvrir la liste des utilisateurs rendus muets", + "keyboard_shortcuts.muted": "pour ouvrir la liste des utilisateur·rice·s rendu·e·s muet·te·s", "keyboard_shortcuts.my_profile": "pour ouvrir votre profil", "keyboard_shortcuts.notifications": "pour ouvrir votre colonne de notifications", "keyboard_shortcuts.pinned": "pour ouvrir une liste des pouets épinglés", @@ -195,7 +197,7 @@ "keyboard_shortcuts.start": "pour ouvrir la colonne \"pour commencer\"", "keyboard_shortcuts.toggle_hidden": "pour afficher/cacher un texte derrière CW", "keyboard_shortcuts.toot": "pour démarrer un tout nouveau pouet", - "keyboard_shortcuts.unfocus": "pour recentrer composer textarea/search", + "keyboard_shortcuts.unfocus": "pour quitter la zone de composition/recherche", "keyboard_shortcuts.up": "pour remonter dans la liste", "lightbox.close": "Fermer", "lightbox.next": "Suivant", @@ -204,6 +206,7 @@ "lists.account.remove": "Supprimer de la liste", "lists.delete": "Effacer la liste", "lists.edit": "Éditer la liste", + "lists.edit.submit": "Change title", "lists.new.create": "Ajouter une liste", "lists.new.title_placeholder": "Titre de la nouvelle liste", "lists.search": "Rechercher parmi les gens que vous suivez", @@ -225,25 +228,25 @@ "navigation_bar.filters": "Mots silenciés", "navigation_bar.follow_requests": "Demandes de suivi", "navigation_bar.info": "Plus d’informations", - "navigation_bar.keyboard_shortcuts": "Raccourcis-clavier", + "navigation_bar.keyboard_shortcuts": "Raccourcis clavier", "navigation_bar.lists": "Listes", "navigation_bar.logout": "Déconnexion", "navigation_bar.mutes": "Comptes masqués", - "navigation_bar.personal": "Personal", + "navigation_bar.personal": "Personnel", "navigation_bar.pins": "Pouets épinglés", "navigation_bar.preferences": "Préférences", "navigation_bar.public_timeline": "Fil public global", "navigation_bar.security": "Sécurité", "notification.favourite": "{name} a ajouté à ses favoris :", "notification.follow": "{name} vous suit", - "notification.mention": "{name} vous a mentionné⋅e :", + "notification.mention": "{name} vous a mentionné :", "notification.reblog": "{name} a partagé votre statut :", "notifications.clear": "Nettoyer les notifications", "notifications.clear_confirmation": "Voulez-vous vraiment supprimer toutes vos notifications ?", "notifications.column_settings.alert": "Notifications locales", "notifications.column_settings.favourite": "Favoris :", "notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories", - "notifications.column_settings.filter_bar.category": "Barre de recherche rapide", + "notifications.column_settings.filter_bar.category": "Barre de filtrage rapide", "notifications.column_settings.filter_bar.show": "Afficher", "notifications.column_settings.follow": "Nouveauxâ‹…elles abonné⋅e·s :", "notifications.column_settings.mention": "Mentions :", @@ -254,7 +257,7 @@ "notifications.filter.all": "Tout", "notifications.filter.boosts": "Repartages", "notifications.filter.favourites": "Favoris", - "notifications.filter.follows": "Suiveurs", + "notifications.filter.follows": "Abonné·e·s", "notifications.filter.mentions": "Mentions", "notifications.group": "{count} notifications", "privacy.change": "Ajuster la confidentialité du message", @@ -276,7 +279,7 @@ "reply_indicator.cancel": "Annuler", "report.forward": "Transférer à {target}", "report.forward_hint": "Le compte provient d’un autre serveur. Envoyez également une copie anonyme du rapport ?", - "report.hint": "Le rapport sera envoyé aux modérateur·rice·s de votre instance. Vous pouvez expliquer pourquoi vous signalez le compte ci-dessous :", + "report.hint": "Le rapport sera envoyé aux modérateur·rice·s de votre instance. Vous pouvez expliquer pourquoi vous signalez le compte ci-dessous :", "report.placeholder": "Commentaires additionnels", "report.submit": "Envoyer", "report.target": "Signalement", @@ -291,13 +294,13 @@ "search_results.hashtags": "Hashtags", "search_results.statuses": "Pouets", "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}", - "standalone.public_title": "Un aperçu …", + "standalone.public_title": "Un aperçu…", "status.admin_account": "Ouvrir l'interface de modération pour @{name}", "status.admin_status": "Ouvrir ce statut dans l'interface de modération", - "status.block": "Block @{name}", + "status.block": "Bloquer @{name}", "status.cancel_reblog_private": "Dé-booster", "status.cannot_reblog": "Cette publication ne peut être boostée", - "status.copy": "Copy link to status", + "status.copy": "Copier le lien vers le pouet", "status.delete": "Effacer", "status.detailed_status": "Vue détaillée de la conversation", "status.direct": "Envoyer un message direct à @{name}", @@ -306,7 +309,7 @@ "status.filtered": "Filtré", "status.load_more": "Charger plus", "status.media_hidden": "Média caché", - "status.mention": "Mentionner", + "status.mention": "Mentionner @{name}", "status.more": "Plus", "status.mute": "Masquer @{name}", "status.mute_conversation": "Masquer la conversation", @@ -329,11 +332,11 @@ "status.show_less_all": "Tout replier", "status.show_more": "Déplier", "status.show_more_all": "Tout déplier", - "status.show_thread": "Afficher le fil", + "status.show_thread": "Lire le fil", "status.unmute_conversation": "Ne plus masquer la conversation", "status.unpin": "Retirer du profil", "suggestions.dismiss": "Rejeter la suggestion", - "suggestions.header": "Vous pourriez être intéressé par.…", + "suggestions.header": "Vous pourriez être intéressé par…", "tabs_bar.federated_timeline": "Fil public global", "tabs_bar.home": "Accueil", "tabs_bar.local_timeline": "Fil public local", @@ -343,7 +346,7 @@ "ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.", "upload_area.title": "Glissez et déposez pour envoyer", "upload_button.label": "Joindre un média (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "File upload limit exceeded.", + "upload_error.limit": "Taille maximale d'envoi de fichier dépassée.", "upload_form.description": "Décrire pour les malvoyant·e·s", "upload_form.focus": "Modifier l’aperçu", "upload_form.undo": "Supprimer", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 45bc2d36c5..789624d388 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -128,7 +128,7 @@ "empty_column.lists": "AÃnda non ten listas. Cando cree unha, mostrarase aquÃ.", "empty_column.mutes": "Non acalou ningunha usuaria polo de agora.", "empty_column.notifications": "AÃnda non ten notificacións. Interactúe con outras para iniciar unha conversa.", - "empty_column.public": "Nada por aquÃ! Escriba algo de xeito público, ou siga manualmente usuarias de outras instancias para ir enchéndoa", + "empty_column.public": "Nada por aquÃ! Escriba algo de xeito público, ou siga manualmente usuarias de outros servidores para ir enchéndoa", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rexeitar", "getting_started.developers": "Desenvolvedoras", @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "e {additional}", "hashtag.column_header.tag_mode.any": "ou {additional}", "hashtag.column_header.tag_mode.none": "sen {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Todos estos", "hashtag.column_settings.tag_mode.any": "Calquera de estos", "hashtag.column_settings.tag_mode.none": "Ningún de estos", @@ -160,7 +162,7 @@ "introduction.interactions.favourite.headline": "Favorito", "introduction.interactions.favourite.text": "Pode gardar un toot para máis tarde, e facerlle saber a autora que lle gustou, dándolle a Favorito.", "introduction.interactions.reblog.headline": "Promocionar", - "introduction.interactions.reblog.text": "Pode compartir os toots de outra xente coas súas seguirodas promocionándoos.", + "introduction.interactions.reblog.text": "Pode compartir os toots de outra xente coas súas seguidoras promocionándoos.", "introduction.interactions.reply.headline": "Respostar", "introduction.interactions.reply.text": "Pode respostar aos toots de outras persoas e aos seus propios, asà quedarán encadeados nunha conversa.", "introduction.welcome.action": "Imos!", @@ -204,6 +206,7 @@ "lists.account.remove": "Eliminar da lista", "lists.delete": "Delete list", "lists.edit": "Editar lista", + "lists.edit.submit": "Change title", "lists.new.create": "Engadir lista", "lists.new.title_placeholder": "Novo tÃtulo da lista", "lists.search": "Procurar entre a xente que segues", @@ -224,7 +227,7 @@ "navigation_bar.favourites": "Favoritas", "navigation_bar.filters": "Palabras acaladas", "navigation_bar.follow_requests": "Peticións de seguimento", - "navigation_bar.info": "Sobre esta instancia", + "navigation_bar.info": "Sobre este servidor", "navigation_bar.keyboard_shortcuts": "Atallos", "navigation_bar.lists": "Listas", "navigation_bar.logout": "Sair", @@ -276,7 +279,7 @@ "reply_indicator.cancel": "Cancelar", "report.forward": "Reenviar a {target}", "report.forward_hint": "A conta pertence a outro servidor. Enviar unha copia anónima do informe alà tamén?", - "report.hint": "O informe enviarase a moderación da súa instancia. Abaixo pode explicar a razón pola que está a información:", + "report.hint": "O informe enviarase a moderación do seu servidor. Abaixo pode explicar a razón pola que está a informar:", "report.placeholder": "Comentarios adicionais", "report.submit": "Enviar", "report.target": "Informar {target}", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 13278382fd..56d474170a 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index a4aafd8fbe..cc4f5725a9 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 41734b58da..a82b3e94d4 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "EltávolÃt a listából", "lists.delete": "Lista törlése", "lists.edit": "Lista szerkesztése", + "lists.edit.submit": "Change title", "lists.new.create": "Lista hozzáadása", "lists.new.title_placeholder": "Új lista cÃm", "lists.search": "Keresés a követtett személyek között", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 2169bb9908..07b239f874 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Õ€Õ¡Õ¶Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ«Ö", "lists.delete": "Õ‹Õ¶Õ»Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¨", "lists.edit": "Õ“Õ¸ÖƒÕ¸ÕÕ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¨", + "lists.edit.submit": "Change title", "lists.new.create": "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ ÖÕ¡Õ¶Õ¯", "lists.new.title_placeholder": "Õ†Õ¸Ö€ ÖÕ¡Õ¶Õ¯Õ« Õ¾Õ¥Ö€Õ¶Õ¡Õ£Õ«Ö€", "lists.search": "Õ“Õ¶Õ¿Ö€Õ¥Õ¬ Ö„Õ¸ Õ°Õ¥Õ¿Õ¥Ö‚Õ¡Õ® Õ´Õ¡Ö€Õ¤Õ¯Õ¡Õ¶Ö Õ´Õ¥Õ»", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index c8cd2b3d29..a23c0a5475 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 17f74cbabc..e375314bdd 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 423efdbc3c..6825d8d059 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "e {additional}", "hashtag.column_header.tag_mode.any": "o {additional}", "hashtag.column_header.tag_mode.none": "senza {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Tutti questi", "hashtag.column_settings.tag_mode.any": "Uno o più di questi", "hashtag.column_settings.tag_mode.none": "Nessuno di questi", @@ -204,6 +206,7 @@ "lists.account.remove": "Togli dalla lista", "lists.delete": "Delete list", "lists.edit": "Modifica lista", + "lists.edit.submit": "Change title", "lists.new.create": "Aggiungi lista", "lists.new.title_placeholder": "Titolo della nuova lista", "lists.search": "Cerca tra le persone che segui", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 13364066fa..4fb5d8e27b 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "㨠{additional}", "hashtag.column_header.tag_mode.any": "ã‹ {additional}", "hashtag.column_header.tag_mode.none": "({additional} を除ã)", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "ã™ã¹ã¦ã‚’å«ã‚€", "hashtag.column_settings.tag_mode.any": "ã„ãšã‚Œã‹ã‚’å«ã‚€", "hashtag.column_settings.tag_mode.none": "ã“れらを除ã", @@ -204,6 +206,7 @@ "lists.account.remove": "リストã‹ã‚‰å¤–ã™", "lists.delete": "リストを削除", "lists.edit": "リストを編集", + "lists.edit.submit": "Change title", "lists.new.create": "リストを作æˆ", "lists.new.title_placeholder": "æ–°è¦ãƒªã‚¹ãƒˆå", "lists.search": "フォãƒãƒ¼ã—ã¦ã„る人ã®ä¸ã‹ã‚‰æ¤œç´¢", @@ -297,7 +300,7 @@ "status.block": "@{name}ã•ã‚“をブãƒãƒƒã‚¯", "status.cancel_reblog_private": "ブースト解除", "status.cannot_reblog": "ã“ã®æŠ•ç¨¿ã¯ãƒ–ーストã§ãã¾ã›ã‚“", - "status.copy": "Copy link to status", + "status.copy": "トゥートã¸ã®ãƒªãƒ³ã‚¯ã‚’コピー", "status.delete": "削除", "status.detailed_status": "詳細ãªä¼šè©±ãƒ“ュー", "status.direct": "@{name}ã•ã‚“ã«ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index e2e7306fd0..2f7cdc70df 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "სიიდáƒáƒœ áƒáƒ›áƒáƒ¨áƒšáƒ", "lists.delete": "სიის წáƒáƒ¨áƒšáƒ", "lists.edit": "სიის შეცვლáƒ", + "lists.edit.submit": "Change title", "lists.new.create": "სიის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ", "lists.new.title_placeholder": "áƒáƒ®áƒáƒšáƒ˜ სიის სáƒáƒ—áƒáƒ£áƒ ი", "lists.search": "ძებნრáƒáƒ“áƒáƒ›áƒ˜áƒáƒœáƒ”ბს შáƒáƒ ის რáƒáƒ›áƒ”ლთáƒáƒª მიჰყვებით", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json new file mode 100644 index 0000000000..fc0c88dd99 --- /dev/null +++ b/app/javascript/mastodon/locales/kk.json @@ -0,0 +1,363 @@ +{ + "account.add_or_remove_from_list": "Add or Remove from lists", + "account.badges.bot": "Bot", + "account.block": "Block @{name}", + "account.block_domain": "Hide everything from {domain}", + "account.blocked": "Blocked", + "account.direct": "Direct message @{name}", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.domain_blocked": "Domain hidden", + "account.edit_profile": "Edit profile", + "account.endorse": "Feature on profile", + "account.follow": "Follow", + "account.followers": "Followers", + "account.followers.empty": "No one follows this user yet.", + "account.follows": "Follows", + "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows_you": "Follows you", + "account.hide_reblogs": "Hide boosts from @{name}", + "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.media": "Media", + "account.mention": "Mention @{name}", + "account.moved_to": "{name} has moved to:", + "account.mute": "Mute @{name}", + "account.mute_notifications": "Mute notifications from @{name}", + "account.muted": "Muted", + "account.posts": "Toots", + "account.posts_with_replies": "Toots and replies", + "account.report": "Report @{name}", + "account.requested": "Awaiting approval. Click to cancel follow request", + "account.share": "Share @{name}'s profile", + "account.show_reblogs": "Show boosts from @{name}", + "account.unblock": "Unblock @{name}", + "account.unblock_domain": "Unhide {domain}", + "account.unendorse": "Don't feature on profile", + "account.unfollow": "Unfollow", + "account.unmute": "Unmute @{name}", + "account.unmute_notifications": "Unmute notifications from @{name}", + "account.view_full_profile": "View full profile", + "alert.unexpected.message": "An unexpected error occurred.", + "alert.unexpected.title": "Oops!", + "boost_modal.combo": "You can press {combo} to skip this next time", + "bundle_column_error.body": "Something went wrong while loading this component.", + "bundle_column_error.retry": "Try again", + "bundle_column_error.title": "Network error", + "bundle_modal_error.close": "Close", + "bundle_modal_error.message": "Something went wrong while loading this component.", + "bundle_modal_error.retry": "Try again", + "column.blocks": "Blocked users", + "column.community": "Local timeline", + "column.direct": "Direct messages", + "column.domain_blocks": "Hidden domains", + "column.favourites": "Favourites", + "column.follow_requests": "Follow requests", + "column.home": "Home", + "column.lists": "Lists", + "column.mutes": "Muted users", + "column.notifications": "Notifications", + "column.pins": "Pinned toot", + "column.public": "Federated timeline", + "column_back_button.label": "Back", + "column_header.hide_settings": "Hide settings", + "column_header.moveLeft_settings": "Move column to the left", + "column_header.moveRight_settings": "Move column to the right", + "column_header.pin": "Pin", + "column_header.show_settings": "Show settings", + "column_header.unpin": "Unpin", + "column_subheading.settings": "Settings", + "community.column_settings.media_only": "Media Only", + "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.", + "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", + "compose_form.lock_disclaimer.lock": "locked", + "compose_form.placeholder": "What is on your mind?", + "compose_form.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive.marked": "Media is marked as sensitive", + "compose_form.sensitive.unmarked": "Media is not marked as sensitive", + "compose_form.spoiler.marked": "Text is hidden behind warning", + "compose_form.spoiler.unmarked": "Text is not hidden", + "compose_form.spoiler_placeholder": "Write your warning here", + "confirmation_modal.cancel": "Cancel", + "confirmations.block.confirm": "Block", + "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.delete.confirm": "Delete", + "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.mute.confirm": "Mute", + "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "confirmations.unfollow.confirm": "Unfollow", + "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "embed.instructions": "Embed this status on your website by copying the code below.", + "embed.preview": "Here is what it will look like:", + "emoji_button.activity": "Activity", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flags", + "emoji_button.food": "Food & Drink", + "emoji_button.label": "Insert emoji", + "emoji_button.nature": "Nature", + "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ â”»â”â”»", + "emoji_button.objects": "Objects", + "emoji_button.people": "People", + "emoji_button.recent": "Frequently used", + "emoji_button.search": "Search...", + "emoji_button.search_results": "Search results", + "emoji_button.symbols": "Symbols", + "emoji_button.travel": "Travel & Places", + "empty_column.account_timeline": "No toots here!", + "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.domain_blocks": "There are no hidden domains yet.", + "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", + "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", + "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home.public_timeline": "the public timeline", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", + "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", + "follow_request.authorize": "Authorize", + "follow_request.reject": "Reject", + "getting_started.developers": "Developers", + "getting_started.directory": "Profile directory", + "getting_started.documentation": "Documentation", + "getting_started.heading": "Getting started", + "getting_started.invite": "Invite people", + "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.security": "Security", + "getting_started.terms": "Terms of service", + "hashtag.column_header.tag_mode.all": "and {additional}", + "hashtag.column_header.tag_mode.any": "or {additional}", + "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", + "hashtag.column_settings.tag_mode.all": "All of these", + "hashtag.column_settings.tag_mode.any": "Any of these", + "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "home.column_settings.basic": "Basic", + "home.column_settings.show_reblogs": "Show boosts", + "home.column_settings.show_replies": "Show replies", + "introduction.federation.action": "Next", + "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", + "introduction.federation.home.headline": "Home", + "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", + "introduction.federation.local.headline": "Local", + "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", + "introduction.interactions.action": "Finish toot-orial!", + "introduction.interactions.favourite.headline": "Favourite", + "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "introduction.interactions.reblog.headline": "Boost", + "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", + "introduction.interactions.reply.headline": "Reply", + "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", + "introduction.welcome.action": "Let's go!", + "introduction.welcome.headline": "First steps", + "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", + "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.compose": "to focus the compose textarea", + "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.favourites": "to open favourites list", + "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.heading": "Keyboard Shortcuts", + "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.muted": "to open muted users list", + "keyboard_shortcuts.my_profile": "to open your profile", + "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.pinned": "to open pinned toots list", + "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.up": "to move up in the list", + "lightbox.close": "Close", + "lightbox.next": "Next", + "lightbox.previous": "Previous", + "lists.account.add": "Add to list", + "lists.account.remove": "Remove from list", + "lists.delete": "Delete list", + "lists.edit": "Edit list", + "lists.edit.submit": "Change title", + "lists.new.create": "Add list", + "lists.new.title_placeholder": "New list title", + "lists.search": "Search among people you follow", + "lists.subheading": "Your lists", + "loading_indicator.label": "Loading...", + "media_gallery.toggle_visible": "Toggle visibility", + "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", + "mute_modal.hide_notifications": "Hide notifications from this user?", + "navigation_bar.apps": "Mobile apps", + "navigation_bar.blocks": "Blocked users", + "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", + "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.edit_profile": "Edit profile", + "navigation_bar.favourites": "Favourites", + "navigation_bar.filters": "Muted words", + "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.info": "About this server", + "navigation_bar.keyboard_shortcuts": "Hotkeys", + "navigation_bar.lists": "Lists", + "navigation_bar.logout": "Logout", + "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", + "navigation_bar.pins": "Pinned toots", + "navigation_bar.preferences": "Preferences", + "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", + "notification.favourite": "{name} favourited your status", + "notification.follow": "{name} followed you", + "notification.mention": "{name} mentioned you", + "notification.reblog": "{name} boosted your status", + "notifications.clear": "Clear notifications", + "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.favourite": "Favourites:", + "notifications.column_settings.filter_bar.advanced": "Display all categories", + "notifications.column_settings.filter_bar.category": "Quick filter bar", + "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.follow": "New followers:", + "notifications.column_settings.mention": "Mentions:", + "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.show": "Show in column", + "notifications.column_settings.sound": "Play sound", + "notifications.filter.all": "All", + "notifications.filter.boosts": "Boosts", + "notifications.filter.favourites": "Favourites", + "notifications.filter.follows": "Follows", + "notifications.filter.mentions": "Mentions", + "notifications.group": "{count} notifications", + "privacy.change": "Adjust status privacy", + "privacy.direct.long": "Post to mentioned users only", + "privacy.direct.short": "Direct", + "privacy.private.long": "Post to followers only", + "privacy.private.short": "Followers-only", + "privacy.public.long": "Post to public timelines", + "privacy.public.short": "Public", + "privacy.unlisted.long": "Do not show in public timelines", + "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}h", + "relative_time.just_now": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Cancel", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", + "report.placeholder": "Additional comments", + "report.submit": "Submit", + "report.target": "Report {target}", + "search.placeholder": "Search", + "search_popout.search_format": "Advanced search format", + "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.status": "status", + "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.user": "user", + "search_results.accounts": "People", + "search_results.hashtags": "Hashtags", + "search_results.statuses": "Toots", + "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "standalone.public_title": "A look inside...", + "status.admin_account": "Open moderation interface for @{name}", + "status.admin_status": "Open this status in the moderation interface", + "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", + "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", + "status.delete": "Delete", + "status.detailed_status": "Detailed conversation view", + "status.direct": "Direct message @{name}", + "status.embed": "Embed", + "status.favourite": "Favourite", + "status.filtered": "Filtered", + "status.load_more": "Load more", + "status.media_hidden": "Media hidden", + "status.mention": "Mention @{name}", + "status.more": "More", + "status.mute": "Mute @{name}", + "status.mute_conversation": "Mute conversation", + "status.open": "Expand this status", + "status.pin": "Pin on profile", + "status.pinned": "Pinned toot", + "status.read_more": "Read more", + "status.reblog": "Boost", + "status.reblog_private": "Boost to original audience", + "status.reblogged_by": "{name} boosted", + "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.redraft": "Delete & re-draft", + "status.reply": "Reply", + "status.replyAll": "Reply to thread", + "status.report": "Report @{name}", + "status.sensitive_toggle": "Click to view", + "status.sensitive_warning": "Sensitive content", + "status.share": "Share", + "status.show_less": "Show less", + "status.show_less_all": "Show less for all", + "status.show_more": "Show more", + "status.show_more_all": "Show more for all", + "status.show_thread": "Show thread", + "status.unmute_conversation": "Unmute conversation", + "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", + "tabs_bar.federated_timeline": "Federated", + "tabs_bar.home": "Home", + "tabs_bar.local_timeline": "Local", + "tabs_bar.notifications": "Notifications", + "tabs_bar.search": "Search", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", + "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", + "upload_area.title": "Drag & drop to upload", + "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "File upload limit exceeded.", + "upload_form.description": "Describe for the visually impaired", + "upload_form.focus": "Crop", + "upload_form.undo": "Delete", + "upload_progress.label": "Uploading...", + "video.close": "Close video", + "video.exit_fullscreen": "Exit full screen", + "video.expand": "Expand video", + "video.fullscreen": "Full screen", + "video.hide": "Hide video", + "video.mute": "Mute sound", + "video.pause": "Pause", + "video.play": "Play", + "video.unmute": "Unmute sound" +} diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 6d607068e2..040ada2c05 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -128,7 +128,7 @@ "empty_column.lists": "ì•„ì§ ë¦¬ìŠ¤íŠ¸ê°€ 없습니다. 리스트를 만들면 ì—¬ê¸°ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤.", "empty_column.mutes": "ì•„ì§ ì•„ë¬´ë„ ë®¤íŠ¸í•˜ì§€ 않았습니다.", "empty_column.notifications": "ì•„ì§ ì•Œë¦¼ì´ ì—†ìŠµë‹ˆë‹¤. 다른 사람과 대화를 시작해 보세요.", - "empty_column.public": "여기엔 ì•„ì§ ì•„ë¬´ ê²ƒë„ ì—†ìŠµë‹ˆë‹¤! 공개ì 으로 무언가 í¬ìŠ¤íŒ…하거나, 다른 ì¸ìŠ¤í„´ìŠ¤ì˜ ìœ ì €ë¥¼ 팔로우 í•´ì„œ 채워보세요", + "empty_column.public": "여기엔 ì•„ì§ ì•„ë¬´ ê²ƒë„ ì—†ìŠµë‹ˆë‹¤! 공개ì 으로 무언가 í¬ìŠ¤íŒ…하거나, 다른 ì„œë²„ì˜ ìœ ì €ë¥¼ 팔로우 í•´ì„œ 채워보세요", "follow_request.authorize": "허가", "follow_request.reject": "거부", "getting_started.developers": "개발ìž", @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "ê·¸ë¦¬ê³ {additional}", "hashtag.column_header.tag_mode.any": "ë˜ëŠ” {additional}", "hashtag.column_header.tag_mode.none": "({additional}를 ì œì™¸)", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "모ë‘", "hashtag.column_settings.tag_mode.any": "아무것ì´ë“ ", "hashtag.column_settings.tag_mode.none": "ì´ê²ƒë“¤ì„ ì œì™¸í•˜ê³ ", @@ -204,6 +206,7 @@ "lists.account.remove": "리스트ì—ì„œ ì œê±°", "lists.delete": "리스트 ì‚ì œ", "lists.edit": "리스트 편집", + "lists.edit.submit": "Change title", "lists.new.create": "리스트 추가", "lists.new.title_placeholder": "새 ë¦¬ìŠ¤íŠ¸ì˜ ì´ë¦„", "lists.search": "팔로우 ì¤‘ì¸ ì‚¬ëžŒë“¤ 중ì—ì„œ 찾기", @@ -224,7 +227,7 @@ "navigation_bar.favourites": "ì¦ê²¨ì°¾ê¸°", "navigation_bar.filters": "뮤트", "navigation_bar.follow_requests": "팔로우 ìš”ì²", - "navigation_bar.info": "ì´ ì¸ìŠ¤í„´ìŠ¤ì— 대해서", + "navigation_bar.info": "ì´ ì„œë²„ì— ëŒ€í•´ì„œ", "navigation_bar.keyboard_shortcuts": "단축키", "navigation_bar.lists": "리스트", "navigation_bar.logout": "로그아웃", @@ -297,7 +300,7 @@ "status.block": "@{name} 차단", "status.cancel_reblog_private": "부스트 취소", "status.cannot_reblog": "ì´ í¬ìŠ¤íŠ¸ëŠ” 부스트 í• ìˆ˜ 없습니다", - "status.copy": "Copy link to status", + "status.copy": "게시물 ë§í¬ 복사", "status.delete": "ì‚ì œ", "status.detailed_status": "대화 ìžì„¸ížˆ 보기", "status.direct": "@{name}ì—게 다ì´ë ‰íŠ¸ 메시지", @@ -343,7 +346,7 @@ "ui.beforeunload": "지금 나가면 ì €ìž¥ë˜ì§€ ì•Šì€ í•ëª©ì„ 잃게 ë©ë‹ˆë‹¤.", "upload_area.title": "드래그 & ë“œë¡ìœ¼ë¡œ 업로드", "upload_button.label": "미디어 추가 (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "File upload limit exceeded.", + "upload_error.limit": "íŒŒì¼ ì—…ë¡œë“œ ì œí•œì— ë„달했습니다.", "upload_form.description": "ì‹œê°ìž¥ì• ì¸ì„ 위한 설명", "upload_form.focus": "미리보기 변경", "upload_form.undo": "ì‚ì œ", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index dbea1d6dc9..eaf3366aa7 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 602a59ca08..536f654624 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 92f94ddc06..fdc1eed4f0 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -5,7 +5,7 @@ "account.block_domain": "Verberg alles van {domain}", "account.blocked": "Geblokkeerd", "account.direct": "Direct Message @{name}", - "account.disclaimer_full": "De informatie hieronder kan mogelijk een incompleet beeld geven van dit gebruikersprofiel.", + "account.disclaimer_full": "De informatie hieronder kan een incompleet beeld geven van dit gebruikersprofiel.", "account.domain_blocked": "Domein verborgen", "account.edit_profile": "Profiel bewerken", "account.endorse": "Op profiel weergeven", @@ -94,7 +94,7 @@ "confirmations.redraft.confirm": "Verwijderen en herschrijven", "confirmations.redraft.message": "Weet je zeker dat je deze toot wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en reacties op de originele toot zitten niet meer aan de nieuwe toot vast.", "confirmations.reply.confirm": "Reageren", - "confirmations.reply.message": "Door nu te reageren overschrijf je de toot die je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?", + "confirmations.reply.message": "Door nu te reageren overschrijf je de toot die je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?", "confirmations.unfollow.confirm": "Ontvolgen", "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?", "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.", @@ -117,7 +117,7 @@ "empty_column.blocks": "Jij hebt nog geen enkele gebruiker geblokkeerd.", "empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!", "empty_column.direct": "Je hebt nog geen directe berichten. Wanneer je er een verzend of ontvangt, zijn deze hier te zien.", - "empty_column.domain_blocks": "Er zijn nog geen genegeerde domeinen.", + "empty_column.domain_blocks": "Er zijn nog geen genegeerde servers.", "empty_column.favourited_statuses": "Jij hebt nog geen favoriete toots. Wanneer je er een aan jouw favorieten toevoegt, valt deze hier te zien.", "empty_column.favourites": "Niemand heeft deze toot nog aan hun favorieten toegevoegd. Wanneer iemand dit doet, valt dat hier te zien.", "empty_column.follow_requests": "Jij hebt nog enkel volgverzoek ontvangen. Wanneer je er eentje ontvangt, valt dat hier te zien.", @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "en {additional}", "hashtag.column_header.tag_mode.any": "of {additional}", "hashtag.column_header.tag_mode.none": "zonder {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Allemaal", "hashtag.column_settings.tag_mode.any": "Een van deze", "hashtag.column_settings.tag_mode.none": "Geen van deze", @@ -204,6 +206,7 @@ "lists.account.remove": "Uit lijst verwijderen", "lists.delete": "Lijst verwijderen", "lists.edit": "Lijst bewerken", + "lists.edit.submit": "Change title", "lists.new.create": "Lijst toevoegen", "lists.new.title_placeholder": "Naam nieuwe lijst", "lists.search": "Zoek naar mensen die je volgt", @@ -219,7 +222,7 @@ "navigation_bar.compose": "Nieuw toot schrijven", "navigation_bar.direct": "Directe berichten", "navigation_bar.discover": "Ontdekken", - "navigation_bar.domain_blocks": "Genegeerde domeinen", + "navigation_bar.domain_blocks": "Genegeerde servers", "navigation_bar.edit_profile": "Profiel bewerken", "navigation_bar.favourites": "Favorieten", "navigation_bar.filters": "Filters", @@ -297,7 +300,7 @@ "status.block": "Blokkeer @{name}", "status.cancel_reblog_private": "Niet langer boosten", "status.cannot_reblog": "Deze toot kan niet geboost worden", - "status.copy": "Copy link to status", + "status.copy": "Link naar toot kopiëren", "status.delete": "Verwijderen", "status.detailed_status": "Uitgebreide gespreksweergave", "status.direct": "Directe toot @{name}", @@ -343,7 +346,7 @@ "ui.beforeunload": "Je concept zal verloren gaan als je Mastodon verlaat.", "upload_area.title": "Hierin slepen om te uploaden", "upload_button.label": "Media toevoegen (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "File upload limit exceeded.", + "upload_error.limit": "Uploadlimiet van bestand overschreden.", "upload_form.description": "Omschrijf dit voor mensen met een visuele beperking", "upload_form.focus": "Voorvertoning aanpassen", "upload_form.undo": "Verwijderen", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index f6910f0e66..d9504c0c58 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Fjern fra listen", "lists.delete": "Slett listen", "lists.edit": "Rediger listen", + "lists.edit.submit": "Change title", "lists.new.create": "Ligg til liste", "lists.new.title_placeholder": "Ny listetittel", "lists.search": "Søk blant personer du følger", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 8250d59bdc..5d4897e2b4 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "e {additional}", "hashtag.column_header.tag_mode.any": "o {additional}", "hashtag.column_header.tag_mode.none": "sens {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Totes aquestes", "hashtag.column_settings.tag_mode.any": "Un d’aquestes", "hashtag.column_settings.tag_mode.none": "Cap d’aquestes", @@ -204,6 +206,7 @@ "lists.account.remove": "Levar de la lista", "lists.delete": "Suprimir la lista", "lists.edit": "Modificar la lista", + "lists.edit.submit": "Change title", "lists.new.create": "Ajustar una lista", "lists.new.title_placeholder": "TÃtol de la nòva lista", "lists.search": "Cercar demest lo monde que seguètz", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 2af261251d..d1d9004479 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "i {additional}", "hashtag.column_header.tag_mode.any": "lub {additional}", "hashtag.column_header.tag_mode.none": "bez {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Wszystkie", "hashtag.column_settings.tag_mode.any": "Dowolne", "hashtag.column_settings.tag_mode.none": "Å»adne", @@ -204,6 +206,7 @@ "lists.account.remove": "Usunąć z listy", "lists.delete": "UsuÅ„ listÄ™", "lists.edit": "Edytuj listÄ™", + "lists.edit.submit": "Change title", "lists.new.create": "Utwórz listÄ™", "lists.new.title_placeholder": "Wprowadź tytuÅ‚ listy", "lists.search": "Szukaj wÅ›ród osób które Å›ledzisz", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index bc36829210..83c2dd0ce7 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "e {additional}", "hashtag.column_header.tag_mode.any": "ou {additional}", "hashtag.column_header.tag_mode.none": "sem {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Todas essas", "hashtag.column_settings.tag_mode.any": "Qualquer uma dessas", "hashtag.column_settings.tag_mode.none": "Nenhuma dessas", @@ -204,6 +206,7 @@ "lists.account.remove": "Remover da lista", "lists.delete": "Delete list", "lists.edit": "Editar lista", + "lists.edit.submit": "Change title", "lists.new.create": "Adicionar lista", "lists.new.title_placeholder": "Novo tÃtulo da lista", "lists.search": "Procurar entre as pessoas que você segue", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json index edcfd2fa29..af48b323cc 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Remover da lista", "lists.delete": "Delete list", "lists.edit": "Editar lista", + "lists.edit.submit": "Change title", "lists.new.create": "Adicionar lista", "lists.new.title_placeholder": "Novo tÃtulo da lista", "lists.search": "Pesquisa entre as pessoas que segues", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 3be3214ee9..802e43ce26 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "È™i {additional}", "hashtag.column_header.tag_mode.any": "sau {additional}", "hashtag.column_header.tag_mode.none": "fără {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "Toate acestea", "hashtag.column_settings.tag_mode.any": "Oricare din acestea", "hashtag.column_settings.tag_mode.none": "Niciuna din aceastea", @@ -204,6 +206,7 @@ "lists.account.remove": "Elimină din listă", "lists.delete": "Șterge lista", "lists.edit": "Editează lista", + "lists.edit.submit": "Change title", "lists.new.create": "Adaugă listă", "lists.new.title_placeholder": "Titlu pentru noua listă", "lists.search": "Caută printre persoanale pe care le urmăreÈ™ti", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index db9e732c09..7c978bc3f0 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Убрать из ÑпиÑка", "lists.delete": "Удалить ÑпиÑок", "lists.edit": "Изменить ÑпиÑок", + "lists.edit.submit": "Change title", "lists.new.create": "Ðовый ÑпиÑок", "lists.new.title_placeholder": "Заголовок ÑпиÑка", "lists.search": "ИÑкать из ваших подпиÑок", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 8ca9132454..62677471c2 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -128,7 +128,7 @@ "empty_column.lists": "Nemáš eÅ¡te žiadne zoznamy. KeÄ nejaký vytvorÃÅ¡, bude zobrazený práve tu.", "empty_column.mutes": "EÅ¡te si nestĺmil žiadných užÃvateľov.", "empty_column.notifications": "EÅ¡te nemáš žiadne oznámenia. ZaÄni komunikovaÅ¥ s ostatnými, aby diskusia mohla zaÄaÅ¥.", - "empty_column.public": "EÅ¡te tu niÄ nie je. NapÃÅ¡ nieÄo verejne, alebo zaÄni sledovaÅ¥ užÃvateľov z iných Mastodon serverov, aby tu nieÄo pribudlo", + "empty_column.public": "EÅ¡te tu niÄ nie je. NapÃÅ¡ nieÄo verejne, alebo zaÄni sledovaÅ¥ užÃvateľov z iných serverov, aby tu nieÄo pribudlo", "follow_request.authorize": "Povoľ prÃstup", "follow_request.reject": "Odmietni", "getting_started.developers": "Vývojári", @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "a {additional}", "hashtag.column_header.tag_mode.any": "alebo {additional}", "hashtag.column_header.tag_mode.none": "bez {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "VÅ¡etky tieto", "hashtag.column_settings.tag_mode.any": "Hociktorý z týchto", "hashtag.column_settings.tag_mode.none": "Žiaden z týchto", @@ -204,6 +206,7 @@ "lists.account.remove": "OdobraÅ¥ zo zoznamu", "lists.delete": "VymazaÅ¥ list", "lists.edit": "Uprav zoznam", + "lists.edit.submit": "Change title", "lists.new.create": "Pridaj zoznam", "lists.new.title_placeholder": "Názov nového zoznamu", "lists.search": "Vyhľadávajte medzi užÃvateľmi ktorých sledujete", @@ -276,7 +279,7 @@ "reply_indicator.cancel": "ZruÅ¡iÅ¥", "report.forward": "Posuň ku {target}", "report.forward_hint": "Tento úÄet je z iného serveru. ChceÅ¡ poslaÅ¥ anonymnú kópiu reportu aj tam?", - "report.hint": "Toto nahlásenie bude zaslané správcom servera. MôžeÅ¡ napÃsaÅ¥ odvôvodnenie preÄo si nahlásil/a tento úÄet:", + "report.hint": "Toto nahlásenie bude zaslané správcom tvojho servera. MôžeÅ¡ napÃsaÅ¥ odvôvodnenie, preÄo nahlasujeÅ¡ tento úÄet:", "report.placeholder": "ÄŽalÅ¡ie komentáre", "report.submit": "PoslaÅ¥", "report.target": "Nahlásenie {target}", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 8e5e3deb98..213eb82036 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 3dd7fb4435..6e0d7ebb6e 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -1,360 +1,363 @@ { - "account.add_or_remove_from_list": "Add or Remove from lists", - "account.badges.bot": "Bot", - "account.block": "Block @{name}", - "account.block_domain": "Hide everything from {domain}", - "account.blocked": "Blocked", - "account.direct": "Direct message @{name}", - "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", - "account.domain_blocked": "Domain hidden", - "account.edit_profile": "Edit profile", - "account.endorse": "Feature on profile", - "account.follow": "Follow", - "account.followers": "Followers", - "account.followers.empty": "No one follows this user yet.", - "account.follows": "Follows", - "account.follows.empty": "This user doesn't follow anyone yet.", - "account.follows_you": "Follows you", - "account.hide_reblogs": "Hide boosts from @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.add_or_remove_from_list": "Shtoni ose Hiqni prej listash", + "account.badges.bot": "Robot", + "account.block": "Blloko @{name}", + "account.block_domain": "Fshih gjithçka prej {domain}", + "account.blocked": "E bllokuar", + "account.direct": "Mesazh i drejtpërdrejt për @{name}", + "account.disclaimer_full": "Të dhënat më poshtë mund ta pasqyrojnë pjesërisht profilin e përdoruesit.", + "account.domain_blocked": "Përkatësi e fshehur", + "account.edit_profile": "Përpunoni profilin", + "account.endorse": "Pasqyrojeni në profil", + "account.follow": "Ndiqeni", + "account.followers": "Ndjekës", + "account.followers.empty": "Këtë përdorues ende s’e ndjek njeri.", + "account.follows": "Ndjekje", + "account.follows.empty": "Ky përdorues ende s’ndjek njeri.", + "account.follows_you": "Ju ndjek", + "account.hide_reblogs": "Fshih përforcime nga @{name}", + "account.link_verified_on": "Pronësia e kësaj lidhjeje qe kontrolluar më {date}", + "account.locked_info": "Gjendja e privatësisë së kësaj llogarie është caktuar si e kyçur. I zoti merr dorazi në shqyrtim cilët mund ta ndjekin.", "account.media": "Media", - "account.mention": "Mention @{name}", - "account.moved_to": "{name} has moved to:", - "account.mute": "Mute @{name}", - "account.mute_notifications": "Mute notifications from @{name}", - "account.muted": "Muted", - "account.posts": "Toots", - "account.posts_with_replies": "Toots and replies", - "account.report": "Report @{name}", - "account.requested": "Awaiting approval. Click to cancel follow request", - "account.share": "Share @{name}'s profile", - "account.show_reblogs": "Show boosts from @{name}", - "account.unblock": "Unblock @{name}", - "account.unblock_domain": "Unhide {domain}", - "account.unendorse": "Don't feature on profile", - "account.unfollow": "Unfollow", - "account.unmute": "Unmute @{name}", - "account.unmute_notifications": "Unmute notifications from @{name}", - "account.view_full_profile": "View full profile", - "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", - "boost_modal.combo": "You can press {combo} to skip this next time", - "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", - "bundle_modal_error.close": "Close", - "bundle_modal_error.message": "Something went wrong while loading this component.", - "bundle_modal_error.retry": "Try again", - "column.blocks": "Blocked users", - "column.community": "Local timeline", - "column.direct": "Direct messages", - "column.domain_blocks": "Hidden domains", - "column.favourites": "Favourites", - "column.follow_requests": "Follow requests", - "column.home": "Home", - "column.lists": "Lists", - "column.mutes": "Muted users", - "column.notifications": "Notifications", - "column.pins": "Pinned toot", - "column.public": "Federated timeline", - "column_back_button.label": "Back", - "column_header.hide_settings": "Hide settings", - "column_header.moveLeft_settings": "Move column to the left", - "column_header.moveRight_settings": "Move column to the right", - "column_header.pin": "Pin", - "column_header.show_settings": "Show settings", - "column_header.unpin": "Unpin", - "column_subheading.settings": "Settings", - "community.column_settings.media_only": "Media Only", - "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.", - "compose_form.direct_message_warning_learn_more": "Learn more", - "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", - "compose_form.lock_disclaimer.lock": "locked", - "compose_form.placeholder": "What is on your mind?", - "compose_form.publish": "Toot", + "account.mention": "Përmendni @{name}", + "account.moved_to": "{name} ka kaluar te:", + "account.mute": "Heshtoni @{name}", + "account.mute_notifications": "Heshtoji njoftimet prej @{name}", + "account.muted": "Heshtuar", + "account.posts": "Mesazhe", + "account.posts_with_replies": "Mesazhe dhe përgjigje", + "account.report": "Raportojeni @{name}", + "account.requested": "Në pritje të miratimit. Klikoni që të anulohet kërkesa për ndjekje", + "account.share": "Ndajeni profilin e @{name} me të tjerët", + "account.show_reblogs": "Shfaq përforcime nga @{name}", + "account.unblock": "Zhbllokoje @{name}", + "account.unblock_domain": "Shfshihe {domain}", + "account.unendorse": "Mos e përfshi në profil", + "account.unfollow": "Resht së ndjekuri", + "account.unmute": "Ktheji zërin @{name}", + "account.unmute_notifications": "Hiqua ndalimin e shfaqjes njoftimeve nga @{name}", + "account.view_full_profile": "Shihni profilin e plotë", + "alert.unexpected.message": "Ndodhi një gabim të papritur.", + "alert.unexpected.title": "Hëm!", + "boost_modal.combo": "Mund të shtypni {combo}, që të anashkalohet kjo herës tjetër", + "bundle_column_error.body": "Diç shkoi ters teksa ngarkohej ky përbërës.", + "bundle_column_error.retry": "Riprovoni", + "bundle_column_error.title": "Gabim rrjeti", + "bundle_modal_error.close": "Mbylle", + "bundle_modal_error.message": "Diç shkoi ters teksa ngarkohej ky përbërës.", + "bundle_modal_error.retry": "Riprovoni", + "column.blocks": "Përdorues të bllokuar", + "column.community": "Rrjedhë kohore vendore", + "column.direct": "Mesazhe të drejtpërdrejta", + "column.domain_blocks": "Përkatësi të fshehura", + "column.favourites": "Të parapëlqyer", + "column.follow_requests": "Kërkesa për ndjekje", + "column.home": "Kreu", + "column.lists": "Lista", + "column.mutes": "Përdorues të heshtuar", + "column.notifications": "Njoftime", + "column.pins": "Mesazhe të fiksuar", + "column.public": "Rrjedhë kohore e federuar", + "column_back_button.label": "Mbrapsht", + "column_header.hide_settings": "Fshihi rregullimet", + "column_header.moveLeft_settings": "Shpjere shtyllën majtas", + "column_header.moveRight_settings": "Shpjere shtyllën djathtas", + "column_header.pin": "Fiksoje", + "column_header.show_settings": "Shfaq rregullime", + "column_header.unpin": "Shfiksoje", + "column_subheading.settings": "Rregullime", + "community.column_settings.media_only": "Vetëm Media", + "compose_form.direct_message_warning": "Ky mesazh do t’u dërgohet përdoruesve të përmendur.", + "compose_form.direct_message_warning_learn_more": "Mësoni më tepër", + "compose_form.hashtag_warning": "Ky mesazh s’do të paraqitet nën ndonjë hashtag, ngaqë s’i është caktuar ndonjë. Vetëm mesazhet publike mund të kërkohen sipas hashtagësh.", + "compose_form.lock_disclaimer": "Llogaria juaj s’është {locked}. Mund ta ndjekë cilido, për të parë postimet tuaja vetëm për ndjekësit.", + "compose_form.lock_disclaimer.lock": "e bllokuar", + "compose_form.placeholder": "Ç’bluani në mendje?", + "compose_form.publish": "Mesazh", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.marked": "Media is marked as sensitive", - "compose_form.sensitive.unmarked": "Media is not marked as sensitive", - "compose_form.spoiler.marked": "Text is hidden behind warning", - "compose_form.spoiler.unmarked": "Text is not hidden", - "compose_form.spoiler_placeholder": "Write your warning here", - "confirmation_modal.cancel": "Cancel", - "confirmations.block.confirm": "Block", - "confirmations.block.message": "Are you sure you want to block {name}?", - "confirmations.delete.confirm": "Delete", - "confirmations.delete.message": "Are you sure you want to delete this status?", - "confirmations.delete_list.confirm": "Delete", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", - "confirmations.domain_block.confirm": "Hide entire domain", - "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", - "confirmations.mute.confirm": "Mute", - "confirmations.mute.message": "Are you sure you want to mute {name}?", - "confirmations.redraft.confirm": "Delete & redraft", - "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", - "confirmations.reply.confirm": "Reply", - "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "confirmations.unfollow.confirm": "Unfollow", - "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", - "embed.instructions": "Embed this status on your website by copying the code below.", - "embed.preview": "Here is what it will look like:", - "emoji_button.activity": "Activity", - "emoji_button.custom": "Custom", - "emoji_button.flags": "Flags", - "emoji_button.food": "Food & Drink", - "emoji_button.label": "Insert emoji", - "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ â”»â”â”»", - "emoji_button.objects": "Objects", - "emoji_button.people": "People", - "emoji_button.recent": "Frequently used", - "emoji_button.search": "Search...", - "emoji_button.search_results": "Search results", - "emoji_button.symbols": "Symbols", - "emoji_button.travel": "Travel & Places", - "empty_column.account_timeline": "No toots here!", - "empty_column.blocks": "You haven't blocked any users yet.", - "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", - "empty_column.hashtag": "There is nothing in this hashtag yet.", - "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", - "empty_column.home.public_timeline": "the public timeline", - "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", - "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", - "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", - "follow_request.authorize": "Authorize", - "follow_request.reject": "Reject", - "getting_started.developers": "Developers", - "getting_started.directory": "Profile directory", - "getting_started.documentation": "Documentation", - "getting_started.heading": "Getting started", - "getting_started.invite": "Invite people", - "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", - "getting_started.security": "Security", - "getting_started.terms": "Terms of service", - "hashtag.column_header.tag_mode.all": "and {additional}", - "hashtag.column_header.tag_mode.any": "or {additional}", - "hashtag.column_header.tag_mode.none": "without {additional}", - "hashtag.column_settings.tag_mode.all": "All of these", - "hashtag.column_settings.tag_mode.any": "Any of these", - "hashtag.column_settings.tag_mode.none": "None of these", - "hashtag.column_settings.tag_toggle": "Include additional tags in this column", - "home.column_settings.basic": "Basic", - "home.column_settings.show_reblogs": "Show boosts", - "home.column_settings.show_replies": "Show replies", - "introduction.federation.action": "Next", - "introduction.federation.federated.headline": "Federated", - "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", - "introduction.federation.home.headline": "Home", - "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", - "introduction.federation.local.headline": "Local", - "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", - "introduction.interactions.action": "Finish toot-orial!", - "introduction.interactions.favourite.headline": "Favourite", - "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", - "introduction.interactions.reblog.headline": "Boost", - "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", - "introduction.interactions.reply.headline": "Reply", - "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", - "introduction.welcome.action": "Let's go!", - "introduction.welcome.headline": "First steps", - "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", - "keyboard_shortcuts.back": "to navigate back", - "keyboard_shortcuts.blocked": "to open blocked users list", - "keyboard_shortcuts.boost": "to boost", - "keyboard_shortcuts.column": "to focus a status in one of the columns", - "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.description": "Description", - "keyboard_shortcuts.direct": "to open direct messages column", - "keyboard_shortcuts.down": "to move down in the list", - "keyboard_shortcuts.enter": "to open status", - "keyboard_shortcuts.favourite": "to favourite", - "keyboard_shortcuts.favourites": "to open favourites list", - "keyboard_shortcuts.federated": "to open federated timeline", - "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.home": "to open home timeline", - "keyboard_shortcuts.hotkey": "Hotkey", - "keyboard_shortcuts.legend": "to display this legend", - "keyboard_shortcuts.local": "to open local timeline", - "keyboard_shortcuts.mention": "to mention author", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", - "keyboard_shortcuts.reply": "to reply", - "keyboard_shortcuts.requests": "to open follow requests list", - "keyboard_shortcuts.search": "to focus search", - "keyboard_shortcuts.start": "to open \"get started\" column", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", - "keyboard_shortcuts.toot": "to start a brand new toot", - "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", - "keyboard_shortcuts.up": "to move up in the list", - "lightbox.close": "Close", - "lightbox.next": "Next", - "lightbox.previous": "Previous", - "lists.account.add": "Add to list", - "lists.account.remove": "Remove from list", - "lists.delete": "Delete list", - "lists.edit": "Edit list", - "lists.new.create": "Add list", - "lists.new.title_placeholder": "New list title", - "lists.search": "Search among people you follow", - "lists.subheading": "Your lists", - "loading_indicator.label": "Loading...", - "media_gallery.toggle_visible": "Toggle visibility", - "missing_indicator.label": "Not found", - "missing_indicator.sublabel": "This resource could not be found", - "mute_modal.hide_notifications": "Hide notifications from this user?", - "navigation_bar.apps": "Mobile apps", - "navigation_bar.blocks": "Blocked users", - "navigation_bar.community_timeline": "Local timeline", - "navigation_bar.compose": "Compose new toot", - "navigation_bar.direct": "Direct messages", - "navigation_bar.discover": "Discover", - "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "Edit profile", - "navigation_bar.favourites": "Favourites", - "navigation_bar.filters": "Muted words", - "navigation_bar.follow_requests": "Follow requests", - "navigation_bar.info": "About this server", - "navigation_bar.keyboard_shortcuts": "Hotkeys", - "navigation_bar.lists": "Lists", - "navigation_bar.logout": "Logout", - "navigation_bar.mutes": "Muted users", - "navigation_bar.personal": "Personal", - "navigation_bar.pins": "Pinned toots", - "navigation_bar.preferences": "Preferences", - "navigation_bar.public_timeline": "Federated timeline", - "navigation_bar.security": "Security", - "notification.favourite": "{name} favourited your status", - "notification.follow": "{name} followed you", - "notification.mention": "{name} mentioned you", - "notification.reblog": "{name} boosted your status", - "notifications.clear": "Clear notifications", - "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", - "notifications.column_settings.alert": "Desktop notifications", - "notifications.column_settings.favourite": "Favourites:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", - "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show": "Show", - "notifications.column_settings.follow": "New followers:", - "notifications.column_settings.mention": "Mentions:", - "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.reblog": "Boosts:", - "notifications.column_settings.show": "Show in column", - "notifications.column_settings.sound": "Play sound", - "notifications.filter.all": "All", - "notifications.filter.boosts": "Boosts", - "notifications.filter.favourites": "Favourites", - "notifications.filter.follows": "Follows", - "notifications.filter.mentions": "Mentions", - "notifications.group": "{count} notifications", - "privacy.change": "Adjust status privacy", - "privacy.direct.long": "Post to mentioned users only", - "privacy.direct.short": "Direct", - "privacy.private.long": "Post to followers only", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Post to public timelines", - "privacy.public.short": "Public", - "privacy.unlisted.long": "Do not show in public timelines", - "privacy.unlisted.short": "Unlisted", - "regeneration_indicator.label": "Loading…", - "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "compose_form.sensitive.marked": "Media është shënuar si rezervat", + "compose_form.sensitive.unmarked": "Media s’është shënuar si rezervat", + "compose_form.spoiler.marked": "Teksti është fshehur pas sinjalizimit", + "compose_form.spoiler.unmarked": "Teksti s’është i fshehur", + "compose_form.spoiler_placeholder": "Shkruani këtu sinjalizimin tuaj", + "confirmation_modal.cancel": "Anuloje", + "confirmations.block.confirm": "Bllokoje", + "confirmations.block.message": "Jeni i sigurt se doni të bllokohet {name}?", + "confirmations.delete.confirm": "Fshije", + "confirmations.delete.message": "Jeni i sigurt se doni të fshihet kjo gjendje?", + "confirmations.delete_list.confirm": "Fshije", + "confirmations.delete_list.message": "Jeni i sigurt që doni të fshihet përgjithmonë kjo listë?", + "confirmations.domain_block.confirm": "Fshih krejt përkatësinë", + "confirmations.domain_block.message": "Jeni i sigurt, shumë i sigurt se doni të bllokohet krejt {domain}? Në shumicën e rasteve, ndoca bllokime ose heshtime me synim të caktuar janë të mjaftueshme dhe të parapëlqyera. S’keni për të parë lëndë nga kjo përkatësi në ndonjë rrjedhë kohore publike, apo te njoftimet tuaja. Ndjekësit tuaj prej asaj përkatësie do të hiqen.", + "confirmations.mute.confirm": "Heshtoje", + "confirmations.mute.message": "Jeni i sigurt se doni të heshtohet {name}?", + "confirmations.redraft.confirm": "Fshijeni & rihartojeni", + "confirmations.redraft.message": "Jeni i sigurt se doni të fshihet kjo gjendje dhe të rihartohet? Parapëlqimet dhe boosts do të humbin, ndërsa përgjigjet te postimi origjinal do të bëhen jetime.", + "confirmations.reply.confirm": "Përgjigjuni", + "confirmations.reply.message": "Përgjigja tani do të shkaktojë mbishkrimin e mesazhit që po hartoni. Jeni i sigurt se doni të vazhdohet më tej?", + "confirmations.unfollow.confirm": "Resht së ndjekuri", + "confirmations.unfollow.message": "Jeni i sigurt se doni të mos ndiqet më {name}?", + "embed.instructions": "Trupëzojeni këtë gjendje në sajtin tuaj duke kopjuar kodin më poshtë.", + "embed.preview": "Ja si do të duket:", + "emoji_button.activity": "Veprimtari", + "emoji_button.custom": "Vetjak", + "emoji_button.flags": "Flamuj", + "emoji_button.food": "Ushqim & Pije", + "emoji_button.label": "Futni emoji", + "emoji_button.nature": "Natyrë", + "emoji_button.not_found": "No emojos!!! (╯°□°)╯︵ â”»â”â”»", + "emoji_button.objects": "Objekte", + "emoji_button.people": "Persona", + "emoji_button.recent": "Të përdorur shpesh", + "emoji_button.search": "Kërkoni…", + "emoji_button.search_results": "Përfundime kërkimi", + "emoji_button.symbols": "Simbole", + "emoji_button.travel": "Udhëtime & Vende", + "empty_column.account_timeline": "S’ka mesazhe këtu!", + "empty_column.blocks": "S’keni bllokuar ende ndonjë përdorues.", + "empty_column.community": "Rrjedha kohore vendore është e zbrazët. Shkruani diçka publikisht që t’i hyhet valles!", + "empty_column.direct": "S’keni ende ndonjë mesazh të drejtpërdrejt. Kur dërgoni ose merrni një të tillë, ai do të shfaqet këtu.", + "empty_column.domain_blocks": "Ende s’ka përkatësi të fshehura.", + "empty_column.favourited_statuses": "S’keni ende ndonjë mesazh të parapëlqyer. Kur parapëlqeni një të tillë, ai do të shfaqet këtu.", + "empty_column.favourites": "Askush s’e ka parapëlqyer ende këtë mesazh. Kur e bën dikush, ai do të shfaqet këtu.", + "empty_column.follow_requests": "Ende s’keni ndonjë kërkesë ndjekjeje. Kur të merrni një të tillë, do të shfaqet këtu.", + "empty_column.hashtag": "Ende s’ka gjë nën këtë hashtag.", + "empty_column.home": "Rrjedha juaj kohore është e zbrazët! Vizitoni {public} ose përdorni kërkimin që t’ia filloni dhe të takoni përdorues të tjerë.", + "empty_column.home.public_timeline": "rrjedha kohore publike", + "empty_column.list": "Në këtë listë ende s’ka gjë. Kur anëtarë të kësaj liste postojnë gjendje të reja, ato do të shfaqen këtu.", + "empty_column.lists": "Ende s’keni ndonjë listë. Kur të krijoni një të tillë, do të duket këtu.", + "empty_column.mutes": "S’keni heshtuar ende ndonjë përdorues.", + "empty_column.notifications": "Ende s’keni ndonjë njoftim. Ndërveproni me të tjerët që të nisë biseda.", + "empty_column.public": "S’ka gjë këtu! Shkruani diçka publikisht, ose ndiqni dorazi përdorues prej instancash të tjera, që ta mbushni këtë zonë", + "follow_request.authorize": "Autorizoje", + "follow_request.reject": "Hidhe tej", + "getting_started.developers": "Zhvillues", + "getting_started.directory": "Drejtori profilesh", + "getting_started.documentation": "Dokumentim", + "getting_started.heading": "Si t’ia fillohet", + "getting_started.invite": "Ftoni njerëz", + "getting_started.open_source_notice": "Mastodon-i është software me burim të hapur. Mund të jepni ndihmesë ose të njoftoni probleme në GitHub, te {github}.", + "getting_started.security": "Siguri", + "getting_started.terms": "Kushte shërbimi", + "hashtag.column_header.tag_mode.all": "dhe {additional}", + "hashtag.column_header.tag_mode.any": "ose {additional}", + "hashtag.column_header.tag_mode.none": "pa {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", + "hashtag.column_settings.tag_mode.all": "Krejt këto", + "hashtag.column_settings.tag_mode.any": "Cilëndo prej këtyre", + "hashtag.column_settings.tag_mode.none": "Asnjë prej këtyre", + "hashtag.column_settings.tag_toggle": "Përfshi etiketa shtesë për këtë shtyllë", + "home.column_settings.basic": "Bazë", + "home.column_settings.show_reblogs": "Shfaq përforcime", + "home.column_settings.show_replies": "Shfaq përgjigje", + "introduction.federation.action": "Pasuesi", + "introduction.federation.federated.headline": "Të federuara", + "introduction.federation.federated.text": "Postimet publike nga shërbyes të tjerë të fediversit do të shfaqen te rrjedha kohore e të federuarve.", + "introduction.federation.home.headline": "Vatër", + "introduction.federation.home.text": "Postime prej personash që ndiqni do të shfaqen te prurja juaj vatër. Mund të ndiqni këdo, në çfarëdo shërbyesi!", + "introduction.federation.local.headline": "Vendore", + "introduction.federation.local.text": "Postimet publike prej personash në të njëjtin shërbyes me ju do të shfaqen te rrjedha kohore vendore.", + "introduction.interactions.action": "Përfundojeni përkujdesoren!", + "introduction.interactions.favourite.headline": "Parapëlqejeni", + "introduction.interactions.favourite.text": "Duke e parapëlqyer, një mesazh mund ta ruani për më vonë dhe t’i bëni të ditur autorit se e pëlqyet.", + "introduction.interactions.reblog.headline": "Përforcime", + "introduction.interactions.reblog.text": "Mesazhet e të tjerëve mund t’i ndani me ndjekësit tuaj duke i përforcuar.", + "introduction.interactions.reply.headline": "Përgjigjuni", + "introduction.interactions.reply.text": "Mund t'u përgjigjeni mesazheve tuaja dhe atyre të personave të tjerë, çka do t’i lidhë ato tok në një bisedë.", + "introduction.welcome.action": "Shkojmë!", + "introduction.welcome.headline": "Hapat e parë", + "introduction.welcome.text": "Mirë se vini në fedivers! Brenda pak çastesh do të jeni në gjendje të transmetoni mesazhe dhe të bisedoni me miqtë tuaj nëpër një larmi të madhe shërbyesish. Po ky shërbyes, {domain}, është i veçantë—strehon profilin tuaj, ndaj mbajeni mend emrin e tij.", + "keyboard_shortcuts.back": "për shkuarje mbrapsht", + "keyboard_shortcuts.blocked": "për hapje liste përdoruesish të bllokuar", + "keyboard_shortcuts.boost": "për përfocim", + "keyboard_shortcuts.column": "për kalim fokusi mbi një gjendje te një nga shtyllat", + "keyboard_shortcuts.compose": "për kalim fokusi te fusha e hartimit të mesazheve", + "keyboard_shortcuts.description": "Përshkrim", + "keyboard_shortcuts.direct": "për hapje shtylle mesazhesh të drejtpërdrejtë", + "keyboard_shortcuts.down": "për zbritje poshtë nëpër listë", + "keyboard_shortcuts.enter": "për hapje gjendjeje", + "keyboard_shortcuts.favourite": "për t’i vënë shenjë si të parapëlqyer", + "keyboard_shortcuts.favourites": "për hapje liste të parapëlqyerish", + "keyboard_shortcuts.federated": "për hapje rrjedhe kohore të të federuarve", + "keyboard_shortcuts.heading": "Shkurtore tastiere", + "keyboard_shortcuts.home": "për hapje rrjedhe kohore vetjake", + "keyboard_shortcuts.hotkey": "Tast përkatës", + "keyboard_shortcuts.legend": "për shfaqje të kësaj legjende", + "keyboard_shortcuts.local": "për hapje rrjedhe kohore vendore", + "keyboard_shortcuts.mention": "për përmendje të autorit", + "keyboard_shortcuts.muted": "për hapje liste përdoruesish të heshtuar", + "keyboard_shortcuts.my_profile": "për hapjen e profilit tuaj", + "keyboard_shortcuts.notifications": "për hapje shtylle njoftimesh", + "keyboard_shortcuts.pinned": "për hapje liste mesazhesh të fiksuar", + "keyboard_shortcuts.profile": "për hapje të profilit të autorit", + "keyboard_shortcuts.reply": "për t’u përgjigjur", + "keyboard_shortcuts.requests": "për hapje liste kërkesash për ndjekje", + "keyboard_shortcuts.search": "për kalim fokusi te kërkimi", + "keyboard_shortcuts.start": "për hapjen e shtyllës \"fillojani\"", + "keyboard_shortcuts.toggle_hidden": "për shfaqje/fshehje teksti pas CW", + "keyboard_shortcuts.toot": "për të filluar një mesazh fringo të ri", + "keyboard_shortcuts.unfocus": "për heqjen e fokusit nga fusha e hartimit të mesazheve apo kërkimeve", + "keyboard_shortcuts.up": "për ngjitje sipër nëpër listë", + "lightbox.close": "Mbylle", + "lightbox.next": "Pasuesja", + "lightbox.previous": "E mëparshmja", + "lists.account.add": "Shto në listë", + "lists.account.remove": "Hiqe nga lista", + "lists.delete": "Fshije listën", + "lists.edit": "Përpunoni listën", + "lists.edit.submit": "Change title", + "lists.new.create": "Shtoni listë", + "lists.new.title_placeholder": "Titull liste të re", + "lists.search": "Kërkoni mes personash që ndiqni", + "lists.subheading": "Listat tuaja", + "loading_indicator.label": "Po ngarkohet…", + "media_gallery.toggle_visible": "Ndërroni dukshmërinë", + "missing_indicator.label": "S’u gjet", + "missing_indicator.sublabel": "Ky burim s’u gjet dot", + "mute_modal.hide_notifications": "Të fshihen njoftimet prej këtij përdoruesi?", + "navigation_bar.apps": "Aplikacione për celular", + "navigation_bar.blocks": "Përdorues të bllokuar", + "navigation_bar.community_timeline": "Rrjedhë kohore vendore", + "navigation_bar.compose": "Hartoni mesazh të ri", + "navigation_bar.direct": "Mesazhe të drejtpërdrejta", + "navigation_bar.discover": "Zbuloni", + "navigation_bar.domain_blocks": "Përkatësi të fshehura", + "navigation_bar.edit_profile": "Përpunoni profilin", + "navigation_bar.favourites": "Të parapëlqyer", + "navigation_bar.filters": "Fjalë të heshtuara", + "navigation_bar.follow_requests": "Kërkesa për ndjekje", + "navigation_bar.info": "Mbi këtë shërbyes", + "navigation_bar.keyboard_shortcuts": "Taste përkatës", + "navigation_bar.lists": "Lista", + "navigation_bar.logout": "Dalje", + "navigation_bar.mutes": "Përdorues të heshtuar", + "navigation_bar.personal": "Personale", + "navigation_bar.pins": "Mesazhe të fiksuar", + "navigation_bar.preferences": "Parapëlqime", + "navigation_bar.public_timeline": "Rrjedhë kohore të federuarish", + "navigation_bar.security": "Siguri", + "notification.favourite": "{name} parapëlqeu gjendjen tuaj", + "notification.follow": "{name} zuri t’ju ndjekë", + "notification.mention": "{name} ju ka përmendur", + "notification.reblog": "përforcoi gjendjen tuaj", + "notifications.clear": "Pastroji njoftimet", + "notifications.clear_confirmation": "Jeni i sigurt se doni të pastrohen përgjithmonë krejt njoftimet tuaja?", + "notifications.column_settings.alert": "Njoftime desktopi", + "notifications.column_settings.favourite": "Të parapëlqyer:", + "notifications.column_settings.filter_bar.advanced": "Shfaq krejt kategoritë", + "notifications.column_settings.filter_bar.category": "Shtyllë filtrimesh të shpejta", + "notifications.column_settings.filter_bar.show": "Shfaq", + "notifications.column_settings.follow": "Ndjekës të rinj:", + "notifications.column_settings.mention": "Përmendje:", + "notifications.column_settings.push": "Njoftime Push", + "notifications.column_settings.reblog": "Përforcime:", + "notifications.column_settings.show": "Shfaq në shtylla", + "notifications.column_settings.sound": "Luaj një tingull", + "notifications.filter.all": "Krejt", + "notifications.filter.boosts": "Përforcime", + "notifications.filter.favourites": "Të parapëlqyer", + "notifications.filter.follows": "Ndjekje", + "notifications.filter.mentions": "Përmendje", + "notifications.group": "%(count)s njoftime", + "privacy.change": "Rregulloni privatësi gjendje", + "privacy.direct.long": "Postoja vetëm përdoruesve të përmendur", + "privacy.direct.short": "I drejtpërdrejtë", + "privacy.private.long": "Postojuani vetëm ndjekësve", + "privacy.private.short": "Vetëm ndjekësve", + "privacy.public.long": "Postojeni në rrjedha publike kohore", + "privacy.public.short": "Publike", + "privacy.unlisted.long": "Mos e postoni në rrjedha publike kohore", + "privacy.unlisted.short": "Jo në lista", + "regeneration_indicator.label": "Po ngarkohet…", + "regeneration_indicator.sublabel": "Prurja juaj vetjake po përgatiteet!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", - "relative_time.just_now": "now", + "relative_time.just_now": "tani", "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", - "reply_indicator.cancel": "Cancel", - "report.forward": "Forward to {target}", - "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", - "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", - "report.placeholder": "Additional comments", - "report.submit": "Submit", - "report.target": "Report {target}", - "search.placeholder": "Search", - "search_popout.search_format": "Advanced search format", - "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "reply_indicator.cancel": "Anuloje", + "report.forward": "Përcillja {target}", + "report.forward_hint": "Llogaria është nga një shërbyes tjetër. Të dërgohet edhe një kopje e anonimizuar e raportimit?", + "report.hint": "Raportimi do t’u dërgohet moderatorëve të shërbyesit tuaj. Më poshtë mund të jepni një shpjegim se pse po e raportoni këtë llogari:", + "report.placeholder": "Komente shtesë", + "report.submit": "Parashtroje", + "report.target": "Raportim i {target}", + "search.placeholder": "Kërkoni", + "search_popout.search_format": "Format kërkimi të përparuar", + "search_popout.tips.full_text": "Kërkimi për tekst të thjeshtë përgjigjet me gjendje që keni shkruar, parapëlqyer, përforcuar, ose ku jeni përmendur, si dhe emra përdoruesish, emra ekrani dhe hashtagë që kanë përputhje me termin e kërkimit.", "search_popout.tips.hashtag": "hashtag", - "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", - "search_popout.tips.user": "user", - "search_results.accounts": "People", - "search_results.hashtags": "Hashtags", - "search_results.statuses": "Toots", - "search_results.total": "{count, number} {count, plural, one {result} other {results}}", - "standalone.public_title": "A look inside...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", - "status.block": "Block @{name}", - "status.cancel_reblog_private": "Unboost", - "status.cannot_reblog": "This post cannot be boosted", - "status.copy": "Copy link to status", - "status.delete": "Delete", - "status.detailed_status": "Detailed conversation view", - "status.direct": "Direct message @{name}", - "status.embed": "Embed", - "status.favourite": "Favourite", - "status.filtered": "Filtered", - "status.load_more": "Load more", - "status.media_hidden": "Media hidden", - "status.mention": "Mention @{name}", - "status.more": "More", - "status.mute": "Mute @{name}", - "status.mute_conversation": "Mute conversation", - "status.open": "Expand this status", - "status.pin": "Pin on profile", - "status.pinned": "Pinned toot", - "status.read_more": "Read more", - "status.reblog": "Boost", - "status.reblog_private": "Boost to original audience", - "status.reblogged_by": "{name} boosted", - "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", - "status.redraft": "Delete & re-draft", - "status.reply": "Reply", - "status.replyAll": "Reply to thread", - "status.report": "Report @{name}", - "status.sensitive_toggle": "Click to view", - "status.sensitive_warning": "Sensitive content", - "status.share": "Share", - "status.show_less": "Show less", - "status.show_less_all": "Show less for all", - "status.show_more": "Show more", - "status.show_more_all": "Show more for all", - "status.show_thread": "Show thread", - "status.unmute_conversation": "Unmute conversation", - "status.unpin": "Unpin from profile", - "suggestions.dismiss": "Dismiss suggestion", - "suggestions.header": "You might be interested in…", - "tabs_bar.federated_timeline": "Federated", - "tabs_bar.home": "Home", - "tabs_bar.local_timeline": "Local", - "tabs_bar.notifications": "Notifications", - "tabs_bar.search": "Search", - "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", - "upload_area.title": "Drag & drop to upload", - "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "File upload limit exceeded.", - "upload_form.description": "Describe for the visually impaired", - "upload_form.focus": "Crop", - "upload_form.undo": "Delete", - "upload_progress.label": "Uploading...", - "video.close": "Close video", - "video.exit_fullscreen": "Exit full screen", - "video.expand": "Expand video", - "video.fullscreen": "Full screen", - "video.hide": "Hide video", - "video.mute": "Mute sound", - "video.pause": "Pause", - "video.play": "Play", - "video.unmute": "Unmute sound" + "search_popout.tips.status": "gjendje", + "search_popout.tips.text": "Kërkim për tekst të thjeshtë përgjigjet me emra, emra përdoruesish dhe hashtagë që kanë përputhje me termin e kërkimit", + "search_popout.tips.user": "përdorues", + "search_results.accounts": "Persona", + "search_results.hashtags": "Hashtagë", + "search_results.statuses": "Mesazhe", + "search_results.total": "{count, number} {count, plural, një {result} {results} të tjera}", + "standalone.public_title": "Një pamje brenda…", + "status.admin_account": "Hap ndërfaqe moderimi për @{name}", + "status.admin_status": "Hape këtë gjendje te ndërfaqja e moderimit", + "status.block": "Blloko @{name}", + "status.cancel_reblog_private": "Shpërforcojeni", + "status.cannot_reblog": "Ky postim s’mund të përforcohet", + "status.copy": "Kopjoje lidhjen te gjendje", + "status.delete": "Fshije", + "status.detailed_status": "Pamje e hollësishme bisede", + "status.direct": "Mesazh i drejtpërdrejt për @{name}", + "status.embed": "Trupëzim", + "status.favourite": "I parapëlqyer", + "status.filtered": "I filtruar", + "status.load_more": "Ngarko më tepër", + "status.media_hidden": "Me media të fshehur", + "status.mention": "Përmendni @{name}", + "status.more": "Më tepër", + "status.mute": "Heshtoni @{name}", + "status.mute_conversation": "Heshtojeni bisedën", + "status.open": "Zgjeroje këtë gjendje", + "status.pin": "Fiksoje në profil", + "status.pinned": "Mesazh i fiksuar", + "status.read_more": "Lexoni më tepër", + "status.reblog": "Përforcojeni", + "status.reblog_private": "Përforcim për publikun origjinal", + "status.reblogged_by": "{name} përforcoi", + "status.reblogs.empty": "Këtë mesazh s’e ka përforcuar njeri deri tani. Kur ta bëjë dikush, kjo do të duket këtu.", + "status.redraft": "Fshijeni & rihartojeni", + "status.reply": "Përgjigjuni", + "status.replyAll": "Përgjigjuni rrjedhës", + "status.report": "Raportojeni @{name}", + "status.sensitive_toggle": "Klikoni që ta shihni", + "status.sensitive_warning": "Lëndë me spec", + "status.share": "Ndajeni me të tjerët", + "status.show_less": "Shfaq më pak", + "status.show_less_all": "Shfaq më pak për të tërë", + "status.show_more": "Shfaq më tepër", + "status.show_more_all": "Shfaq më tepër për të tërë", + "status.show_thread": "Shfaq rrjedhën", + "status.unmute_conversation": "Ktheji zërin bisedës", + "status.unpin": "Shfiksoje nga profili", + "suggestions.dismiss": "Mos e merr parasysh sugjerimin", + "suggestions.header": "Mund t’ju interesonte…", + "tabs_bar.federated_timeline": "E federuar", + "tabs_bar.home": "Kreu", + "tabs_bar.local_timeline": "Vendore", + "tabs_bar.notifications": "Njoftime", + "tabs_bar.search": "Kërkim", + "trends.count_by_accounts": "{count} {rawCount, plural, një {person} {people} të tjerë} po flasin", + "ui.beforeunload": "Skica juaj do të humbë nëse dilni nga Mastodon-i.", + "upload_area.title": "Merreni & vëreni që të ngarkohet", + "upload_button.label": "Shtoni media (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_error.limit": "U tejkalua kufi ngarkimi kartelash.", + "upload_form.description": "Përshkruajeni për persona me probleme shikimi", + "upload_form.focus": "Ndryshoni parapamjen", + "upload_form.undo": "Fshije", + "upload_progress.label": "Po ngarkohet…", + "video.close": "Mbylle videon", + "video.exit_fullscreen": "Dil nga mënyra Sa Krejt Ekrani", + "video.expand": "Zgjeroje videon", + "video.fullscreen": "Sa krejt ekrani", + "video.hide": "Fshihe videon", + "video.mute": "Hiqi zërin", + "video.pause": "Ndalesë", + "video.play": "Luaje", + "video.unmute": "Riktheji zërin" } diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 484e2690dc..79619c9144 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Ukloni sa liste", "lists.delete": "ObriÅ¡i listu", "lists.edit": "Izmeni listu", + "lists.edit.submit": "Change title", "lists.new.create": "Dodaj listu", "lists.new.title_placeholder": "Naslov nove liste", "lists.search": "Pretraži meÄ‘u ljudima koje pratite", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 284ceab47a..b72431b347 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Уклони Ñа лиÑте", "lists.delete": "Обриши лиÑту", "lists.edit": "Измени лиÑту", + "lists.edit.submit": "Change title", "lists.new.create": "Додај лиÑту", "lists.new.title_placeholder": "ÐаÑлов нове лиÑте", "lists.search": "Претражи међу људима које пратите", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 9acf2428ee..018fdc85f1 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Ta bort frÃ¥n lista", "lists.delete": "Radera lista", "lists.edit": "Redigera lista", + "lists.edit.submit": "Change title", "lists.new.create": "Lägg till lista", "lists.new.title_placeholder": "Ny listrubrik", "lists.search": "Sök bland personer du följer", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 602a59ca08..536f654624 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index b118c189f6..1c27fab811 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "మరియౠ{additional}", "hashtag.column_header.tag_mode.any": "లేదా {additional}", "hashtag.column_header.tag_mode.none": "{additional} లేకà±à°‚à°¡à°¾", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "ఇవనà±à°¨à±€All of these", "hashtag.column_settings.tag_mode.any": "వీటిలో à°à°µà±ˆà°¨à°¾", "hashtag.column_settings.tag_mode.none": "ఇవేవీ కావà±", @@ -204,6 +206,7 @@ "lists.account.remove": "జాబితా à°¨à±à°‚à°¡à°¿ తొలగించà±", "lists.delete": "జాబితానౠతొలగించà±", "lists.edit": "జాబితానౠసవరించà±", + "lists.edit.submit": "Change title", "lists.new.create": "జాబితానౠజోడించà±", "lists.new.title_placeholder": "కొతà±à°¤ జాబితా శీరà±à°·à°¿à°•", "lists.search": "మీరౠఅనà±à°¸à°°à°¿à°‚చే à°µà±à°¯à°•à±à°¤à±à°²à°²à±‹ శోధించండి", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 2b0fc40e2d..5947b04c21 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 30dc06d8c4..76949352f1 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -1,84 +1,84 @@ { - "account.add_or_remove_from_list": "Add or Remove from lists", + "account.add_or_remove_from_list": "Listelere ekle veya kaldır", "account.badges.bot": "Bot", "account.block": "Engelle @{name}", - "account.block_domain": "Hide everything from {domain}", - "account.blocked": "Blocked", + "account.block_domain": "{domain} alanından her ÅŸeyi gizle", + "account.blocked": "EngellenmiÅŸ", "account.direct": "Direct Message @{name}", - "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", - "account.domain_blocked": "Domain hidden", + "account.disclaimer_full": "AÅŸağıdaki bilgiler, kullanıcının profilini tam olarak yansıtmayabilir.", + "account.domain_blocked": "Alan adı gizlendi", "account.edit_profile": "Profili düzenle", - "account.endorse": "Feature on profile", + "account.endorse": "Profildeki özellik", "account.follow": "Takip et", "account.followers": "Takipçiler", - "account.followers.empty": "No one follows this user yet.", + "account.followers.empty": "Henüz kimse bu kullanıcıyı takip etmiyor.", "account.follows": "Takip ettikleri", - "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows.empty": "Bu kullanıcı henüz kimseyi takip etmiyor.", "account.follows_you": "Seni takip ediyor", - "account.hide_reblogs": "Hide boosts from @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", - "account.media": "Media", - "account.mention": "Bahset @{name}", + "account.hide_reblogs": "@{name} kiÅŸisinden boost'ları gizle", + "account.link_verified_on": "Bu baÄŸlantının mülkiyeti {date} tarihinde kontrol edildi", + "account.locked_info": "Bu hesabın gizlilik durumu kilitli olarak ayarlanmış. Sahibi, onu kimin takip edebileceÄŸini elle inceler.", + "account.media": "Medya", + "account.mention": "@{name} kullanıcısından bahset", "account.moved_to": "{name} has moved to:", - "account.mute": "Sustur @{name}", - "account.mute_notifications": "Mute notifications from @{name}", - "account.muted": "Muted", + "account.mute": "@{name} kullanıcısını sessize al", + "account.mute_notifications": "@{name} kullanıcısının bildirimlerini kapat", + "account.muted": "Sessiz", "account.posts": "Gönderiler", - "account.posts_with_replies": "Toots with replies", - "account.report": "Rapor et @{name}", - "account.requested": "Onay bekleniyor", - "account.share": "Share @{name}'s profile", - "account.show_reblogs": "Show boosts from @{name}", + "account.posts_with_replies": "Gönderiler ve yanıtlar", + "account.report": "@{name} kullanıcısını bildir", + "account.requested": "Onay bekliyor. Takip isteÄŸini iptal etmek için tıklayın", + "account.share": "@{name} kullanıcısının profilini paylaÅŸ", + "account.show_reblogs": "@{name} kullanıcısından boost'ları göster", "account.unblock": "Engeli kaldır @{name}", - "account.unblock_domain": "Unhide {domain}", - "account.unendorse": "Don't feature on profile", + "account.unblock_domain": "{domain} göster", + "account.unendorse": "Profilde özellik yok", "account.unfollow": "Takipten vazgeç", "account.unmute": "Sesi aç @{name}", - "account.unmute_notifications": "Unmute notifications from @{name}", - "account.view_full_profile": "View full profile", - "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", + "account.unmute_notifications": "@{name} kullanıcısından bildirimleri aç", + "account.view_full_profile": "Tüm profili görüntüle", + "alert.unexpected.message": "Beklenmedik bir hata oluÅŸtu.", + "alert.unexpected.title": "Hay aksi!", "boost_modal.combo": "Bir dahaki sefere {combo} tuÅŸuna basabilirsiniz", - "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", + "bundle_column_error.body": "Bu bileÅŸen yüklenirken bir ÅŸeyler ters gitti.", + "bundle_column_error.retry": "Tekrar deneyin", "bundle_column_error.title": "Network error", - "bundle_modal_error.close": "Close", - "bundle_modal_error.message": "Something went wrong while loading this component.", - "bundle_modal_error.retry": "Try again", + "bundle_modal_error.close": "Kapat", + "bundle_modal_error.message": "Bu bileÅŸen yüklenirken bir ÅŸeyler ters gitti.", + "bundle_modal_error.retry": "Tekrar deneyin", "column.blocks": "Engellenen kullanıcılar", "column.community": "Yerel zaman tüneli", - "column.direct": "Direct messages", - "column.domain_blocks": "Hidden domains", + "column.direct": "DoÄŸrudan mesajlar", + "column.domain_blocks": "Gizli alan adları", "column.favourites": "Favoriler", "column.follow_requests": "Takip istekleri", "column.home": "Anasayfa", - "column.lists": "Lists", + "column.lists": "Listeler", "column.mutes": "SusturulmuÅŸ kullanıcılar", "column.notifications": "Bildirimler", "column.pins": "Pinned toot", "column.public": "Federe zaman tüneli", "column_back_button.label": "Geri", - "column_header.hide_settings": "Hide settings", - "column_header.moveLeft_settings": "Move column to the left", - "column_header.moveRight_settings": "Move column to the right", - "column_header.pin": "Pin", - "column_header.show_settings": "Show settings", - "column_header.unpin": "Unpin", + "column_header.hide_settings": "Ayarları gizle", + "column_header.moveLeft_settings": "Sütunu sola taşı", + "column_header.moveRight_settings": "Sütunu saÄŸa taşı", + "column_header.pin": "Sabitle", + "column_header.show_settings": "Ayarları göster", + "column_header.unpin": "Sabitlemeyi kaldır", "column_subheading.settings": "Ayarlar", - "community.column_settings.media_only": "Media Only", - "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", - "compose_form.direct_message_warning_learn_more": "Learn more", + "community.column_settings.media_only": "Sadece medya", + "compose_form.direct_message_warning": "Bu gönderi sadece belirtilen kullanıcılara gönderilecektir.", + "compose_form.direct_message_warning_learn_more": "Daha fazla bilgi edin", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", "compose_form.lock_disclaimer": "Hesabınız {locked} deÄŸil. Sadece takipçilerle paylaÅŸtığınız gönderileri görebilmek için sizi herhangi bir kullanıcı takip edebilir.", "compose_form.lock_disclaimer.lock": "kilitli", - "compose_form.placeholder": "Ne düşünüyorsun?", + "compose_form.placeholder": "Aklınızdan ne geçiyor?", "compose_form.publish": "Toot", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.marked": "Media is marked as sensitive", - "compose_form.sensitive.unmarked": "Media is not marked as sensitive", - "compose_form.spoiler.marked": "Text is hidden behind warning", - "compose_form.spoiler.unmarked": "Text is not hidden", + "compose_form.sensitive.marked": "Medya hassas olarak iÅŸaretlendi", + "compose_form.sensitive.unmarked": "Medya hassas olarak iÅŸaretlenmemiÅŸ", + "compose_form.spoiler.marked": "Metin uyarının arkasına gizlenir", + "compose_form.spoiler.unmarked": "Metin gizli deÄŸil", "compose_form.spoiler_placeholder": "İçerik uyarısı", "confirmation_modal.cancel": "Ä°ptal", "confirmations.block.confirm": "Engelle", @@ -86,38 +86,38 @@ "confirmations.delete.confirm": "Sil", "confirmations.delete.message": "Bu gönderiyi silmek istiyor musunuz?", "confirmations.delete_list.confirm": "Delete", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", - "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.delete_list.message": "Bu listeyi kalıcı olarak silmek istediÄŸinize emin misiniz?", + "confirmations.domain_block.confirm": "Alan adının tamamını gizle", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", "confirmations.mute.confirm": "Sessize al", "confirmations.mute.message": "{name} kullanıcısını sessize almak istiyor musunuz?", - "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.redraft.confirm": "Sil ve yeniden tasarla", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", - "confirmations.reply.confirm": "Reply", - "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "confirmations.unfollow.confirm": "Unfollow", + "confirmations.reply.confirm": "Yanıtla", + "confirmations.reply.message": "Åžimdi yanıtlarken o an oluÅŸturduÄŸunuz mesajın üzerine yazılır. Devam etmek istediÄŸinize emin misiniz?", + "confirmations.unfollow.confirm": "Takibi kaldır", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", - "embed.preview": "Here is what it will look like:", + "embed.preview": "Ä°ÅŸte nasıl görüneceÄŸi:", "emoji_button.activity": "Aktivite", - "emoji_button.custom": "Custom", + "emoji_button.custom": "Özel", "emoji_button.flags": "Bayraklar", "emoji_button.food": "Yiyecek ve İçecek", "emoji_button.label": "Emoji ekle", "emoji_button.nature": "DoÄŸa", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ â”»â”â”»", + "emoji_button.not_found": "Ä°fade yok!! (╯°□°)╯︵ â”»â”â”»", "emoji_button.objects": "Nesneler", "emoji_button.people": "Ä°nsanlar", - "emoji_button.recent": "Frequently used", + "emoji_button.recent": "Sık kullanılan", "emoji_button.search": "Emoji ara...", - "emoji_button.search_results": "Search results", + "emoji_button.search_results": "Arama sonuçları", "emoji_button.symbols": "Semboller", "emoji_button.travel": "Seyahat ve Yerler", - "empty_column.account_timeline": "No toots here!", - "empty_column.blocks": "You haven't blocked any users yet.", - "empty_column.community": "Yerel zaman tüneliniz boÅŸ. Daha fazla eÄŸlence için herkese açık bir gönderi paylaşın.", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", - "empty_column.domain_blocks": "There are no hidden domains yet.", + "empty_column.account_timeline": "Burada hiç gönderi yok!", + "empty_column.blocks": "Henüz bir kullanıcıyı engellemediniz.", + "empty_column.community": "Yerel zaman çizelgesi boÅŸ. Daha fazla eÄŸlence için herkese açık bir gönderi paylaşın!", + "empty_column.direct": "Henüz doÄŸrudan mesajınız yok. Bir tane gönderdiÄŸinizde veya aldığınızda burada görünecektir.", + "empty_column.domain_blocks": "Henüz hiçbir gizli alan adı yok.", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", @@ -125,61 +125,63 @@ "empty_column.home": "Henüz kimseyi takip etmiyorsunuz. {public} ziyaret edebilir veya arama kısmını kullanarak diÄŸer kullanıcılarla iletiÅŸime geçebilirsiniz.", "empty_column.home.public_timeline": "herkese açık zaman tüneli", "empty_column.list": "There is nothing in this list yet.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.lists": "Henüz hiç listeniz yok. Bir tane oluÅŸturduÄŸunuzda burada görünecek.", + "empty_column.mutes": "Henüz hiçbir kullanıcıyı sessize almadınız.", "empty_column.notifications": "Henüz hiçbir bildiriminiz yok. DiÄŸer insanlarla sobhet edebilmek için etkileÅŸime geçebilirsiniz.", - "empty_column.public": "Burada hiçbir gönderi yok! Herkese açık bir ÅŸeyler yazın, veya diÄŸer sunucudaki insanları takip ederek bu alanın dolmasını saÄŸlayın", + "empty_column.public": "Burada hiçbir ÅŸey yok! Herkese açık bir ÅŸeyler yazın veya burayı doldurmak için diÄŸer sunuculardaki kullanıcıları takip edin", "follow_request.authorize": "Yetkilendir", "follow_request.reject": "Reddet", - "getting_started.developers": "Developers", - "getting_started.directory": "Profile directory", + "getting_started.developers": "GeliÅŸtiriciler", + "getting_started.directory": "Profil dizini", "getting_started.documentation": "Documentation", "getting_started.heading": "BaÅŸlangıç", - "getting_started.invite": "Invite people", + "getting_started.invite": "Ä°nsanları davet edin", "getting_started.open_source_notice": "Mastodon açık kaynaklı bir yazılımdır. Github {github}. {apps} üzerinden katkıda bulunabilir, hata raporlayabilirsiniz.", - "getting_started.security": "Security", - "getting_started.terms": "Terms of service", - "hashtag.column_header.tag_mode.all": "and {additional}", - "hashtag.column_header.tag_mode.any": "or {additional}", - "hashtag.column_header.tag_mode.none": "without {additional}", - "hashtag.column_settings.tag_mode.all": "All of these", - "hashtag.column_settings.tag_mode.any": "Any of these", - "hashtag.column_settings.tag_mode.none": "None of these", + "getting_started.security": "Güvenlik", + "getting_started.terms": "Hizmet koÅŸulları", + "hashtag.column_header.tag_mode.all": "ve {additional}", + "hashtag.column_header.tag_mode.any": "ya da {additional}", + "hashtag.column_header.tag_mode.none": "{additional} olmadan", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", + "hashtag.column_settings.tag_mode.all": "Bunların hepsi", + "hashtag.column_settings.tag_mode.any": "Bunların hiçbiri", + "hashtag.column_settings.tag_mode.none": "Bunların hiçbiri", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "home.column_settings.basic": "Temel", "home.column_settings.show_reblogs": "Boost edilenleri göster", "home.column_settings.show_replies": "Cevapları göster", - "introduction.federation.action": "Next", - "introduction.federation.federated.headline": "Federated", - "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", - "introduction.federation.home.headline": "Home", + "introduction.federation.action": "Ä°leri", + "introduction.federation.federated.headline": "BirleÅŸik", + "introduction.federation.federated.text": "DiÄŸer dosya sunucularından gelen genel yayınlar, birleÅŸik zaman çizelgesinde görünecektir.", + "introduction.federation.home.headline": "Ana sayfa", "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", - "introduction.federation.local.headline": "Local", + "introduction.federation.local.headline": "Yerel", "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", - "introduction.interactions.action": "Finish tutorial!", - "introduction.interactions.favourite.headline": "Favourite", + "introduction.interactions.action": "Öğreticiyi bitirin!", + "introduction.interactions.favourite.headline": "Favori", "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", "introduction.interactions.reblog.headline": "Boost", "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", - "introduction.interactions.reply.headline": "Reply", + "introduction.interactions.reply.headline": "Yanıt", "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", - "introduction.welcome.action": "Let's go!", - "introduction.welcome.headline": "First steps", + "introduction.welcome.action": "Hadi gidelim!", + "introduction.welcome.headline": "Ä°lk adımlar", "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.blocked": "to open blocked users list", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.description": "Açıklama", "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", "keyboard_shortcuts.favourites": "to open favourites list", "keyboard_shortcuts.federated": "to open federated timeline", - "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.heading": "Klavye kısayolları", + "keyboard_shortcuts.home": "Ana sayfa zaman çizelgesini açmak için", "keyboard_shortcuts.hotkey": "Hotkey", "keyboard_shortcuts.legend": "to display this legend", "keyboard_shortcuts.local": "to open local timeline", @@ -204,6 +206,7 @@ "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", + "lists.edit.submit": "Change title", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", "lists.search": "Search among people you follow", @@ -292,12 +295,12 @@ "search_results.statuses": "Toots", "search_results.total": "{count, number} {count, plural, one {sonuç} other {sonuçlar}}", "standalone.public_title": "A look inside...", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "status.admin_account": "@{name} için denetim arayüzünü açın", + "status.admin_status": "Denetim arayüzünde bu durumu açın", "status.block": "Block @{name}", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "Bu gönderi boost edilemez", - "status.copy": "Copy link to status", + "status.copy": "BaÄŸlantı durumunu kopyala", "status.delete": "Sil", "status.detailed_status": "Detailed conversation view", "status.direct": "Direct message @{name}", @@ -343,7 +346,7 @@ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Upload için sürükle bırak yapınız", "upload_button.label": "Görsel ekle", - "upload_error.limit": "File upload limit exceeded.", + "upload_error.limit": "Dosya yükleme sınırı aşıldı.", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", "upload_form.undo": "Geri al", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 5dfda49335..d6c5317e0f 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "Видалити зі ÑпиÑку", "lists.delete": "Видалити ÑпиÑок", "lists.edit": "Редагувати ÑпиÑок", + "lists.edit.submit": "Change title", "lists.new.create": "Додати ÑпиÑок", "lists.new.title_placeholder": "Ðова назва ÑпиÑку", "lists.search": "Шукати Ñеред людей, на Ñких ви підпиÑані", diff --git a/app/javascript/mastodon/locales/whitelist_kk.json b/app/javascript/mastodon/locales/whitelist_kk.json new file mode 100644 index 0000000000..0d4f101c7a --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_kk.json @@ -0,0 +1,2 @@ +[ +] diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 0cfa3f7129..27effba4cf 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "从列表ä¸åˆ 除", "lists.delete": "åˆ é™¤åˆ—è¡¨", "lists.edit": "编辑列表", + "lists.edit.submit": "Change title", "lists.new.create": "新建列表", "lists.new.title_placeholder": "æ–°åˆ—è¡¨çš„æ ‡é¢˜", "lists.search": "æœç´¢ä½ 关注的人", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 999ca32168..60baffd2ec 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "從列表刪除", "lists.delete": "刪除列表", "lists.edit": "編輯列表", + "lists.edit.submit": "Change title", "lists.new.create": "新增列表", "lists.new.title_placeholder": "新列表標題", "lists.search": "å¾žä½ é—œæ³¨çš„ç”¨æˆ¶ä¸æœç´¢", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 26328e12e3..c0871d3796 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -142,6 +142,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", @@ -204,6 +206,7 @@ "lists.account.remove": "從åå–®ä¸ç§»é™¤", "lists.delete": "刪除åå–®", "lists.edit": "修改åå–®", + "lists.edit.submit": "Change title", "lists.new.create": "新增åå–®", "lists.new.title_placeholder": "åå–®å稱", "lists.search": "æœå°‹æ‚¨é—œæ³¨çš„使用者", diff --git a/config/locales/activerecord.kk.yml b/config/locales/activerecord.kk.yml new file mode 100644 index 0000000000..41d3b2525f --- /dev/null +++ b/config/locales/activerecord.kk.yml @@ -0,0 +1,13 @@ +--- +kk: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: тек әріптер, Ñандар және аÑÑ‚Ñ‹ Ñызылған таңбалар + status: + attributes: + reblog: + taken: жазбаÑÑ‹ бұрыннан бар diff --git a/config/locales/activerecord.tr.yml b/config/locales/activerecord.tr.yml new file mode 100644 index 0000000000..1cc2d98760 --- /dev/null +++ b/config/locales/activerecord.tr.yml @@ -0,0 +1,13 @@ +--- +tr: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: sadece harfler, sayılar ve alt çizgiler + status: + attributes: + reblog: + taken: durum zaten var diff --git a/config/locales/co.yml b/config/locales/co.yml index 5f961b4663..8955f7a687 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -7,7 +7,7 @@ co: administered_by: 'Amministratu da:' api: API apps: Applicazione per u telefuninu - closed_registrations: Pè avà , l’arregistramenti sò chjosi nant’à st’istanza. Mà pudete truvà un’altr’istanza per fà un contu è avè accessu à listessa reta da quallà . + closed_registrations: Pè avà , l’arregistramenti sò chjosi nant’à stu servore. Mà pudete truvà un’altru per fà un contu è avè accessu à listessa reta da quallà . contact: Cuntattu contact_missing: Mancante contact_unavailable: Micca dispunibule @@ -27,7 +27,7 @@ co: generic_description: "%{domain} hè un servore di a rete" hosted_on: Mastodon allughjatu nant’à %{domain} learn_more: Amparà di più - other_instances: Lista di l’istanze + other_instances: Lista di i servori privacy_policy: Pulitica di vita privata source_code: Codice di fonte status_count_after: @@ -386,14 +386,14 @@ co: desc_html: Mudificà l'apparenza cù CSS caricatu nant'à ogni pagina title: CSS persunalizatu hero: - desc_html: Affissatu nant’a pagina d’accolta. Ricumandemu almenu 600x100px. S’ellu ùn hè micca definiti, a vignetta di l’istanza sarà usata + desc_html: Affissatu nant’a pagina d’accolta. Ricumandemu almenu 600x100px. S’ellu ùn hè micca definiti, a vignetta di u servore sarà usata title: Ritrattu di cuprendula mascot: desc_html: Affissata nant'à parechje pagine. Almenu 293x205px ricumandatu. S'ella hè lasciata viota, a mascotta predefinita sarà utilizata title: Ritrattu di a mascotta peers_api_enabled: - desc_html: Indirizzi st’istanza hà vistu indè u fediverse - title: Pubblicà a lista d’istanza cunnisciute + desc_html: Indirizzi web stu servore hà vistu indè u fediverse + title: Pubblicà a lista di servori cunnisciuti preview_sensitive_media: desc_html: E priviste di i ligami nant'à l'altri siti mustreranu una vignetta ancu s'ellu hè marcatu cum'è sensibile u media title: Vede media sensibili in e viste OpenGraph @@ -421,20 +421,20 @@ co: title: Mustrà un badge staff site_description: desc_html: Paragrafu di prisentazione nant’a pagina d’accolta. Parlate di cio chì rende stu servore speziale, o d'altre cose impurtante. Pudete fà usu di marchi HTML, in particulare <code><a></code> è <code><em></code>. - title: Discrizzione di l’istanza + title: Discrizzione di u servore site_description_extended: desc_html: Una bona piazza per e regule, infurmazione è altre cose chì l’utilizatori duverìanu sapè. Pudete fà usu di marchi HTML title: Discrizzione stesa di u situ site_short_description: - desc_html: Mustratu indè a barra laterala è i tag meta. Spiegate quale hè Mastodon è ciò chì rende u vostru servore speciale in un paragrafu. S'ella hè lasciata viota, a discrizzione di l'istanza sarà utilizata. - title: Descrizzione corta di l'istanza + desc_html: Mustratu indè a barra laterala è i tag meta. Spiegate quale hè Mastodon è ciò chì rende u vostru servore speciale in un paragrafu. S'ella hè lasciata viota, a discrizzione di u servore sarà utilizata. + title: Descrizzione corta di u servore site_terms: desc_html: Quì pudete scrive e vostre regule di cunfidenzialità , cundizione d’usu o altre menzione legale. Pudete fà usu di marchi HTML title: Termini persunalizati - site_title: Nome di l’istanza + site_title: Nome di u servore thumbnail: desc_html: Utilizatu per viste cù OpenGraph è l’API. Ricumandemu 1200x630px - title: Vignetta di l’istanza + title: Vignetta di u servore timeline_preview: desc_html: Vede a linea pubblica nant’a pagina d’accolta title: Vista di e linee @@ -495,7 +495,7 @@ co: warning: Abbadate à quessi dati. Ùn i date à nisunu! your_token: Rigenerà a fiscia d’accessu auth: - agreement_html: Cliccà "Arregistrassi" quì sottu vole dì chì site d’accunsentu per siguità <a href="%{rules_path}">e regule di l’istanza</a> è <a href="%{terms_path}">e cundizione d’usu</a>. + agreement_html: Cliccà "Arregistrassi" quì sottu vole dì chì site d’accunsentu per siguità <a href="%{rules_path}">e regule di u servore</a> è <a href="%{terms_path}">e cundizione d’usu</a>. change_password: Chjave d’accessu confirm_email: Cunfirmà l’e-mail delete_account: Sguassà u contu @@ -549,7 +549,7 @@ co: description_html: U contu sarà deattivatu è u cuntenutu sarà sguassatu di manera <strong>permanente è irreversibile</strong>. Ùn sarà micca pussibule piglià stu cugnome torna per evità l’impusture. proceed: Sguassà u contu success_msg: U vostru contu hè statu sguassatu - warning_html: Pudete esse sicuru·a solu chì u cuntenutu sarà sguassatu di st’istanza. S’ellu hè statu spartutu in altrò, sarà forse sempre quallà . + warning_html: Pudete esse sicuru·a solu chì u cuntenutu sarà sguassatu di stu servore. S’ellu hè statu spartutu in altrò, sarà forse sempre quallà . I servori scunettati è quelli ch'ùn sò più abbunati à e vostre pubblicazione ùn anu micca da mette à ghjornu e so database. warning_title: Dispunibilità di i cuntenuti sparsi directories: directory: Annuariu di i prufili @@ -563,8 +563,8 @@ co: other: "%{count} persone" errors: '403': Ùn site micca auturizatu·a à vede sta pagina. - '404': Sta pagina ùn esiste micca. - '410': Sta pagina ùn esiste più. + '404': Sta pagina ùn esiste micca quì. + '410': Sta pagina ùn esiste più quì. '422': content: C’hè statu un prublemu cù a verificazione di sicurità . Forse bluccate cookies? title: Fiascu di verificazione @@ -577,7 +577,7 @@ co: archive_takeout: date: Data download: Scaricà l’archiviu - hint_html: Pudete dumandà un’archiviu di i vostri <strong>statuti è media caricati</strong>. I dati saranu in u furmattu ActivityPub è pudarenu esse letti da tutti i lugiziali chì u supportanu. + hint_html: Pudete dumandà un’archiviu di i vostri <strong>statuti è media caricati</strong>. I dati saranu in u furmattu ActivityPub è pudarenu esse letti da tutti i lugiziali chì u supportanu. Pudete richiede un'archiviu ogni 7 ghjorni. in_progress: Cumpilazione di l’archiviu... request: Dumandà u vostr’archiviu size: Pesu @@ -588,6 +588,10 @@ co: lists: Liste mutes: Piattate storage: I vostri media + featured_tags: + add_new: Aghjustà novu + errors: + limit: Avete digià messu in mostra u numeru massimale di hashtag filters: contexts: home: Accolta @@ -606,7 +610,7 @@ co: title: Aghjustà un novu filtru followers: domain: Duminiu - explanation_html: Per assicuravi di a cunfidenzialità di i vostri statuti, duvete avè primura di quale vi seguita. <strong>I vostri statuti privati sò mandati à tutte l’istanze induve avete abbunati</strong>. Pensate à u vostru livellu di cunfidenza in i so amministratori. + explanation_html: Per assicuravi di a cunfidenzialità di i vostri statuti, duvete avè primura di quale vi seguita. <strong>I vostri statuti privati sò mandati à tutti i servori induve avete abbunati</strong>. Pensate à u vostru livellu di cunfidenza in i so amministratori. followers_count: Numeru d’abbunati lock_link: Rendete u contu privatu purge: Toglie di a lista d’abbunati @@ -628,10 +632,16 @@ co: one: Qualcosa ùn và bè! Verificate u prublemu quì sottu other: Qualcosa ùn và bè! Verificate %{count} prublemi quì sottu imports: - preface: Pudete impurtà certi dati cumu e persone chì seguitate o bluccate nant’à u vostru contu nant’à st’istanza à partesi di fugliali creati nant’à un’altr’istanza. + modes: + merge: Unisce + merge_long: Cunservà i dati esistenti è aghjustà i novi + overwrite: Soprascrive + overwrite_long: Rimpiazzà i dati esistenti cù i novi + preface: Pudete impurtà certi dati, cumu e persone chì seguitate o bluccate nant’à u vostru contu, nant’à stu servore à partesi di fugliali creati nant’à un’altru. success: I vostri dati sò stati impurtati è saranu trattati da quì à pocu types: blocking: Persone chì bluccate + domain_blocking: Lista di blucchimi di duminiu following: Persone chì seguitate muting: Persone chì piattate upload: Impurtà @@ -653,7 +663,7 @@ co: one: 1 usu other: "%{count} usi" max_uses_prompt: Micca limita - prompt: Create è spartete ligami cù altre parsone per dà accessu à l’istanza + prompt: Create è spartete ligami cù altre parsone per dà accessu à u servore table: expires_at: Spira uses: Utiliza @@ -801,6 +811,7 @@ co: development: Sviluppu edit_profile: Mudificà u prufile export: Spurtazione d’infurmazione + featured_tags: Hashtag in vista followers: Abbunati auturizati import: Impurtazione migrate: Migrazione di u contu @@ -929,9 +940,9 @@ co: <p>Originellement adapté de la <a href="https://github.com/discourse/discourse">politique de confidentialité de Discourse</a>.</p> title: Termini d’usu è di cunfidenzialità per %{instance} themes: - contrast: Cuntrastu altu - default: Mastodon - mastodon-light: Mastodon (chjaru) + contrast: Mastodon (Cuntrastu altu) + default: Mastodon (Scuru) + mastodon-light: Mastodon (Chjaru) time: formats: default: "%d %b %Y, %H:%M" diff --git a/config/locales/cs.yml b/config/locales/cs.yml index c75d0b643c..7a4c3f255b 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -225,15 +225,15 @@ cs: emoji: Emoji enable: Povolit enabled_msg: Emoji bylo úspěšnÄ› povoleno - image_hint: PNG až do 50KB - listed: Uvedené + image_hint: PNG až do 50 KB + listed: Uvedeno new: title: PÅ™idat nové vlastnà emoji overwrite: PÅ™epsat shortcode: Zkratka shortcode_hint: Alespoň 2 znaky, pouze alfanumerické znaky a podtržÃtka title: Vlastnà emoji - unlisted: Neuvedené + unlisted: Neuvedeno update_failed_msg: Nebylo možné aktualizovat toto emoji updated_msg: Emoji úspěšnÄ› aktualizováno! upload: Nahrát @@ -570,10 +570,10 @@ cs: other: "%{count} lidÃ" errors: '403': Nemáte povolenà zobrazit tuto stránku. - '404': Stránka, kterou hledáte, neexistuje. - '410': Stránka, kterou hledáte, již neexistuje. + '404': Stránka, kterou hledáte, tu nenÃ. + '410': Stránka, kterou hledáte, tu již neexistuje. '422': - content: BezpeÄnostnà ověřenà selhalo. Neblokujete cookoes? + content: BezpeÄnostnà ověřenà selhalo. Neblokujete cookies? title: BezpeÄnostnà ověřenà selhalo '429': PÅ™ÃliÅ¡ mnoho požadavků '500': @@ -584,7 +584,7 @@ cs: archive_takeout: date: Datum download: Stáhnout svůj archiv - hint_html: Můžete si vyžádat archiv vaÅ¡ich <strong>tootů a nahraných médiÃ</strong>. Exportovaná data budou ve formátu ActivityPub a budou Äitelné kterýmkoliv kompatibilnÃm softwarem. Archiv si můžete vyžádat každých 7 dnÃ. + hint_html: Můžete si vyžádat archiv vaÅ¡ich <strong>tootů a nahraných médiÃ</strong>. Exportovaná data budou ve formátu ActivityPub a budou Äitelná kterýmkoliv kompatibilnÃm softwarem. Archiv si můžete vyžádat každých 7 dnÃ. in_progress: Kompiluji váš archiv... request: Vyžádat svůj archiv size: Velikost @@ -595,6 +595,10 @@ cs: lists: Seznamy mutes: Ignorujete storage: Paměť médià + featured_tags: + add_new: PÅ™idat nový + errors: + limit: Již jste nastavil/a maximálnà poÄet oblÃbených hashtagů filters: contexts: home: Domovská Äasová osa @@ -637,10 +641,16 @@ cs: 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 imports: + modes: + merge: SlouÄit + merge_long: Ponechat existujÃcà záznamy a pÅ™idat nové + overwrite: PÅ™epsat + overwrite_long: Nahradit aktuálnà záznamy novými preface: Můžete importovat data, která jste exportoval/a z jiného serveru, 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 types: blocking: Seznam blokovaných + domain_blocking: Seznam blokovaných domén following: Seznam sledovaných muting: Seznam ignorovaných upload: Nahrát @@ -812,6 +822,7 @@ cs: development: Vývoj edit_profile: Upravit profil export: Export dat + featured_tags: OblÃbené hashtagy followers: Autorizovanà sledujÃcà import: Import migrate: PÅ™esunutà úÄtu @@ -854,7 +865,7 @@ cs: public: VeÅ™ejné public_long: VÅ¡ichni mohou vidÄ›t unlisted: Neuvedené - unlisted_long: VÅ¡ichni mohou vidÄ›t, ale nenà zahrnut ve veÅ™ejných Äasových osách + unlisted_long: VÅ¡ichni mohou vidÄ›t, ale nebudou zahrnuty ve veÅ™ejných Äasových osách stream_entries: pinned: PÅ™ipnutý toot reblogged: boostnul/a @@ -943,8 +954,8 @@ cs: <p>PůvodnÄ› adaptováno ze <a href="https://github.com/discourse/discourse">zásad soukromà Discourse</a>.</p> title: PodmÃnky použÃvánà a zásady soukromà %{instance} themes: - contrast: Vysoký kontrast - default: Mastodon + contrast: Mastodon (vysoký kontrast) + default: Mastodon (tmavý) mastodon-light: Mastodon (svÄ›tlý) time: formats: diff --git a/config/locales/de.yml b/config/locales/de.yml index f3276b4f75..1dff7156e8 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -7,7 +7,7 @@ de: administered_by: 'Administriert von:' api: API apps: Mobile Apps - closed_registrations: Die Registrierung auf dieser Instanz ist momentan geschlossen. Aber du kannst dein Konto auch auf einer anderen Instanz erstellen! Von dort hast du genauso Zugriff auf das Mastodon-Netzwerk. + closed_registrations: Die Registrierung auf diesem Server ist momentan geschlossen. Aber du kannst dein Konto auch auf einem anderen Server erstellen! Von dort hast du genauso Zugriff auf das Mastodon-Netzwerk. contact: Kontakt contact_missing: Nicht angegeben contact_unavailable: N/A @@ -27,7 +27,7 @@ de: generic_description: "%{domain} ist ein Server im Netzwerk" hosted_on: Mastodon, beherbergt auf %{domain} learn_more: Mehr erfahren - other_instances: Andere Instanzen + other_instances: Andere Server privacy_policy: Datenschutzerklärung source_code: Quellcode status_count_after: @@ -386,14 +386,14 @@ de: desc_html: Verändere das Aussehen mit CSS, dass auf jeder Seite geladen wird title: Benutzerdefiniertes CSS hero: - desc_html: Wird auf der Startseite angezeigt. Mindestens 600x100px sind empfohlen. Wenn es nicht gesetzt wurde, wird das Instanz-Thumbnail dafür verwendet + desc_html: Wird auf der Startseite angezeigt. Mindestens 600x100px sind empfohlen. Wenn es nicht gesetzt wurde, wird das Server-Thumbnail dafür verwendet title: Bild für Startseite mascot: desc_html: Angezeigt auf mehreren Seiten. Mehr als 293x205px empfohlen. Wenn es nicht gesetzt wurde wird es auf das Standard-Maskottchen zurückfallen title: Maskottchen-Bild peers_api_enabled: - desc_html: Domain-Namen dieser Instanz, die im Fediverse gefunden wurden - title: Veröffentliche Liste von gefundenen Instanzen + desc_html: Domain-Namen, die der Server im Fediverse gefunden hat + title: Veröffentliche Liste von gefundenen Servern preview_sensitive_media: desc_html: Linkvorschauen auf anderen Webseiten werden ein Vorschaubild anzeigen, obwohl die Medien als heikel gekennzeichnet sind title: Heikle Medien in OpenGraph-Vorschauen anzeigen @@ -421,20 +421,20 @@ de: title: Zeige Mitarbeiter-Badge site_description: desc_html: Einleitungsabschnitt auf der Frontseite. Beschreibe, was diese Mastodon-Instanz ausmacht. Du kannst HTML-Tags benutzen, insbesondere <code><a></code> und <code><em></code>. - title: Beschreibung der Instanz + title: Beschreibung des Servers site_description_extended: - desc_html: Bietet sich für Verhaltenskodizes, Regeln, Richtlinien und weiteres an, was deine Instanz auszeichnet. Du kannst HTML-Tags benutzen + desc_html: Bietet sich für Verhaltenskodizes, Regeln, Richtlinien und weiteres an, was deinen Server auszeichnet. Du kannst HTML-Tags benutzen title: Erweiterte Beschreibung der Instanz site_short_description: - desc_html: Wird angezeigt in der Seitenleiste und in Meta-Tags. Beschreibe in einem einzigen Abschnitt, was Mastodon ist und was diesen Server ausmacht. Falls leer, wird die Instanz-Beschreibung verwendet. - title: Kurze Instanz-Beschreibung + desc_html: Wird angezeigt in der Seitenleiste und in Meta-Tags. Beschreibe in einem einzigen Abschnitt, was Mastodon ist und was diesen Server ausmacht. Falls leer, wird die Server-Beschreibung verwendet. + title: Kurze Server-Beschreibung site_terms: desc_html: Hier kannst du deine eigenen Geschäftsbedingungen, Datenschutzerklärung und anderes rechtlich Relevante eintragen. Du kannst HTML-Tags benutzen title: Eigene Geschäftsbedingungen - site_title: Name der Instanz + site_title: Name des Servers thumbnail: desc_html: Wird für die Vorschau via OpenGraph und API verwendet. 1200×630 px wird empfohlen - title: Instanz-Thumbnail + title: Server-Thumbnail timeline_preview: desc_html: Auf der Frontseite die öffentliche Zeitleiste anzeigen title: Zeitleisten-Vorschau @@ -495,7 +495,7 @@ de: warning: Sei mit diesen Daten sehr vorsichtig. Teile sie mit niemandem! your_token: Dein Zugangs-Token auth: - agreement_html: Indem du dich registrierst, erklärst du dich mit den untenstehenden <a href="%{rules_path}">Regeln dieser Instanz</a> und der <a href="%{terms_path}">Datenschutzerklärung</a> einverstanden. + agreement_html: Indem du dich registrierst, erklärst du dich mit den untenstehenden <a href="%{rules_path}">Regeln des Servers</a> und der <a href="%{terms_path}">Datenschutzerklärung</a> einverstanden. change_password: Passwort confirm_email: E-Mail bestätigen delete_account: Konto löschen @@ -549,7 +549,7 @@ de: description_html: Hiermit wird <strong>dauerhaft und unwiederbringlich</strong> der Inhalt deines Kontos gelöscht und dein Konto deaktiviert. Dein Profilname wird reserviert, um künftige Imitationen zu verhindern. proceed: Konto löschen success_msg: Dein Konto wurde erfolgreich gelöscht - warning_html: Wir können nur dafür garantieren, dass die Inhalte auf dieser einen Instanz gelöscht werden. Bei Inhalten, die weit verbreitet wurden, ist es wahrscheinlich, dass Spuren bleiben werden. Server, die offline sind oder keine Benachrichtigungen von deinem Konto mehr empfangen, werden ihre Datenbanken nicht bereinigen. + warning_html: Wir können nur dafür garantieren, dass die Inhalte auf diesem einen Server gelöscht werden. Bei Inhalten, die weit verbreitet wurden, ist es wahrscheinlich, dass Spuren bleiben werden. Server, die offline sind oder keine Benachrichtigungen von deinem Konto mehr empfangen, werden ihre Datenbanken nicht bereinigen. warning_title: Verfügbarkeit verstreuter Inhalte directories: directory: Profilverzeichnis @@ -563,8 +563,8 @@ de: other: "%{count} Leute" errors: '403': Dir fehlt die Befugnis, diese Seite sehen zu können. - '404': Diese Seite existiert nicht. - '410': Diese Seite existiert nicht mehr. + '404': Die Seite nach der du gesucht hast wurde nicht gefunden. + '410': Die Seite nach der du gesucht hast existiert hier nicht mehr. '422': content: Sicherheitsüberprüfung fehlgeschlagen. Blockierst du Cookies? title: Sicherheitsüberprüfung fehlgeschlagen @@ -577,7 +577,7 @@ de: archive_takeout: date: Datum download: Dein Archiv herunterladen - hint_html: Du kannst ein Archiv deiner <strong>Beiträge und hochgeladenen Medien</strong> anfragen. Die exportierten Daten werden im ActivityPub-Format gespeichert, welches mit jeder Software lesbar ist die das Format unterstützt. Du kannst alle 7 Tage ein Archiv anfordern. + hint_html: Du kannst ein Archiv deiner <strong>Beiträge und hochgeladenen Medien</strong> anfragen. Die exportierten Daten werden in dem ActivityPub-Format gespeichert, welches mit jeder Software lesbar ist die das Format unterstützt. Du kannst alle 7 Tage ein Archiv anfordern. in_progress: Stelle dein Archiv zusammen... request: Dein Archiv anfragen size: Größe @@ -588,6 +588,10 @@ de: lists: Listen mutes: Du hast stummgeschaltet storage: Medienspeicher + featured_tags: + add_new: Neu hinzufügen + errors: + limit: Du hast bereits die maximale Anzahl an empfohlenen Hashtags erreicht filters: contexts: home: Startseite @@ -606,7 +610,7 @@ de: title: Neuen Filter hinzufügen followers: domain: Instanz - explanation_html: Wenn du sicherstellen willst, dass deine Beiträge privat sind, musst du wissen, wer dir folgt. <strong>Deine privaten Beiträge werden an alle Instanzen weitergegeben, auf denen Menschen registriert sind, die dir folgen.</strong> Wenn du den Betreibenden einer Instanz misstraust und du befürchtest, dass sie deine Privatsphäre missachten könnten, kannst du sie hier entfernen. + explanation_html: Wenn du sicherstellen willst, dass deine Beiträge privat sind, musst du wissen, wer dir folgt. <strong>Deine privaten Beiträge werden an alle Server weitergegeben, auf denen Menschen registriert sind, die dir folgen.</strong> Wenn du den Betreibenden eines Servers misstraust und du befürchtest, dass sie deine Privatsphäre missachten könnten, kannst du sie hier entfernen. followers_count: Zahl der Folgenden lock_link: dein Konto sperrst purge: Von der Liste deiner Folgenden löschen @@ -628,10 +632,16 @@ de: one: Etwas ist noch nicht ganz richtig! Bitte korrigiere den Fehler other: Etwas ist noch nicht ganz richtig! Bitte korrigiere %{count} Fehler imports: - preface: Daten, die du aus einer anderen Instanz exportiert hast, kannst du hier importieren. Beispielsweise die Liste derjenigen, denen du folgst oder die du blockiert hast. + modes: + merge: Zusammenführen + merge_long: Behalte existierende Datensätze und füge neue hinzu + overwrite: Ãœberschreiben + overwrite_long: Ersetze aktuelle Datensätze mit neuen + preface: Daten, die du aus einem anderen Server exportiert hast, kannst du hier importieren. Beispielsweise die Liste derjenigen, denen du folgst oder die du blockiert hast. success: Deine Daten wurden erfolgreich hochgeladen und werden in Kürze verarbeitet types: blocking: Blockierliste + domain_blocking: Domain-Blockliste following: Folgeliste muting: Stummschaltungsliste upload: Hochladen @@ -653,7 +663,7 @@ de: one: 1 mal verwendet other: "%{count} mal verwendet" max_uses_prompt: Kein Limit - prompt: Generiere und teile Links um Zugang zu dieser Instanz zu geben + prompt: Generiere und teile Links um Zugang zu diesem Server zu geben table: expires_at: Läuft ab uses: Verwendungen @@ -801,6 +811,7 @@ de: development: Entwicklung edit_profile: Profil bearbeiten export: Datenexport + featured_tags: Empfohlene Hashtags followers: Autorisierte Folgende import: Datenimport migrate: Konto-Umzug @@ -931,9 +942,9 @@ de: <p>Ursprünglich übernommen von der <a href="https://github.com/discourse/discourse">Discourse-Datenschutzerklärung</a>.</p> title: "%{instance} Nutzungsbedingungen und Datenschutzerklärung" themes: - contrast: Hoher Kontrast - default: Mastodon - mastodon-light: Mastodon (hell) + contrast: Mastodon (Hoher Kontrast) + default: Mastodon (Dunkel) + mastodon-light: Mastodon (Hell) time: formats: default: "%d.%m.%Y %H:%M" @@ -982,7 +993,7 @@ de: final_action: Fang an zu posten final_step: 'Fang an zu posten! Selbst ohne Follower werden deine öffentlichen Beitrage von anderen gesehen, zum Beispiel auf der lokalen Zeitleiste oder in Hashtags. Vielleicht möchtest du dich vorstellen mit dem #introductions-Hashtag.' full_handle: Dein vollständiger Benutzername - full_handle_hint: Dies ist was du deinen Freunden sagen kannst, damit sie dich anschreiben oder von einer anderen Instanz folgen können. + full_handle_hint: Dies ist was du deinen Freunden sagen kannst, damit sie dich anschreiben oder von einem anderen Server folgen können. review_preferences_action: Einstellungen ändern review_preferences_step: Stelle sicher, dass du deine Einstellungen einstellst, wie zum Beispiel welche E-Mails du gerne erhalten möchtest oder was für Privatsphäreneinstellungen voreingestellt werden sollten. Wenn dir beim Ansehen von GIFs nicht schwindelig wird, dann kannst du auch das automatische Abspielen dieser aktivieren. subject: Willkommen bei Mastodon diff --git a/config/locales/devise.co.yml b/config/locales/devise.co.yml index 108a4ef11e..89688a5a9d 100644 --- a/config/locales/devise.co.yml +++ b/config/locales/devise.co.yml @@ -20,17 +20,17 @@ co: action: Verificà l’indirizzu email action_with_app: Cunfirmà è rivene à %{app} explanation: Avete creatu un contu nant’à %{host} cù st’indirizzu email. Pudete attivallu cù un clic, o ignurà quessu missaghji s’ellu un era micca voi. - extra_html: Pensate à leghje <a href="%{terms_path}">e regule di l’istanza</a> è <a href="%{policy_path}">i termini d’usu</a>. + extra_html: Pensate à leghje <a href="%{terms_path}">e regule di u servore</a> è <a href="%{policy_path}">i termini d’usu</a>. subject: 'Mastodon: Istruzzione di cunfirmazione per %{instance}' title: Verificà l’indirizzu email email_changed: explanation: 'L’indirizzu email di u vostru contu hè stata cambiata per:' - extra: S’ellu un era micca voi ch’avete cambiatu u vostru email, qualch’un’altru hà accessu à u vostru contu. Duvete cambià a vostra chjave d’accessu o cuntattà l’amministratore di l’istanza s’ellu ùn hè più pussibule di cunnettavi. + extra: S’ellu un era micca voi ch’avete cambiatu u vostru email, qualch’un’altru hà accessu à u vostru contu. Duvete cambià a vostra chjave d’accessu o cuntattà l’amministratore di u servore s’ellu ùn hè più pussibule di cunnettavi. subject: 'Mastodon: Email cambiatu' title: Novu indirizzu email password_change: explanation: A chjave d’accessu per u vostru contu hè stata cambiata. - extra: S’ellu un era micca voi ch’avete cambiatu a vostra chjave d’accessu, qualch’un’altru hà accessu à u vostru contu. Duvete cambià a vostra chjave d’accessu o cuntattà l’amministratore di l’istanza s’ellu ùn hè più pussibule di cunnettavi. + extra: S’ellu un era micca voi ch’avete cambiatu a vostra chjave d’accessu, qualch’un’altru hà accessu à u vostru contu. Duvete cambià a vostra chjave d’accessu o cuntattà l’amministratore di u servore s’ellu ùn hè più pussibule di cunnettavi. subject: 'Mastodon: Chjave d’accessu cambiata' title: Chjave cambiata reconfirmation_instructions: diff --git a/config/locales/devise.da.yml b/config/locales/devise.da.yml index 56ae5183bf..4816d6456b 100644 --- a/config/locales/devise.da.yml +++ b/config/locales/devise.da.yml @@ -20,17 +20,17 @@ da: action: Bekræft email adresse action_with_app: Bekræft og vend tilbage til %{app} explanation: Du har oprettet en konto pÃ¥ %{host} med denne email adresse. Du er et klik fra at aktivere din konto. Hvis du ikke har oprettet dig, ignorer venligst denne email. - extra_html: Tjek ogsÃ¥ <a href="%{terms_path}">reglerne for instansen</a> og <a href="%{policy_path}">vores betingelser</a>. + extra_html: Tjek ogsÃ¥ <a href="%{terms_path}">reglerne for serveren</a> og <a href="%{policy_path}">vores betingelser</a>. subject: 'Mastodon: Bekræftelses instrukser for %{instance}' title: Bekræft email adresse email_changed: explanation: 'Email adressen for din konto bliver ændret til:' - extra: Hvis du ikke har ændret din email adresse er det muligt, at nogen har fÃ¥et adgang til din konto. Venligst ændre dit kodeord med det samme eller kontakt administratoren pÃ¥ instansen hvis du er lÃ¥st ude af din konto. + extra: Hvis du ikke har ændret din email adresse er det muligt, at nogen har fÃ¥et adgang til din konto. Venligst ændre dit kodeord med det samme eller kontakt administratoren pÃ¥ serveren hvis du er lÃ¥st ude af din konto. subject: 'Mastodon: Email ændret' title: Ny email adresse password_change: explanation: Kodeordet for din konto er blevet ændret. - extra: Hvis du ikke har ændret dit kodeord er det muligt, at nogen har fÃ¥et adgang til din konto. Venligst ændre dit kodeord med det samme eller kontakt administratoren pÃ¥ instansen hvis du er lÃ¥st ude af din konto. + extra: Hvis du ikke har ændret dit kodeord er det muligt, at nogen har fÃ¥et adgang til din konto. Venligst ændre dit kodeord med det samme eller kontakt administratoren pÃ¥ serveren hvis du er lÃ¥st ude af din konto. subject: 'Mastodon: Kodeord ændret' title: Kodeordet er blevet ændret reconfirmation_instructions: diff --git a/config/locales/devise.de.yml b/config/locales/devise.de.yml index fc41c9db51..5b060e0e78 100644 --- a/config/locales/devise.de.yml +++ b/config/locales/devise.de.yml @@ -20,17 +20,17 @@ de: action: E-Mail-Adresse verifizieren action_with_app: Bestätigen und zu %{app} zurückkehren explanation: Du hast einen Account auf %{host} mit dieser E-Mail-Adresse erstellt. Du bist nun einen Klick entfernt vor der Aktivierung. Wenn du das nicht warst, kannst du diese E-Mail ignorieren. - extra_html: Bitte lies auch die <a href="%{terms_path}">Regeln dieser Instanz</a> und <a href="%{policy_path}">unsere Nutzungsbedingungen</a>. + extra_html: Bitte lies auch die <a href="%{terms_path}">Regeln des Servers</a> und <a href="%{policy_path}">unsere Nutzungsbedingungen</a>. subject: 'Mastodon: Bestätigung deines Kontos bei %{instance}' title: Verifiziere E-Mail-Adresse email_changed: explanation: 'Die E-Mail-Adresse deines Accounts wird geändert zu:' - extra: Wenn du deine E-Mail-Adresse nicht geändert hast, dann kann es vermutlich sein, dass jemand Zugriff zu deinem Account erhalten hat. Bitte ändere sofort dein Passwort oder kontaktiere den Administrator deiner Instanz, wenn du dich ausgesperrt hast. + extra: Wenn du deine E-Mail-Adresse nicht geändert hast, dann kann es vermutlich sein, dass jemand Zugriff zu deinem Account erhalten hat. Bitte ändere sofort dein Passwort oder kontaktiere den Administrator des Servers, wenn du dich ausgesperrt hast. subject: 'Mastodon: E-Mail-Adresse geändert' title: Neue E-Mail-Adresse password_change: explanation: Das Passwort für deinen Account wurde geändert. - extra: Wenn du dein Passwort nicht geändert hast, dann kann es vermutlich sein, dass jemand Zugriff zu deinem Account erhalten hat. Bitte ändere sofort dein Passwort oder kontaktiere den Administrator deiner Instanz, wenn du dich ausgesperrt hast. + extra: Wenn du dein Passwort nicht geändert hast, dann kann es vermutlich sein, dass jemand Zugriff zu deinem Account erhalten hat. Bitte ändere sofort dein Passwort oder kontaktiere den Administrator des Servers, wenn du dich ausgesperrt hast. subject: 'Mastodon: Passwort geändert' title: Passwort geändert reconfirmation_instructions: diff --git a/config/locales/devise.eu.yml b/config/locales/devise.eu.yml index 9893f5ba32..65046dc0f5 100644 --- a/config/locales/devise.eu.yml +++ b/config/locales/devise.eu.yml @@ -20,17 +20,17 @@ eu: action: Baieztatu e-mail helbidea action_with_app: Berretsi eta itzuli %{app} aplikaziora explanation: Kontu bat sortu duzu %{host} ostalarian e-mail helbide honekin. Aktibatzeko klik bat falta zaizu. Ez baduzu zuk sortu, ez egin ezer e-mail honekin. - extra_html: Egiaztatu <a href="%{terms_path}">instantziaren arauak</a> eta <a href="%{policy_path}">zerbitzuaren erabilera baldintzak</a>. + extra_html: Egiaztatu <a href="%{terms_path}">zerbitzariaren arauak</a> eta <a href="%{policy_path}">zerbitzuaren erabilera baldintzak</a>. subject: 'Mastodon: %{instance} instantziaren argibideak baieztapenerako' title: Baieztatu e-mail helbidea email_changed: explanation: 'Zure kontuaren e-mail helbidea honetara aldatuko da:' - extra: Ez baduzu e-mail helbidea aldatu, agian baten bat zure kontura sartzea lortu du. Aldatu zure pasahitza berehala edo jarri instantziako administratzailearekin kontaktuan zure kontura sartzerik ez baduzu. + extra: Ez baduzu e-mail helbidea aldatu, agian baten bat zure kontura sartzea lortu du. Aldatu zure pasahitza berehala edo jarri zerbitzariko administratzailearekin kontaktuan zure kontura sartzerik ez baduzu. subject: 'Mastodon: E-mail helbidea aldatuta' title: E-mail helbide berria password_change: explanation: Zure kontuaren pasahitza aldatu da. - extra: Ez baduzu pasahitza aldatu, agian baten bat zure kontura sartzea lortu du. Aldatu zure pasahitza berehala edo jarri instantziako administratzailearekin kontaktuan zure kontura sartzerik ez baduzu. + extra: Ez baduzu pasahitza aldatu, agian baten bat zure kontura sartzea lortu du. Aldatu zure pasahitza berehala edo jarri zerbitzariko administratzailearekin kontaktuan zure kontura sartzerik ez baduzu. subject: 'Mastodon: Pasahitza aldatuta' title: Pasahitza aldatuta reconfirmation_instructions: diff --git a/config/locales/devise.fa.yml b/config/locales/devise.fa.yml index e6e16b4b49..1375c43f52 100644 --- a/config/locales/devise.fa.yml +++ b/config/locales/devise.fa.yml @@ -18,6 +18,7 @@ fa: mailer: confirmation_instructions: action: تأیید نشانی ایمیل + action_with_app: تأیید Ùˆ بازگشت به %{app} explanation: شما با این نشانی ایمیل Øسابی در %{host} باز کرده‌اید. با یک کلیک می‌توانید این Øساب را Ùعال کنید. اگر شما چنین کاری نکردید، لطÙاً این ایمیل را نادیده بگیرید. extra_html: لطÙاً همچنین <a href="%{terms_path}">قانون‌های این سرور</a> Ùˆ <a href="%{policy_path}">شرایط کاربری</a> آن را ببینید. subject: 'ماستدون: راهنمایی برای تأیید %{instance}' diff --git a/config/locales/devise.fi.yml b/config/locales/devise.fi.yml index e356abf9f4..12ab0f3ab9 100644 --- a/config/locales/devise.fi.yml +++ b/config/locales/devise.fi.yml @@ -18,6 +18,7 @@ fi: mailer: confirmation_instructions: action: Vahvista sähköpostiosoite + action_with_app: Vahvista ja palaa %{app} explanation: Olet luonut tilin palvelimelle %{host} käyttäen tätä sähköpostiosoitetta. Aktivoi tili yhdellä klikkauksella. Jos et luonut tiliä itse, voit jättää tämän viestin huomiotta. extra_html: Katso myös <a href="%{terms_path}">instanssin säännöt</a> ja <a href="%{policy_path}">käyttöehdot</a>. subject: 'Mastodon: Vahvistusohjeet - %{instance}' diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml index 718b4056e7..f0a5414b8e 100644 --- a/config/locales/devise.fr.yml +++ b/config/locales/devise.fr.yml @@ -21,7 +21,7 @@ fr: action_with_app: Confirmer et retourner à %{app} explanation: Vous avez créé un compte sur %{host} avec cette adresse courriel. Vous êtes à un clic de l’activer. Si ce n’était pas vous, veuillez ignorer ce courriel. extra_html: Merci de consultez également <a href="%{terms_path}">les règles de l’instance</a> et <a href="%{policy_path}">nos conditions d’utilisation</a>. - subject: Merci de confirmer votre inscription sur %{instance} + subject: 'Mastodon : Merci de confirmer votre inscription sur %{instance}' title: Vérifier l’adresse courriel email_changed: explanation: 'L’adresse courriel de votre compte est en cours de modification pour devenir :' @@ -31,7 +31,7 @@ fr: password_change: explanation: Le mot de passe de votre compte a été changé. extra: Si vous n’avez pas changé votre mot de passe, il est probable que quelqu’un ait eu accès à votre compte. Veuillez changer votre mot de passe immédiatement ou contacter l’administrateur·rice de l’instance si vous êtes bloqué·e hors de votre compte. - subject: Votre mot de passe a été modifié avec succès + subject: 'Mastodon : Votre mot de passe a été modifié avec succès' title: Mot de passe modifié reconfirmation_instructions: explanation: Confirmez la nouvelle adresse pour changer votre courriel. @@ -42,10 +42,10 @@ fr: action: Modifier le mot de passe explanation: Vous avez demandé un nouveau mot de passe pour votre compte. extra: Si vous ne l’avez pas demandé, veuillez ignorer ce courriel. Votre mot de passe ne changera pas tant que vous n’aurez pas cliqué sur le lien ci-dessus et que vous n’en aurez pas créé un nouveau. - subject: Instructions pour changer votre mot de passe + subject: 'Mastodon : Instructions pour changer votre mot de passe' title: Réinitialisation du mot de passe unlock_instructions: - subject: Instructions pour déverrouiller votre compte + subject: 'Mastodon : Instructions pour déverrouiller votre compte' omniauth_callbacks: failure: 'Nous n’avons pas pu vous authentifier via %{kind} : ''%{reason}''.' success: Authentifié avec succès via %{kind}. @@ -56,12 +56,12 @@ fr: updated: Votre mot de passe a été modifié avec succès, vous êtes maintenant connecté⋅e. updated_not_active: Votre mot de passe a été modifié avec succès. registrations: - destroyed: Votre compte a été supprimé avec succès. Nous espérons vous revoir bientôt. - signed_up: Bienvenue, vous êtes connecté⋅e. + destroyed: Au revoir ! Votre compte a été supprimé avec succès. Nous espérons vous revoir bientôt. + signed_up: Bienvenue ! Vous êtes connecté⋅e. signed_up_but_inactive: Vous êtes bien enregistré⋅e. Vous ne pouvez cependant pas vous connecter car votre compte n’est pas encore activé. signed_up_but_locked: Vous êtes bien enregistré⋅e. Vous ne pouvez cependant pas vous connecter car votre compte est verrouillé. - signed_up_but_unconfirmed: Un message contenant un lien de confirmation a été envoyé à votre adresse courriel. Ouvrez ce lien pour activer votre compte. - update_needs_confirmation: Votre compte a bien été mis à jour mais nous devons vérifier votre nouvelle adresse courriel. Merci de vérifier vos courriels et de cliquer sur le lien de confirmation pour finaliser la validation de votre nouvelle adresse. + signed_up_but_unconfirmed: Un message contenant un lien de confirmation a été envoyé à votre adresse courriel. Ouvrez ce lien pour activer votre compte. Veuillez vérifier votre dossier d'indésirables si vous ne recevez pas le courriel. + update_needs_confirmation: Votre compte a bien été mis à jour, mais nous devons vérifier votre nouvelle adresse courriel. Merci de vérifier vos courriels et de cliquer sur le lien de confirmation pour finaliser la validation de votre nouvelle adresse. Si vous n'avez pas reçu le courriel, vérifiez votre dossier d'indésirables. updated: Votre compte a été modifié avec succès. sessions: already_signed_out: Déconnecté·e. diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml index 9f60747a6a..d456d25df1 100644 --- a/config/locales/devise.gl.yml +++ b/config/locales/devise.gl.yml @@ -20,17 +20,17 @@ gl: action: Validar enderezo de correo-e action_with_app: Confirmar e voltar a %{app} explanation: Creou unha conta en %{host} con este enderezo de correo. Está a punto de activalo, si non foi vostede quen fixo a petición, por favor ignore este correo. - extra_html: Por favor, lea tamén <a href="%{terms_path}">as normas da instancia</a> e <a href="%{policy_path}">os termos do servizo</a>. + extra_html: Por favor, lea tamén <a href="%{terms_path}">as normas do sevidor</a> e <a href="%{policy_path}">os termos do servizo</a>. subject: 'Mastodon: Instruccións de confirmación para %{instance}' title: Verificar enderezo de correo-e email_changed: explanation: 'O seu enderezo de correo para esta conta foi cambiado a:' - extra: Si non fixo a petición de cambio de correo-e é probable que alguén obtivese acceso a súa conta. Por favor, cambie o contrasinal inmediatamente ou contacte coa administración da instancia si non ten acceso a súa conta. + extra: Se non fixo a petición de cambio de correo-e é probable que alguén obtivese acceso a súa conta. Por favor, cambie o contrasinal inmediatamente ou contacte coa administración do servidor se non ten acceso a súa conta. subject: 'Mastodon: email cambiado' title: Novo enderezo de correo password_change: explanation: Cambiouse o contrasinal da súa conta. - extra: Si non cambio o contrasinal, é probable que alguén obtivese acceso a súa conta. Por favor cambie o contrasinal inmediatamente ou contacte coa administración da instancia si non ten acceso a súa conta. + extra: Se non cambiou o contrasinal, é probable que alguén obtivese acceso a súa conta. Por favor cambie o contrasinal inmediatamente ou contacte coa administración do servidor se non ten acceso a súa conta. subject: 'Mastodon: contrasinal cambiado' title: Contrainal cambiado reconfirmation_instructions: diff --git a/config/locales/devise.kk.yml b/config/locales/devise.kk.yml new file mode 100644 index 0000000000..d99116c7f0 --- /dev/null +++ b/config/locales/devise.kk.yml @@ -0,0 +1,83 @@ +--- +kk: + devise: + confirmations: + confirmed: Сіздің email адреÑіңіз Ñәтті құпталды. + send_instructions: Email адреÑіңізге бірнеше минут ішінде қалай раÑтау керегі туралы нұÑқау бар хат келеді. Бұл хат егер келмеÑе, Ñпам құтыÑын текÑеріңіз. + send_paranoid_instructions: Email адреÑіңіз біздің дерекқорымызда болÑа, бірнеше минут ішінде раÑтау туралы нұÑқау бар хат алаÑыз. Бұл хатты алмаÑаңыз, Ñпам құтыÑын текÑеріңіз. + failure: + already_authenticated: Сіз кіріп тұрÑыз. + inactive: Ðккаунтыңыз әлі құпталмаған. + invalid: Қате %{authentication_keys} немеÑе құпиÑÑөз. + last_attempt: Ðккаунтыңыз құлыпталғанға дейін тағы бір әрекет жаÑаңыз. + locked: Ðккаунтыңыз құлыпталған. + not_found_in_database: Қате %{authentication_keys} немеÑе құпиÑÑөз. + timeout: СеÑÑиÑңыз аÑқталды. Қайтадан кіріңіз жалғаÑтыру үшін. + unauthenticated: ЖалғаÑтыру үшін тіркеліңіз немеÑе логиніңізбен кіріңіз. + unconfirmed: ЖалғаÑтыру үшін email адреÑіңізді құптауыңыз керек. + mailer: + confirmation_instructions: + action: Email адреÑіңізді раÑтаңыз + action_with_app: РаÑтау және оралу - %{app} + explanation: Сіз %{host} Ñайтына тіркелгенÑіз оÑÑ‹ email адреÑімен. ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð¶Ð°Ñауға бір адам қалды. Егер тіркелмеген болÑаңыз, бұл хатты елемеңіз. + extra_html: Сондай-ақ <a href="%{terms_path}">шарттар мен ережелерді</a> және <a href="%{policy_path}">құпиÑлылық ÑаÑÑатын</a> оқыңыз. + subject: 'Mastodon: РаÑтау туралы нұÑқаулық %{instance}' + title: Email адреÑін раÑтау + email_changed: + explanation: 'Сіздің email адреÑіңіз өзгертілейін деп жатыр:' + extra: Егер Ñіз Ñлектрондық поштаңызды өзгертпеген болÑаңыз, онда біреу Ñіздің аккаунтыңызға қол жеткізді. Ðккаунтыңыздан шыққан жағдайда дереу Ò›Ò±Ð¿Ð¸Ñ Ñөзіңізді өзгертіңіз немеÑе Ñервер әкімшіÑіне хабарлаÑыңыз. + subject: 'Mastodon: Email өзгертілді' + title: Жаңа email Ð°Ð´Ñ€ÐµÑ + password_change: + explanation: Ðккаунтыңыздағы құпиÑÑөз өзгертілді. + extra: Егер Ñіз Ñлектрондық поштаңызды өзгертпеген болÑаңыз, онда біреу Ñіздің аккаунтыңызға қол жеткізді. Ðккаунтыңыздан шыққан жағдайда дереу Ò›Ò±Ð¿Ð¸Ñ Ñөзіңізді өзгертіңіз немеÑе Ñервер әкімшіÑіне хабарлаÑыңыз. + subject: 'Mastodon: ҚұпиÑÑөз өзгертілді' + title: ҚұпиÑÑөз өзгертілді + reconfirmation_instructions: + explanation: Email адреÑіңізді өзгерту үшін раÑтаңыз. + extra: Егер Ñіз бұл өзгеріÑÑ‚Ñ– жаÑамаған болÑаңыз, бұл хатты елемеңіз. Mastodon тіркелгіÑінің Ñлектрондық пошта мекенжайы жоғарыдағы Ñілтемеге кірмейінше өзгермейді. + subject: 'Mastodon: %{instance} үшін email раÑтаңыз' + title: Еmail адреÑін раÑтаңыз + reset_password_instructions: + action: ҚұпиÑÑөз өзгерту + explanation: Ðккаунтыңыз үшін жаңа құпиÑÑөз Ñұраттыңыз. + extra: Егер Ñіз мұны Ñұрамаған болÑаңыз, бұл хатты елемеңіз. Жоғарыдағы Ñілтемені ашып, жаңаÑын жаÑағанша Ò›Ò±Ð¿Ð¸Ñ Ñөзіңіз өзгермейді. + subject: 'Mastodon: ҚұпиÑÑөзді қалпына келтіру нұÑқаулықтары' + title: ҚұпиÑÑөзді қалпына келтіру + unlock_instructions: + subject: 'Mastodon: Құлыптан шешу нұÑқаулықтары' + omniauth_callbacks: + failure: Сізді аутентификациÑлау мүмкін болмады %{kind} Ñебебі "%{reason}". + success: "%{kind} аккаунтынан Ñәтті аутентификациÑ." + passwords: + no_token: Бұл бетке құпиÑÑөзді қалпына келтіру Ñлектрондық поштаÑынан шықпай кіре алмайÑыз. ÒšÒ±Ð¿Ð¸Ñ Ñөзді қалпына келтіру Ñлектрондық поштаÑынан шықÑаңыз, берілген толық URL мекенжайын пайдаланғаныңызды текÑеріңіз. + send_instructions: Ðлектрондық пошта мекенжайыңыз біздің дерекқорымызда болÑа, бірнеше минут ішінде Ò›Ò±Ð¿Ð¸Ñ Ñөзді қалпына келтіру ÑілтемеÑін алаÑыз. Бұл хат келмеген болÑа, Ñпам құтыÑын текÑеріңіз. + send_paranoid_instructions: Ðлектрондық пошта мекенжайыңыз біздің дерекқорымызда болÑа, бірнеше минут ішінде Ò›Ò±Ð¿Ð¸Ñ Ñөзді қалпына келтіру ÑілтемеÑін алаÑыз. Бұл хат келмеген болÑа, Ñпам құтыÑын текÑеріңіз. + updated: ҚұпиÑÑөзіңіз Ñәтті өзгертілді. Сіз енді кірдіңіз. + updated_not_active: ҚұпиÑÑөзіңіз Ñәтті өзгертілді. + registrations: + destroyed: Сау! Ðккаунтыңыз тоқтатылды. Қайтадан оралаÑыз деп Ñенеміз. + signed_up: Қош келдіңіз! Тіркелу Ñәтті Ó©Ñ‚Ñ‚Ñ–. + signed_up_but_inactive: Тіркелу Ñәтті аÑқталды. Дегенмен, аккаунтыңыз әлі белÑендірілмегендіктен, Ñізге Ñайтқа кіру мүмкін болмайды. + signed_up_but_locked: Тіркелу Ñәтті аÑқталды. Дегенмен, аккаунтыңыз құлыпталғандықтан, Ñізге Ñайтқа кіру мүмкін болмайды. + signed_up_but_unconfirmed: РаÑтау ÑілтемеÑÑ– бар хат Ñлектрондық поштаыңызға жіберілді. Ðккаунтыңызды белÑендіру үшін Ñілтеме бойынша өтіңіз. Бұл хат келмеÑе, Ñпам құтыÑын текÑеріңіз. + update_needs_confirmation: Ðккаунтыыызды Ñәтті жаңарттыңыз, бірақ жаңа Ñлектрондық поштаны текÑеру қажет. Ðлектрондық поштаңызды текÑеріп, жаңа Ñлектрондық пошта мекенжайыңызды раÑтаңыз. Бұл Ñлектрондық поштаны алмаÑаңыз, Ñпам қалтаңызды текÑеріңіз. + updated: Ðккаунтыңыз Ñәтті жаңартылды. + sessions: + already_signed_out: Сәтті шықтыңыз. + signed_in: Сәтті кірдіңіз. + signed_out: Шығу Ñәтті орындалды. + unlocks: + send_instructions: Бірнеше минуттан кейін аккаунтыңыздың құлпын ашу туралы нұÑқаулар бар хат алаÑыз. Бұл хаттыы алмаÑаңыз, Ñпам құтыÑын текÑеріңіз. + send_paranoid_instructions: Егер тіркелгіңіз бар болÑа, оны бірнеше минуттан кейін құлыптан боÑату туралы нұÑқаулар бар хат алаÑыз. Бұл хат келмеÑе, Ñпам құтыÑын текÑеріңіз. + unlocked: Ðккаунтыңыз Ñәтті шешілді құлыптан. ЖалғаÑтыру үшін кіріңіз. + errors: + messages: + already_confirmed: әлдеқашан раÑталған, логинмен кіре беріңіз + confirmation_period_expired: "%{period} ішінде раÑталуы қажет, жаңаÑын Ñұратыңыз" + expired: уақыты өтіп кетті, жаңаÑын Ñұратыңыз + not_found: табылмады + not_locked: құлыпталмады + not_saved: + one: '1 тыйым Ñалынған қате %{resource} Ñақталды:' + other: "%{count} тыйым Ñалынған қате %{resource} Ñақталды:" diff --git a/config/locales/devise.sq.yml b/config/locales/devise.sq.yml index 906bece813..0380d962e6 100644 --- a/config/locales/devise.sq.yml +++ b/config/locales/devise.sq.yml @@ -20,17 +20,17 @@ sq: action: Verifikoni adresë email action_with_app: Ripohojeni dhe kthehuni te %{app} explanation: Keni krijuar një llogari te %{host}, me këtë adresë email. Jeni një klikim larg aktivizimit të saj. Nëse s’jeni ju, shpërfilleni këtë email. - extra_html: Ju lutemi, shihni edhe <a href="%{terms_path}">rregullat e instancës</a> dhe <a href="%{policy_path}">kushtet tona të shërbimit</a>. + extra_html: Ju lutemi, shihni edhe <a href="%{terms_path}">rregullat e shërbyesit</a> dhe <a href="%{policy_path}">kushtet tona të shërbimit</a>. subject: 'Mastodon: Udhëzime ripohimi për %{instance}' title: Verifikoni adresë email email_changed: explanation: 'Adresa email për llogarinë tuaj po ndryshohet në:' - extra: Nëse email-in tuaj nuk e ndryshuat ju, gjasat janë që dikush tjetër ka arritur të hyjë në llogarinë tuaj. Ju lutemi, ndryshoni menjëherë fjalëkalimin tuaj ose lidhuni me përgjegjësin e instancës, nëse jeni kyçur jashtë llogarisë tuaj. + extra: Nëse email-in tuaj nuk e ndryshuat ju, gjasat janë që dikush tjetër ka arritur të hyjë në llogarinë tuaj. Ju lutemi, ndryshoni menjëherë fjalëkalimin tuaj ose lidhuni me përgjegjësin e shërbyesit, nëse jeni kyçur jashtë llogarisë tuaj. subject: 'Mastodon: Email-i u ndryshua' title: Adresë email e re password_change: explanation: Fjalëkalimi për llogarinë tuaj u ndryshua. - extra: Nëse fjalëkalimin tuaj nuk e ndryshuat ju, gjasat janë që dikush tjetër ka arritur të hyjë në llogarinë tuaj. Ju lutemi, ndryshoni menjëherë fjalëkalimin tuaj ose lidhuni me përgjegjësin e instancës, nëse jeni kyçur jashtë llogarisë tuaj. + extra: Nëse fjalëkalimin tuaj nuk e ndryshuat ju, gjasat janë që dikush tjetër ka arritur të hyjë në llogarinë tuaj. Ju lutemi, ndryshoni menjëherë fjalëkalimin tuaj ose lidhuni me përgjegjësin e shërbyesit, nëse jeni kyçur jashtë llogarisë tuaj. subject: 'Mastodon: Fjalëkalimi u ndryshua' title: Fjalëkalimi u ndryshua reconfirmation_instructions: diff --git a/config/locales/devise.tr.yml b/config/locales/devise.tr.yml new file mode 100644 index 0000000000..0a504dd676 --- /dev/null +++ b/config/locales/devise.tr.yml @@ -0,0 +1,15 @@ +--- +tr: + devise: + confirmations: + confirmed: E-posta adresiniz baÅŸarıyla onaylandı. + send_instructions: Birkaç dakika içinde e-posta adresinizi nasıl onaylayacağınıza iliÅŸkin talimatları içeren bir e-posta alacaksınız. Bu e-postayı almadıysanız, lütfen spam klasörünüzü kontrol edin. + send_paranoid_instructions: E-posta adresiniz veritabanımızda varsa, e-posta adresinizi birkaç dakika içinde nasıl doÄŸrulayacağınıza iliÅŸkin talimatları içeren bir e-posta alacaksınız. Bu e-postayı almadıysanız, lütfen spam klasörünüzü kontrol edin. + failure: + already_authenticated: Zaten oturum açtınız. + inactive: Hesabınız henüz etkinleÅŸtirilmedi. + last_attempt: Hesabınız kilitlenmeden önce bir kez daha denemeniz gerekir. + locked: Hesabınız kilitli. + mailer: + confirmation_instructions: + action: E-posta adresinizi doÄŸrulayın diff --git a/config/locales/doorkeeper.kk.yml b/config/locales/doorkeeper.kk.yml new file mode 100644 index 0000000000..de3a0e155f --- /dev/null +++ b/config/locales/doorkeeper.kk.yml @@ -0,0 +1,142 @@ +--- +kk: + activerecord: + attributes: + doorkeeper/application: + name: Application аты + redirect_uri: Redirect URI + scopes: Scopes + website: Application Ñайты + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: cannot contain a frаgment. + invalid_uri: must be a vаlid URI. + relative_uri: must be an аbsolute URI. + secured_uri: must be аn HTTPS/SSL URI. + doorkeeper: + applications: + buttons: + authorize: ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ + cancel: Қайтып алу + destroy: Жою + edit: Түзету + submit: Жіберу + confirmations: + destroy: Шынымен бе? + edit: + title: ҚоÑымшаны түзету + form: + error: Whoops! Check your form for pоssible errors + help: + native_redirect_uri: Use %{native_redirect_uri} fоr local tests + redirect_uri: Use one line pеr URI + scopes: Separate scopes with spаces. Leave blank to use the default scopes. + index: + application: ҚоÑымша + callback_url: Callbаck URL + delete: Өшіру + name: ÐÑ‚Ñ‹ + new: Жаңа қоÑымша + scopes: Scopеs + show: КөрÑету + title: ҚоÑымшаларыңыз + new: + title: Жаңа қоÑымша + show: + actions: Әрекеттер + application_id: Client kеy + callback_urls: Callbаck URLs + scopes: Scopеs + secret: Client sеcret + title: 'Applicаtion: %{name}' + authorizations: + buttons: + authorize: ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ + deny: Қабылдамау + error: + title: Қате пайда болды + new: + able_to: It will be аble to + prompt: Application %{client_name} rеquests access to your account + title: Authorization rеquired + show: + title: Copy this authorization cоde and paste it to the application. + authorized_applications: + buttons: + revoke: Тыйым Ñалу + confirmations: + revoke: Шынымен бе? + index: + application: ҚоÑымша + created_at: ÐвторизациÑланды + date_format: "%Y-%m-%d %H:%M:%S" + scopes: Scopеs + title: Your authorized applicаtions + errors: + messages: + access_denied: The resource owner or authоrization server denied the request. + credential_flow_not_configured: Resource Owner Password Credentials flow fаiled due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured. + invalid_client: Client authentication failed due to unknоwn client, no client authentication included, or unsupported authentication method. + invalid_grant: The provided authorization grant is invаlid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client. + invalid_redirect_uri: The redirеct uri included is not valid. + invalid_request: The request is missing a required parameter, includes an unsupported parameter vаlue, or is otherwise malformed. + invalid_resource_owner: The provided resource owner credentials are not valid, or rеsource owner cannot be found + invalid_scope: The requested scope is invаlid, unknown, or malformed. + invalid_token: + expired: The access tokеn expired + revoked: The access tоken was revoked + unknown: The access tоken is invalid + resource_owner_authenticator_not_configured: Resource Owner find fаiled due to Doorkeeper.configure.resource_owner_authenticator being unconfiged. + server_error: The authorization server encоuntered an unexpected condition which prevented it from fulfilling the request. + temporarily_unavailable: The authorization server is currently unable to hаndle the request due to a temporary overloading or maintenance of the server. + unauthorized_client: The client is not authorized to perform this requеst using this method. + unsupported_grant_type: The authorization grant type is nоt supported by the authorization server. + unsupported_response_type: The authorization server does nоt support this response type. + flash: + applications: + create: + notice: Application crеated. + destroy: + notice: Application dеleted. + update: + notice: Application updаted. + authorized_applications: + destroy: + notice: Application revоked. + layouts: + admin: + nav: + applications: Applicatiоns + oauth2_provider: OAuth2 Prоvider + application: + title: OAuth authorizatiоn required + scopes: + follow: modify accоunt relationships + push: receive your push nоtifications + read: read all your accоunt's data + read:accounts: see accounts infоrmation + read:blocks: see your blоcks + read:favourites: see your favоurites + read:filters: see yоur filters + read:follows: see your follоws + read:lists: see yоur lists + read:mutes: see yоur mutes + read:notifications: see your nоtifications + read:reports: see your repоrts + read:search: search on yоur behalf + read:statuses: see all stаtuses + write: modify all your accоunt's data + write:accounts: modify your prоfile + write:blocks: block accounts and dоmains + write:favourites: favourite stаtuses + write:filters: creаte filters + write:follows: follow peоple + write:lists: creatе lists + write:media: upload mеdia files + write:mutes: mute pеople and conversations + write:notifications: clear yоur notifications + write:reports: report оther people + write:statuses: publish stаtuses diff --git a/config/locales/doorkeeper.tr.yml b/config/locales/doorkeeper.tr.yml new file mode 100644 index 0000000000..686a018e0a --- /dev/null +++ b/config/locales/doorkeeper.tr.yml @@ -0,0 +1,19 @@ +--- +tr: + activerecord: + attributes: + doorkeeper/application: + name: Uygulama adı + website: Uygulama web sitesi + doorkeeper: + applications: + buttons: + authorize: Yetki ver + cancel: Ä°ptal et + destroy: Yok et + edit: Düzenle + submit: Gönder + confirmations: + destroy: Emin misiniz? + edit: + title: Uygulamayı düzenle diff --git a/config/locales/el.yml b/config/locales/el.yml index 95a72571d3..f3038e3d09 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -588,6 +588,10 @@ el: lists: Λίστες mutes: Αποσιωπάς storage: Αποθήκευση πολυμÎσων + featured_tags: + add_new: Î Ïοσθήκη νÎας + errors: + limit: Έχεις ήδη Ï€ÏοσθÎσει το μÎγιστο αÏιθμό ταμπελών filters: contexts: home: ΑÏχική Ïοή @@ -628,10 +632,16 @@ el: one: Κάτι δεν είναι εντάξει ακόμα! Για κοίταξε το παÏακάτω σφάλμα other: Κάτι δεν είναι εντάξει ακόμα! Για κοίταξε τα παÏακάτω %{count} σφάλματα imports: + modes: + merge: Συγχώνευση + merge_long: ΔιατήÏηση των εγγÏάφων που υπάÏχουν και Ï€Ïοσθηκη των νÎων + overwrite: Αντικατάσταση + overwrite_long: Αντικατάσταση των υπαÏχόντων εγγÏάφων με τις καινοÏÏγιες preface: ΜποÏείς να εισάγεις τα δεδομÎνα που Îχεις εξάγει από άλλο κόμβο, όπως τη λίστα των ανθÏώπων που ακολουθείς ή μπλοκάÏεις. success: Τα δεδομÎνα σου μεταφοÏτώθηκαν επιτυχώς και θα επεξεÏγαστοÏν εν καιÏÏŽ types: blocking: Λίστα Î±Ï€Î¿ÎºÎ»ÎµÎ¹ÏƒÎ¼Î¿Ï + domain_blocking: Λίστα αποκλεισμÎνων τομÎων following: Λίστα ακολοÏθων muting: Λίστα αποσιωπήσεων upload: ΑνÎβασμα @@ -733,7 +743,7 @@ el: no_account_html: Δεν Îχεις λογαÏιασμό; ΜποÏείς <a href='%{sign_up_path}' target='_blank'>να γÏαφτείς εδώ</a> proceed: ΣυνÎχισε για να ακολουθήσεις prompt: 'Ετοιμάζεσαι να ακολουθήσεις:' - reason_html: "<strong>Γιατί χÏειάζεται αυτό το βήμα;</strong> Το <code>%{instance}</code> ποÏεία να μην είναι ο κόμβος που είσαι γÏαμμÎνος, Îτσι Ï€ÏÎπει να σε ανακατευθÏνουμε στο δικό σου." + reason_html: "<strong>Γιατί χÏειάζεται αυτό το βήμα;</strong> Το <code>%{instance}</code> μποÏεί να μην είναι ο κόμβος που Îχεις γÏαφτεί, Îτσι Ï€ÏÎπει να σε ανακατευθÏνουμε στο δικό σου." remote_interaction: favourite: proceed: ΣυνÎχισε για σημείωση ως αγαπημÎνου @@ -800,6 +810,7 @@ el: development: Ανάπτυξη edit_profile: ΕπεξεÏγασία Ï€Ïοφίλ export: Εξαγωγή δεδομÎνων + featured_tags: ΧαÏακτηÏιστικÎÏ‚ ταμπÎλες followers: ΕγκεκÏιμÎνοι ακόλουθοι import: Εισαγωγή migrate: Μετακόμιση λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 84fbbbaf70..f8eb18279e 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -7,7 +7,7 @@ eu: administered_by: 'Administratzailea(k):' api: APIa apps: Aplikazio mugikorrak - closed_registrations: Harpidetza itxita dago orain instantzia honetan. Hala ere, beste instantzia bat aurkitu dezakezu kontua egiteko eta hona ere sarbidea izan. + closed_registrations: Harpidetza itxita dago orain zerbitzari honetan. Hala ere, beste zerbitzari bat aurkitu dezakezu kontua egiteko eta hona ere sarbidea izan. contact: Kontaktua contact_missing: Ezarri gabe contact_unavailable: E/E @@ -27,7 +27,7 @@ eu: generic_description: "%{domain} sareko zerbitzari bat da" hosted_on: Mastodon %{domain} domeinuan ostatatua learn_more: Ikasi gehiago - other_instances: Instantzien zerrenda + other_instances: Zerbitzarien zerrenda privacy_policy: Pribatutasun politika source_code: Iturburu kodea status_count_after: @@ -386,14 +386,14 @@ eu: desc_html: Aldatu itxura orri bakoitzean kargatutako CSS bidez title: CSS pertsonala hero: - desc_html: Azaleko orrian bistaratua. Gutxienez 600x100px aholkatzen da. Ezartzen ez bada, instantziaren irudia hartuko du + desc_html: Azaleko orrian bistaratua. Gutxienez 600x100px aholkatzen da. Ezartzen ez bada, zerbitzariaren irudia hartuko du title: Azaleko irudia mascot: desc_html: Hainbat orritan bistaratua. Gutxienez 293x205px aholkatzen da. Ezarri ezean lehenetsitako maskota erakutsiko da title: Maskotaren irudia peers_api_enabled: - desc_html: Instantzia honek fedibertsuan aurkitutako domeinu-izenak - title: Argitaratu aurkitutako instantzien zerrenda + desc_html: Zerbitzari honek fedibertsoan aurkitutako domeinu-izenak + title: Argitaratu aurkitutako zerbitzarien zerrenda preview_sensitive_media: desc_html: Beste webguneetako esteken aurrebistak iruditxoa izango du multimedia hunkigarri gisa markatzen bada ere title: Erakutsi multimedia hunkigarria OpenGraph aurrebistetan @@ -421,20 +421,20 @@ eu: title: Erakutsi langile banda site_description: desc_html: Azaleko orrian agertuko den sarrera paragrafoa. Azaldu zerk egiten duen berezi Mastodon zerbitzari hau eta garrantzizko beste edozer. HTML etiketak erabili ditzakezu, zehazki <code><a></code> eta <code><em></code>. - title: Instantziaren deskripzioa + title: Zerbitzariaren deskripzioa site_description_extended: - desc_html: Zure jokabide-koderako toki on bat, arauak, gidalerroak eta zure instantzia desberdin egiten duten bestelakoak. HTML etiketak erabili ditzakezu + desc_html: Zure jokabide-koderako toki on bat, arauak, gidalerroak eta zure zerbitzari desberdin egiten duten bestelakoak. HTML etiketak erabili ditzakezu title: Informazio hedatu pertsonalizatua site_short_description: desc_html: Albo-barra eta meta etiketetan bistaratua. Deskribatu zerk egiten duen Mastodon zerbitzari hau berezia paragrafo batean. Hutsik lagatzekotan lehenetsitako deskripzioa agertuko da. - title: Instantziaren deskripzio laburra + title: Zerbitzariaren deskripzio laburra site_terms: desc_html: Zure pribatutasun politika, erabilera baldintzak eta bestelako testu legalak idatzi ditzakezu. HTML etiketak erabili ditzakezu title: Erabilera baldintza pertsonalizatuak - site_title: Instantziaren izena + site_title: Zerbitzariaren izena thumbnail: desc_html: Aurrebistetarako erabilia OpenGraph eta API bidez. 1200x630px aholkatzen da - title: Instantziaren iruditxoa + title: Zerbitzariaren iruditxoa timeline_preview: desc_html: Bistaratu denbora-lerro publikoa hasiera orrian title: Denbora-lerroaren aurrebista @@ -495,7 +495,7 @@ eu: warning: Kontuz datu hauekin, ez partekatu inoiz inorekin! your_token: Zure sarbide token-a auth: - agreement_html: '"Izena eman" botoia sakatzean <a href="%{rules_path}">instantziaren arauak</a> eta <a href="%{terms_path}">erabilera baldintzak</a> onartzen dituzu.' + agreement_html: '"Izena eman" botoia sakatzean <a href="%{rules_path}">zerbitzariaren arauak</a> eta <a href="%{terms_path}">erabilera baldintzak</a> onartzen dituzu.' change_password: Pasahitza confirm_email: Berretsi e-mail helbidea delete_account: Ezabatu kontua @@ -549,7 +549,7 @@ eu: description_html: Honek <strong>behin betirako eta atzera egiteko aukera gabe</strong> zure kontuko edukia kendu eta hau desaktibatuko du. Zure erabiltzaile-izena erreserbatuko da etorkizunean inork zure itxurak ez egiteko. proceed: Ezabatu kontua success_msg: Zure kontua ongi ezabatu da - warning_html: Instantzia honetako edukiak ezabatzea besterik ezin da bermatu. Asko partekatu den edukiaren arrastoak geratzea izan liteke. Deskonektatuta dauden zerbitzariak edo zure eguneraketetatik harpidetza kendu duten zerbitzariek ez dituzte beraien datu-baseak eguneratuko. + warning_html: Zerbitzari honetako edukiak ezabatzea besterik ezin da bermatu. Asko partekatu den edukiaren arrastoak geratzea izan liteke. Deskonektatuta dauden zerbitzariak edo zure eguneraketetatik harpidetza kendu duten zerbitzariek ez dituzte beraien datu-baseak eguneratuko. warning_title: Sakabanatutako edukiaren eskuragarritasuna directories: directory: Profilen direktorioa @@ -563,8 +563,8 @@ eu: other: "%{count} pertsona" errors: '403': Ez duzu orri hau ikusteko baimenik. - '404': Bilatu duzun orria ez da existitzen. - '410': Bilatu duzun orria ez da existitzen jada. + '404': Bilatu duzun orria ez dago hemen. + '410': Bilatu duzun orria ez dago hemen jada. '422': content: Segurtasun egiaztaketak huts egin du. Cookie-ak blokeatzen dituzu? title: Segurtasun egiaztaketak huts egin du @@ -588,6 +588,10 @@ eu: lists: Zerrendak mutes: Zuk mututukoak storage: Multimedia biltegiratzea + featured_tags: + add_new: Gehitu berria + errors: + limit: Gehienezko traola kopurua nabarmendu duzu jada filters: contexts: home: Hasierako denbora-lerroa @@ -606,7 +610,7 @@ eu: title: Gehitu iragazki berria followers: domain: Domeinua - explanation_html: Zure mezuen pribatutasuna bermatu nahi baduzu, nork jarraitzen zaituen jakin behar duzu. <strong>Zure mezu pribatuak zure jarraitzaileak dituzten instantzia guztietara bidaltzen dira</strong>. Instantzia bateko langileek edo softwareak zure pribatutasunari dagokion begirunea ez dutela izango uste baduzu, berrikusi eta kendu jarraitzaileak. + explanation_html: Zure mezuen pribatutasuna bermatu nahi baduzu, nork jarraitzen zaituen jakin behar duzu. <strong>Zure mezu pribatuak zure jarraitzaileak dituzten zerbitzari guztietara bidaltzen dira</strong>. Zerbitzari bateko langileek edo softwareak zure pribatutasunari dagokion begirunea ez dutela izango uste baduzu, berrikusi eta kendu jarraitzaileak. followers_count: Jarraitzaile kopurua lock_link: Giltzapetu zure kontua purge: Kendu jarraitzaileetatik @@ -628,10 +632,16 @@ eu: one: Zerbait ez dabil ongi! Egiaztatu beheko errorea mesedez other: Zerbait ez dabil ongi! Egiaztatu beheko %{count} erroreak mesedez imports: - preface: Beste instantzia bateko datuak inportatu ditzakezu, esaterako jarraitzen duzun edo blokeatu duzun jendearen zerrenda. + modes: + merge: Bateratu + merge_long: Mantendu dauden erregistroak eta gehitu berriak + overwrite: Gainidatzi + overwrite_long: Ordeztu oraingo erregistroak berriekin + preface: Beste zerbitzari bateko datuak inportatu ditzakezu, esaterako jarraitzen duzun edo blokeatu duzun jendearen zerrenda. success: Zure datuak ongi igo dira eta dagokionean prozesatuko dira types: blocking: Blokeatutakoen zerrenda + domain_blocking: Domeinuen blokeo zerrenda following: Jarraitutakoen zerrenda muting: Mutututakoen zerrenda upload: Igo @@ -653,7 +663,7 @@ eu: one: Erabilera 1 other: "%{count} erabilera" max_uses_prompt: Mugagabea - prompt: Sortu eta partekatu estekak instantzia onetara sarbidea emateko + prompt: Sortu eta partekatu estekak zerbitzari honetara sarbidea emateko table: expires_at: Iraungitzea uses: Erabilerak @@ -801,6 +811,7 @@ eu: development: Garapena edit_profile: Aldatu profila export: Datuen esportazioa + featured_tags: Nabarmendutako traolak followers: Baimendutako jarraitzaileak import: Inportazioa migrate: Kontuaren migrazioa @@ -929,9 +940,9 @@ eu: <p>Jatorrian <a href="https://github.com/discourse/discourse">Discourse sarearen pribatutasun politikatik</a> moldatua.</p> title: "%{instance} instantziaren erabilera baldintzak eta pribatutasun politika" themes: - contrast: Kontraste altua - default: Mastodon - mastodon-light: Mastodon (argia) + contrast: Mastodon (Kontraste altua) + default: Mastodon (Iluna) + mastodon-light: Mastodon (Argia) time: formats: default: "%Y(e)ko %b %d, %H:%M" @@ -980,7 +991,7 @@ eu: final_action: Hasi mezuak bidaltzen final_step: 'Hasi argitaratzen! Jarraitzailerik ez baduzu ere zure mezu publikoak besteek ikusi ditzakete, esaterako denbora-lerro lokalean eta traoletan. Zure burua aurkeztu nahi baduzu #aurkezpenak traola erabili zenezake.' full_handle: Zure erabiltzaile-izen osoa - full_handle_hint: Hau da lagunei esango zeniekeena beste instantzia batetik zu jarraitzeko edo zuri mezuak bidaltzeko. + full_handle_hint: Hau da lagunei esango zeniekeena beste zerbitzari batetik zu jarraitzeko edo zuri mezuak bidaltzeko. review_preferences_action: Aldatu hobespenak review_preferences_step: Ziurtatu hobespenak ezartzen dituzula, jaso nahi dituzu e-mail mezuak, lehenetsitako pribatutasuna mezu berrietarako. Mareatzen ez bazaitu GIF-ak automatikoki abiatzea ezarri dezakezu ere. subject: Ongi etorri Mastodon-era diff --git a/config/locales/fa.yml b/config/locales/fa.yml index e7dd86025f..fd551d1b6a 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -48,6 +48,7 @@ fa: other: پیگیر following: Ù¾ÛŒ می‌گیرد joined: کاربر از %{date} + last_active: آخرین Ùعالیت link_verified_on: مالکیت این نشانی در تاریخ %{date} بررسی شد media: عکس Ùˆ ویدیو moved_html: "%{name} Øساب خود را به %{new_profile_link} منتقل کرده است:" @@ -69,6 +70,9 @@ fa: moderator: ناظم unfollow: پایان پیگیری admin: + account_actions: + action: انجام تغییر + title: انجام تغییر مدیریتی روی %{acct} account_moderation_notes: create: اÙزودن یادداشت created_msg: یادداشت مدیر با موÙقیت ساخته شد! @@ -88,6 +92,7 @@ fa: confirm: تأیید confirmed: تأیید شد confirming: تأیید + deleted: پاک‌شده demote: تنزل‌دادن disable: غیرÙعال disable_two_factor_authentication: غیرÙعال‌سازی ورود دومرØله‌ای @@ -103,8 +108,11 @@ fa: followers: پیگیران followers_url: نشانی پیگیران follows: Ù¾ÛŒ می‌گیرد + header: زمینه inbox_url: نشانی صندوق ورودی + invited_by: دعوت‌شده از طر٠ip: IP + joined: عضویت از location: all: همه local: Ù…ØÙ„ÛŒ @@ -114,6 +122,7 @@ fa: media_attachments: ضمیمه‌های تصویری memorialize: تبدیل به یادمان moderation: + active: Ùعال all: همه silenced: بی‌صدا شده suspended: معلق شده @@ -130,8 +139,9 @@ fa: protocol: پروتکل public: عمومی push_subscription_expires: عضویت از راه PuSH منقضی شد - redownload: به‌روزرسانی تصویر نمایه + redownload: به‌روزرسانی نمایه remove_avatar: Øذ٠تصویر نمایه + remove_header: برداشتن تصویر زمینه resend_confirmation: already_confirmed: این کاربر قبلا تایید شده است send: ایمیل تایید را دوباره بÙرستید @@ -149,8 +159,8 @@ fa: search: جستجو shared_inbox_url: نشانی صندوق ورودی مشترک show: - created_reports: گزارش‌ها از طر٠این Øساب - targeted_reports: گزارش‌ها دربارهٔ این Øساب + created_reports: گزارش‌های ثبت کرده + targeted_reports: گزارش‌های دیگران silence: بی‌صدا silenced: بی‌صداشده statuses: نوشته‌ها @@ -162,12 +172,14 @@ fa: undo_suspension: واگردانی تعلیق unsubscribe: لغو اشتراک username: نام کاربری + warn: هشدار web: وب action_logs: actions: assigned_to_self_report: "%{name} رسیدگی به گزارش %{target} را به عهده گرÙت" change_email_user: "%{name} نشانی ایمیل کاربر %{target} را تغییر داد" confirm_user: "%{name} نشانی ایمیل کاربر %{target} را تأیید کرد" + create_account_warning: "%{name} هشداری برای %{target} Ùرستاد" create_custom_emoji: "%{name} Ø´Ú©Ù„Ú© تازهٔ %{target} را بارگذاشت" create_domain_block: "%{name} دامین %{target} را مسدود کرد" create_email_domain_block: "%{name} دامین ایمیل %{target} را مسدود کرد" @@ -226,6 +238,7 @@ fa: config: پیکربندی feature_deletions: Øساب‌های ØØ°Ù‌شده feature_invites: دعوت‌نامه‌ها + feature_profile_directory: Ùهرست گزیدهٔ کاربران feature_registrations: ثبت‌نام‌ها feature_relay: رله features: ویژگی‌ها @@ -243,7 +256,7 @@ fa: week_users_active: کاربران Ùعال Ù‡Ùتهٔ اخیر week_users_new: کاربران Ù‡Ùتهٔ اخیر domain_blocks: - add_new: اÙزودن تازه + add_new: اÙزودن مسدودسازی دامین تازه created_msg: مسدودکردن دامین در Øال انجام است destroyed_msg: مسدودکردن دامین واگردانده شد domain: دامین @@ -260,6 +273,11 @@ fa: reject_media_hint: تصویرهای ذخیره‌شده در این‌جا را پاک می‌کند Ùˆ جلوی دریاÙت تصویرها را در آینده می‌گیرد. بی‌تأثیر برای معلق‌شده‌ها reject_reports: نپذیرÙتن گزارش‌ها reject_reports_hint: گزارش‌هایی را Ú©Ù‡ از این دامین می‌آید نادیده می‌گیرد. بی‌تأثیر برای معلق‌شده‌ها + rejecting_media: رسانه‌ها نادیده گرÙته می‌شوند + rejecting_reports: گزارش‌ها نادیده گرÙته می‌شوند + severity: + silence: بی‌صداشده + suspend: معلق‌شده show: affected_accounts: one: روی یک Øساب در پایگاه داده تأثیر گذاشت @@ -269,7 +287,7 @@ fa: suspend: معلق‌شدن همهٔ Øساب‌های این دامین را لغو Ú©Ù† title: واگردانی مسدودسازی دامنه برای %{domain} undo: واگردانی - undo: واگردانی + undo: واگردانی مسدودسازی دامین email_domain_blocks: add_new: اÙزودن تازه created_msg: مسدودسازی دامین ایمیل با موÙقیت ساخته شد @@ -280,8 +298,24 @@ fa: create: ساختن مسدودسازی title: مسدودسازی دامین ایمیل تازه title: مسدودسازی دامین‌های ایمیل + followers: + back_to_account: بازگشت به Øساب + title: پیگیران %{acct} instances: - title: سرورهای شناخته‌شده + delivery_available: پیام آماده است + known_accounts: + one: "%{count} Øساب شناخته‌شده" + other: "%{count} Øساب شناخته‌شده" + moderation: + all: همه + limited: Ù…Øدود + title: مدیریت + title: ارتباط میان‌سروری + total_blocked_by_us: مسدودشده از طر٠ما + total_followed_by_them: ما را Ù¾ÛŒ می‌گیرند + total_followed_by_us: ما پیگیرشان هستیم + total_reported: گزارش درباره‌شان + total_storage: عکس‌ها Ùˆ ویدیوها invites: deactivate_all: غیرÙعال‌کردن همه filter: @@ -363,6 +397,9 @@ fa: preview_sensitive_media: desc_html: پیوند به سایت‌های دیگر پیش‌نمایشی خواهد داشت Ú©Ù‡ یک تصویر Ú©ÙˆÚ†Ú© را نشان می‌دهد، Øتی اگر نوشته به عنوان Øساس علامت‌گذاری شده باشد title: نمایش تصاویر Øساسیت‌برانگیز در پیش‌نمایش‌های OpenGraph + profile_directory: + desc_html: به کاربران اجازه دهید تا بتوانند خود را روی Ùهرست گزیدهٔ کاربران این سرور نمایش دهند + title: Ùعال‌سازی Ùهرست گزیدهٔ کاربران registrations: closed_message: desc_html: وقتی امکان ثبت نام روی سرور Ùعال نباشد در صÙØÙ‡Ù” اصلی نمایش می‌یابد<br>می‌توانید HTML بنویسید @@ -384,20 +421,20 @@ fa: title: نمایش علامت همکار site_description: desc_html: معرÙÛŒ کوتاهی Ú©Ù‡ روی صÙØÙ‡Ù” اصلی نمایش می‌یابد. دربارهٔ این Ú©Ù‡ Ú†Ù‡ چیزی دربارهٔ این سرور ماستدون ویژه است یا هر چیز مهم دیگری بنویسید. می‌توانید HTML بنویسید، به‌ویژه <code><a></code> Ùˆ <code><em></code>. - title: دربارهٔ سایت + title: دربارهٔ این سرور site_description_extended: desc_html: جای خوبی برای نوشتن سیاست‌های کاربری، قانون‌ها، راهنماها، Ùˆ هر چیزی Ú©Ù‡ ویژهٔ این سرور است. تگ‌های HTML هم مجاز است title: اطلاعات تکمیلی سÙارشی site_short_description: desc_html: روی نوار کناری Ùˆ همچنین به عنوان Ùرادادهٔ صÙØه‌ها نمایش می‌یابد. در یک بند ØªÙˆØ¶ÛŒØ Ø¯Ù‡ÛŒØ¯ Ú©Ù‡ ماستدون چیست Ùˆ چرا این سرور با بقیه Ùرق دارد. اگر خالی بگذارید، به جایش «دربارهٔ سایت» نمایش می‌یابد. - title: ØªÙˆØ¶ÛŒØ Ú©ÙˆØªØ§Ù‡ دربارهٔ سایت + title: ØªÙˆØ¶ÛŒØ Ú©ÙˆØªØ§Ù‡ دربارهٔ سرور site_terms: desc_html: می‌توانید سیاست رازداری، شرایط استÙاده، یا سایر مسائل قانونی را به دلخواه خود بنویسید. تگ‌های HTML هم مجاز است title: شرایط استÙادهٔ سÙارشی site_title: نام سرور thumbnail: desc_html: برای دیدن با OpenGraph Ùˆ رابط برنامه‌نویسی. ÙˆØ¶ÙˆØ Ù¾ÛŒØ´Ù†Ù‡Ø§Ø¯ÛŒ ۱۲۰۰×۶۳۰ پیکسل - title: تصویر Ú©ÙˆÚ†Ú© Ùوری + title: تصویر Ú©ÙˆÚ†Ú© سرور timeline_preview: desc_html: نوشته‌های عمومی این سرور را در صÙØÙ‡Ù” آغازین نشان دهید title: پیش‌نمایش نوشته‌ها @@ -422,7 +459,21 @@ fa: last_delivery: آخرین ارسال title: WebSub topic: موضوع + tags: + accounts: Øساب‌ها + hidden: پنهان‌شده + hide: در Ùهرست گزیدهٔ کاربران نشان نده + name: برچسب + title: برچسب‌ها + unhide: نمایش در Ùهرست گزیدهٔ کاربران + visible: نمایان title: مدیریت سرور + warning_presets: + add_new: اÙزودن تازه + delete: زدودن + edit: ویرایش + edit_preset: ویرایش هشدار پیش‌Ùرض + title: مدیریت هشدارهای پیش‌Ùرض admin_mailer: new_report: body: کاربر %{reporter} کاربر %{target} را گزارش داد @@ -500,10 +551,20 @@ fa: success_msg: Øساب شما با موÙقیت پاک شد warning_html: تنها پاک‌شدن Ù…Øتوای Øساب در این سرور خاص تضمین می‌شود. Ù…Øتوایی Ú©Ù‡ به گستردگی هم‌رسانی شده باشد ممکن است ردش همچنان باقی بماند. سرورهای Ø¢Ùلاین یا سرورهایی Ú©Ù‡ دیگر مشترک شما نیستند پایگاه‌های دادهٔ خود را به‌روز نخواهند کرد. warning_title: دسترس‌پذیری Ù…Øتوای هم‌رسان‌شده + directories: + directory: Ùهرست گزیدهٔ کاربران + enabled: شما هم‌اینک در Ùهرست گزیدهٔ کاربران نمایش می‌یابید. + enabled_but_waiting: شما می‌خواهید در Ùهرست گزیدهٔ کاربران این سرور باشید، ولی تعداد پیگیران شما هنوز به مقدار لازم (%{min_followers}) نرسیده است. + explanation: کاربران این سرور را بر اساس علاقه‌مندی‌هایشان پیدا کنید + explore_mastodon: گشت Ùˆ گذار در %{title} + how_to_enable: شما هنوز در Ùهرست گزیدهٔ کاربران این سرور نشان داده نمی‌شوید. این‌جا می‌توانید انتخابش کنید. اگر در بخش معرÙÛŒ خود در نمایه‌تان برچسب (هشتگ) داشته باشد، نام شما هم برای آن هشتگ‌ها Ùهرست می‌شود! + people: + one: "%{count} Ù†Ùر" + other: "%{count} Ù†Ùر" errors: '403': شما اجازهٔ دیدن این صÙØÙ‡ را ندارید. - '404': صÙØه‌ای Ú©Ù‡ به دنبالش بودید وجود ندارد. - '410': صÙØه‌ای Ú©Ù‡ به دنبالش بودید دیگر وجود ندارد. + '404': صÙØه‌ای Ú©Ù‡ به دنبالش هستید این‌جا نیست. + '410': صÙØه‌ای Ú©Ù‡ به دنبالش بودید دیگر این‌جا وجود ندارد. '422': content: تأیید امنیتی انجام نشد. آیا مرورگر شما کوکی‌ها را مسدود می‌کند؟ title: تأیید امنیتی کار نکرد @@ -522,9 +583,15 @@ fa: size: اندازه blocks: Øساب‌های مسدودشده csv: CSV + domain_blocks: دامین‌های مسدودشده follows: Øساب‌های پی‌گرÙته + lists: Ùهرست‌ها mutes: Øساب‌های بی‌صداشده storage: تصویرهای ذخیره‌شده + featured_tags: + add_new: اÙزودن تازه + errors: + limit: شما بیشترین تعداد مجاز برچسب‌ها را دارید filters: contexts: home: خانه @@ -565,10 +632,16 @@ fa: one: یک چیزی هنوز درست نیست! لطÙاً خطاهای زیر را ببینید other: یک چیزی هنوز درست نیست! لطÙاً %{count} خطای زیر را ببینید imports: + modes: + merge: ادغام + merge_long: داده‌های Ùعلی را داشته باشید Ùˆ داده‌های تازه‌ای بیÙزایید + overwrite: بازنویسی + overwrite_long: داده‌های Ùعلی را پاک کنید Ùˆ داده‌های تازه‌ای بیÙزایید preface: شما می‌توانید داده‌هایی از قبیل کاربرانی Ú©Ù‡ Ù¾ÛŒ می‌گرÙتید یا مسدود می‌کردید را در Øساب خود روی این سرور درون‌ریزی کنید. برای این کار پرونده‌هایی Ú©Ù‡ از سرور دیگر برون‌سپاری کرده‌اید را به‌کار ببرید. success: داده‌های شما با موÙقیت بارگذاری شد Ùˆ به زودی پردازش می‌شود types: blocking: Ùهرست مسدودشده‌ها + domain_blocking: Ùهرست دامین‌های مسدودشده following: Ùهرست پی‌گیری‌ها muting: Ùهرست بی‌صداشده‌ها upload: بارگذاری @@ -671,12 +744,27 @@ fa: no_account_html: هنوز عضو نیستید؟ <a href='%{sign_up_path}' target='_blank'>این‌جا می‌توانید Øساب باز کنید</a> proceed: درخواست پیگیری prompt: 'شما قرار است این Øساب را پیگیری کنید:' + reason_html: "<strong>چرا این مرØله لازم است؟</strong> ممکن است <code>%{instance}</code> سروری نباشد Ú©Ù‡ شما روی آن Øساب باز کرده‌اید، بنابراین ما باید پیش از هرچیز شما را به سرور خودتان منتقل کنیم." + remote_interaction: + favourite: + proceed: به سمت پسندیدن این بوق + prompt: 'شما می‌خواهید این بوق را بپسندید:' + reblog: + proceed: به سمت بازبوقیدن + prompt: 'شما می‌خواهید این بوق را بازببوقید:' + reply: + proceed: به سمت پاسخ‌دادن + prompt: 'شما می‌خواهید به این بوق پاسخ دهید:' remote_unfollow: error: خطا title: عنوان unfollowed: پایان پیگیری + scheduled_statuses: + over_daily_limit: شما از Øد مجاز %{limit} بوق زمان‌بندی‌شده در آن روز Ùراتر رÙته‌اید + over_total_limit: شما از Øد مجاز %{limit} بوق زمان‌بندی‌شده Ùراتر رÙته‌اید + too_soon: زمان تعیین‌شده باید در آینده باشد sessions: - activity: آخرین کنش + activity: آخرین Ùعالیت browser: مرورگر browsers: alipay: Alipay @@ -723,6 +811,7 @@ fa: development: Ùرابری edit_profile: ویرایش نمایه export: برون‌سپاری داده‌ها + featured_tags: برچسب‌های منتخب followers: پیگیران مورد تأیید import: درون‌ریزی migrate: انتقال Øساب @@ -770,8 +859,8 @@ fa: terms: title: شرایط استÙاده Ùˆ سیاست رازداری %{instance} themes: - contrast: کنتراست بالا - default: ماستدون + contrast: ماستدون (کنتراست بالا) + default: ماستدون (تیره) mastodon-light: ماستدون (روشن) time: formats: @@ -798,6 +887,22 @@ fa: explanation: شما یک نسخهٔ پشتیبان کامل از Øساب خود را درخواست کردید. این پشتیبان الان آمادهٔ بارگیری است! subject: بایگانی شما آمادهٔ دریاÙت است title: گرÙتن بایگانی + warning: + explanation: + disable: تا وقتی Øساب شما متوق٠باشد، داده‌های شما دست‌نخورده باقی می‌مانند، ولی تا وقتی Ú©Ù‡ Øسابتان باز نشده، نمی‌توانید هیچ کاری با آن بکنید. + silence: تا وقتی Øساب شما Ù…Øدود باشد، تنها کسانی Ú©Ù‡ از قبل پیگیر شما بودند نوشته‌های شما در این سرور را می‌بینند Ùˆ شما در Ùهرست‌های عمومی دیده نمی‌شوید. ولی دیگران همچنان می‌توانند به دلخواه خودشان پیگیر شما شوند. + suspend: Øساب شما معلق شده است، Ùˆ همهٔ نوشته‌ها Ùˆ رسانه‌های تصویری شما به طور بازگشت‌ناپذیری پاک شده‌اند؛ Ú†Ù‡ از این سرور Ùˆ Ú†Ù‡ از سرورهای دیگری Ú©Ù‡ از آن‌ها پیگیر داشتید. + review_server_policies: مرور سیاست‌های این سرور + subject: + disable: Øساب %{acct} شما متوق٠شده است + none: هشدار برای %{acct} + silence: Øساب %{acct} شما Ù…Øدود شده است + suspend: Øساب %{acct} شما معلق شده است + title: + disable: Øساب متوق٠شده است + none: هشدار + silence: Øساب Ù…Øدود شده است + suspend: Øساب معلق شده است welcome: edit_profile_action: تنظیم نمایه edit_profile_step: 'شما می‌توانید نمایهٔ خود را به دلخواه خود تغییر دهید: می‌توانید تصویر نمایه، تصویر پس‌زمینه، نام، Ùˆ چیزهای دیگری را تعیین کنید. اگر بخواهید، می‌توانید Øساب خود را خصوصی کنید تا Ùقط کسانی Ú©Ù‡ شما اجازه می‌دهید بتوانند پیگیر Øساب شما شوند.' diff --git a/config/locales/fi.yml b/config/locales/fi.yml index e7b8b18ae6..c3c48cbe31 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -5,10 +5,13 @@ fi: about_mastodon_html: Mastodon on sosiaalinen verkosto. Se on toteutettu avoimilla verkkoprotokollilla ja vapailla, avoimen lähdekoodin ohjelmistoilla, ja se toimii hajautetusti samaan tapaan kuin sähköposti. about_this: Tietoja tästä palvelimesta administered_by: 'Ylläpitäjä:' + api: API + apps: Mobiili sovellukset closed_registrations: Tähän instanssiin ei voi tällä hetkellä rekisteröityä. Voit kuitenkin luoda tilin johonkin toiseen instanssiin ja käyttää samaa verkostoa sitä kautta. contact: Ota yhteyttä contact_missing: Ei asetettu contact_unavailable: Ei saatavilla + documentation: Dokumentaatio extended_description_html: | <h3>Hyvä paikka säännöille</h3> <p>Pidempää kuvausta ei ole vielä laadittu.</p> @@ -25,23 +28,40 @@ fi: hosted_on: Mastodon palvelimella %{domain} learn_more: Lisätietoja other_instances: Muut palvelimet + privacy_policy: Tietosuojaseloste source_code: Lähdekoodi - status_count_after: statusta + status_count_after: + one: tila + other: tilanne status_count_before: He ovat luoneet - user_count_after: käyttäjälle + terms: Käyttöehdot + user_count_after: + one: käyttäjä + other: käyttäjät user_count_before: Koti what_is_mastodon: Mikä on Mastodon? accounts: + choices_html: "%{name} valinnat:" follow: Seuraa - followers: Seuraajat + followers: + one: Seuraaja + other: Seuraajat following: Seuratut + joined: Liittynyt %{date} + last_active: viimeksi aktiivinen + link_verified_on: Tämän linkin omistus on tarkastettu %{date} media: Media moved_html: "%{name} on muuttanut osoitteeseen %{new_profile_link}:" network_hidden: Nämä tiedot eivät ole käytettävissä nothing_here: Täällä ei ole mitään! people_followed_by: Henkilöt, joita %{name} seuraa people_who_follow: Käyttäjän %{name} seuraajat - posts: Tuuttaukset + pin_errors: + following: Sinun täytyy seurata henkilöä jota haluat tukea + posts: + one: Toot + other: Toots + posts_tab_heading: Toots posts_with_replies: Tuuttaukset ja vastaukset reserved_username: Käyttäjänimi on varattu roles: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 7fa0418723..5c564fc047 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -92,7 +92,7 @@ fr: confirm: Confirmer confirmed: Confirmé confirming: Confirmation - deleted: Effacé + deleted: Supprimé demote: Rétrograder disable: Désactiver disable_two_factor_authentication: Désactiver l’authentification à deux facteurs @@ -112,6 +112,7 @@ fr: inbox_url: URL d’entrée invited_by: Invité par ip: Adresse IP + joined: Inscrit·e depuis location: all: Tous local: Local @@ -171,6 +172,7 @@ fr: undo_suspension: Annuler la suspension unsubscribe: Se désabonner username: Nom d’utilisateurâ‹…ice + warn: Avertissement web: Web action_logs: actions: @@ -300,6 +302,7 @@ fr: back_to_account: Retour au compte title: Abonné⋅eâ‹…s de %{acct} instances: + delivery_available: Livraison disponible known_accounts: one: "%{count} compte connu" other: "%{count} comptes connus" @@ -381,7 +384,7 @@ fr: username: Entrez un nom d’utilisateurâ‹…ice custom_css: desc_html: Modifier l'apparence avec une CSS chargée sur chaque page - title: CSS personnalisée + title: CSS personnalisé hero: desc_html: Affichée sur la page d’accueil. Au moins 600x100px recommandé. Lorsqu’elle n’est pas définie, se rabat sur la vignette de l’instance title: Image d’en-tête @@ -418,17 +421,17 @@ fr: title: Montrer un badge de responsable site_description: desc_html: Paragraphe introductif sur la page d’accueil. Décrivez ce qui rend spécifique ce serveur Mastodon et toute autre chose importante. Vous pouvez utiliser des balises HTML, en particulier <code><a></code> et <code><em></code>. - title: Description du site + title: Description de l'instance site_description_extended: - desc_html: Affichée sur la page d’informations complémentaires du site<br>Vous pouvez utiliser des balises HTML + desc_html: L'endroit idéal pour afficher votre code de conduite, les règles, les guides et autres choses qui rendent votre instance différente. Vous pouvez utiliser des balises HTML title: Description étendue du site site_short_description: - desc_html: Affichée dans la barre latérale et dans les méta-tags. Décrivez ce qui rend spécifique ce serveur Mastodon en un seul paragraphe. Si laissée vide, la description de l’instance sera affiché par défaut. + desc_html: Affichée dans la barre latérale et dans les méta-tags. Décrivez ce qui rend spécifique cette instance Mastodon en un seul paragraphe. Si laissée vide, la description de l’instance sera affiché par défaut. title: Description courte de l’instance site_terms: desc_html: Affichée sur la page des conditions d’utilisation du site<br>Vous pouvez utiliser des balises HTML title: Politique de confidentialité - site_title: Titre du site + site_title: Nom de l'instance thumbnail: desc_html: Utilisée pour les prévisualisations via OpenGraph et l’API. 1200x630px recommandé title: Vignette de l’instance @@ -546,7 +549,7 @@ fr: description_html: Cela va supprimer votre compte et le désactiver de manière <strong>permanente et irréversible</strong>. Votre nom d’utilisateurâ‹…ice restera réservé afin d’éviter la confusion. proceed: Supprimer compte success_msg: Votre compte a été supprimé avec succès - warning_html: Seule la suppression du contenu depuis cette instance est garantie. Le contenu qui a été partagé est susceptible de laisser des traces. Les serveurs hors-ligne ainsi que ceux n’étant plus abonnés à vos publications ne mettront pas leur base de données à jour. + warning_html: Seule la suppression du contenu depuis cette instance est garantie. Le contenu qui a été partagé est susceptible de laisser des traces. Les instances hors-ligne ainsi que ceux n’étant plus abonnées à vos publications ne mettront pas leur base de données à jour. warning_title: Disponibilité du contenu disséminé directories: directory: Annuaire des profils @@ -574,7 +577,7 @@ fr: archive_takeout: date: Date download: Télécharger votre archive - hint_html: Vous pouvez demander une archive de vos <strong>pouets et médias téléversés</strong>. Les données exportées seront au format ActivityPub, lisible par tout logiciel compatible. Vous pouvez demander une archive tous les 7 jours. + hint_html: Vous pouvez demander une archive de vos <strong>pouets et médias téléversés</strong>. Les données exportées seront au format ActivityPub, lisible par tout logiciel compatible. Vous pouvez demander une archive tous les 7 jours. in_progress: Création de votre archive… request: Demandez vos archives size: Taille @@ -585,6 +588,10 @@ fr: lists: Listes mutes: Vous masquez storage: Médias stockés + featured_tags: + add_new: Ajouter un nouvel hashtag + errors: + limit: Vous avez déjà mis en avant le nombre maximum de hashtags filters: contexts: home: Accueil @@ -603,7 +610,7 @@ fr: title: Ajouter un nouveau filtre followers: domain: Domaine - explanation_html: Si vous voulez être sûrâ‹…e que vos statuts restent privés, vous devez savoir qui vous suit. <strong>Vos statuts privés seront diffusés à toutes les instances des utilisateurâ‹…iceâ‹…s qui vous suivent</strong>. Vous voudrez peut-être les passer en revue et les supprimer si vous n’êtes pas sûrâ‹…e que votre vie privée sera respectée par l’administration ou le logiciel de ces instances. + explanation_html: Si vous voulez vous assurer que vos statuts restent privés, vous devez savoir qui vous suit. <strong>Vos statuts privés seront diffusés sur toutes les instances où vous avez des abonné·e·s</strong>. Vous voudrez peut-être les passer en revue et les supprimer si vous pensez que votre vie privée ne sera pas respectée par l’administration ou le logiciel de ces instances. followers_count: Nombre d’abonné⋅eâ‹…s lock_link: Rendez votre compte privé purge: Retirer de la liste d’abonné⋅eâ‹…s @@ -625,10 +632,16 @@ fr: one: Quelque chose ne va pas ! Vérifiez l’erreur ci-dessous other: Certaines choses ne vont pas ! Vérifiez les %{count} erreurs ci-dessous imports: - preface: Vous pouvez importer certaines données comme les personnes que vous suivez ou bloquez sur votre compte sur cette instance à partir de fichiers créés sur une autre instance. + modes: + merge: Fusionner + merge_long: Garder les enregistrements existants et ajouter les nouveaux + overwrite: Réécrire + overwrite_long: Remplacer les enregistrements actuels par les nouveaux + preface: Vous pouvez importer certaines données que vous avez exporté d'une autre instance, comme une liste des personnes que vous suivez ou bloquez sur votre compte. success: Vos données ont été importées avec succès et seront traitées en temps et en heure types: blocking: Liste d’utilisateurâ‹…iceâ‹…s bloqué⋅eâ‹…s + domain_blocking: Liste des instances bloquées following: Liste d’utilisateurâ‹…iceâ‹…s suiviâ‹…eâ‹…s muting: Liste d’utilisateurâ‹…iceâ‹…s que vous masquez upload: Importer @@ -734,10 +747,13 @@ fr: reason_html: "<strong>Pourquoi cette étape est-elle nécessaire?</strong> <code>%{instance}</code> pourrait ne pas être le serveur où vous vous êtes inscrit, et nous devons donc vous rediriger vers votre serveur de base en premier." remote_interaction: favourite: + proceed: Confirmer l'ajout aux favoris prompt: 'Vous souhaitez mettre ce pouet en favori :' reblog: + proceed: Confirmer le repartage prompt: 'Vous souhaitez repartager ce pouet :' reply: + proceed: Confirmer la réponse prompt: 'Vous souhaitez répondre à ce pouet :' remote_unfollow: error: Erreur @@ -795,6 +811,7 @@ fr: development: Développement edit_profile: Modifier le profil export: Export de données + featured_tags: Hashtags mis en avant followers: Abonné⋅es autorisé⋅es import: Import de données migrate: Migration de compte @@ -923,9 +940,9 @@ fr: <p>Originellement adapté de la <a href="https://github.com/discourse/discourse">politique de confidentialité de Discourse</a>.</p> title: "%{instance} Conditions d’utilisation et politique de confidentialité" themes: - contrast: Contraste élevé - default: Mastodon - mastodon-light: Mastodon (clair) + contrast: Mastodon (Contraste élevé) + default: Mastodon (Sombre) + mastodon-light: Mastodon (Clair) time: formats: default: "%d %b %Y, %H:%M" @@ -974,7 +991,7 @@ fr: final_action: Commencer à publier final_step: 'Commencez à poster ! Même sans abonné·e·s, vos messages publics peuvent être vus par d’autres, par exemple sur le fil public local et dans les hashtags. Vous pouvez vous présenter sur le hashtag #introductions.' full_handle: Votre identifiant complet - full_handle_hint: C’est ce que vous diriez à vos ami·e·s pour qu’il·elle·s puissent vous envoyer un message ou vous suivre à partir d’une autre instance. + full_handle_hint: C’est ce que vous diriez à vos ami·e·s pour leur permettre de vous envoyer un message ou vous suivre à partir d’une autre instance. review_preferences_action: Modifier les préférences review_preferences_step: Assurez-vous de définir vos préférences, telles que les courriels que vous aimeriez recevoir ou le niveau de confidentialité auquel vous aimeriez que vos messages soient soumis par défaut. Si vous n’avez pas le mal des transports, vous pouvez choisir d’activer la lecture automatique des GIF. subject: Bienvenue sur Mastodon diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 57e150d49c..cadb7cff65 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -7,7 +7,7 @@ gl: administered_by: 'Administrada por:' api: API apps: Apps móbiles - closed_registrations: O rexistro en esta instancia está pechado en este intre. Porén! Pode atopar unha instancia diferente para obter unha conta e ter acceso exactamente a misma rede desde alÃ. + closed_registrations: O rexistro en este servidor está pechado neste momento. Porén! Pode atopar un servidor diferente para obter unha conta e ter acceso exactamente a misma rede desde alÃ. contact: Contacto contact_missing: Non establecido contact_unavailable: N/A @@ -27,7 +27,7 @@ gl: generic_description: "%{domain} é un servidor na rede" hosted_on: Mastodon aloxado en %{domain} learn_more: Coñeza máis - other_instances: Listado de instancias + other_instances: Lista de servidores privacy_policy: PolÃtica de intimidade source_code: Código fonte status_count_after: @@ -386,14 +386,14 @@ gl: desc_html: Modificar o aspecto con CSS cargado en cada páxina title: CSS persoalizado hero: - desc_html: Mostrado na portada. Recoméndase 600x100px como mÃnimo. Si non se establece, mostrará a imaxe por omisión da instancia + desc_html: Mostrado na portada. Recoméndase 600x100px como mÃnimo. Se non se establece, mostrará a imaxe por omisión do servidor title: Imáxe Heróe mascot: desc_html: Mostrado en varias páxinas. Recoméndase 293x205 como mÃnimo. Se non se establece publÃcase a mascota por omisión title: Imaxe da mascota peers_api_enabled: - desc_html: Nome de dominio que esta instancia atopou no fediverso - title: Publicar lista de instancias descubertas + desc_html: Nomes de dominio que este servidor atopou no fediverso + title: Publicar lista de servidores descubertos preview_sensitive_media: desc_html: A vista previa de ligazóns de outros sitios web mostrará unha imaxe incluso si os medios están marcados como sensibles title: Mostrar medios sensibles con vista previa OpenGraph @@ -421,20 +421,20 @@ gl: title: Mostrar insigna de membresÃa site_description: desc_html: Parágrafo de presentación na páxina principal. Describe o que fai especial a este servidor Mastodon e calquera outra ouca importante. Pode utilizar etiquetas HTML, en particular <code><a></code> e <code><em></code>. - title: Descrición da instancia + title: Descrición do servidor site_description_extended: - desc_html: Un bo lugar para o seu código de conducta, regras, guÃas e outras cousas que distingan a súa instancia. Pode utilizar etiquetas HTML + desc_html: Un bo lugar para o seu código de conducta, regras, guÃas e outras cousas que distingan ao seu servidor. Pode utilizar etiquetas HTML title: Información extendida da persoalización site_short_description: - desc_html: Mostrado na barra lateral e nas etiquetas meta. Describe o que é Mastodon e que fai especial a este servidor nun só parágrafo. Si está baldeiro, mostrará a descrición da instancia. - title: Descrición curta da instancia + desc_html: Mostrado na barra lateral e nas etiquetas meta. Describe o que é Mastodon e que fai especial a este servidor nun só parágrafo. Si está baldeiro, mostrará a descrición do servidor. + title: Descrición curta do servidor site_terms: desc_html: Pode escribir a súa propia polÃtica de intimidade, termos de servizo ou aclaracións legais. Pode utilizar etiquetas HTML title: Termos de servizo persoalizados - site_title: Nome da instancia + site_title: Nome do servidor thumbnail: desc_html: Utilizado para vistas previsas vÃa OpenGraph e API. Recoméndase 1200x630px - title: Icona da instancia + title: Icona do servidor timeline_preview: desc_html: Mostrar liña de tempo pública na páxina de inicio title: vista previa da liña temporal @@ -495,7 +495,7 @@ gl: warning: Teña moito tino con estos datos. Nunca os comparta con ninguén! your_token: O seu testemuño de acceso auth: - agreement_html: Ao pulsar "Rexistrar" vostede acorda seguir <a href="%{rules_path}">as normas da instancia</a> e <a href="%{terms_path}">os termos do servizo</a>. + agreement_html: Ao pulsar "Rexistrar" vostede acorda seguir <a href="%{rules_path}">as normas do servidor</a> e <a href="%{terms_path}">os termos do servizo</a>. change_password: Contrasinal confirm_email: Confirmar correo-e delete_account: Eliminar conta @@ -549,7 +549,7 @@ gl: description_html: Esto eliminará de xeito <strong>permanente e irreversible</strong> o contido da súa conta e será desactivada. O seu nome de usuaria permanecerá reservado para evitar futuras confusións de identidades. proceed: Eliminar conta success_msg: A súa conta eliminouse correctamente - warning_html: Só se garantiza a eliminación de contido de esta instancia. O contido que foi compartido con outras instancias é probable que deixe rastros. O servidores fora de liña e servidores que se desuscribiron das súas actualizacións non actualizarán as súas bases de datos. + warning_html: Só se garantiza a eliminación de contido de este servidor. O contido que foi compartido con outras instancias é probable que deixe rastros. O servidores fora de liña e servidores que se desuscribiron das súas actualizacións non actualizarán as súas bases de datos. warning_title: Dispoñibilidade do contido espallado directories: directory: Directorio de perfil @@ -563,8 +563,8 @@ gl: other: "%{count} persoas" errors: '403': Non ten permiso para ver esta páxina. - '404': A páxina que está a buscar non existe. - '410': A páxina que busca xa non existe. + '404': A páxina que está a buscar non está aquÃ. + '410': A páxina que estaba a buscar xa non existe. '422': content: Fallou a verificación de seguridade. Está bloqueando as cookies? title: Fallou a verficación de seguridade @@ -577,7 +577,7 @@ gl: archive_takeout: date: Data download: Descargue o seu ficheiro - hint_html: Pode solicitar un ficheiro cos <strong>seus toots ficheiros de medios</strong>. Os datos estarán en formato ActivityPub e son compatibles con calquer software que o cumpla. Pode solicitar un ficheiro cada 7 dÃas. + hint_html: Pode solicitar un ficheiro cos <strong>seus toots e ficheiros de medios</strong>. Os datos estarán en formato ActivityPub e son compatibles con calquer software que o siga. Pode solicitar un ficheiro cada 7 dÃas. in_progress: Xerando o seu ficheiro... request: Solicite o ficheiro size: Tamaño @@ -588,6 +588,10 @@ gl: lists: Listas mutes: Acalou storage: Almacenamento de medios + featured_tags: + add_new: Engadir novo + errors: + limit: Xa acadou o número máximo de etiquetas filters: contexts: home: Liña temporal inicial @@ -606,7 +610,7 @@ gl: title: Engadir novo filtro followers: domain: Dominio - explanation_html: Se quere asegurar a intimidade dos seus estados, debe ser consciente de quen a está a seguir. <strong>Os seus estados privados son enviados a todas as instancias onde ten seguidoras</strong>. PoderÃa querer revisalas, e elminar seguidoras si non confÃa que a súa intimidade sexa respetada polos administradores ou o software de esa instancia. + explanation_html: Se quere asegurar a intimidade dos seus estados, debe ser consciente de quen a está a seguir. <strong>Os seus estados privados son enviados a todas os servidores onde ten seguidoras</strong>. PoderÃa querer revisalas, e elminar seguidoras si non confÃa que a súa intimidade sexa respetada polos administradores ou o software de ese servidor. followers_count: Número de seguidoras lock_link: Bloquear a súa conta purge: Eliminar das seguidoras @@ -628,10 +632,16 @@ gl: one: Algo non está ben de todo! Por favor revise abaixo o erro other: Algo aÃnda non está ben! Por favor revise os %{count} erros abaixo imports: - preface: Pode importar os datos que exportou de outra instancia, tales como a lista de usuarias que está a seguir ou bloquear. + modes: + merge: Fusionar + merge_long: Manter os rexistros actuais e engadir novos + overwrite: Sobreescribir + overwrite_long: SustituÃr rexistros actuais cos novos + preface: Pode importar os datos que exportou de outro servidor, tales como a lista de usuarias que está a seguir ou bloquear. success: Os seus datos foron correctamente subidos e serán procesados ao momento types: blocking: Lista de bloqueo + domain_blocking: Lista de bloqueo de dominios following: Lista de seguimento muting: Lista de usuarias acaladas upload: Subir @@ -653,7 +663,7 @@ gl: one: 1 uso other: "%{count} usos" max_uses_prompt: Sen lÃmite - prompt: Xerar e compartir ligazóns con outras para permitir acceso a esta instancia + prompt: Xerar e compartir ligazóns con outras para permitir acceso a este servidor table: expires_at: Caduca uses: Usos @@ -801,6 +811,7 @@ gl: development: Desenvolvemento edit_profile: Editar perfil export: Exportar datos + featured_tags: Etiquetas destacadas followers: Seguidoras autorizadas import: Importar migrate: Migrar conta @@ -929,9 +940,9 @@ gl: <p>Adaptado do orixinal <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p> title: "%{instance} Termos do Servizo e PolÃtica de Intimidade" themes: - contrast: Alto contraste - default: Mastodon - mastodon-light: Mastodon (claro) + contrast: Mastodon (Alto contraste) + default: Mastodon (Escuro) + mastodon-light: Mastodon (Claro) time: formats: default: "%d %b, %Y, %H:%M" @@ -980,7 +991,7 @@ gl: final_action: Comece a publicar final_step: 'Publique! Incluso sin seguidoras as súas mensaxes serán vistas por outras, por exemplo na liña temporal local e nas etiquetas. PoderÃa presentarse no #fediverso utilizando a etiqueta #introductions.' full_handle: O seu alcume completo - full_handle_hint: Esto é o que lle dirá aos seus amigos para que poidan seguila ou enviarlle mensaxes desde outra instancia. + full_handle_hint: Esto é o que lle dirá aos seus amigos para que poidan seguila ou enviarlle mensaxes desde outro servidor. review_preferences_action: Cambiar preferencias review_preferences_step: Lembre establecer as preferencias, tales como qué correos-e lle quererÃa recibir, ou o nivel de intimidade por omisión para as súas mensaxes. Se non lle molestan as imaxes con movemento, pode escoller que os GIF se reproduzan automáticamente. subject: Benvida a Mastodon diff --git a/config/locales/kk.yml b/config/locales/kk.yml new file mode 100644 index 0000000000..97a0626e63 --- /dev/null +++ b/config/locales/kk.yml @@ -0,0 +1,445 @@ +--- +kk: + about: + about_hashtag_html: Бұл жерде <strong>#%{hashtag}</strong> Ñ…Ñштегімен жинақталған жазбалар. Желіге тіркеліп, Ñіз де қоÑыла алаÑыз бұл ортаға. + about_mastodon_html: Mastodon - әлеуметтік желіге негізделген, тегін және веб протоколды, ашық кодты құрылым. Ол email ÑиÑқты орталықтандырылған. + about_this: Туралы + administered_by: 'Ðдмин:' + api: API + apps: Мобиль қоÑымшалар + closed_registrations: Бұл Ñерверде тіркелу уақытша тоқтатылған. Дегенмен, Ñіз баÑқа Ñервер арқылы тіркеліп, Ñол аккаунтыңызбен қолдана берÑеңіз болады. + contact: Ð‘Ð°Ð¹Ð»Ð°Ð½Ñ‹Ñ + contact_missing: Бапталмаған + contact_unavailable: БелгіÑіз + documentation: Құжаттама + extended_description_html: | + <h3>Ережелерге арналған жақÑÑ‹ орын</h3> + <p>Әлі ештеңе жазылмапты</p> + features: + humane_approach_body: БаÑқа желілердің ÑәтÑіздіктерінен Ñабақ алып, Mastodon әлеуметтік медианы Ð´Ò±Ñ€Ñ‹Ñ Ð¿Ð°Ð¹Ð´Ð°Ð»Ð°Ð½Ð±Ð°ÑƒÐ¼ÐµÐ½ күреÑу үшін Ñтикалық дизайнды таңдауға бағытталған. + humane_approach_title: ГуманиÑтік ÐºÓ©Ð·Ò›Ð°Ñ€Ð°Ñ Ð±Ð°Ñым + not_a_product_body: Mastodon коммерциÑлық желі емеÑ. Жарнама жоқ, деректерді өңдеу, қоршаулы бақтар да жоқ. Орталықтан баÑқару да жоқ. + not_a_product_title: Сіз тұлғаÑыз, тауар ÐµÐ¼ÐµÑ + real_conversation_body: 500 таңба арқылы мазмұнды пікір және қызық медиа қолданып, өз ойыңызды жеткізе алаÑыз. + real_conversation_title: Ðақты әңгімелерге арналған + within_reach_body: Ыңғайлы API ÑкожүйеÑÑ– арқаÑында iOS, Android және баÑқа платформаларға арналған бірнеше қоÑымшалар арқылы доÑтарыңызбен кез-келген жерде әңгіме құруға мүмкіндік береді. + within_reach_title: Әрқашан қол жетімді + generic_description: "%{domain} желідегі Ñерверлердің бірі" + hosted_on: Mastodon орнатылған %{domain} доменінде + learn_more: Көбірек білу + other_instances: Серверлер тізімі + privacy_policy: ҚұпиÑлылық ÑаÑÑаты + source_code: Ðшық коды + status_count_after: + one: жазба + other: жазба + status_count_before: Жазылғандар + terms: Қолдану шарттары + user_count_after: + one: қолданушы + other: қолданушы + user_count_before: Желіде + what_is_mastodon: Mastodon деген не? + accounts: + choices_html: "%{name} таңдаулары:" + follow: Жазылу + followers: + one: Оқырман + other: Оқырман + following: Жазылғандары + joined: Тіркелген күні %{date} + last_active: Ñоңғы әрекеті + link_verified_on: Сілтеме меншігі раÑталған күн %{date} + media: Медиа + moved_html: "%{name} мына жерге көшті %{new_profile_link}:" + network_hidden: Бұл ақпарат қолжетімді ÐµÐ¼ÐµÑ + nothing_here: Бұл жерде ештеңе жоқ! + people_followed_by: "%{name} жазылған адамдар" + people_who_follow: "%{name} атты қолданушының оқырмандары" + pin_errors: + following: Оқығыңыз келген адамға жазылуыңыз керек + posts: + one: Жазба + other: Жазба + posts_tab_heading: Жазба + posts_with_replies: Жазбалар және жауаптар + reserved_username: Мұндай логин тіркелген + roles: + admin: Ðдмин + bot: Бот + moderator: Мод + unfollow: Оқымау + admin: + account_actions: + action: Әрекетті орындаңыз + title: ÐœÐ¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¶Ð°Ñаңыз %{acct} + account_moderation_notes: + create: Жазба қалдырыңыз + created_msg: ÐœÐ¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¶Ð°Ð·Ð±Ð°ÑÑ‹ қалдырылды! + delete: Өшіру + destroyed_msg: ÐœÐ¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¶Ð°Ð·Ð±Ð°ÑÑ‹ өшірілді! + accounts: + are_you_sure: Шынымен бе? + avatar: Ðватар + by_domain: Домен + change_email: + changed_msg: Ðккаунт email-Ñ– Ñәтті өзгертілді! + current_email: Қазіргі email + label: email өзгерту + new_email: Жаңа email + submit: email өзгерт + title: Қолданушы email-ін өзгерту %{username} + confirm: Құптау + confirmed: Құпталды + confirming: Құпталуды күтеді + deleted: Өшірілді + demote: Төмендету + disable: Ðжырату + disable_two_factor_authentication: Ðжырату 2FA + disabled: Ðжыратылды + display_name: Ðтын көрÑет + domain: Домен + edit: Түзету + email: Email + email_status: Email ÑтатуÑÑ‹ + enable: ҚоÑу + enabled: ҚоÑылды + followers: Оқырмандар + followers_url: Оқырмандар URL + follows: Жазылғандары + header: БаÑÑ‹ + inbox_url: Келген хаттар URL + invited_by: Шақырған + ip: IP + joined: ҚоÑылды + location: + all: Барлығы + local: Жергілікті + remote: ÐÐ»Ñ‹Ñ + title: Мекен + login_status: Логин ÑтатуÑÑ‹ + media_attachments: Медиа файлдар + memorialize: ЕÑтелік қылу + moderation: + active: Ðктив + all: Барлығы + silenced: ҮнÑіз + suspended: Тоқтатылды + title: ÐœÐ¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ + moderation_notes: ÐœÐ¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¶Ð°Ð·Ð±Ð°Ð»Ð°Ñ€Ñ‹ + most_recent_activity: Соңғы белÑенділіктер + most_recent_ip: Соңғы ІР+ no_limits_imposed: Шектеу жоқ + not_subscribed: Жазылмаған + outbox_url: Кеткен хаттар URL + perform_full_suspension: Тоқтат + profile_url: Профиль URL + promote: Жарнамалау + protocol: Хаттама + public: Ðшық + push_subscription_expires: PuSH жазылу мерзімі аÑқталады + redownload: Профиль жаңарт + remove_avatar: Ðватар өшіру + remove_header: Мұқаба Ñуретін өшір + resend_confirmation: + already_confirmed: Қолданушы құпталған + send: Құптау хатын қайтадан жібер + success: Құптау хаты Ñәтті жіберілді! + reset: Қалпына келтіру + reset_password: ҚұпиÑÑөзді қалпына келтіру + role: Қайта жазылу + roles: + admin: Ðдмин + moderator: Модератор + staff: Қызметкерлер + user: Қолданушы + salmon_url: ÐÒ›Ñерке URL + search: Іздеу + shared_inbox_url: БөліÑілген Ð¸Ð½Ð±Ð¾ÐºÑ URL + show: + created_reports: Шағымдар жинағы + targeted_reports: Жіберілген шағымдар + silence: ҮнÑіз + silenced: ҮнÑіз қылғандар + statuses: СтатуÑтар + subscribe: Жазылу + suspended: Тоқтатылды + title: Ðккаунттар + unconfirmed_email: Құпталмаған email + undo_silenced: ҮнÑіздікті қайтып алу + undo_suspension: Тоқтатуды қайтып алу + unsubscribe: Жазылмау + username: Логин + warn: ЕÑкерту + web: Веб + action_logs: + actions: + assigned_to_self_report: "%{name} шағым таÑтады %{target} өздері үшін" + change_email_user: "%{name} e-mail адреÑін өзгертті - %{target}" + confirm_user: "%{name} e-mail адреÑін құптады - %{target}" + create_account_warning: "%{name} еÑкерту жіберді - %{target}" + create_custom_emoji: "%{name} жаңа Ñмодзи қоÑÑ‚Ñ‹ %{target}" + create_domain_block: "%{name} домен бұғаттады - %{target}" + create_email_domain_block: "%{name} e-mail доменін қара тізімге қоÑÑ‚Ñ‹ - %{target}" + demote_user: "%{name} төмендетілген қолданушы - %{target}" + destroy_custom_emoji: "%{name} Ñмодзи жойды %{target}" + destroy_domain_block: "%{name} бұғатталмаған домен %{target}" + destroy_email_domain_block: "%{name} e-mail доменін ақ тізімге кіргізді %{target}" + destroy_status: "%{name} жазбаÑын өшірді %{target}" + disable_2fa_user: "%{name} қолданушы үшін екі фактор ажыратылған %{target}" + disable_custom_emoji: "%{name} Ñмодзи алып таÑтады %{target}" + disable_user: "%{name} қоÑылмаған логин %{target}" + enable_custom_emoji: "%{name} қоÑылған Ñмодзи %{target}" + enable_user: "%{name} қоÑылған логин %{target}" + memorialize_account: "%{name} %{target} аккаунтын еÑтеліктеріне қоÑÑ‚Ñ‹" + promote_user: "%{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}" + unsilence_account: "%{name} %{target} аккаунтын қайта қоÑÑ‚Ñ‹" + unsuspend_account: "%{name} %{target} аккаунтын қайта қоÑÑ‚Ñ‹" + update_custom_emoji: "%{name} Ñмодзи жаңартты %{target}" + update_status: "%{name} жазбаÑын жаңартты %{target}" + deleted_status: "(өшірілген жазба)" + title: Ðудит логы + custom_emojis: + by_domain: Домен + copied_msg: Жергілікті Ñмодзидің көшірмеÑÑ– Ñәтті жаÑалды + copy: Көшіру + copy_failed_msg: Жергілікті Ñмодзидің көшірмеÑÑ– жаÑалмады + created_msg: Ðмодзи Ñәтті жаңартылды! + delete: Өшіру + destroyed_msg: Ðмодзи Ñәтті жойылды! + disable: Ðжырату + disabled_msg: Бұл Ñмодзи Ñәтті жойылды + emoji: Ðмодзи + enable: ҚоÑу + enabled_msg: Ðмодзи Ñәтті қоÑылды + image_hint: PNG 50KB + listed: Тізілді + new: + title: Жаңа Ñмодзи Ò›Ð¾Ñ + overwrite: Ò®Ñтіне жаз + shortcode: Шорткод + shortcode_hint: Кем дегенде 2 Ñимвол, тек латын әріптері мен аÑÑ‚Ñ‹ Ñызылған таңбалар + title: Таңдаулы Ñмодзилар + unlisted: Тізімде жоқ + update_failed_msg: Бұл Ñмодзи жаңартылмады + updated_msg: Ðмодзи Ñәтті жаңартылды! + upload: Жүктеу + dashboard: + backlog: боÑатылған тапÑырмалар + config: ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ + feature_deletions: Ðккаунттарды жою + feature_invites: Шақыру Ñілтемелері + feature_profile_directory: Профиль каталогы + feature_registrations: Тіркелулер + feature_relay: Ð¤ÐµÐ´ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ€ÐµÐ»ÐµÑÑ– + features: Мүмкіндіктер + hidden_service: ЖаÑырын қызметтер федерациÑÑÑ‹ + open_reports: ашық шағымдар + recent_users: Соңғы қолданушылар + search: Толық мәтінмен іздеу + single_user_mode: Жалғыз пайдаланушы режимі + software: Бағдарлама + space: Пайдаланылған кеңіÑтік + title: БаÑқару тақтаÑÑ‹ + total_users: барлық қолданушы + trends: Трендтер + week_interactions: оÑÑ‹ аптадағы әрекеттер + week_users_active: оÑÑ‹ аптадағы белÑенділік + week_users_new: оÑÑ‹ аптадағы қолданушылар + domain_blocks: + add_new: Жаңа домен блокын қоÑу + created_msg: Домендік блок енді өңделуде + destroyed_msg: Домендік блок қалпына келтірілді + domain: Домен + new: + create: Блок құру + hint: Домендік блок дерекқорда тіркелгі жазбаларын құруға кедергі жаÑамайды, бірақ Ñол еÑептік жазбаларда ретроактивті және автоматты түрде нақты Ð¼Ð¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ Ó™Ð´Ñ–Ñтерін қолданады. + severity: + noop: Ештеңе + silence: ҮнÑіз + suspend: Тоқтатылған + title: Жаңа домен блокы + reject_media: Медиа файлдарды қабылдамау + reject_media_hint: Жергілікті Ñақталған мультимедиалық файлдарды жоÑды және болашақта кез келген жүктеуден Ð±Ð°Ñ Ñ‚Ð°Ñ€Ñ‚Ð°Ð´Ñ‹. СуÑпензиÑға байланыÑÑ‚Ñ‹ ÐµÐ¼ÐµÑ + reject_reports: Шағым қабылдамау + reject_reports_hint: Бұл доменнен келген барлық еÑептерді елемеңіз. СуÑпензиÑға байланыÑÑ‚Ñ‹ ÐµÐ¼ÐµÑ + rejecting_media: медиа файлдарды қабылдамау + rejecting_reports: шағымдарды қабылдамау + severity: + silence: үнÑіз + suspend: тоқтатылған + show: + affected_accounts: + one: Дерекқорда бір тіркелгі қозғалды + other: дерекқордағы %{count} аккаунт қозғалған + retroactive: + silence: ОÑÑ‹ домендегі бар тіркелгілерді жою + suspend: ОÑÑ‹ домендегі бар барлық тіркелгілерді тоқтатыңыз + title: "%{domain} доменіндегі блокты алып таÑта" + undo: Қайтару + undo: Домен блокын қайтып алу + email_domain_blocks: + add_new: ЖаңаÑын қоÑу + created_msg: Қаратізімге email домені қоÑылды + delete: Өшіру + domain: Домен + title: E-mail қаратізімі + followers: + title: "%{acct} оқырмандары" + instances: + delivery_available: Жеткізу қол жетімді + known_accounts: + one: "%{count} Ñ‚Ð°Ð½Ñ‹Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚" + other: "%{count} Ñ‚Ð°Ð½Ñ‹Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚" + moderation: + all: Барлығы + limited: Лимит + title: ÐœÐ¾Ð´ÐµÑ€Ð°Ñ†Ð¸Ñ + title: Ð¤ÐµÐ´ÐµÑ€Ð°Ñ†Ð¸Ñ + total_blocked_by_us: Біз бұғаттағандар + total_followed_by_them: Олар жазылғандар + total_followed_by_us: Біз жазылғандар + total_reported: Келген шағымдар + total_storage: Медиа файлдар + invites: + deactivate_all: Барлығын Ñөндір + filter: + all: Барлығы + available: Қолжетімді + expired: Уақыты өткен + title: Фильтр + title: Шақырулар + relays: + add_new: Жаңа арна қоÑу + delete: Өшіру + disable: Сөндіру + disabled: Сөндірілді + enable: ҚоÑу + enabled: ҚоÑылды + inbox_url: Ðрна URL + pending: Жаңа арна құпталуын күту + save_and_enable: Сақта да Ò›Ð¾Ñ + setup: Ðрна байланыÑын баптау + status: Ð¡Ñ‚Ð°Ñ‚ÑƒÑ + title: Ðрналар + report_notes: + created_msg: Шағым жазбаÑÑ‹ Ñәтті құрылды! + destroyed_msg: Шағым жазбаÑÑ‹ Ñәтті өшірілді! + reports: + account: + note: жазба + report: шағым + action_taken_by: БелÑенділік жаÑаған + are_you_sure: Шынымен бе? + assign_to_self: Мені тағайындау + assigned: Модератор тағайындау + comment: + none: Ештеңе + created_at: Шағым таÑталды + mark_as_resolved: Шешілді деп белгіле + mark_as_unresolved: Шешілмеді деп белгіле + notes: + create: Жазба Ò›Ð¾Ñ + create_and_resolve: Жазба қоÑып шеш + create_and_unresolve: Жазба қоÑып қайта аш + delete: Өшіру + placeholder: Қандай әрекеттер жаÑалғанын немеÑе қандай да бір қатыÑÑ‚Ñ‹ әрекеттерді Ñипаттаңыз ... + reopen: Шағымды қайта аш + report: 'Шағым #%{id}' + reported_account: Шағымдалған аккаунт + reported_by: Шағым таÑтаушы + resolved: Қайта шешілді + resolved_msg: Шағым қайтадан шешілді! + status: Ð¡Ñ‚Ð°Ñ‚ÑƒÑ + title: Шағымдар + unassign: Қайтып алу + unresolved: Шешілмеген + updated_at: Жаңартылды + settings: + activity_api_enabled: + desc_html: Соңғы аптада жазылған жазбалар, белÑенді қолданушылар, жаңа тіркелімдер + title: Пайдаланушы әрекеті туралы жиынтық ÑтатиÑтиканы жариÑлау + bootstrap_timeline_accounts: + desc_html: Бірнеше пайдаланушы атын үтірмен бөліңіз. Тек жергілікті және бұғатталмаған аккаунттар. Барлық жергілікті админдер Ð±Ð¾Ñ Ð±Ð¾Ð»Ò“Ð°Ð½Ð´Ð°. + title: Жаңа қолданушыларға жазылғандар + contact_information: + email: Ð‘Ð¸Ð·Ð½ÐµÑ e-mail + username: Қолданушымен Ð±Ð°Ð¹Ð»Ð°Ð½Ñ‹Ñ + custom_css: + desc_html: Әр беттегі өзгеріÑтерді CSS жаңаруымен қарау + title: Жеке CSS + hero: + desc_html: БаÑтапқы бетінде көрÑетіледі. Кем дегенде 600x100px Ò±Ñынылады. Орнатылмаған кезде, Ñервердің нобайына оралады + title: Қаһарман Ñуреті + mascot: + desc_html: Displayed on multiple pages. Кем дегенде 293×205px рекоменделеді. When not set, falls back to default mascot + title: МаÑкот Ñуреті + peers_api_enabled: + desc_html: Домен names this server has encountered in the fediverse + title: Publish list of discovered Ñерверлер + preview_sensitive_media: + desc_html: Link previews on other websites will display a thumbnail even if the media is marked as Ñезімтал + title: Show sensitive media in OpenGraph превью + profile_directory: + desc_html: Ð Ò±Ò›Ñат users to be discoverable + title: Enable профиль directory + registrations: + closed_message: + desc_html: Displayed on frontpage when registrations are closed. You can use HTML тег + title: Closed registration меÑÑадж + deletion: + desc_html: Allow anyone to delete their аккаунт + title: Open аккаунт deletion + min_invite_role: + disabled: Ешкім + title: Allow шақырулар by + open: + desc_html: Allow anyone to create an аккаунт + title: Ðшық тіркелу + show_known_fediverse_at_about_page: + desc_html: When toggled, it will show toots from all the known fediverse on preview. Otherwise it will only show жергілікті toots. + title: Show known fediverse on timeline превью + show_staff_badge: + desc_html: Show a staff badge on a user бет + title: КөрÑет staff badge + site_description: + desc_html: Introductory paragraph on the баÑÑ‚Ñ‹ бет. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <code><a></code> and <code><em></code>. + title: Сервер туралы + site_description_extended: + desc_html: A good place for your code of conduct, rules, guidelines and other things that set your server apart. You can use HTML тег + title: Custom extended ақпарат + site_short_description: + desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph. If empty, defaults to Ñервер description. + title: Short Ñервер description + site_terms: + desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML тег + title: Қолдану шарттары мен ережелер + site_title: Сервер аты + thumbnail: + desc_html: Used for previews via OpenGraph and API. 1200x630px рекоменделеді + title: Сервер Ñуреті + timeline_preview: + desc_html: Display public timeline on лендинг пейдж + title: Таймлайн превьюі + title: Сайт баптаулары + statuses: + back_to_account: Ðккаунт бетіне оралы + batch: + nsfw_off: Сезімтал ÐµÐ¼ÐµÑ Ñ€ÐµÑ‚Ñ–Ð½Ð´Ðµ белгіле + nsfw_on: Сезімтал ретінде белгіле + failed_to_execute: Орындалмады + media: + title: Медиa + no_media: МедиаÑыз + no_status_selected: Бірде-бір ÑÑ‚Ð°Ñ‚ÑƒÑ Ó©Ð·Ð³ÐµÑ€Ð³ÐµÐ½ жоқ, Ñебебі ештеңе таңдалмады + title: Ðккаунт ÑтатуÑтары + with_media: Медиамен + subscriptions: + callback_url: Callbаck URL diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 0e95adf7b1..ecee8374cb 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -7,7 +7,7 @@ ko: administered_by: '관리ìž:' api: API apps: ëª¨ë°”ì¼ ì•± - closed_registrations: 현재 ì´ ì¸ìŠ¤í„´ìŠ¤ì—서는 ì‹ ê·œ 등ë¡ì„ ë°›ê³ ìžˆì§€ 않습니다. + closed_registrations: 현재 ì´ ì„œë²„ì—서는 ì‹ ê·œ 등ë¡ì„ ë°›ê³ ìžˆì§€ 않습니다. 하지만! 다른 ì„œë²„ì— ê³„ì •ì„ ë§Œë“¤ì–´ ë˜‘ê°™ì€ ë„¤íŠ¸ì›Œí¬ì— ì ‘ì† í• ìˆ˜ 있습니다. contact: ì—°ë½ì²˜ contact_missing: ë¯¸ì„¤ì • contact_unavailable: N/A @@ -27,7 +27,7 @@ ko: generic_description: "%{domain} ì€ ë„¤íŠ¸ì›Œí¬ì— 있는 í•œ 서버입니다" hosted_on: "%{domain}ì—ì„œ 호스팅 ë˜ëŠ” ë§ˆìŠ¤í† ëˆ" learn_more: ìžì„¸ížˆ - other_instances: 다른 ì¸ìŠ¤í„´ìŠ¤ + other_instances: 서버 ëª©ë¡ privacy_policy: ê°œì¸ì •ë³´ ì •ì±… source_code: 소스 코드 status_count_after: @@ -388,14 +388,14 @@ ko: desc_html: ëª¨ë“ íŽ˜ì´ì§€ì— ì ìš©í• CSS title: 커스텀 CSS hero: - desc_html: í”„ë¡ íŠ¸íŽ˜ì´ì§€ì— 표시 ë©ë‹ˆë‹¤. 최소 600x100í”½ì…€ì„ ê¶Œìž¥í•©ë‹ˆë‹¤. 만약 ì„¤ì •ë˜ì§€ 않았다면, ì¸ìŠ¤í„´ìŠ¤ì˜ ì¸ë„¤ì¼ì´ 사용 ë©ë‹ˆë‹¤ + desc_html: í”„ë¡ íŠ¸íŽ˜ì´ì§€ì— 표시 ë©ë‹ˆë‹¤. 최소 600x100í”½ì…€ì„ ê¶Œìž¥í•©ë‹ˆë‹¤. 만약 ì„¤ì •ë˜ì§€ 않았다면, ì„œë²„ì˜ ì¸ë„¤ì¼ì´ 사용 ë©ë‹ˆë‹¤ title: 히어로 ì´ë¯¸ì§€ mascot: desc_html: 여러 페ì´ì§€ì—ì„œ 보여집니다. 최소 293x205pxì„ ì¶”ì²œí•©ë‹ˆë‹¤. ì„¤ì • ë˜ì§€ ì•Šì€ ê²½ìš°, 기본 마스코트가 사용 ë©ë‹ˆë‹¤ title: 마스코트 ì´ë¯¸ì§€ peers_api_enabled: - desc_html: ì´ ì¸ìŠ¤í„´ìŠ¤ê°€ 페디버스ì—ì„œ ë§Œë‚¬ë˜ ë„ë©”ì¸ ë„¤ìž„ë“¤ - title: 발견 ëœ ì¸ìŠ¤í„´ìŠ¤ë“¤ì˜ 리스트 발행 + desc_html: ì´ ì„œë²„ê°€ 페디버스ì—ì„œ ë§Œë‚¬ë˜ ë„ë©”ì¸ ë„¤ìž„ë“¤ + title: 발견 ëœ ì„œë²„ë“¤ì˜ ë¦¬ìŠ¤íŠ¸ 발행 preview_sensitive_media: desc_html: 민ê°í•œ 미디어로 ì„¤ì •ë˜ì—ˆë”ë¼ë„ 다른 웹사ì´íŠ¸ì—ì„œ ë§í¬ ë¯¸ë¦¬ë³´ê¸°ì— ì¸ë„¤ì¼ì„ ë³´ì—¬ì¤ë‹ˆë‹¤ title: 민ê°í•œ 미디어를 오픈그래프 ë¯¸ë¦¬ë³´ê¸°ì— ë³´ì—¬ì£¼ê¸° @@ -423,20 +423,20 @@ ko: title: 스태프 배지 표시 site_description: desc_html: í”„ë¡ íŠ¸ 페ì´ì§€ì˜ ì†Œê°œë¬¸ì— ì‚¬ìš© ë©ë‹ˆë‹¤.ì´ ë§ˆìŠ¤í† ëˆ ì„œë²„ì˜ íŠ¹ë³„í•œ ì ë“±ì„ ì„¤ëª…í•˜ì„¸ìš”. HTML 태그, 주로 <code><a></code>, <code><em></code> ê°™ì€ ê²ƒì„ ì‚¬ìš© 가능합니다. - title: 사ì´íŠ¸ 설명 + title: 서버 설명 site_description_extended: desc_html: 규칙, ê°€ì´ë“œë¼ì¸ ë“±ì„ ìž‘ì„±í•˜ê¸° ì¢‹ì€ ê³³ìž…ë‹ˆë‹¤. HTML 태그를 ì‚¬ìš©í• ìˆ˜ 있습니다 title: 사ì´íŠ¸ ìƒì„¸ 설명 site_short_description: - desc_html: 사ì´ë“œë°”와 메타 íƒœê·¸ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤. ë§ˆìŠ¤í† ëˆì´ 무엇ì´ê³ ì´ ì„œë²„ì˜ íŠ¹ì§•ì€ ë¬´ì—‡ì¸ì§€ í•œ 문장으로 설명하세요. 비워ë‘ë©´ ì¸ìŠ¤í„´ìŠ¤ ì„¤ëª…ì´ ëŒ€ì‹ ì‚¬ìš©ë©ë‹ˆë‹¤. - title: ì§§ì€ ì¸ìŠ¤í„´ìŠ¤ 설명 + desc_html: 사ì´ë“œë°”와 메타 íƒœê·¸ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤. ë§ˆìŠ¤í† ëˆì´ 무엇ì´ê³ ì´ ì„œë²„ì˜ íŠ¹ì§•ì€ ë¬´ì—‡ì¸ì§€ í•œ 문장으로 설명하세요. 비워ë‘ë©´ 서버 ì„¤ëª…ì´ ëŒ€ì‹ ì‚¬ìš©ë©ë‹ˆë‹¤. + title: ì§§ì€ ì„œë²„ 설명 site_terms: desc_html: ë‹¹ì‹ ì€ ë…ìžì ì¸ ê°œì¸ì •ë³´ 취급 방침ì´ë‚˜ ì´ìš©ì•½ê´€, ê·¸ ì™¸ì˜ ë²•ì 근거를 ìž‘ì„±í• ìˆ˜ 있습니다. HTML태그를 ì‚¬ìš©í• ìˆ˜ 있습니다 title: 커스텀 서비스 ì´ìš© 약관 - site_title: 사ì´íŠ¸ ì´ë¦„ + site_title: 서버 ì´ë¦„ thumbnail: desc_html: OpenGraph와 APIì˜ ë¯¸ë¦¬ë³´ê¸°ë¡œ 사용 ë©ë‹ˆë‹¤. 1200x630pxì„ ê¶Œìž¥í•©ë‹ˆë‹¤ - title: ì¸ìŠ¤í„´ìŠ¤ ì¸ë„¤ì¼ + title: 서버 ì¸ë„¤ì¼ timeline_preview: desc_html: 랜딩 페ì´ì§€ì— 공개 타임ë¼ì¸ì„ 표시합니다 title: 타임ë¼ì¸ 프리뷰 @@ -497,7 +497,7 @@ ko: warning: ì´ ë°ì´í„°ë¥¼ 조심히 다뤄 주세요. 다른 사람들과 ì ˆëŒ€ë¡œ ê³µìœ í•˜ì§€ 마세요! your_token: 액세스 í† í° auth: - agreement_html: ì´ ë“±ë¡ìœ¼ë¡œ <a href="%{rules_path}">ì´ìš©ê·œì•½</a> ê³¼ <a href="%{terms_path}">약관</a>ì— ë™ì˜í•˜ëŠ” 것으로 간주ë©ë‹ˆë‹¤. + agreement_html: ì´ ë“±ë¡ìœ¼ë¡œ ì´ ì„œë²„ì˜ <a href="%{rules_path}">ì´ìš©ê·œì•½</a> ê³¼ <a href="%{terms_path}">약관</a>ì— ë™ì˜í•˜ëŠ” 것으로 간주ë©ë‹ˆë‹¤. change_password: 패스워드 confirm_email: í™•ì¸ ë©”ì¼ ìŠ¹ì¸ delete_account: ê³„ì • ì‚ì œ @@ -551,7 +551,7 @@ ko: description_html: ê³„ì •ì— ì—…ë¡œë“œëœ ëª¨ë“ ì»¨í…ì¸ ê°€ ì‚ì œë˜ë©°, ê³„ì •ì€ ë¹„í™œì„±í™” ë©ë‹ˆë‹¤. ì´ê²ƒì€ ì˜êµ¬ì 으로 ì´ë£¨ì–´ì§€ëŠ” 것ì´ë¯€ë¡œ <strong>ë˜ëŒë¦´ 수 없습니다</strong>. ì‚¬ì¹ í–‰ìœ„ë¥¼ 방지하기 위해 ê°™ì€ ì•„ì´ë””ë¡œ 다시 등ë¡í•˜ëŠ” ê²ƒì€ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤. proceed: ê³„ì • ì‚ì œ success_msg: ê³„ì •ì´ ì„±ê³µì 으로 ì‚ì œë˜ì—ˆìŠµë‹ˆë‹¤ - warning_html: ì‚ì œê°€ 보장ë˜ëŠ” ê²ƒì€ ì´ ì¸ìŠ¤í„´ìŠ¤ ìƒì—ì„œì˜ ì»¨í…ì¸ ì— í•œí•©ë‹ˆë‹¤. 타 ì¸ìŠ¤í„´ìŠ¤ 등, ì™¸ë¶€ì— ë©€ë¦¬ ê³µìœ ëœ ì»¨í…ì¸ ëŠ” í”ì ì´ ë‚¨ì•„ ì‚ì œë˜ì§€ 않는 ê²½ìš°ë„ ìžˆìŠµë‹ˆë‹¤. ê·¸ë¦¬ê³ í˜„ìž¬ ì ‘ì†ì´ 불가능한 서버나, ì—…ë°ì´íŠ¸ë¥¼ 받지 않게 ëœ ì„œë²„ì— ëŒ€í•´ì„œëŠ” ì‚ì œê°€ ë°˜ì˜ë˜ì§€ ì•Šì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. + warning_html: ì‚ì œê°€ 보장ë˜ëŠ” ê²ƒì€ ì´ ì„œë²„ ìƒì—ì„œì˜ ì»¨í…ì¸ ì— í•œí•©ë‹ˆë‹¤. 타 서버 등, ì™¸ë¶€ì— ë©€ë¦¬ ê³µìœ ëœ ì»¨í…ì¸ ëŠ” í”ì ì´ ë‚¨ì•„ ì‚ì œë˜ì§€ 않는 ê²½ìš°ë„ ìžˆìŠµë‹ˆë‹¤. ê·¸ë¦¬ê³ í˜„ìž¬ ì ‘ì†ì´ 불가능한 서버나, ì—…ë°ì´íŠ¸ë¥¼ 받지 않게 ëœ ì„œë²„ì— ëŒ€í•´ì„œëŠ” ì‚ì œê°€ ë°˜ì˜ë˜ì§€ ì•Šì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. warning_title: ê³µìœ ëœ ì»¨í…ì¸ ì— ëŒ€í•´ì„œ directories: directory: 프로필 ë””ë ‰í† ë¦¬ @@ -566,7 +566,7 @@ ko: errors: '403': ì´ íŽ˜ì´ì§€ë¥¼ í‘œì‹œí• ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤. '404': ë‹¹ì‹ ì´ ì°¾ìœ¼ë ¤ëŠ” 페ì´ì§€ëŠ” 존재하지 않습니다. - '410': ë‹¹ì‹ ì´ ë³´ë ¤ëŠ” 페ì´ì§€ëŠ” ë”ì´ìƒ 존재하지 않습니다. + '410': ë‹¹ì‹ ì´ ë³´ë ¤ëŠ” 페ì´ì§€ëŠ” ë”ì´ìƒ ì—¬ê¸°ì— ì¡´ìž¬í•˜ì§€ 않습니다. '422': content: 보안 ì¸ì¦ì— 실패했습니다. ì¿ í‚¤ë¥¼ ì°¨ë‹¨í•˜ê³ ìžˆì§„ 않습니까? title: 보안 ì¸ì¦ 실패 @@ -590,6 +590,10 @@ ko: lists: 리스트 mutes: 뮤트 storage: 미디어 + featured_tags: + add_new: 추가 + errors: + limit: ì´ë¯¸ 추천 í•´ì‹œíƒœê·¸ì˜ ê°œìˆ˜ê°€ 최대입니다 filters: contexts: home: 홈 타임ë¼ì¸ @@ -608,7 +612,7 @@ ko: title: í•„í„° 추가 followers: domain: ë„ë©”ì¸ - explanation_html: 프ë¼ì´ë²„시를 í™•ë³´í•˜ê³ ì‹¶ì€ ê²½ìš°, 누가 ì—¬ëŸ¬ë¶„ì„ íŒ”ë¡œìš° í•˜ê³ ìžˆëŠ”ì§€ 파악해둘 필요가 있습니다. <strong>프ë¼ì´ë¹— í¬ìŠ¤íŒ…ì€ ì—¬ëŸ¬ë¶„ì˜ íŒ”ë¡œì›Œê°€ 소ì†í•˜ëŠ” ëª¨ë“ ì¸ìŠ¤í„´ìŠ¤ë¡œ 배달ë©ë‹ˆë‹¤</strong>. 팔로워가 소ì†ëœ ì¸ìŠ¤í„´ìŠ¤ 관리ìžë‚˜ 소프트웨어가 ì—¬ëŸ¬ë¶„ì˜ í”„ë¼ì´ë²„시를 ì¡´ì¤‘í•˜ê³ ìžˆëŠ”ì§€ 잘 모를 경우, ê·¸ 팔로워를 ì‚ì œí•˜ëŠ” ê²ƒì´ ì¢‹ì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. + explanation_html: 프ë¼ì´ë²„시를 í™•ë³´í•˜ê³ ì‹¶ì€ ê²½ìš°, 누가 ì—¬ëŸ¬ë¶„ì„ íŒ”ë¡œìš° í•˜ê³ ìžˆëŠ”ì§€ 파악해둘 필요가 있습니다. <strong>프ë¼ì´ë¹— í¬ìŠ¤íŒ…ì€ ì—¬ëŸ¬ë¶„ì˜ íŒ”ë¡œì›Œê°€ 소ì†í•˜ëŠ” ëª¨ë“ ì„œë²„ë¡œ 배달ë©ë‹ˆë‹¤</strong>. 팔로워가 소ì†ëœ 서버 관리ìžë‚˜ 소프트웨어가 ì—¬ëŸ¬ë¶„ì˜ í”„ë¼ì´ë²„시를 ì¡´ì¤‘í•˜ê³ ìžˆëŠ”ì§€ 잘 모를 경우, ê·¸ 팔로워를 ì‚ì œí•˜ëŠ” ê²ƒì´ ì¢‹ì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. followers_count: 팔로워 수 lock_link: 비공개 ê³„ì • purge: 팔로워ì—ì„œ ì‚ì œ @@ -630,10 +634,16 @@ ko: one: 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 아래 오류를 확ì¸í•´ 주ì‹ì‹œì˜¤ other: 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 아래 %{count}ê°œ 오류를 확ì¸í•´ 주ì‹ì‹œì˜¤ imports: - preface: 다른 ì¸ìŠ¤í„´ìŠ¤ì—ì„œ 내보내기 í•œ 파ì¼ì—ì„œ 팔로우 / 차단 ì •ë³´ë¥¼ ì´ ì¸ìŠ¤í„´ìŠ¤ ê³„ì •ìœ¼ë¡œ 불러올 수 있습니다. + modes: + merge: 병합 + merge_long: 기존 ê²ƒì„ ê·¸ëŒ€ë¡œ ë‘” 채 새로 추가 + overwrite: ë®ì–´ì“°ê¸° + overwrite_long: 기존 ê²ƒì„ ëª¨ë‘ ì§€ìš°ê³ ìƒˆë¡œ 추가 + preface: 다른 서버ì—ì„œ 내보내기 í•œ 파ì¼ì—ì„œ 팔로우 / 차단 ì •ë³´ë¥¼ ì´ ê³„ì •ìœ¼ë¡œ 불러올 수 있습니다. success: 파ì¼ì´ ì •ìƒì 으로 업로드 ë˜ì—ˆìœ¼ë©°, 현재 처리 중입니다 types: blocking: 차단한 ê³„ì • ëª©ë¡ + domain_blocking: ë„ë©”ì¸ ì°¨ë‹¨ ëª©ë¡ following: 팔로우 ì¤‘ì¸ ê³„ì • ëª©ë¡ muting: 뮤트 ì¤‘ì¸ ê³„ì • ëª©ë¡ upload: 업로드 @@ -655,7 +665,7 @@ ko: one: ì¼íšŒìš© other: "%{count} 회" max_uses_prompt: ì œí•œ ì—†ìŒ - prompt: ì´ ì¸ìŠ¤í„´ìŠ¤ì— 대한 초대 ë§í¬ë¥¼ ë§Œë“¤ê³ ê³µìœ í•©ë‹ˆë‹¤ + prompt: ì´ ì„œë²„ì— ëŒ€í•œ 초대 ë§í¬ë¥¼ ë§Œë“¤ê³ ê³µìœ í•©ë‹ˆë‹¤ table: expires_at: 만료 uses: ì‚¬ìš©ë¨ @@ -803,6 +813,7 @@ ko: development: 개발 edit_profile: 프로필 편집 export: ë°ì´í„° 내보내기 + featured_tags: 추천 해시태그 followers: ì‹ ë¢° ì¤‘ì¸ ì¸ìŠ¤í„´ìŠ¤ import: ë°ì´í„° ê°€ì ¸ì˜¤ê¸° migrate: ê³„ì • ì´ë™ @@ -931,8 +942,8 @@ ko: <p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p> title: "%{instance} ì´ìš©ì•½ê´€ê³¼ ê°œì¸ì •ë³´ 취급 방침" themes: - contrast: ê³ ëŒ€ë¹„ - default: ë§ˆìŠ¤í† ëˆ + contrast: ë§ˆìŠ¤í† ëˆ (ê³ ëŒ€ë¹„) + default: ë§ˆìŠ¤í† ëˆ (ì–´ë‘움) mastodon-light: ë§ˆìŠ¤í† ëˆ (ë°ìŒ) time: formats: @@ -982,7 +993,7 @@ ko: final_action: í¬ìŠ¤íŒ… 시작하기 final_step: 'í¬ìŠ¤íŒ…ì„ ì‹œìž‘í•˜ì„¸ìš”! 팔로워가 ì—†ë”ë¼ë„ í¼ë¸”ë¦ ë©”ì‹œì§€ëŠ” 다른 ì‚¬ëžŒë“¤ì´ ë³¼ 수 있습니다, 예를 들면 로컬 타임ë¼ì¸ì´ë‚˜ 해시태그ì—서요. 사람들ì—게 ìžì‹ ì„ ì†Œê°œí•˜ê³ ì‹¶ë‹¤ë©´ #introductions 해시태그를 ì´ìš©í•´ë³´ì„¸ìš”.' full_handle: ë‹¹ì‹ ì˜ í’€ 핸들 - full_handle_hint: ì´ê²ƒì„ ë‹¹ì‹ ì˜ ì¹œêµ¬ë“¤ì—게 ì•Œë ¤ì£¼ë©´ 다른 ì¸ìŠ¤í„´ìŠ¤ì—ì„œ 팔로우 하거나 메시지를 보낼 수 있습니다. + full_handle_hint: ì´ê²ƒì„ ë‹¹ì‹ ì˜ ì¹œêµ¬ë“¤ì—게 ì•Œë ¤ì£¼ë©´ 다른 서버ì—ì„œ 팔로우 하거나 메시지를 보낼 수 있습니다. review_preferences_action: ì„¤ì • 바꾸기 review_preferences_step: ë‹¹ì‹ ì˜ ì„¤ì •ì„ í™•ì¸í•˜ì„¸ìš”. ì–´ë–¤ ì´ë©”ì¼ë¡œ ì•Œë¦¼ì„ ë°›ì„ ê²ƒì¸ì§€, 기본ì 으로 ì–´ë–¤ 프ë¼ì´ë²„ì‹œ ì„¤ì •ì„ ì‚¬ìš©í• ê²ƒì¸ì§€, 멀미가 없다면 GIF를 ìžë™ 재ìƒí•˜ë„ë¡ ì„¤ì •í• ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. subject: ë§ˆìŠ¤í† ëˆì— ì˜¤ì‹ ê²ƒì„ í™˜ì˜í•©ë‹ˆë‹¤ diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 52aa868a60..ad10c70678 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -7,7 +7,7 @@ lt: administered_by: 'Administruoja:' api: API apps: Mobilioji Aplikacija - closed_registrations: Registracija Å¡iuo metu uždaryta prie Å¡ito tinklo. JÅ«s galite rasti kitÄ… bÅ«dÄ… susikurti paskyrÄ… ir gauti prieeiga prie to paties tinklo. + closed_registrations: Registracija Å¡iuo metu uždaryta prie Å¡ito tinklo. JÅ«s galite rasti kitÄ… bÅ«dÄ… susikurti paskyrÄ… ir gauti prieigÄ… prie to paties tinklo. contact: Kontaktai contact_missing: Nenustatyta contact_unavailable: N/A @@ -16,7 +16,7 @@ lt: <h3>TaisyklÄ—s</h3> <p>Ilgas apraÅ¡ymas dar nÄ—ra sudartyas</p> features: - humane_approach_body: Mokantis iÅ¡ kitų socialinių tinklų, bei jų daromu klaidų, Mastodon siekia sukurti etiÅ¡ka dizainÄ…, kovojant su netinkamu socialinių tinklų naudojimu. + humane_approach_body: Mokantis iÅ¡ kitų socialinių tinklų, bei jų daromu klaidų, Mastodon siekia sukurti etiÅ¡ka dizainÄ…, kuris kovotu su netinkamu socialinių tinklų naudojimu. humane_approach_title: HumaniÅ¡kesnis metodas not_a_product_body: Mastodon nÄ—ra komercinis tinklas. Jokių reklamų, privaÄios informacijos rinkimo. ÄŒia nÄ—ra vieno žmogaus, kuris už viskÄ… atsako. not_a_product_title: Tu esi žmogus, o ne produktas @@ -27,6 +27,7 @@ lt: generic_description: "%{domain} yra vienas serveris tinkle" hosted_on: Mastodon palaikomas naudojantis %{domain} talpinimu learn_more: Daugiau + other_instances: Serverių sÄ…raÅ¡as privacy_policy: Privatumo Politika source_code: Å altinio kodas status_count_after: @@ -107,6 +108,7 @@ lt: email_status: El paÅ¡to statusas enable: Ä®jungti enabled: Ä®jungta + feed_url: Srauto URL followers: SekÄ—jai followers_url: SekÄ—jų URL follows: Seka @@ -118,6 +120,7 @@ lt: location: all: Visi local: Lokali + remote: Nuotolinis title: Lokacija login_status: Prisijungimo statusas media_attachments: Prisegti medijos failai @@ -180,3 +183,845 @@ lt: assigned_to_self_report: "%{name} paskyrÄ— reportÄ… %{target} saviems" change_email_user: "%{name} pakeitÄ— el paÅ¡to adresÄ… vartotojui %{target}" confirm_user: "%{name} patvirtino el paÅ¡to adresÄ… vartotojui %{target}" + create_account_warning: "%{name} iÅ¡siuntÄ— įspÄ—jimÄ… %{target}" + create_custom_emoji: "%{name} įkÄ—lÄ— naujÄ… jaustukÄ… %{target}" + create_domain_block: "%{name} užblokavo domena %{target}" + create_email_domain_block: "%{name} įkÄ—lÄ— į juodajį sÄ…raÅ¡Ä… el paÅ¡to domena %{target}" + demote_user: "%{name} pažemino %{target}" + destroy_custom_emoji: "%{name} sunaikino jaustukÄ… %{target}" + destroy_domain_block: "%{name} atrakino domenÄ… %{target}" + destroy_email_domain_block: "%{name} paÅ¡alino iÅ¡ juodojo sÄ…raÅ¡o el paÅ¡to domenÄ… %{target}" + destroy_status: "%{name} paÅ¡alino statusÄ… %{target}" + disable_2fa_user: "%{name} iÅ¡jungÄ— 2 faktorių autentikavimo sistemos reikalavimus vartotojui %{target}" + disable_custom_emoji: "%{name} iÅ¡jungÄ— jaustukÄ… %{target}" + disable_user: "%{name} iÅ¡jungÄ— prisijungimÄ… vartotojui %{target}" + enable_custom_emoji: "%{name} įjungÄ— jaustukÄ… %{target}" + enable_user: "%{name} įjungÄ— prisijungimÄ… vartotojui %{target}" + memorialize_account: "%{name} pavertÄ— vartotojo %{target} paskyrÄ… į prisiminimų puslapį" + promote_user: "%{name} paaukÅ¡tino vartotojÄ… %{target}" + remove_avatar_user: "%{name} panaikino vartotojo %{target} profilio nuotraukÄ…" + reopen_report: "%{name} atidarÄ— skundÄ… %{target}" + reset_password_user: "%{name} atstatyti slaptažodį vartotojui %{target}" + resolve_report: "%{name} iÅ¡sprendÄ— skundÄ… %{target}" + silence_account: "%{name} pritildÄ— vartotojo %{target} paskyrÄ…" + suspend_account: "%{name} laikinai užblokavo vartotojo %{target} paskyrÄ…" + unassigned_report: "%{name} nepaskirtas skundas %{target}" + unsilence_account: "%{name} atitildÄ— vartotojo %{target} paskyrÄ…" + unsuspend_account: "%{name} atblokavo vartotojo %{target} paskyrÄ…" + update_custom_emoji: "%{name} atnaujino jaustukÄ… %{target}" + update_status: "%{name} pakeitÄ— statusÄ… %{target}" + deleted_status: "(panaikintas statusas)" + title: Audito žurnalas + custom_emojis: + by_domain: Domenas + copied_msg: SÄ—kmingai sukurta lokali jaustuko kopija + copy: Kopijuoti + copy_failed_msg: Lokali jaustuko kopija negalÄ—jo bÅ«ti sukurta + created_msg: Jaustukas sukurtas sÄ—kmingai! + delete: IÅ¡trinti + destroyed_msg: Jaustukas sÄ—kmingai sunaikintas! + disable: IÅ¡jungti + disabled_msg: Å is jaustukas sÄ—kmingai iÅ¡jungtas + emoji: Jaustukas + enable: Ä®jungti + enabled_msg: Å is jaustukas sÄ—kmingai įjungtas + image_hint: PNG failo dydis iki 50KB + listed: Ä®trauktas į sÄ…raÅ¡Ä… + new: + title: PridÄ—ti naujÄ… jaustukÄ… + overwrite: PerraÅ¡yti + shortcode: Trumpas-kodas + shortcode_hint: Bent du ženklai, tik raidiniai skaitmeniniai ženklai bei akcentai(_) + title: Asmeniniai jaustukai + unlisted: Neįtrauktas į sÄ…raÅ¡Ä… + update_failed_msg: Jaustukas negalÄ—jo bÅ«ti pakeistas + updated_msg: Jaustukas sÄ—kmingai pakeistas! + upload: Ä®kelti + dashboard: + backlog: Neatlikti darbai + config: Konfiguracija + feature_deletions: Paskyrų Å¡alinimas + feature_invites: Pakivetimo nuorodos + feature_profile_directory: Profilio direktorija + feature_registrations: Registracijos + feature_relay: Federacijos perjungÄ—jas + features: IÅ¡skirtinumai + hidden_service: Federacija su paslÄ—ptomis paslaugomis + open_reports: atidaryti skundai + recent_users: Neseni vartotojai + search: Pilno teksto paieÅ¡ka + single_user_mode: Vieno vartotojo bÅ«sena + software: PrograminÄ— įranga + space: Naudojama atmintis + title: Pagrindinis puslapis + total_users: viso vartotoju + trends: Tendencijos + week_interactions: naudojimai Å¡iÄ… savaitÄ™ + week_users_active: aktyvÅ«s Å¡iÄ… savaitÄ™ + week_users_new: vartotojai Å¡iÄ… savaitÄ™ + domain_blocks: + add_new: PridÄ—ti naujÄ… domeno blokÄ… + created_msg: Domeno užblokavimas nagrinÄ—jamas + destroyed_msg: Domeno blokas paÅ¡alintas + domain: Domenas + new: + create: Sukurti blokÄ… + hint: Domeno blokavimas nesustabdys vartotojų paskyrų sukÅ«rimo duomenų sistemoje, taÄiau automatiÅ¡kai pritaikys atitinkamus moderavimo metodus Å¡ioms paskyroms. + severity: + desc_html: |- + <strong>1Tyla</strong>2 padarys paskyros įkelimus nematomus visiems, kurie jų neseka. + <strong>3Draudimas</strong>4 panaikins visus paskyros įkÄ—limus ir profilio informacijÄ….Naudok<strong>5Nieko</strong>6 jeigu tiesiog norite atmesti medijos failus. + noop: Nieko + silence: Tyla + suspend: Draudimas + title: Naujos domeno blokas + reject_media: Atmesti medijos failai + reject_media_hint: Panaikina lokaliai saugomus medijos failus bei atsisako jų parsisiuntimo ateityje. NelieÄia užblokavimu + reject_reports: Atmesti skundai + reject_reports_hint: Ignoruoti visus skundus, kurie siunÄiami iÅ¡ Å¡io domeno. NelieÄia užblokavimu + rejecting_media: atmetami medijos failai + rejecting_reports: atmetami skundai + severity: + silence: užtildytas + suspend: uždraustas + show: + affected_accounts: + few: "%{count} vartotojai duomenų bazÄ—je yra paveikti" + one: Vienas vartotojas duomenų bazÄ—je paveiktas + other: "%{count} vartotojai duomenų bazÄ—je yra paveikti" + retroactive: + silence: Atitildyti visus egzistuojanÄius vartotojus Å¡iame domene + suspend: Atblokuotis visus egzistuojanÄius vartotojus Å¡iame domene + title: Atkurti domeno blokavimÄ… domenui %{domain} + undo: Atkurti + undo: Atkurti domeno blokÄ… + email_domain_blocks: + add_new: PridÄ—ti naujÄ… + created_msg: El paÅ¡to domenas sÄ—kmingai pridÄ—tas į juodÄ…jį sÄ…raÅ¡Ä… + delete: IÅ¡trinti + destroyed_msg: El paÅ¡to adresas sÄ—kmingai paÅ¡alintas iÅ¡ juodojo sÄ…raÅ¡o + domain: Domenas + new: + create: PridÄ—to domenÄ… + title: Naujas el paÅ¡to juodojo sÄ…raÅ¡o įtraukimas + title: El paÅ¡to juodasis sÄ…raÅ¡as + followers: + back_to_account: Atgal Ä® PaskyrÄ… + title: "%{acct} SekÄ—jai" + instances: + delivery_available: Pristatymas galimas + known_accounts: + few: "%{count} žinomos paskyros" + one: "%{count} žinoma paskyra" + other: "%{count} žinomos paskyros" + moderation: + all: Visi + limited: Limituotas + title: Moderacija + title: Federacija + total_blocked_by_us: Mes užblokavome + total_followed_by_them: Jų sekami + total_followed_by_us: MÅ«sų sekami + total_reported: Skundai apie juos + total_storage: Medijos prisegti failai + invites: + deactivate_all: Deaktyvuoti visus + filter: + all: Visi + available: Prieinamas + expired: PasibaigÄ™s + title: Filtras + title: Pakvietimai + relays: + add_new: PridÄ—ti naujÄ… pamainÄ… + delete: IÅ¡trinti + description_html: "<strong>Federacijos perjungÄ—jas</strong> tai tarpinis serveris, kuris apsikeiÄia didelios apimties informacija tarp kitų serverių. <strong> Tai gali padÄ—ti mažesniems serveriams atrasti turinį iÅ¡ fedi-visatos</strong>, kuris kitaip reikalautų vartotojų lokaliai sekti kitus žmones naudojantis kitus tolimus serverius." + disable: IÅ¡jungti + disabled: IÅ¡jungtas + enable: Ä®jungti + enable_hint: Kai įjungta, JÅ«sų serveris prenumeruos visas vieÅ¡as žinutes iÅ¡ Å¡io tinklo, ir pradÄ—s siųsti Å¡io serverio vieÅ¡as žinutes į tinklÄ…. + enabled: Ä®jungtas + inbox_url: Perdavimo URL + pending: Laukiama perdavimo patvirtinimo + save_and_enable: IÅ¡saugoti ir įjungti + setup: Sukurti perdavimo ryšį + status: Statusas + title: Perdavimai + report_notes: + created_msg: Skundo žinutÄ— sekmingai sukurta! + destroyed_msg: Skundo žinutÄ— sekmingai iÅ¡trinta! + reports: + account: + note: raÅ¡telis + report: skundas + action_taken_by: Veiksmo Ä—mÄ—si + are_you_sure: Ar tu įsitikinÄ™s? + assign_to_self: Paskirti man + assigned: Paskirtas moderatorius + comment: + none: NÄ—ra + created_at: Reportuotas + mark_as_resolved: PažymÄ—ti kaip iÅ¡sprestÄ… + mark_as_unresolved: PažymÄ—ti kaip neiÅ¡sprestÄ… + notes: + create: PridÄ—ti raÅ¡telį + create_and_resolve: IÅ¡sprÄ™sti su raÅ¡teliu + create_and_unresolve: Atidaryti su raÅ¡teliu + delete: IÅ¡trinti + placeholder: ApibÅ«dink, kokių veiksmų imtasi arba kitokie atnaujinimai.. + reopen: Atidaryti skundÄ… + report: 'Skundas #%{id}' + reported_account: Reportuota paskyra + reported_by: Skundas sukurtas + resolved: IÅ¡sprÄ™sta + resolved_msg: Skundas sÄ—kmingai įšsprÄ™stas! + status: Statusas + title: Skundai + unassign: Nepriskirti + unresolved: NeiÅ¡sprÄ™sti + updated_at: Atnaujinti + settings: + activity_api_enabled: + desc_html: SkaiÄiai lokaliai įkeltų statusų, aktyvių vartotojų ir naujų registracijų, kas savaitiniuose atnaujinimuose + title: Paskelbti agreguotÄ… statistikÄ… apie vartotojo veiklÄ… + bootstrap_timeline_accounts: + desc_html: Atskirti vartotojų vardus naudojant kablelį (,). Tik lokalios ir neužblokuotos paskyros veiks. Pradinis kai tuÅ¡Äia, visi lokalÅ«s administratoriai. + title: Numatyti sekimai naujiems vartotojams + contact_information: + email: Verslo el paÅ¡tas + username: Kontaktinis slapyvardis + custom_css: + desc_html: Pakeisk iÅ¡vaizdÄ… su CSS užkraunamu kiekviename puslapyje + title: Asmeninis CSS + hero: + desc_html: Rodomas pagrindiniame puslapyje. Bent 600x100px rekomenduojama. Kai nenustatyta, renkamasi numatytÄ… serverio nuotraukÄ… + title: Herojaus nuotrauka + mascot: + desc_html: Rodoma keleta puslapių. Bent 293×205px rekomenduoja. Kai nenustatyÄ…, renkamasi numatytÄ… varianta + title: Talismano nuotrauka + peers_api_enabled: + desc_html: Domeno vardai, kuriuos Å¡is serveris sutiko fedi-visatoje + title: Paskelbti sÄ…raÅ¡Ä… atrastų serveriu + preview_sensitive_media: + desc_html: Nuorodų peržiÅ«ros kituose tinklalapiuose bus rodomos su maža nuotrauka, net jeigu failas parinktas kaip "jautraus turinio" + title: Rodyti jautriÄ… informacijÄ… OpenGraph peržiÅ«rose + profile_directory: + desc_html: Leisti vartotojams bÅ«ti atrastiems + title: Ä®jungti profilio direktorija + registrations: + closed_message: + desc_html: Rodoma pagrindiniame puslapyje, kuomet registracijos uždarytos. JÅ«s galite naudoti HTML + title: Uždarytos registracijos žinutÄ— + deletion: + desc_html: Leisti visiems iÅ¡trinti savo paskyrÄ… + title: Atidaryti paskyros trynimÄ… + min_invite_role: + disabled: Nei vienas + title: Leisti pakvietimus + open: + desc_html: Leisti bet kam susikurti paskyrÄ… + title: Atidaryta registracija + show_known_fediverse_at_about_page: + desc_html: Kai įjungta, rodys įraÅ¡us iÅ¡ visos žinomos fedi-visatos. Kitokiu atvÄ—ju, rodys tik lokalius įraÅ¡us. + title: Rodyti žinoma fedi-visatos laiko juosta peržiÅ«roje + show_staff_badge: + desc_html: Rodyti personalo ženklelį vartotojo puslapyje + title: Rodyti personalo ženklelį + site_description: + desc_html: Introdukcinis paragrafas pagrindiniame puslapyje. ApibÅ«dink, kas padaro šį Mastodon serverį iÅ¡skirtiniu ir visa kita, kas svarbu. Nebijok naudoti HTML žymes, pavyzdžiui <code> < a ></code> bei <code><em></code>. + title: Serverio apibÅ«dinimas + site_description_extended: + desc_html: Gera vieta JÅ«sų elgesio kodeksui, taisyklÄ—ms, nuorodms ir kitokiai informacijai, kuri yra iÅ¡skirtinÄ— JÅ«sų serveriui. Galite naudoti HTML žymes + title: IÅ¡samesnÄ— iÅ¡skirtine informacija + site_short_description: + desc_html: Rodoma Å¡oniniame meniu ir meta žymÄ—se. ApibÅ«dink kas yra Mastodon, ir kas daro šį serverį iÅ¡skirtiniu, vienu paragrafu. Jeigu tuÅ¡Äias, naudojamas numatytasis tekstas. + title: Trumpas serverio apibÅ«dinimas + site_terms: + desc_html: JÅ«s galite paraÅ¡yti savo paÄio privatumo politika, naudojimo sÄ…lygas ar kita informacija. Galite naudoti HTML žymes + title: IÅ¡skirtinÄ—s naudojimosi taisyklÄ—s + site_title: Serverio pavadinimas + thumbnail: + desc_html: Naudojama OpenGraph peržiÅ«roms ir API. Rekomenduojama 1200x630px + title: Serverio miniatÅ«ra + timeline_preview: + desc_html: Rodyti vieÅ¡Ä… laiko juostÄ… apsilankymo puslapyje + title: Laiko juostos peržiÅ«ra + title: Tinklalapio nustatymai + statuses: + back_to_account: Atgal į paskyros puslapį + batch: + delete: IÅ¡trinti + nsfw_off: PažymÄ—ti kaip ne jautriÄ… informacijÄ… + nsfw_on: PažymÄ—ti kaip jautriÄ… informacijÄ… + failed_to_execute: NesÄ—kmingas veiksmas + media: + title: Medija + no_media: NÄ—ra medijos + no_status_selected: Jokie statusai nebuvo pakeisti, nes niekas nepasirinkta + title: Paskyros statusai + with_media: Su medija + subscriptions: + callback_url: AtgalinÄ— URL + confirmed: Patvirtinta + expires_in: Pasibaigia + last_delivery: Paskutinis pristatymas + title: WebSub protokolas + topic: Tema + tags: + accounts: Paskyros + hidden: PaslÄ—pti + hide: PaslÄ—pti iÅ¡ direktorijos + name: Saitažodis(#) + title: Saitažodžiai(#) + unhide: Rodyti direktorijoje + visible: Matomas + title: Administracija + warning_presets: + add_new: PridÄ—ti naujÄ… + delete: IÅ¡trinti + edit: Keisti + edit_preset: Keisti įspÄ—jimo nustatymus + title: Valdyti įspÄ—jimo nustatymus + admin_mailer: + new_report: + body: "%{reporter} paraÅ¡Ä— skundÄ… apie %{target}" + body_remote: Kažkas iÅ¡ %{domain} paraÅ¡Ä— skundÄ… apie %{target} + subject: Naujas skundas %{instance} (#%{id}) + application_mailer: + notification_preferences: Keisti el paÅ¡to parinktis + salutation: "%{name}," + settings: 'Keisti el paÅ¡to parinktis: %{link}' + view: 'PeržiÅ«ra:' + view_profile: PeržiurÄ—ti profilį + view_status: PeržiÅ«rÄ—ti statusÄ… + applications: + created: Aplikacija sÄ—kmingai sukurta + destroyed: Aplikacija sÄ—kmingai iÅ¡trinta + invalid_url: Gauta URL nuoroda netinkama + regenerate_token: Regeneruoti prieigos žetonÄ… + token_regenerated: Prieigos žetonas sÄ—kmingai sugeneruotas + warning: BÅ«kite atsargÅ«s su Å¡ia informacija. Niekada jos nesidalinkite! + your_token: JÅ«sų prieigos žetonas + auth: + agreement_html: Paspaudus "Sign up" JÅ«s sutinkate sekti <a href="%{rules_path}">serverio taisykles</a> bei <a href="%{terms_path}">naudojimo sÄ…lygas</a>. + change_password: Slaptažodis + confirm_email: Patvirtinti el paÅ¡tÄ… + delete_account: IÅ¡trinti paskyrÄ… + delete_account_html: Jeigu norite iÅ¡trinti savo paskyrÄ…, galite eiti <a href="%{path}">Äia</a>. JÅ«sų praÅ¡ys patvirtinti pasirinkimÄ…. + didnt_get_confirmation: Negavote patvirtinimo instrukcijų? + forgot_password: PamirÅ¡ote slaptažodį? + invalid_reset_password_token: Slaptažodžio atkÅ«rimo žetonas netinkamas arba jo galiojimo laikas pasibaigÄ™s. PraÅ¡ykite naujo žetono. + login: Prisijungti + logout: Atsijungti + migrate_account: Prisijungti prie kitos paskyros + migrate_account_html: Jeigu norite nukreipti Å¡iÄ… paskyrÄ… į kita, galite tai <a href="%{path}">konfiguruoti Äia</a>. + or: arba + or_log_in_with: Arba prisijungti su + providers: + cas: CAS + saml: SAML + register: Užsiregistruoti + register_elsewhere: Užsiregistruoti kitame serveryje + resend_confirmation: IÅ¡siųsti dar kartÄ… patvirtinimo instrukcijas + reset_password: Atstatyti slaptažodį + security: Apsauga + set_new_password: Nustatyti naujÄ… slaptažodį + authorize_follow: + already_following: JÅ«s jau sekate Å¡iÄ… paskyrÄ… + error: DÄ—ja, aptikta klaida ieÅ¡kant tolimosios paskyros + follow: Sekti + follow_request: 'JÅ«s iÅ¡siuntÄ—te sekimo praÅ¡ymÄ…:' + following: 'Puiku! JÅ«s pradÄ—jote sekti:' + post_follow: + close: Arba, JÅ«s galite uždaryti šį langÄ…. + return: Rodyti vartotojo paskyrÄ… + web: Eiti į + title: Sekti %{acct} + datetime: + distance_in_words: + about_x_hours: "%{count} val" + about_x_months: "%{count}mÄ—n" + about_x_years: "%{count}met" + almost_x_years: "%{count}met" + half_a_minute: KÄ… tik + less_than_x_minutes: "%{count}min" + less_than_x_seconds: KÄ… tik + over_x_years: "%{count}met" + x_days: "%{count}dien" + x_minutes: "%{count}min" + x_months: "%{count}mÄ—n" + x_seconds: "%{count}sek" + deletes: + bad_password_msg: Geras bandymas, programiÅ¡iau! Neteisingas slaptažodis + confirm_password: Kad patvirtintumÄ—te savo tapatybÄ™, įveskite dabartini slaptažodį + description_html: Tai <strong>be sugrąžinimo, visam laikui</strong> panaikins visa turini iÅ¡ JÅ«sų paskyros ir deaktyvuos jÄ…. JÅ«sų vartotojo vardas paliks rezervuotas, kad iÅ¡vengtumÄ—me tapatybÄ—s pavagimo ateityje. + proceed: IÅ¡trinti paskyrÄ… + success_msg: JÅ«sų paskyra sÄ—kmingai iÅ¡trinta + warning_html: Tiktai panaikinimas turinio iÅ¡ Å¡io serverio garantuotas. Turinys, kuris buvo vieÅ¡ai prieinamas ir dalinamas kituose serveriuose paliks pÄ—dsakus. Serveriai, kurie neseka jÅ«sų, kurie nÄ—ra tinkle, nepakeis savo duomenų sistemos. + warning_title: Platinamo turinio prieinamumas + directories: + directory: Profilio direktorija + enabled: JÅ«s esate rodomas Å¡ioje direktorijoje. + enabled_but_waiting: JÅ«s pasirinkote bÅ«ti įtrauktas į direktorija, bet jÅ«s neturite minimalaus sekÄ—jų skaiÄiaus (%{min_followers}), kad bÅ«tumÄ—te rodomas. + explanation: Raskite vartotojus, remiantis tuo, kuo jie domisi + explore_mastodon: NarÅ¡yti %{title} + how_to_enable: JÅ«s nesate prisijungÄ™s prie Å¡ios direktorijos. Galite prisijungti žemiau. Naudokite saitažodžius savo biografiniame tekste, kad bÅ«tumÄ—te rastas naudojantis specifinius saitažodžius! + people: + few: "%{count} žmonÄ—s" + one: "%{count} žmogus" + other: "%{count} žmonÄ—s" + errors: + '403': JÅ«s neturie prieigos matyti Å¡iam puslapiui. + '404': Puslapis nerastas. + '410': Puslapis neegzistuoja. + '422': + content: Apsaugos patvirtinmas klaidingas. Ar jÅ«s blokuojate sausainius? + title: Apsaugos patvirtinimas nepavyko + '429': Stabdomas + '500': + content: AtsipraÅ¡ome, taÄiau mÅ«sų pusÄ—je įvyko klaida. + title: Netinkamas puslapis + noscript_html: Kad naudotumÄ—tÄ—s Mastodon web aplikacija, praÅ¡ome įsijungti JavaScript. Alternatyviai, pabandykite viena iÅ¡ <a href="%{apps_path}">vietinių aplikacijų</a> Mastodon savo platformai. + exports: + archive_takeout: + date: Data + download: Parsisiųsti archyvÄ… + hint_html: JÅ«s galite praÅ¡yti savo <strong>įrašų bei medijos</strong> archyvo. Eksportuota informacija bus ActivityPub formatu, skaitoma suderintų programų. Galite praÅ¡yti archyvo, kas 7 dienas. + in_progress: Sudaromas archyvas... + request: PraÅ¡yti savo archyvo + size: Dydis + blocks: JÅ«s blokuojate + csv: CSV + domain_blocks: Domeno blokai + follows: JÅ«s sekate + lists: SÄ…raÅ¡ai + mutes: JÅ«s tildote + storage: Medijos sandÄ—lis + featured_tags: + add_new: PridÄ—ti naujÄ… + errors: + limit: JÅ«s jau naudojate maksimalų galimÄ… saitažodžių(#) kiekį + filters: + contexts: + home: Namų laiko juosta + notifications: Priminimai + public: VieÅ¡os laiko juostos + thread: Pokalbiai + edit: + title: Keisti filtrÄ… + errors: + invalid_context: Jokio arba netinkamas pateiktas kontekstas + invalid_irreversible: Negrąžinamas filtras veikia tik namų ir priminimų kontekste + index: + delete: IÅ¡trinti + title: Filtrai + new: + title: PridÄ—ti naujÄ… filtrÄ… + followers: + domain: Domenas + explanation_html: Jeigu norite garantuoti savo statusų privatumÄ…, turite žinoti, kas jus seka. <strong>JÅ«sų privatÅ«s statusai yra pristatyti visiems serveriams, kur jÅ«s turite sekÄ—ju</strong>. GalbÅ«t jÅ«s norite juos peržiÅ«rÄ—ti ir panaikinti sekÄ—jus, kuriais nepasitikite. + followers_count: SekÄ—jų skaiÄius + lock_link: Užrakinti savo paskyrÄ… + purge: Panaikint iÅ¡ sekÄ—ju + success: + few: Å velnaus sekÄ—jų blokavimo procedÅ«roje iÅ¡ %{count} domenų... + one: Å velnaus sekÄ—jų blokavimo procedÅ«roje iÅ¡ vieno domeno... + other: Å velnaus sekÄ—jų blokavimo procedÅ«roje iÅ¡ %{count} domenų... + true_privacy_html: PraÅ¡au prisiminti, kad <strong> tikras privatumas gali bÅ«ti pasiekamas tik su end-to-end užsifravimu</strong>. + unlocked_warning_html: Visi, kurie nori matyti JÅ«sų privatų statusÄ…, gali jus sekti. %{lock_link} kad galÄ—tumÄ—te peržiurÄ—ti ir paÅ¡alinti sekÄ—jus. + unlocked_warning_title: JÅ«sų paskyra neužrakinta + footer: + developers: Programuotojai + more: Daugiau… + resources: Resursai + generic: + changes_saved_msg: Pakeitimai sÄ—kmingai iÅ¡saugoti! + copy: Kopijuoti + save_changes: IÅ¡saugoti pakeitimus + validation_errors: + few: Kažkas negerai! PraÅ¡au patikrinti %{count} klaidas žemiau + one: Kažkas negerai! PeržiÅ«rÄ—k klaidas žemiau + other: Kažkas negerai! PraÅ¡au patikrinti %{count} klaidas žemiau + imports: + modes: + merge: Sulieti + merge_long: IÅ¡saugoti esanÄius įraÅ¡us ir pridÄ—ti naujus + overwrite: PerraÅ¡yti + overwrite_long: Pakeisti senus įraÅ¡us naujais + preface: JÅ«s galite importuoti informacijÄ… iÅ¡ kito serverio, tokiÄ… kaip sÄ…raÅ¡Ä… žmonių kuriuos sekate. + success: JÅ«sų informacija sÄ—kmingai įkelta ir bus apdorota kaip įmanoma greiÄiau + types: + blocking: Blokuojamų sÄ…raÅ¡as + domain_blocking: Domeno blokavimo sÄ…raÅ¡as + following: SekÄ—ju sÄ…raÅ¡as + muting: Tildomų sÄ…raÅ¡as + upload: Ä®kelti + in_memoriam_html: Atminimui. + invites: + delete: Deaktyvuoti + expired: PasibaigÄ™s + expires_in: + '1800': 30 minuÄių + '21600': 6 valandų + '3600': 1 valandos + '43200': 12 valandų + '604800': 1 savaitÄ—s + '86400': 1 dienos + expires_in_prompt: Niekada + generate: Generuoti + invited_by: 'Jus pakvietÄ—:' + max_uses: + few: "%{count} naudojimai" + one: 1 naudojimas + other: "%{count} naudojimai" + max_uses_prompt: Be limito + prompt: Generuoti ir dalintis įraÅ¡ais su kitais, kad sukurti prieigÄ… prie serverio + table: + expires_at: Pasibaigia + uses: Naudojimai + title: Pakviesti žmones + lists: + errors: + limit: JÅ«s pasieketÄ— maksimalų sÄ…rašų skaiÄių + media_attachments: + validations: + images_and_video: Negalima pridÄ—ti video prie statuso, kuris jau turi nuotraukÄ… + too_many: Negalima pridÄ—ti daugiau nei 4 failų + migrations: + acct: slapyvardis@domenas naujam vartotojui + currently_redirecting: 'JÅ«sų profilis nustatytas nukreipimui į:' + proceed: IÅ¡saugoti + updated_msg: JÅ«sų paskyros migracijos nustatymai sÄ—kmingai pakeisti! + moderation: + title: Moderacija + notification_mailer: + digest: + action: PeržiurÄ—ti visus praneÅ¡imus + body: ÄŒia yra trumpa santrauka žinutÄ—s, kuriÄ… jÅ«s praleidote nuo jÅ«sų paskutinio apsilankymo %{since} + mention: "%{name} paminÄ—jo jus:" + new_followers_summary: + few: Beje, jÅ«s gavote %{count} naujų sekÄ—jų, nuo jÅ«sų paskutinio apsilankymo! Nuostabu! + one: Beje, jÅ«s gavote naujÄ… sekÄ—jÄ…, kol buvote atsijungÄ™s! Yay! + other: Beje, jÅ«s gavote %{count} naujų sekÄ—jų, nuo jÅ«sų paskutinio apsilankymo! Nuostabu! + subject: + few: "%{count} nauji praneÅ¡imai, nuo paskutinio apsilankymo\U0001F418" + one: "1 naujas praneÅ¡imas nuo paskutinio apsilankymo \U0001F418" + other: "%{count} nauji praneÅ¡imai, nuo paskutinio apsilankymo\U0001F418" + title: Kol jÅ«sų nebuvo... + favourite: + body: 'JÅ«sų statusÄ… pamÄ—go %{name}:' + subject: "%{name} pamÄ—go JÅ«sų statusÄ…" + title: Naujas mÄ—gstamas + follow: + body: "%{name} pradÄ—jo jus sekti!" + subject: "%{name} pradÄ—jo jus sekti" + title: Naujas sekÄ—jas + follow_request: + action: Tvarkyti praÅ¡ymus sekti + body: "%{name} nori tapti JÅ«sų sekÄ—ju" + subject: 'Laukiantis sprendimo sekÄ—jas: %{name}' + title: Naujas praÅ¡ymas sekti + mention: + action: Atsakyti + body: 'Jus paminÄ—jo %{name} praneÅ¡ime:' + subject: Jus paminÄ—jo %{name} + title: Naujas paminÄ—jimas + reblog: + body: 'JÅ«sų statusÄ… pakÄ—lÄ— %{name}:' + subject: "%{name} pakÄ—lÄ— JÅ«sų statusÄ…" + title: Naujas pakÄ—limas + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: Q + thousand: K + trillion: T + pagination: + newer: Naujesnis + next: Kitas + older: Senesnis + prev: Ankstesnis + truncate: "…" + preferences: + languages: Kalbos + other: Kita + publishing: Skelbiama + web: Tinklas + remote_follow: + acct: Ä®veskite JÅ«sų slapyvardį@domenas kurį norite naudoti + missing_resource: JÅ«sų paskyros nukreipimo URL nerasta + no_account_html: Neturite paskyros? JÅ«s galite<a href='%{sign_up_path}' target='_blank'> užsiregistruoti Äia </a> + proceed: Sekti + prompt: 'JÅ«s seksite:' + reason_html: "<strong>KodÄ—l Å¡is žingsnis svarbus?</strong><code>%{instance}</code> gali bÅ«ti serveris, kuriame jÅ«s nesate užsiregistravÄ™s, todÄ—l mes turime jus nukreipti į JÅ«sų namų serveri." + remote_interaction: + favourite: + proceed: PamÄ—gti + prompt: 'JÅ«s norite pamÄ—gti šį toot''Ä…:' + reblog: + proceed: Pakelti + prompt: 'JÅ«s norite pakelti šį toot''Ä…:' + reply: + proceed: Atsakyti + prompt: 'JÅ«s norite atsakyti Å¡iam toot''ui:' + remote_unfollow: + error: Klaida + title: Pavadinimas + unfollowed: Nebesekama + scheduled_statuses: + over_daily_limit: JÅ«s pasieketÄ— limitÄ… (%{limit}) galimų toot'ų per dienÄ… + over_total_limit: JÅ«s pasieketÄ— %{limit} limitÄ… galimų toot'ų + too_soon: Planuota data privalo bÅ«ti ateityje + sessions: + activity: PaskutinÄ— veikla + browser: NarÅ¡yklÄ— + browsers: + alipay: Alipay + blackberry: Blackberry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox + generic: Nežinoma narÅ¡yklÄ— + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Nokia S40 Ovi Browser + opera: Opera + otter: Otter + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UCBrowser + weibo: Weibo + current_session: DabartinÄ— sesija + description: "%{browser} ant %{platform}" + explanation: ÄŒia rodomos web narÅ¡yklÄ—s prijungtos prie JÅ«sų Mastodon paskyros. + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: Linux + mac: Mac + other: nežinoma platforma + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone + revoke: AtÅ¡aukti + revoke_success: Sesija sÄ—kmingai atÅ¡aukta + title: Sesijos + settings: + authorized_apps: Autorizuotos aplikacijos + back: Atgal į Mastodon + delete: Paskyros trynimas + development: PlÄ—tojimas + edit_profile: Keisti profilį + export: Informacijos eksportas + featured_tags: Rodomi saitažodžiai(#) + followers: Autorizuoti sekÄ—jai + import: Importuoti + migrate: Paskyros migracija + notifications: PraneÅ¡imai + preferences: Preferencijos + settings: Nustatymai + two_factor_authentication: Dviejų veiksnių autentikacija + your_apps: JÅ«sų aplikacijos + statuses: + attached: + description: 'PridÄ—ta: %{attached}' + image: + few: "%{count} nuotraukos" + one: "%{count} nuotrauka" + other: "%{count} nuotraukos" + video: + few: "%{count} vaizdo įraÅ¡ai" + one: "%{count} video" + other: "%{count} vaizdo įraÅ¡ai" + boosted_from_html: Pakelta iÅ¡ %{acct_link} + content_warning: 'Turinio įspÄ—jimas: %{warning}' + disallowed_hashtags: + few: 'rasti neleistini saitąžodžiai: %{tags}' + one: 'rastas neleistinas saitažodis : %{tags}' + other: 'rasti neleistini saitąžodžiai: %{tags}' + language_detection: AutomatiÅ¡kai nustatyti kalbÄ… + open_in_web: Atidaryti naudojan Web + over_character_limit: pasiektas %{max} simbolių limitas + pin_errors: + limit: JÅ«s jau prisegÄ—te maksimalų toot'ų skaiÄų + ownership: Kitų vartotojų toot'ai negali bÅ«ti prisegti + private: Ne vieÅ¡i toot'ai negali bÅ«ti prisegti + reblog: Pakeltos žinutÄ—s negali bÅ«ti prisegtos + show_more: Daugiau + sign_in_to_participate: Prisijunkite jeigu norite dalyvauti pokalbyje + title: '%{name}: "%{quote}"' + visibilities: + private: Tik sekÄ—jams + private_long: Rodyti tik sekÄ—jams + public: VieÅ¡as + public_long: Matyti gali visi + unlisted: Neįtrauktas į sÄ…raÅ¡us + unlisted_long: Matyti gali visi, taÄiau nÄ—ra įtraukta į vieÅ¡as laiko juostas + stream_entries: + pinned: Prisegtas toot'as + reblogged: pakeltas + sensitive_content: Jautrus turinys + terms: + body_html: | + <h2>Privatumo politika</h2> + <h3 id="collect">Kokia informacija yra renkama?</h3> + <ul> + <li><em>Paprasa paskyros informacija</em>: Jeigu JÅ«s užsiregistruojate Å¡iame serveryje, JÅ«sų gali paklausti, kad įraÅ¡ytumÄ—te slapyvardį, el paÅ¡to adresÄ… ir paskyros slaptąžodį. JÅ«s irgi galite įraÅ¡yti papildomÄ… profilio informacijÄ…, tokiÄ… kaip rodomas vardas ir biografijÄ… bei įkelti profilio nuotraukÄ… ir antraÅ¡tÄ—s nuotraukÄ…. Slapyvardis , rodomas vardas, biografija, profilio nuotrauka ir antraÅ¡tÄ—s nuotrauka visada vieÅ¡ai prieinama informacija.</li> + <li><em>Ä®raÅ¡ai, sekami ir kita vieÅ¡a informacija</em>: SÄ…raÅ¡as žmonių, kuriuos JÅ«s sekate yra matomas vieÅ¡ai, taip pat kaip ir JÅ«sų sekÄ—jams. Kai JÅ«s iÅ¡siunÄiate žinutÄ™, data ir laikas yra iÅ¡saugomi bei aplikacija iÅ¡ kurios jÅ«s iÅ¡siuntÄ—te žinutÄ™. ŽinutÄ—se gali bÅ«ti prisegtų medijos failų kaip vaizdo įraÅ¡ai bei nuotraukos. VieÅ¡os ir neįtrauktos į sÄ…raÅ¡us žinutÄ—s yra vieÅ¡ai prieinamos. Kai nusprendžiate rodyti praneÅ¡imÄ… ant savo profilio, tai irgi yra vieÅ¡ai prieinama informacija. JÅ«sų praneÅ¡imai yra pristatomi JÅ«sų sekÄ—jams, kai kuriais atvÄ—jais tai gali reikÅ¡ti, kad Å¡ie praneÅ¡imai yra pristatomi į kitus serverius ir saugomi ten. Kai JÅ«s iÅ¡trinate įraÅ¡us, Å¡ie įraÅ¡ai iÅ¡trinami ir JÅ«sų sekÄ—jams. Veiksmas pamÄ—gti kitus įraÅ¡us irgi yra vieÅ¡as. + </li><li><em>Tiesioginiai ir tik sekÄ—jams įraÅ¡ai</em>: Visi įraÅ¡ai yra saugomi ir apdorojami serveryje. Tik sekÄ—jams įraÅ¡ai yra pristatomi JÅ«sų sekÄ—jams ir vartotojams, kurie yra paminÄ—ti įraÅ¡uose, ir tiesioginiai įraÅ¡ai pristatomi tik vartotojams, kurie yra paminÄ—ti įraÅ¡e. Kai kuriais atvÄ—jais tai gali reikÅ¡ti, kad Å¡ie įraÅ¡ai yra pristatomi į kitÄ… serverį ir įrašų kopijos saugomos ten. Mes stengiames riboti prieigÄ… prie Å¡ių praneÅ¡imų tiktai autorizuotiems gavÄ—jams, taÄiau kiti serveriai to gali nedaryti. TodÄ—l yra svarbu peržiurÄ—ti serverius, kuriems JÅ«sų sekÄ—jai priklauso. JÅ«s galite įjungti bÅ«senÄ… nustatymuose, kad galÄ—tumetÄ— priimti arba atmesti naujas sekimo užklausas.<em> PraÅ¡ome nepamirÅ¡ti, kad serverio operatoriai ir kiti serveriai, kurie gauna Å¡ias žinutes, gali jas peržiurÄ—ti </em> bei, kad gavÄ—jai gali padaryti foto kopija, tektso kopija ar kitaip pasidalinti JÅ«sų žinutÄ—mis.<em> Nesidalinkite jokia jautria ar pavojinga informacija naudojantis Mastodon.</em></li> + <li><em>IP adresai ir kiti metaduomenys</em>: Kai prisijungiate, mes įraÅ¡ome IP adresÄ… iÅ¡ kurio jÅ«s prisijungÄ—te, ir naudojamos narÅ¡yklÄ—s pavadinimÄ…. Visos prisijungimo sesijos yra prieinamos JÅ«sų apžvalgai ir atÅ¡aukimams nustatymuose. Paskutiniai IP adresai yra saugomi iki 12-kos mÄ—nesių. Mes taipogi galime pasilikti serverio registrÄ…, kuriuose yra saugoma IP adresai iÅ¡ visų bandymu prisijungti prie serverio praÅ¡ant informacijos. + </li></ul> + + <hr class="spacer" /> + + <h3 id="use">Kam mes naudojame JÅ«sų informacijÄ…?</h3> + <p>Visa surinkta informacija apie jus, gali bÅ«ti panaudota Å¡iems tikslams: </p> + <ul> + <li>Suteikti pagrindį Mastodon funkcialumÄ…. JÅ«s galite sÄ…veikauti su kitų vartotojų turiniu ir kelti sÄ…vajį, kuomet esate prisijungÄ™s. Pavyzdžiui, galite sekti kitus žmones, peržiÅ«rÄ—ti jų sujungtus įraÅ¡us savo paÄio personalizuotoje laiko juostoje. </li> + <li>PadÄ—ti bendruomenÄ—s moderavimui, pavyzdžiui, lyginant JÅ«sų IP adresÄ…, su kitu žinomu IP adresu, kad nustatyti bandymus vengti užblokavimo.</li> + <li>JÅ«sų el paÅ¡to adresas gali bÅ«ti naudojamas iÅ¡siųsti informacija jums, priminimus apie kitų vartotojų interakcijÄ… su jÅ«sų paskyra, pavyzdžiui, kai jie jums siunÄia žinutes, ir atsakyti į užklausas ir/arba kitais klausimais. </li> + </ul> + + <hr class="spacer" /> + + <h3 id="protect">Kaip mes saugome JÅ«sų informacija? </h3> + + <p>Mes implementavome saugumo priemones, tam, kad apsaugotume JÅ«sų privaÄiÄ… informacijÄ…. Tarp Å¡ių dalykų, JÅ«sų narÅ¡yklÄ—s sesija, taip pat ir eismas tarp JÅ«sų aplikacijos ir API yra apsaugoti SSL, ir JÅ«sų slaptažodis yra užsifruotas sudÄ—tingu algoritmu. JÅ«s galite įjungti dviejų veiksnių autentikacijÄ… savo paskyrai, taip apsaugodami jÄ… dar daugiau. + </p> + + <hr class="spacer" /> + <h3 id="data-retention"> Kokia yra mÅ«sų duomenų laikymo politika? </h3> + + <p>Mes stengiamÄ—s:</p> + + <ul> + <li> IÅ¡saugoti serverio registrÄ…, kuriame yra visi IP adresai, kurie kreipÄ—si į serverį, Å¡ie duomenys laikomi neilgiau nei 90 dienų.</li> + <li> IÅ¡saugoti IP adresus asocijuotus su registruotais vartotojais, ne ilgiau nei 12 mÄ—nesių.</li> + </ul> + + <p> JÅ«s galite pateikti praÅ¡ymÄ… ir parsisiųsti savo turinio archyvÄ…, kuriame bus JÅ«sų įraÅ¡ai, medijos failai, profilio nuotrauka ir antraÅ¡tÄ—s nuotrauka.</p> + + <p> JÅ«s galite VISIÅ KAI iÅ¡trinti savo paskyrÄ… bet kuriuo metu.</p> + + <hr class="spacer"/> + + <h3 id="cookies">Ar mes naudojame sausainiukus?</h3> + + <p> Taip. Sausainiukai yra mažos apimties failai, kuriuos svetainÄ— arba svetainÄ—s tiekÄ—jas perkelia į JÅ«sų kompiuterio kietÄ…jį diskÄ… naudojantis interneto narÅ¡ykle (jeigu jÅ«s leidžiate). Å ie sausainiai leidžia svetainiai prisiminti JÅ«sų narÅ¡yklÄ™ ir jeigu turite registruotÄ… vartotojÄ…, ji asocijuoti su JÅ«su vartotoju.</p> + <p>Mes naudojame sausainius, kad suprastumÄ—me ir iÅ¡saugotumÄ—me JÅ«sų poreikius kitam apsilankymui.</p> + + <hr class="spacer" /> + + <h3 id="disclose">Ar mes atskleidžiame JÅ«sų informacija kitoms Å¡alims?</h3> + + <p>Mes neparduodame, nesikeiÄiame, ar kitaip mainomÄ—s JÅ«sų privaÄiais duomenimis su treÄiosiomis Å¡alimis. Ä® šį sÄ…raÅ¡Ä… neįeina patikimos treÄiosios Å¡alys, kurios padeda mums naudotis tinklalapiu, daryti verslÄ…, ar padÄ—ti jums, tol, kol Å¡ios Å¡alys sutinka laikyti Å¡iÄ… informacijÄ… konfidencialiai. Mes taippat galime pavieÅ¡inti JÅ«sų informacijÄ…, jeigu manome, kad JÅ«s pažeidÄ—te įstatymus, naudojimosi politikÄ…, ar apsaugoti, ginti JÅ«sų, mÅ«sų ar kitų teises. </p> + + <p>JÅ«sų vieÅ¡i duomenys gali bÅ«ti atsisiųsti kitų serverių esanÄių tinkle. JÅ«sų vieÅ¡i bei tik sekÄ—jams skirti įraÅ¡ai pristatomi serveriams, kuriuose JÅ«sų sekÄ—jai egzistuoja, o tiesioginÄ—s žinutÄ—s pristatomos tiesiai į gavÄ—jo serverį, tol, kol Å¡ie sekÄ—jai ar gavÄ—jai yra naudotojai iÅ¡ kitų serverių. </p> + + <p>Kai jÅ«s patvirtinate JÅ«sų paskyros naudojimÄ… aplikacijai, atitinkamai priklausant nuo leidimų, kuriuos jÅ«s suteikÄ—te, aplikacija turi prieiga prie JÅ«sų vieÅ¡ojo profilio informacijos, JÅ«sų sekÄ—jų sÄ…raÅ¡o, sekamų sÄ…raÅ¡o, visų JÅ«sų įrašų, ir pamÄ—gtų įrašų. + Aplikacijos niekada negali turÄ—ti prieigos prie JÅ«sų el paÅ¡to adreso arba slaptažodžio.</p> + + <hr class="spacer" /> + + + <h3 id="children">Tinklalapio naudojimas nepilnameÄiams</h3> + + <p> Jeigu serveris yra EU arba EEA: MÅ«sų tinklalapis, produktai ir visi teikiami aptarnavimai yra teikiami tik žmonÄ—ms, kuriems yra bent 16 metų. Jeigu jums yra mažiau nei 16 metų, sekant GDPR reikalavimais (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>) praÅ¡ome nenaudoti Å¡ios svetainÄ—s. </p> + + <p> Jeigu Å¡is serveris yra USA: MÅ«sų tinklalapis, produktai ir visi teikiami aptarnavimai yra teikiami žmonÄ—ms, kuriems yra bent 13 metų. Jeigu jums mažiau nei 13 metų, sekant COPPA reikalavimais (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) praÅ¡ome nenaudotis Å¡ios svetainÄ—s.</p> + + <p>LegalÅ«s reikalavimai gali bÅ«ti kitokie, jeigu serveris yra kitoje jurisdikcijoje.</p> + + <hr class="spacer" /> + + <h3 id="changes">Pasikeitimai mÅ«sų privatumo politikoje</h3> + + <p>Jeigu mes nusprendžiame pakeisti savo privatumo politikÄ…, mes įraÅ¡ysime Å¡iuos pakeitimus Å¡iame tinklalapyje.</p> + + <p>Å is dokumentas yra CC-BY-SA. Paskutinį kartÄ… keistas Kovo 7, 2018.</p> + + <p>Originaliai adaptuotas iÅ¡ <a href="https://github.com/discourse/discourse">Discourse privatumo politika</a>.</p> + title: "%{instance} Naudojimosi SÄ…lygos ir Privatumo Politika" + themes: + contrast: Mastodon (Didelio Kontrasto) + default: Mastodon (Tamsus) + mastodon-light: Mastodon (Å viesus) + time: + formats: + default: "%b %d, %Y, %H:%M" + month: "%b %Y" + two_factor_authentication: + code_hint: Ä®veskite autentikacijos aplikacijos sugeneruotÄ… kodÄ… kad galÄ—tumete tÄ™sti + description_html: Jeigu įjungiate <strong>dviejų veiksnių autentikacijÄ…</strong>, prisijungiant jums reikÄ—s turÄ—ti su savimi savo telefonÄ…, kuris jums generuos prisijungimo žetonus. + disable: IÅ¡jungti + enable: Ä®jungti + enabled: Dviejų veiksnių autentikacija įjungta + enabled_success: Dviejų veiksnių autentikacija sÄ—kmingai įjungta + generate_recovery_codes: Sugeneruoti atkÅ«rimo kodus + instructions_html: "<strong>Nuskenuokite šį QR kodÄ… į Google Autentikatorių arba panaÅ¡iÄ… TOTP aplikacijÄ… jÅ«sų telefone</strong>. Nuo Å¡iol, Å¡i aplikacija jums generuos žetonus, kurių reikÄ—s norint prisijungti." + lost_recovery_codes: AtkÅ«rimo kodai jums leidžia atgauti prisijungimÄ… prie JÅ«sų paskyros, jeigu prarandate telefonÄ…. Jeigu praradote atkÅ«rimo kodus, juos galite sugeneruoti Äia. JÅ«sų senieji atkÅ«rimo kodai nebeveiks. + manual_instructions: 'Jeigu jÅ«s negalite nuskenuoti QR kodo ir turite jį įvesti savarankiÅ¡kai, Å¡tai Äia yra tekstas Å¡iam kodui:' + recovery_codes: Atsarginio atkÅ«rimo kodai + recovery_codes_regenerated: AtkÅ«rimo kodai sÄ—kmingai sugeneruoti + recovery_instructions_html: Jeigu prarandate prieiga prie telefono, jÅ«s galite naudoti atkÅ«rimo kodus esanÄius žemiau, kad atgautumÄ—te priega prie savo paskyros.<strong>Laikykite atkÅ«rimo kodus saugiai</strong> Pavyzdžiui, galite norÄ—ti juos iÅ¡spausdinti, ir laikyti kartu su kitais svarbiais dokumentais. + setup: Nustatyti + wrong_code: Koda netinkamas! Ar serverio laikas ir prietaiso laikas vienodi? + user_mailer: + backup_ready: + explanation: JÅ«s praÅ¡Ä—te pilnos Mastodon paskyros atsarginÄ—s kopijos. Ji paruoÅ¡ta parsisiuntimui! + subject: JÅ«sų archyvas paruoÅ¡tas parsisiuntimui + title: Archyvas iÅ¡imtas + warning: + explanation: + disable: Kol JÅ«sų paskyra užšaldyta, JÅ«sų duomenys tebÄ—ra matomi, taÄiau jÅ«s negalite atlikti jokių veiksmu, tol, kol užšaldymas panaikintas. + silence: Kol JÅ«sų paskyra limituota, tik žmonÄ—s, kurie jus jau sekÄ— matus JÅ«sų toot'us serveryje, JÅ«s taip pat bÅ«site iÅ¡imtas iÅ¡ viešųjų sÄ…rašų. TaÄiau, kiti gali jus rasti, savo rankomis. + suspend: JÅ«sų paskyra buvo užrakinta, ir visi JÅ«sų toot'ai, medijos failai, buvo panaikinti iÅ¡ Å¡io serverio, ir visų kitų serverių, kur turÄ—jote sekÄ—jų. + review_server_policies: Apžvelgti serverio politikÄ… + subject: + disable: JÅ«sų paskyra %{acct} buvo užšaldyta + none: Ä®spÄ—jmas vartotojui %{acct} + silence: JÅ«sų paskyra %{acct} buvo limituota + suspend: JÅ«sų paskyra %{acct} buvo užrakinta + title: + disable: Paskyra užšaldyta + none: Ä®spÄ—jimas + silence: Paskyra limituota + suspend: Paskyra užrakinta + welcome: + edit_profile_action: Nustatyti profilį + edit_profile_step: JÅ«s galite keisti savo profilį įkeldami profilio nuotraukÄ…, antraÅ¡tÄ™, pakeiÄiant savo rodomÄ… vardÄ… ir dar daugiau. Jeigu norÄ—tumete peržiurÄ—ti naujus sekÄ—jus prieÅ¡ leidžiant jiems jus sekti, galite užrakinti savo paskyrÄ…. + explanation: Å tai keletas patarimų Jums + final_action: PradÄ—ti kelti įraÅ¡us + final_step: 'PradÄ—k kelti įraÅ¡us! Net jeigu neturi sekÄ—jų, JÅ«sų vieÅ¡os žinutÄ—s gali bÅ«ti matomos kitų, pavyzdžiui, lokalioje laiko juostoje ir saitažodžiuose. Galite norÄ—ti prisistatyti naudojan saitąžodį #introductions.' + full_handle: JÅ«sų pilnas slapyvardis + full_handle_hint: Å tai kÄ… jÅ«s sakytumÄ—te savo draugams, kad jie galÄ—tų jums siųsti žinutes arba just sekti iÅ¡ kitų serverių. + review_preferences_action: Pakeisti pasirinkimus + review_preferences_step: Nustatykite savo pasirinkimus, tokius kaip el paÅ¡to laiÅ¡kai, kuriuos norÄ—tumÄ—te gauti, arba kokiu privatumo lygiu norÄ—tumÄ—te, kad jÅ«sų įraÅ¡ai bÅ«tų talpinami, taip pat galite įjungti automatinį GIF paleidimÄ…. + subject: Sveiki atvykÄ™ į Mastodon + tip_federated_timeline: Federuota laiko juosta yra lyg gaisrininkų žarnÄ… rodanti Mastodon tinklÄ…. TaÄiau, joje rodomi tik žmonÄ—s kurie yra sekami JÅ«sų kaimynų. + tip_following: JÅ«s sekate savo serverio administratorius numatyta tvarka. Norint rasti įdomesnių žmonių, patikrinkite lokaliÄ… bei federuotÄ… laiko juostas. + tip_local_timeline: Lokali laiko juosta, joje rodomi žmonÄ—s iÅ¡ %{instance}. Jie yra JÅ«sų artimiausi kaimynai! + tip_mobile_webapp: Jeigu JÅ«sų mobilioji narÅ¡yklÄ— leidžia jums pridÄ—ti Mastodon prie namų ekrano, jÅ«s galite gauti priminimus. Tai gali veikti kaip vietinÄ— aplikacija! + tips: Patarimai + title: Sveiki atvykÄ™, %{name}! + users: + follow_limit_reached: Negalite sekti daugiau nei %{limit} žmonių + invalid_email: Netinkamas el paÅ¡to adresas + invalid_otp_token: Netinkamas dviejų veiksnių kodas + otp_lost_help_html: Jeigu praradote prieiga prie abiejų, susisiekite su mumis per %{email} + seamless_external_login: JÅ«s esate prisijungÄ™ per iÅ¡orini įrenginį, todÄ—l slaptąžodis ir el paÅ¡to nustatymai neprieinami. + signed_in_as: 'Prisijungta kaip:' + verification: + explanation_html: 'JÅ«s galite <strong>patvirtinti savÄ™ kaip savininkÄ… nuorodų savo profilio meta duomenyse</strong>. Kad tai padarytumÄ—te, susieta svetainÄ— privalo turÄ—ti nuorodÄ… atgal į JÅ«sų Mastodon profilį. Nuoroda atgal <strong> privalo </strong> turÄ—ti <code>rel="me"</code> savybÄ™. Teksto turinys nuorodoje nesvarbus. Å tai pavyzdys:' + verification: Patvirtinimas diff --git a/config/locales/nl.yml b/config/locales/nl.yml index e0d7a4a02a..2ba99463bb 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -423,7 +423,7 @@ nl: desc_html: Dit wordt als een alinea op de voorpagina getoond. Beschrijf wat er speciaal is aan deze server en andere zaken die van belang zijn. Je kan HTML gebruiken, zoals <code><a></code> en <code><em></code>. title: Omschrijving Mastodonserver site_description_extended: - desc_html: Wordt op de uitgebreide informatiepagina weergegeven<br>Je kan ook hier HTML gebruiken + desc_html: Een goede plek voor je gedragscode, regels, richtlijnen en andere zaken die jouw server uniek maken. Je kan ook hier HTML gebruiken title: Uitgebreide omschrijving Mastodonserver site_short_description: desc_html: Dit wordt in de zijbalk getoond als en als metatag in de paginabron. Beschrijf in één alinea wat Mastodon is en wat deze server speciaal maakt. De (langere) omschrijving van de Mastodonserver wordt gebruikt wanneer dit veld wordt leeg gelaten. @@ -577,7 +577,7 @@ nl: archive_takeout: date: Datum download: Jouw archief downloaden - hint_html: Je kunt een archief opvragen van jouw <strong>toots en geüploade media</strong>. De geëxporteerde gegevens zijn in ActivityPub-formaat, dat door hiervoor geschikte software valt uit te lezen. Je kunt elke 7 dagen een kopie van je archief aanvragen. + hint_html: Je kunt een archief opvragen van jouw <strong>toots en geüploade media</strong>. De geëxporteerde gegevens zijn in het ActivityPub-formaat, dat door hiervoor geschikte software valt uit te lezen. Je kunt elke 7 dagen een kopie van je archief aanvragen. in_progress: Jouw archief wordt samengesteld... request: Jouw archief opvragen size: Omvang @@ -588,6 +588,10 @@ nl: lists: Lijsten mutes: Jij negeert storage: Mediaopslag + featured_tags: + add_new: Nieuwe toevoegen + errors: + limit: Je hebt al het maximaal aantal hashtags uitgelicht filters: contexts: home: Starttijdlijn @@ -628,10 +632,16 @@ nl: one: Er is iets niet helemaal goed! Bekijk onderstaande fout other: Er is iets niet helemaal goed! Bekijk onderstaande %{count} fouten imports: + modes: + merge: Samenvoegen + merge_long: Bestaande gegevens behouden en nieuwe toevoegen + overwrite: Overschrijven + overwrite_long: Huidige gegevens met de nieuwe gegevens vervangen preface: Je kunt bepaalde gegevens, zoals de mensen die jij volgt of hebt geblokkeerd, naar jouw account op deze server importeren. Je moet deze gegevens wel eerst op de oorspronkelijke server exporteren. success: Jouw gegevens zijn succesvol geüpload en worden binnenkort verwerkt types: blocking: Blokkeerlijst + domain_blocking: Lijst met genegeerde servers following: Volglijst muting: Negeerlijst upload: Uploaden @@ -801,6 +811,7 @@ nl: development: Ontwikkelaars edit_profile: Profiel bewerken export: Exporteren + featured_tags: Uitgelichte hashtags followers: Geautoriseerde volgers import: Importeren migrate: Accountmigratie @@ -929,8 +940,8 @@ nl: <p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p> title: Gebruiksvoorwaarden en privacybeleid van %{instance} themes: - contrast: Hoog contrast - default: Mastodon + contrast: Mastodon (hoog contrast) + default: Mastodon (donker) mastodon-light: Mastodon (licht) time: formats: @@ -946,7 +957,7 @@ nl: generate_recovery_codes: Herstelcodes genereren instructions_html: "<strong>Scan deze QR-code in Google Authenticator of een soortgelijke app op jouw mobiele telefoon</strong>. Van nu af aan genereert deze app aanmeldcodes die je bij het inloggen moet invoeren." lost_recovery_codes: Met herstelcodes kun je toegang tot jouw account krijgen wanneer je jouw telefoon bent kwijtgeraakt. Wanneer je jouw herstelcodes bent kwijtgeraakt, kan je ze hier opnieuw genereren. Jouw oude herstelcodes zijn daarna ongeldig. - manual_instructions: Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren, vind je hieronder geheime code in gewone tekst. + manual_instructions: Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren, vind je hieronder geheime code in platte tekst. recovery_codes: Herstelcodes back-uppen recovery_codes_regenerated: Opnieuw genereren herstelcodes geslaagd recovery_instructions_html: Wanneer je ooit de toegang verliest tot jouw telefoon, kan je met behulp van een van de herstelcodes hieronder opnieuw toegang krijgen tot jouw account. <strong>Zorg ervoor dat je de herstelcodes op een veilige plek bewaard</strong>. Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren. diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index ef1d269eea..14fcfdbd93 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -33,8 +33,10 @@ ar: setting_noindex: ذلك يؤثر على Øالة ملÙÙƒ الشخصي Ùˆ صÙØاتك setting_theme: ذلك يؤثر على الشكل الذي سيبدو عليه ماستدون عندما تقوم بالدخول Ù…ÙÙ† أي جهاز. username: اسم المستخدم الخاص بك سو٠يكون Ùريدا Ù…ÙÙ† نوعه على %{domain} + featured_tag: + name: 'رÙبَّما تريد/ÙŠ استخدام Ø£Øد هؤلاء:' imports: - data: مل٠CSV تم تصديره Ù…ÙÙ† مثيل خادوم ماستدون آخر + data: مل٠CSV تم تصديره Ù…ÙÙ† خادوم ماستدون آخر sessions: otp: 'قم بإدخال رمز المصادقة بخطوتين الذي قام بتوليده تطبيق جهازك أو إستخدم Ø£Øد رموز النÙاذ الإØتياطية :' user: @@ -97,6 +99,7 @@ ar: setting_hide_network: إخÙ٠شبكتك setting_noindex: عدم Ø§Ù„Ø³Ù…Ø§Ø Ù„Ù…Øركات البØØ« بÙهرسة ملÙÙƒ الشخصي setting_reduce_motion: تخÙيض عدد الصور ÙÙŠ الوسائط المتØركة + setting_show_application: إكشÙ/ÙŠ البرامج التي كانت تÙرسل تبويقات setting_system_font_ui: إستخدم الخطوط الإÙتراضية للنظام setting_theme: سمة الموقع setting_unfollow_modal: إظهار مربع Øوار للتأكيد قبل إلغاء متابعة أي Øساب @@ -105,6 +108,8 @@ ar: username: إسم المستخدم username_or_email: إسم المستخدم أو كلمة السر whole_word: الكلمة كاملة + featured_tag: + name: وسم interactions: must_be_follower: Øظر الإخطارات القادمة من Øسابات لا تتبعك must_be_following: Øظر الإخطارات القادمة من الØسابات التي لا تتابعها diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index 2fb0355569..53e48d7587 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -33,11 +33,14 @@ co: setting_display_media_show_all: Sempre affissà i media marcati cum'è sensibili setting_hide_network: I vostri abbunati è abbunamenti ùn saranu micca mustrati nant’à u vostru prufile setting_noindex: Tocca à u vostru prufile pubblicu è i vostri statuti + setting_show_application: L'applicazione chì voi utilizate per mandà statuti sarà affissata indè a vista ditagliata di quelli setting_theme: Tocca à l’apparenza di Mastodon quandu site cunnettatu·a da qualch’apparechju. username: U vostru cugnome sarà unicu nant'à %{domain} whole_word: Quandu a parolla o a frasa sana hè alfanumerica, sarà applicata solu s'ella currisponde à a parolla sana + featured_tag: + name: 'Pudete vulè utilizà unu di quelli:' imports: - data: Un fugliale CSV da un’altr’istanza di Mastodon + data: Un fugliale CSV da un’altru servore di Mastodon sessions: otp: 'Entrate u codice d’identificazione à dui fattori nant’à u vostru telefuninu, o unu di i vostri codici di ricuperazione:' user: @@ -100,6 +103,7 @@ co: setting_hide_network: Piattà a vostra rete setting_noindex: Dumandà à i motori di ricerca internet d’un pudè micca esse truvatu·a cusì setting_reduce_motion: Fà chì l’animazione vanu più pianu + setting_show_application: Indicà u nome di l'applicazione utilizata per mandà statuti setting_system_font_ui: Pulizza di caratteri di u sistemu setting_theme: Tema di u situ setting_unfollow_modal: Mustrà una cunfirmazione per siguità qualch’unu @@ -108,6 +112,8 @@ co: username: Cugnome username_or_email: Cugnome o Email whole_word: Parolla sana + featured_tag: + name: Hashtag interactions: must_be_follower: Piattà e nutificazione di quelli·e ch’ùn vi seguitanu must_be_following: Piattà e nutificazione di quelli·e ch’ùn seguitate diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index 99127c2b68..2107530b50 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -33,9 +33,12 @@ cs: setting_display_media_show_all: Vždy zobrazovat média oznaÄená jako citlivá setting_hide_network: Koho sledujete a kdo sleduje vás nebude zobrazeno na vaÅ¡em profilu setting_noindex: Ovlivňuje váš veÅ™ejný profil a stránky pÅ™ÃspÄ›vků + setting_show_application: Aplikace, kterou použÃváte psanà tootů, bude zobrazena v detailnÃm zobrazenà vaÅ¡ich tootů setting_theme: Ovlivňuje jak Mastodon vypadá, jste-li pÅ™ihlášen na libovolném zaÅ™ÃzenÃ. username: VaÅ¡e uživatelské jméno bude na %{domain} unikátnà whole_word: Je-li klÃÄové slovo Äi fráze pouze alfanumerická, bude aplikována pouze, pokud se shoduje s celým slovem + featured_tag: + name: 'NejspÃÅ¡ budete chtÃt použÃt jeden z tÄ›chto:' imports: data: Soubor CSV exportovaný z jiného serveru Mastodon sessions: @@ -100,6 +103,7 @@ cs: setting_hide_network: Skrýt svou sÃÅ¥ setting_noindex: Neindexovat svůj profil vyhledávaÄi setting_reduce_motion: Redukovat pohyb v animacÃch + setting_show_application: Zobrazit aplikaci použÃvanou k psanà tootů setting_system_font_ui: PoužÃt výchozà pÃsmo systému setting_theme: Motiv stránky setting_unfollow_modal: Zobrazovat pÅ™ed zruÅ¡enÃm sledovánà potvrzovacà okno @@ -108,6 +112,8 @@ cs: username: Uživatelské jméno username_or_email: Uživatelské jméno nebo e-mail whole_word: Celé slovo + featured_tag: + name: Hashtag interactions: must_be_follower: Blokovat oznámenà od lidÃ, kteřà vás nesledujà must_be_following: Blokovat oznámenà od lidÃ, které nesledujete diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index f73dbac963..483be70552 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -29,7 +29,7 @@ da: username: Dit brugernavn vil være unikt pÃ¥ %{domain} whole_word: NÃ¥r nøgle ordet eller udtrykket kun er alfanumerisk, vil det kun blive brugt hvis det passer hele ordet imports: - data: CSV fil eksporteret fra en anden Mastodon instans + data: CSV fil eksporteret fra en anden Mastodon server sessions: otp: 'Indtast to-faktor koden der generes af appen af appen pÃ¥ din telefon eller brug en af din genoprettelses koder:' user: diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 3958e315f6..6dbfd17c07 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -33,11 +33,14 @@ de: setting_display_media_show_all: Medien, die als sensibel markiert sind, immer anzeigen setting_hide_network: Wem du folgst und wer dir folgt, wird in deinem Profil nicht angezeigt setting_noindex: Betrifft dein öffentliches Profil und deine Beiträge + setting_show_application: Die Anwendung, die du zum Schreiben von Beiträgen benutzt wird in der detaillierten Ansicht deiner Beiträge angezeigt setting_theme: Wirkt sich darauf aus, wie Mastodon aussieht, egal auf welchem Gerät du eingeloggt bist. username: Dein Benutzer:innen-Name wird auf %{domain} nur einmal vorkommen whole_word: Wenn das Schlagwort oder die Phrase nur Buchstaben und Zahlen enthält, wird es nur angewendet, wenn es dem ganzen Wort entspricht + featured_tag: + name: 'Du möchtest vielleicht einen von diesen benutzen:' imports: - data: CSV-Datei, die aus einer anderen Mastodon-Instanz exportiert wurde + data: CSV-Datei, die aus einem anderen Mastodon-Server exportiert wurde sessions: otp: 'Gib den Zwei-Faktor-Authentisierungscode von deinem Telefon ein oder benutze einen deiner Wiederherstellungscodes:' user: @@ -74,7 +77,7 @@ de: email: E-Mail-Adresse expires_in: Läuft ab fields: Profil-Metadaten - header: Kopfbild + header: Titelbild inbox_url: Inbox-URL des Relays irreversible: Verwerfen statt verstecken locale: Sprache der Benutzeroberfläche @@ -100,6 +103,7 @@ de: setting_hide_network: Blende dein Netzwerk aus setting_noindex: Suchmaschinen-Indexierung verhindern setting_reduce_motion: Bewegung in Animationen verringern + setting_show_application: Anwendung preisgeben, die benutzt wurde um Beiträge zu versenden setting_system_font_ui: Standardschriftart des Systems verwenden setting_theme: Theme der Website setting_unfollow_modal: Bestätigungsdialog anzeigen, bevor jemandem entfolgt wird @@ -108,6 +112,8 @@ de: username: Profilname username_or_email: Profilname oder E-Mail whole_word: Ganzes Wort + featured_tag: + name: Hashtag interactions: must_be_follower: Benachrichtigungen von Nicht-Folgenden blockieren must_be_following: Benachrichtigungen von Profilen blockieren, denen ich nicht folge diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index fecddd11f5..3d812204c3 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -33,9 +33,12 @@ el: setting_display_media_show_all: Μόνιμη εμφάνιση ευαίσθητων πολυμÎσων setting_hide_network: Δε θα εμφανίζεται στο Ï€Ïοφίλ σου ποιους ακολουθείς και ποιοι σε ακολουθοÏν setting_noindex: ΕπηÏεάζει το δημόσιο Ï€Ïοφίλ και τις δημοσιεÏσεις σου + setting_show_application: Η εφαÏμογή που χÏησιμοποιείς για να στÎλνεις τα τουτ σου θα εμφανίζεται στις αναλυτικÎÏ‚ λεπτομÎÏειες τους setting_theme: ΕπηÏεάζει την εμφάνιση του Mastodon όταν συνδÎεται από οποιαδήποτε συσκευή. username: Το όνομα χÏήστη σου θα είναι μοναδικό στο %{domain} whole_word: Όταν η λÎξη ή η φÏάση κλειδί είναι μόνο αλφαÏιθμητική, θα εφαÏμοστεί μόνο αν ταιÏιάζει με ολόκληÏη τη λÎξη + featured_tag: + name: 'Ίσως να θες να χÏησιμοποιήσεις μια από αυτÎÏ‚:' imports: data: ΑÏχείο CSV που Îχει εξαχθεί από διαφοÏετικό κόμβο Mastodon sessions: @@ -100,6 +103,7 @@ el: setting_hide_network: ΚÏÏψε τις διασυνδÎσεις σου setting_noindex: ΕπÎλεξε να μην συμμετÎχεις στα αποτελÎσματα μηχανών αναζήτησης setting_reduce_motion: Μείωση κίνησης κινουμÎνων στοιχείων + setting_show_application: Îα αποκαλÏπτεται η εφαÏμογή που χÏησιμοποιήθηκε για την αποστολή των τουτ setting_system_font_ui: ΧÏησιμοποίησε την Ï€ÏοεπιλεγμÎνη γÏαμματοσειÏά του συστήματος setting_theme: ΘÎμα ιστότοπου setting_unfollow_modal: Εμφάνιση εÏώτησης επιβεβαίωσης Ï€Ïιν διακόψεις την παÏακολοÏθηση κάποιου @@ -108,6 +112,8 @@ el: username: Όνομα χÏηστη username_or_email: Όνομα ή διεÏθυνση email χÏήστη whole_word: ΟλόκληÏη λÎξη + featured_tag: + name: ΤαμπÎλα interactions: must_be_follower: ΜπλόκαÏε τις ειδοποιήσεις από όσους δεν ακολουθείς must_be_following: ΜπλόκαÏε τις ειδοποιήσεις που Ï€ÏοÎÏχονται από άτομα που δεν τα ακολουθείς diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index b78d2dd813..6cffcc0d15 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -2,6 +2,10 @@ eo: simple_form: hints: + account_warning_preset: + text: Vi povas uzi skribmanierojn de mesaÄoj, kiel URL-ojn, kradvortojn kaj menciojn + admin_account_action: + send_email_notification: La uzanto ricevos klarigon pri tio, kio okazis al ties konto defaults: autofollow: Homoj, kiuj registriÄos per la invito aÅtomate sekvos vin avatar: Formato PNG, GIF aÅ JPG. Äœis %{size}. Estos malgrandigita al %{dimensions}px diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 2b9c2bb811..f4fadb29d6 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -33,11 +33,14 @@ eu: setting_display_media_show_all: Erakutsi beti hunkigarri gisa markatutako multimedia setting_hide_network: Nor jarraitzen duzun eta nork jarraitzen zaituen ez da bistaratuko zure profilean setting_noindex: Zure profil publiko eta Toot-en orrietan eragina du + setting_show_application: Tootak bidaltzeko erabiltzen duzun aplikazioa zure tooten ikuspegi xehetsuan bistaratuko da setting_theme: Edozein gailutik konektatzean Mastodon-en itxuran eragiten du. username: Zure erabiltzaile-izena bakana izango da %{domain} domeinuan whole_word: Hitz eta esaldi gakoa alfanumerikoa denean, hitz osoarekin bat datorrenean besterik ez da aplikatuko + featured_tag: + name: 'Hauetakoren bat erabili zenezake:' imports: - data: Beste Mastodon instantzia batetik esportatutako CSV fitxategia + data: Beste Mastodon zerbitzari batetik esportatutako CSV fitxategia sessions: otp: 'Sartu zure telefonoko aplikazioak sortutako bi faktoreetako kodea, edo erabili zure berreskuratze kodeetako bat:' user: @@ -100,6 +103,7 @@ eu: setting_hide_network: Ezkutatu zure sarea setting_noindex: Atera bilaketa motorraren indexaziotik setting_reduce_motion: Murriztu animazioen mugimenduak + setting_show_application: Utzi agerian tootak bidaltzeko erabilitako aplikazioa setting_system_font_ui: Erabili sistemako tipografia lehenetsia setting_theme: Gunearen gaia setting_unfollow_modal: Erakutsi baieztapen elkarrizketa-koadroa inor jarraitzeari utzi aurretik @@ -108,6 +112,8 @@ eu: username: Erabiltzaile-izena username_or_email: Erabiltzaile-izena edo e-mail helbidea whole_word: Hitz osoa + featured_tag: + name: Traola interactions: must_be_follower: Blokeatu jarraitzaile ez direnen jakinarazpenak must_be_following: Blokeatu zuk jarraitzen ez dituzunen jakinarazpenak diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 2eeacade62..f6e654d7b2 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -18,6 +18,7 @@ fa: password: دست‌کم باید Û¸ نویسه داشته باشد phrase: مستقل از Ú©ÙˆÚ†Ú©ÛŒ Ùˆ بزرگی ØروÙØŒ با متن اصلی یا هشدار Ù…Øتوای بوق‌ها مقایسه می‌شود scopes: واسط‌های برنامه‌نویسی Ú©Ù‡ این برنامه به آن دسترسی دارد. اگر بالاترین Ø³Ø·Ø Ø¯Ø³ØªØ±Ø³ÛŒ را انتخاب کنید، دیگر نیازی به انتخاب سطØ‌های پایینی ندارید. + setting_aggregate_reblogs: برای بازبوق‌هایی Ú©Ù‡ به تازگی برایتان نمایش داده شده‌اند، بازبوق‌های بیشتر را نشان نده (Ùقط روی بازبوق‌های اخیر تأثیر می‌گذارد) setting_default_language: زبان نوشته‌های شما به طور خودکار تشخیص داده می‌شود، ولی این تشخیص همیشه دقیق نیست setting_display_media_default: تصویرهایی را Ú©Ù‡ به عنوان Øساس علامت زده شده‌اند پنهان Ú©Ù† setting_display_media_hide_all: همیشه همهٔ عکس‌ها Ùˆ ویدیوها را پنهان Ú©Ù† @@ -63,6 +64,7 @@ fa: otp_attempt: کد ورود دومرØله‌ای password: رمز phrase: کلیدواژه یا عبارت + setting_aggregate_reblogs: بازبوق‌ها را متØد Ú©Ù† setting_auto_play_gif: پخش خودکار تصویرهای متØرک setting_boost_modal: نمایش پیغام تأیید پیش از بازبوقیدن setting_default_language: زبان نوشته‌های شما diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index b0f958f2f1..5fda109691 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -2,6 +2,9 @@ fi: simple_form: hints: + admin_account_action: + send_email_notification: Käyttäjä saa selityksen mitä tapahtui hänen tililleen + type_html: Valitse mitä teet <strong>1%{acct}</strong>2 defaults: 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 diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 730a695225..f493b746bd 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -33,9 +33,12 @@ fr: setting_display_media_show_all: Toujours afficher les médias marqués comme sensibles setting_hide_network: Ceux que vous suivez et ceux qui vous suivent ne seront pas affichés sur votre profil setting_noindex: Affecte votre profil public ainsi que vos statuts + setting_show_application: Le nom de l'application que vous utilisez afin d'envoyer des pouets sera affiché dans la vue détaillée de ceux-ci setting_theme: Affecte l’apparence de Mastodon quand vous êtes connecté·e depuis n’importe quel appareil. username: Votre nom d’utilisateur sera unique sur %{domain} whole_word: Lorsque le mot-clef ou la phrase-clef est uniquement alphanumérique, ça sera uniquement appliqué s’il correspond au mot entier + featured_tag: + name: 'Vous pourriez utiliser l''un d''entre eux :' imports: data: Un fichier CSV généré par une autre instance de Mastodon sessions: @@ -100,6 +103,7 @@ fr: setting_hide_network: Cacher votre réseau setting_noindex: Demander aux moteurs de recherche de ne pas indexer vos informations personnelles setting_reduce_motion: Réduire la vitesse des animations + setting_show_application: Dévoiler le nom de l'application utilisée pour envoyer des pouets setting_system_font_ui: Utiliser la police par défaut du système setting_theme: Thème du site setting_unfollow_modal: Afficher une fenêtre de confirmation avant de vous désabonner d’un compte @@ -108,6 +112,8 @@ fr: username: Identifiant username_or_email: Nom d’utilisateur·ice ou courriel whole_word: Mot entier + featured_tag: + name: Hashtag interactions: must_be_follower: Masquer les notifications des personnes qui ne vous suivent pas must_be_following: Masquer les notifications des personnes que vous ne suivez pas diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index aebab52475..10f6b6ab81 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -33,11 +33,14 @@ gl: setting_display_media_show_all: Mostrar sempre os medios marcados como sensibles setting_hide_network: Non se mostrará no seu perfil quen a segue e quen a está a seguir setting_noindex: Afecta ao seu perfil público e páxinas de estado + setting_show_application: A aplicación que está a utilizar para enviar toots mostrarase na vista detallada do toot setting_theme: Afecta ao aspecto de Mastodon en calquer dispositivo cando está conectada. username: O seu nome de usuaria será único en %{domain} whole_word: Se a chave ou frase de paso é só alfanumérica, só se aplicará se concorda a palabra completa + featured_tag: + name: 'PoderÃa utilizar algunha de estas:' imports: - data: Ficheiro CSV exportado desde outra instancia Mastodon + data: Ficheiro CSV exportado desde outro servidor Mastodon sessions: otp: 'Introduza o código de doble-factor xerado no aplicativo do seu móbil ou utilice un dos seus códigos de recuperación:' user: @@ -100,6 +103,7 @@ gl: setting_hide_network: Agochar a súa rede setting_noindex: Pedir non aparecer nas buscas dos motores de busca setting_reduce_motion: Reducir o movemento nas animacións + setting_show_application: Mostrar a aplicación utilizada para tootear setting_system_font_ui: Utilizar a tipografÃa por defecto do sistema setting_theme: Decorado da instancia setting_unfollow_modal: Solicitar confirmación antes de deixar de seguir alguén @@ -108,6 +112,8 @@ gl: username: Nome de usuaria username_or_email: Nome de usuaria ou Correo-e whole_word: Palabra completa + featured_tag: + name: Etiqueta interactions: must_be_follower: Bloquear as notificacións de non-seguidoras must_be_following: Bloquea as notificacións de personas que non segue diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index fd0a1940ee..42be5a93cf 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -33,11 +33,14 @@ ko: setting_display_media_show_all: 민ê°í•¨ìœ¼ë¡œ ì„¤ì • ëœ ë¯¸ë””ì–´ë¥¼ í•ìƒ ë³´ì´ê¸° setting_hide_network: 나를 팔로우 하는 사람들과 ë‚´ê°€ 팔로우 하는 ì‚¬ëžŒë“¤ì´ ë‚´ í”„ë¡œí•„ì— í‘œì‹œë˜ì§€ 않게 합니다 setting_noindex: 공개 프로필 ë° ê° íˆ¿íŽ˜ì´ì§€ì— ì˜í–¥ì„ 미칩니다 + setting_show_application: ë‹¹ì‹ ì´ íˆ¿ì„ ìž‘ì„±í•˜ëŠ”ë°ì— 사용한 ì•±ì´ íˆ¿ì˜ ìƒì„¸ì •ë³´ì— 표시 ë©ë‹ˆë‹¤ setting_theme: 로그ì¸ì¤‘ì¸ ëª¨ë“ ë””ë°”ì´ìŠ¤ì— ì ìš©ë˜ëŠ” ë””ìžì¸ìž…니다. username: ë‹¹ì‹ ì˜ ìœ ì €ë„¤ìž„ì€ %{domain} 안ì—ì„œ ìœ ì¼í•´ì•¼ 합니다 whole_word: 키워드가 ì˜ë¬¸ê³¼ 숫ìžë¡œë§Œ ì´ë£¨ì–´ 진 경우, 단어 ì „ì²´ì— ë§¤ì¹ ë˜ì—ˆì„ ë•Œì—만 ìž‘ë™í•˜ê²Œ 합니다 + featured_tag: + name: 'ì´ê²ƒë“¤ì„ 사용하면 ì¢‹ì„ ê²ƒ 같습니다:' imports: - data: 다른 ë§ˆìŠ¤í† ëˆ ì¸ìŠ¤í„´ìŠ¤ì—ì„œ ì¶”ì¶œëœ CSV íŒŒì¼ + data: 다른 ë§ˆìŠ¤í† ëˆ ì„œë²„ì—ì„œ ì¶”ì¶œëœ CSV íŒŒì¼ sessions: otp: 'íœ´ëŒ€ì „í™”ì—ì„œ ìƒì„± ëœ 2단계 ì¸ì¦ 코드를 ìž…ë ¥í•˜ê±°ë‚˜, 복구 코드 중 하나를 사용하세요:' user: @@ -100,6 +103,7 @@ ko: setting_hide_network: ë‚´ ë„¤íŠ¸ì›Œí¬ ìˆ¨ê¸°ê¸° setting_noindex: ê²€ìƒ‰ì—”ì§„ì˜ ì¸ë±ì‹±ì„ ê±°ì ˆ setting_reduce_motion: ì• ë‹ˆë©”ì´ì…˜ 줄ì´ê¸° + setting_show_application: 툿 ìž‘ì„±ì— ì‚¬ìš©í•œ ì•±ì„ ê³µê°œ setting_system_font_ui: ì‹œìŠ¤í…œì˜ ì´ˆê¸° ì„¤ì • í°íŠ¸ë¥¼ 사용 setting_theme: 사ì´íŠ¸ 테마 setting_unfollow_modal: 언팔로우 ì „ 언팔로우 í™•ì¸ í‘œì‹œ @@ -108,6 +112,8 @@ ko: username: ìœ ì € ì´ë¦„ username_or_email: ìœ ì €ë„¤ìž„ ë˜ëŠ” ì´ë©”ì¼ whole_word: 단어 ì „ì²´ì— ë§¤ì¹ + featured_tag: + name: 해시태그 interactions: must_be_follower: 나를 팔로우 하지 않는 사람ì—게서 온 ì•Œë¦¼ì„ ì°¨ë‹¨ must_be_following: ë‚´ê°€ 팔로우 하지 않는 사람ì—게서 온 ì•Œë¦¼ì„ ì°¨ë‹¨ diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 6eb784c303..0d7d1a847d 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -33,9 +33,12 @@ nl: setting_display_media_show_all: Als gevoelig gemarkeerde media altijd verbergen setting_hide_network: Wie jij volgt en wie jou volgen wordt niet op jouw profiel getoond setting_noindex: Heeft invloed op jouw openbare profiel en toots + setting_show_application: De toepassing de je gebruikt om te tooten wordt in de gedetailleerde weergave van de toot getoond setting_theme: Heeft invloed op hoe de webapp van Mastodon eruitziet (op elk apparaat waarmee je inlogt). username: Jouw gebruikersnaam is uniek op %{domain} whole_word: Wanneer het trefwoord of zinsdeel alfanumeriek is, wordt het alleen gefilterd wanneer het hele woord overeenkomt + featured_tag: + name: 'Je wilt misschien een van deze gebruiken:' imports: data: CSV-bestand dat op een andere Mastodonserver werd geëxporteerd sessions: @@ -100,6 +103,7 @@ nl: setting_hide_network: Jouw volgers en wie je volgt verbergen setting_noindex: Jouw toots niet door zoekmachines laten indexeren setting_reduce_motion: Langzamere animaties + setting_show_application: Toepassing onthullen die je voor het verzenden van toots gebruikt setting_system_font_ui: Standaardlettertype van jouw systeem gebruiken setting_theme: Thema website setting_unfollow_modal: Vraag voor het ontvolgen van iemand een bevestiging @@ -108,6 +112,8 @@ nl: username: Gebruikersnaam username_or_email: Gebruikersnaam of e-mailadres whole_word: Heel woord + featured_tag: + name: Hashtag interactions: must_be_follower: Meldingen van mensen die jou niet volgen blokkeren must_be_following: Meldingen van mensen die jij niet volgt blokkeren diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index 6ded448e90..ac2845335f 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -33,11 +33,14 @@ oc: setting_display_media_show_all: Totjorn mostrar los mèdias marcats coma sensibles setting_hide_network: Vòstre perfil mostrarà pas los que vos sègon e lo monde que seguètz setting_noindex: Aquò es destinat a vòstre perfil public e vòstra pagina d’estatuts + setting_show_application: Lo nom de l’aplicacion qu’utilizatz per publicar serà mostrat dins la vista detalhada de vòstres tuts setting_theme: Aquò cà mbia lo tèma grafic de Mastodon quand sètz connectat qual que siasque lo periferic. username: Vòstre nom d’utilizaire serà unic sus %{domain} whole_word: Quand lo mot-clau o frasa es solament alfranumeric, serà pas qu’aplicat se correspond al mot complèt + featured_tag: + name: 'Benlèu que volètz utilizar una d’aquestas causas :' imports: - data: Fichièr CSV exportat d’una autra instà ncia Mastodon + data: Fichièr CSV exportat d’un autre servidor Mastodon sessions: otp: 'Picatz lo còdi d’autentificacion en dos temps (Two factor code) de vòstra aplicacion mobil o utilizatz un de vòstres còdis de recuperacion :' user: diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index 41d045a4ad..504f909c2d 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -33,11 +33,14 @@ sk: setting_display_media_show_all: Stále ukazuj médiá oznaÄené ako citlivé setting_hide_network: Koho následujeÅ¡, a kto následuje teba nebude zobrazené na tvojom profile setting_noindex: Ovplyvňuje verejný profil a stránky s prÃspevkami + setting_show_application: Aplikácia, ktorú použÃvaÅ¡ na pÃsanie prÃspevkov, bude zobrazená v detailnom náhľade jednotlivých tvojÃch prÃspevkov setting_theme: Ovplyvňuje ako Mastodon vyzerá pri prihlásenà z hociakého zariadenia. username: Tvoja prezývka bude unikátna pre server %{domain} whole_word: Ak je kľúÄové slovo, alebo fráza poskladaná iba s pÃsmen a ÄÃsel, bude použité iba ak sa zhoduje s celým výrazom + featured_tag: + name: 'Možno by si chcel/a použiÅ¥ niektoré z týchto:' imports: - data: CSV súbor vyexportovaný z inej Mastodon inÅ¡tancie + data: CSV súbor vyexportovaný z iného Mastodon serveru sessions: otp: 'NapÃÅ¡ sem dvoj-faktorový kód z telefónu, alebo použi jeden z tvojÃch obnovovacÃch kódov:' user: @@ -100,6 +103,7 @@ sk: setting_hide_network: Ukri svoju sieÅ¥ kontaktov setting_noindex: NezaraÄuj prÃspevky do indexu pre vyhľadávÄe setting_reduce_motion: Mierni pohyb pri animáciách + setting_show_application: Zverejni akú aplikáciu použÃvaÅ¡ na posielanie prÃspevkov setting_system_font_ui: Použi základné systémové pÃsmo setting_theme: Vzhľad webu setting_unfollow_modal: Zobrazuj potvrdzovacie okno pred skonÄenÃm sledovania iného užÃvateľa @@ -108,6 +112,8 @@ sk: username: Prezývka username_or_email: PrezÃvka, alebo email whole_word: Celé slovo + featured_tag: + name: HaÅ¡tag interactions: must_be_follower: BlokovaÅ¥ oznámenia od nesledujúcich must_be_following: BlokovaÅ¥ oznámenia od ľudÃ, ktorých nesledujeÅ¡ diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index 0967ef424b..c3feee5751 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -1 +1,133 @@ -{} +--- +sq: + simple_form: + hints: + account_warning_preset: + text: Mund të përdorni sintaksë mesazhesh, të tillë si URL, hashtagë dhe përmendje + admin_account_action: + send_email_notification: Përdoruesi do të marrë një shpjegim mbi çfarë ndodhi me llogarinë e tij + text_html: Opsionale. Mund të përdorni sintaksë mesazhesh. Për të kursyer kohë, mund të <a href="%{path}">shtoni paracaktime sinjalizimesh</a> + type_html: Zgjidhni ç’të bëhet me <strong>%{acct}</strong> + warning_preset_id: Opsionale. Mundeni sërish të shtoni tekst vetjak në fund të paracaktimit + defaults: + autofollow: Personat që regjistrohen përmes ftesës do t’ju ndjekin vetvetiu + avatar: PNG, GIF ose JPG. Maksimumi %{size}. Do të zvogëlohen në %{dimensions}px + bot: Kjo llogari kryesisht bën veprime të automatizuara dhe mund të mos mbikëqyret dot + context: Një ose disa kontekste kur duhet të zbatohet filtri + digest: I dërguar vetëm pas një periudhe të gjatë pasiviteti dhe vetëm nëse keni marrë ndonjë mesazh personal gjatë mungesës suaj + discoverable_html: <a href="%{path}" target="_blank">Drejtoria</a> u lejon njerëzve të gjejnë llogari bazuar në interesat dhe veprimtarinë. Lyp të paktën %{min_followers} ndjekës + email: Do t’ju dërgohet një email ripohimi + fields: Te profili juaj mund të keni deri në 4 objekte të shfaqur si tabelë + header: PNG, GIF ose JPG. E shumta %{size}. Do të ripërmasohet në %{dimensions}px + inbox_url: Kopjoni URL-në prej faqes ballore të relesë që doni të përdorni + irreversible: Mesazhet e filtruar do të zhduket në mënyrë të pakthyeshme, edhe nëse filtri hiqet më vonë + locale: Gjuha e ndërfaqes së përdoruesit, email-eve dhe njoftimeve <em>push</em> + locked: Lyp që ju të miratoni dorazi ndjekësit + password: Përdorni të paktën 8 shenja + phrase: Do të kërkohet përputhje pavarësish se teksti ose sinjalizimi mbi lëndën e një mesazhi është shkruar me të mëdha apo me të vogla + scopes: Cilat API do të lejohet të përdorë aplikacioni. Nëse përzgjidhni një shkallë të epërme, nuk ju duhet të përzgjidhni individualet një nga një. + setting_aggregate_reblogs: Mos shfaq përforcime të reja për mesazhe që janë përforcuar tani së fundi (prek vetëm përforcime të marra rishtas) + setting_default_language: Gjuha e mesazheve tuaj do të zbulohet vetvetiu, por mund të mos jetë përherë e saktë + setting_display_media_default: Fshih media me shenjën rezervat + setting_display_media_hide_all: Fshih përherë krejt mediat + setting_display_media_show_all: Mediat me shenjën rezervat shfaqi përherë + setting_hide_network: Cilët ndiqni dhe cilët ju ndjekin nuk do të shfaqen në profilin tuaj + setting_noindex: Prek faqet e profilit tuaj publik dhe gjendjeve + setting_show_application: Aplikacioni që përdorni për mesazhe do të shfaqet te pamja e hollësishme për mesazhet tuaj + setting_theme: Lidhet me se si duket Mastodon-i kur jeni i futur nga çfarëdo pajisje. + username: Emri juaj i përdoruesit do të jetë unik në %{domain} + whole_word: Kur fjalëkyçi ose fraza është vetëm numerike, do të aplikohet vetëm nëse përputhet me krejt fjalën + featured_tag: + name: 'Mund të doni të përdorni një nga këto:' + imports: + data: Kartelë CSV të eksportuar nga një tjetër shërbyes Mastodon + sessions: + otp: 'Jepni kodin dyfaktorësh të prodhuar nga aplikacioni i telefonit tuaj ose përdorni një nga kodet tuaj të rikthimive:' + user: + chosen_languages: Në iu vëntë shenjë, te rrjedha kohore publike do të shfaqen vetëm mesazhe në gjjuhët e përzgjedhura + labels: + account: + fields: + name: Etiketë + value: Lëndë + account_warning_preset: + text: Tekst i paracaktuar + admin_account_action: + send_email_notification: Njoftoje përdoruesin me email + text: Sinjalizim vetjak + type: Veprim + types: + disable: Çaktivizoje + none: Mos bëj gjë + silence: Heshtje + suspend: Pezulloje dhe fshi në mënyrë të pakthyeshme të dhënat e llogarisë + warning_preset_id: Përdor një sinjalizim të paracaktuar + defaults: + autofollow: Ftesë për ndjekje të llogarisë tuaj + avatar: Avatar + bot: Kjo është një llogari robot + chosen_languages: Filtro gjuhë + confirm_new_password: Ripohoni fjalëkalimin e ri + confirm_password: Ripohoni fjalëkalimin + context: Filtroni kontekste + current_password: Fjalëkalimi i tanishëm + data: Të dhëna + discoverable: Shfaqe këtë llogari te lista + display_name: Emër në ekran + email: Adresë email + expires_in: Skadon pas + fields: Tejtëdhëna profili + header: Krye + inbox_url: URL e Të marrëve të relesë + irreversible: Heqje, në vend se fshehje + locale: Gjuhë ndërfaqeje + locked: Kyçe llogarinë + max_uses: Numër maksimum përdorimesh + new_password: Fjalëkalim i ri + note: Jetëshkrim + otp_attempt: Kod mirëfilltësimi dyfaktorësh + password: Fjalëkalim + phrase: Fjalëkyç ose frazë + setting_aggregate_reblogs: Grupoji përforcimet në rrjedha kohore + setting_auto_play_gif: Vetëluaji GIF-et e animuar + setting_boost_modal: Shfaq dialog ripohimi përpara përforcimi + setting_default_language: Gjuhë postimi + setting_default_privacy: Privatësi postim + setting_default_sensitive: Mediave vëru përherë shenjë si rezervat + setting_delete_modal: Shfaq dialog ripohimi përpara fshirjes së një mesazhi + setting_display_media: Shfaqje mediash + setting_display_media_default: Parazgjedhje + setting_display_media_hide_all: Fshihi krejt + setting_display_media_show_all: Shfaqi krejt + setting_expand_spoilers: Mesazhet me sinjalizime mbi lëndën, zgjeroji përherë + setting_hide_network: Fshiheni rrjetin tuaj + setting_noindex: Përfundim i indeksimit nga motor kërkimesh + setting_reduce_motion: Zvogëlo lëvizjen në animacione + setting_show_application: Tregoje aplikacionin e përdorur për të dërguar mesazhe + setting_system_font_ui: Përdor shkronja parazgjedhje të sistemit + setting_theme: Temë sajti + setting_unfollow_modal: Shfaq dialog ripohimi përpara heqjes së ndjekjes për dikë + severity: Rreptësi + type: Lloj importimi + username: Emër përdoruesi + username_or_email: Emër përdoruesi ose Email + whole_word: Krejt fjalën + featured_tag: + name: Hashtag + interactions: + must_be_follower: Blloko njoftime nga jo-ndjekës + must_be_following: Blloko njoftime nga persona që nuk i ndiqni + must_be_following_dm: Blloko mesazhe të drejtpërdrejt nga persona që nuk i ndiqni + notification_emails: + digest: Dërgo email-e përmbledhës + favourite: Të dërgohet email kur dikush parapëlqen gjendjen tuaj + follow: Të dërgohet email kur dikush fillon t’ju ndjekë + follow_request: Të dërgohet email kur dikush kërkon t’ju ndjekë + mention: Të dërgohet email kur dikush ju përmend + reblog: Dërgo email kur dikush përforcon gjendjen time + report: Dërgo email kur parashtrohet një raportim i ri + 'no': Jo + required: + mark: "*" + text: e domosdoshme + 'yes': Po diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index d0b50609b0..517b38ca58 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -2,7 +2,11 @@ tr: simple_form: hints: + admin_account_action: + send_email_notification: Kullanıcı, hesabına ne olduÄŸu hakkında bir bildirim alacak + warning_preset_id: Ä°steÄŸe baÄŸlı. Hazır ayarın sonuna hala özel metin ekleyebilirsiniz defaults: + autofollow: Davetiyeyle kaydolan kiÅŸiler sizi otomatik olarak takip eder avatar: En fazla %{size} olacak ÅŸekilde PNG, GIF veya JPG formatında yükleyiniz. %{dimensions}px büyüklüğüne indirgenecektir header: En fazla %{size} olacak ÅŸekilde PNG, GIF veya JPG formatında yükleyiniz. %{dimensions}px büyüklüğüne indirgenecektir. locked: Takipçilerinizi manuel olarak kabul etmenizi ve gönderilerinizi varsayılan olarak sadece takipçilerinizin göreceÄŸi ÅŸekilde paylaÅŸmanızı saÄŸlar. diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 5c2dcd7e07..296589becc 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -1,13 +1,13 @@ --- sk: about: - about_hashtag_html: Toto sú verejné prÃspevky otagované pod <strong>#%{hashtag}</strong>. Ak máš úÄet hocikde v rámci fediversa, môžeÅ¡ ich využÃvaÅ¥. + about_hashtag_html: Toto sú verejné prÃspevky, otagované pod <strong>#%{hashtag}</strong>. Ak máš úÄet hocikde v rámci fediversa, môžeÅ¡ s nimi narábaÅ¥. about_mastodon_html: Mastodon je sociálna sieÅ¥ založená na otvorených webových protokoloch a na slobodnom softvéri. Je decentralizovaná, podobne ako email. about_this: O tomto serveri administered_by: 'Správcom je:' api: API apps: Aplikácie - closed_registrations: Registrácie sú na tomto serveri momentálne uzatvorené. AvÅ¡ak, môžeÅ¡ nájsÅ¥ nejaký iný Mastodon server kde si založ úÄet a zÃskaj tak prÃstup do presne tej istej siete odtiaľ. + closed_registrations: Registrácie na tomto serveri sú momentálne uzatvorené. AvÅ¡ak, môžeÅ¡ nájsÅ¥ nejaký iný server kde si založÃÅ¡ úÄet a zÃskaÅ¡ tak prÃstup do presne tej istej siete odtiaľ. contact: Kontakt contact_missing: Nezadaný contact_unavailable: Neuvedený @@ -27,7 +27,7 @@ sk: generic_description: "%{domain} je jeden server v sieti" hosted_on: Mastodon hostovaný na %{domain} learn_more: Zisti viac - other_instances: Zoznam ÄalÅ¡Ãch inÅ¡tancià + other_instances: Zoznam serverov privacy_policy: Ustanovenia o súkromà source_code: Zdrojový kód status_count_after: @@ -39,7 +39,7 @@ sk: user_count_after: few: užÃvatelia one: užÃvateľ - other: užÃvatelia + other: užÃvateľov user_count_before: Domov pre what_is_mastodon: ÄŒo je Mastodon? accounts: @@ -246,7 +246,7 @@ sk: feature_registrations: Registrácie feature_relay: Federovacà mostÃk features: Vymoženosti - hidden_service: Federácia so skritými službami + hidden_service: Federácia so skrytými službami open_reports: otvorené hlásenia recent_users: Nedávny užÃvatelia search: Celofrázové vyhľadávanie @@ -392,13 +392,13 @@ sk: desc_html: Uprav vzhľad pomocou CSS, ktoré je naÄÃtané na každej stránke title: Vlastné CSS hero: - desc_html: Zobrazuje sa na hlavnej stránke. DoporuÄuje sa rozliÅ¡enie aspoň 600x100px Pokiaľ tu nieje niÄ dodané, bude nastavený základný orázok tohoto serveru + desc_html: Zobrazuje sa na hlavnej stránke. DoporuÄuje sa rozliÅ¡enie aspoň 600x100px Pokiaľ niÄ nieje dodané, bude nastavený základný orázok serveru title: Obrázok hrdinu mascot: desc_html: Zobrazované na viacerých stránkach. OdporúÄaná veľkosÅ¥ aspoň 293×205px. Pokiaľ nieje nahraté, bude zobrazený základný maskot title: Obrázok maskota peers_api_enabled: - desc_html: Domény, na ktoré tento server už vo fediverse natrafil + desc_html: Domény, na ktoré tento server už v rámci fediverse natrafil title: Zverejni zoznam objavených serverov preview_sensitive_media: desc_html: Náhľad odkazov z iných serverov, bude zobrazený aj vtedy, keÄ sú médiá oznaÄené ako senzitÃvne @@ -427,20 +427,20 @@ sk: title: Zobraz znaÄku moderátora site_description: desc_html: Oboznamujúci paragraf na hlavnej stránke a pri meta tagoch. OpÃÅ¡, Äo robà tento Mastodon server Å¡pecifickým, a Äalej hociÄo iné, Äo považujeÅ¡ za dôležité. MôžeÅ¡ použiÅ¥ HTML kód, hlavne <code>< a ></code>, ale tiež <code><></code>. - title: Popis instancie + title: Popis servera site_description_extended: - desc_html: Toto je vhodné miesto pre tvoje pravidlá o prevádzke, pokyny a iné veci, ktorými je tvoja instancia Å¡pecifická. Je možné tu použÃvaÅ¥ HTML kód + desc_html: Toto je vhodné miesto pre tvoje pravidlá o prevádzke, pokyny, podmienky a iné veci, ktorými je tvoj server Å¡pecifický. Je možné tu použÃvaÅ¥ HTML tagy title: Vlastné doplňujúce informácie site_short_description: - desc_html: Zobrazené na boÄnom paneli a pri meta tagoch. PopÃÅ¡ Äo je Mastodon, a Äo robà tento server iným, v jednom paragrafe. Pokiaľ toto necháš prázdne, bude tu zobrazený základný popis instancie. - title: Krátky popis instancie + desc_html: Zobrazené na boÄnom paneli a pri meta tagoch. PopÃÅ¡ Äo je Mastodon, a Äo robà tento server iným, v jednom paragrafe. Pokiaľ toto necháš prázdne, bude tu zobrazený základný popis servera. + title: Krátky popis serveru site_terms: desc_html: MôžeÅ¡ si napÃsaÅ¥ svoje vlastné pravidla o súkromÃ, prevádzke, alebo aj iné legality. MôžeÅ¡ tu použÃvaÅ¥ HTML kód title: Vlastné pravidlá prevádzky - site_title: Názov instancie + site_title: Názov servera thumbnail: desc_html: PoužÃvané pre náhľady cez OpenGraph a API. DoporuÄuje sa rozliÅ¡enie 1200x630px - title: Miniatúra instancie + title: Miniatúra servera timeline_preview: desc_html: ZobraziÅ¥ verejnú nástenku na hlavnej stránke title: Náhľad nástenky @@ -501,12 +501,12 @@ sk: warning: Na tieto údaje dávajte ohromný pozor. Nikdy ich s nikým nezÄieľajte! your_token: Váš prÃstupový token auth: - agreement_html: V rámci registrácie súhlasÃÅ¡, že sa budeÅ¡ riadiÅ¥ <a href="%{rules_path}"> pravidlami tejto instancie</a>, a taktiež <a href="%{terms_path}"> naÅ¡Ãmi prevoznými podmienkami</a>. + agreement_html: V rámci registrácie súhlasÃÅ¡, že sa budeÅ¡ riadiÅ¥ <a href="%{rules_path}"> pravidlami tohto servera</a>, a taktiež <a href="%{terms_path}"> naÅ¡Ãmi prevádzkovými podmienkami</a>. change_password: Heslo confirm_email: PotvrdiÅ¥ email - delete_account: VymazaÅ¥ úÄet - delete_account_html: Pokiaľ chceÅ¡ vymazaÅ¥ svoj úÄet, môžeÅ¡ tak <a href="%{path}">urobiÅ¥ tu</a>. BudeÅ¡ požiadaný/á o potvrdenie tohto kroku. - didnt_get_confirmation: Neobdržal/a si kroky pre potvrdenie? + delete_account: Vymaž úÄet + delete_account_html: Pokiaľ chceÅ¡ svoj úÄet odtiaľto vymazaÅ¥, môžeÅ¡ tak <a href="%{path}">urobiÅ¥ tu</a>. BudeÅ¡ požiadaný/á o potvrdenie tohto kroku. + didnt_get_confirmation: Neobdržal/a si kroky na potvrdenie? forgot_password: Zabudnuté heslo? invalid_reset_password_token: Token na obnovu hesla vyprÅ¡al. ProsÃm vypÃtaj si nový. login: Prihlás sa @@ -555,7 +555,7 @@ sk: description_html: Týmto <strong> natrvalo, nenavrátiteľne </strong> vymažeÅ¡ obsah tvojho úÄtu, a deaktivujeÅ¡ ho. Tvoja prezývka ale ostane rezervovaná ako prevencia pred budúcimi impersonáciami. proceed: Vymaž úÄet success_msg: Tvoj úÄet bol úspeÅ¡ne vymazaný - warning_html: Iba vymazanie obsahu z tejto konkrétnej instancie je zaruÄené. Obsah, ktorý bol zdieľaný Å¡iroko-Äaleko pravdepodobne zanechá nejaké stopy. Servery ktoré sú offline a tie ktoré ignorujú tvoje zmeny teda nezaktualizujú svoje databázy. + warning_html: Iba vymazanie obsahu z tohto konkrétneho serveru je zaruÄené. Obsah, ktorý bol zdieľaný Å¡iroko-Äaleko pravdepodobne zanechá nejaké stopy. Servery ktoré sú offline a tie ktoré ignorujú tvoje zmeny teda nezaktualizujú svoje databázy. warning_title: DostupnosÅ¥ rozÅ¡Ãrovaného obsahu directories: directory: Katalóg profilov @@ -595,6 +595,10 @@ sk: lists: Zoznamy mutes: StÃÅ¡il/a si storage: Úložisko médià + featured_tags: + add_new: Pridaj nový + errors: + limit: Už si si predvolil/a najvyÅ¡Å¡Ã možný poÄet obľúbených haÅ¡tagov filters: contexts: home: Domáca os @@ -613,7 +617,7 @@ sk: title: Pridaj nové triedenie followers: domain: Doména - explanation_html: Pokiaľ chceÅ¡ zaruÄiÅ¥ súkromie svojÃch prÃspevkov, musÃÅ¡ maÅ¥ na vedomÃ, kto Å¥a sleduje. <strong> Tvoje súkromné prÃspevky sú doruÄené na každý server z ktorého Å¥a niekto následuje. </strong> Takže možno by si ich chcel/a skontrolovaÅ¥, a odstrániÅ¥ tých následovnÃkov, Äo sú na serveroch ktorÃm nedôverujeÅ¡, že ich moderátori, alebo úpravbuy kódu budú tiež reÅ¡pektovaÅ¥ tvoje súkromie. + explanation_html: Pokiaľ chceÅ¡ zaruÄiÅ¥ súkromie svojÃch prÃspevkov, musÃÅ¡ maÅ¥ na vedomÃ, kto Å¥a sleduje. <strong> Tvoje súkromné prÃspevky sú doruÄené na každý server z ktorého Å¥a niekto následuje. </strong> Takže možno by si ich chcel/a skontrolovaÅ¥, a odstrániÅ¥ tých následovnÃkov, Äo sú na serveroch ktorÃm dostatoÄne nedôverujeÅ¡ v zmysle, že ich moderátori, alebo ich softvérové úpravy, budú tiež reÅ¡pektovaÅ¥ tvoje súkromie. followers_count: PoÄet následovateľov lock_link: Zamkni svoj úÄet purge: Odstráň sledovateľa @@ -637,10 +641,16 @@ sk: one: NieÄo nieje úplne v poriadku! ProsÃm skontroluj danú chybu other: NieÄo eÅ¡te stále nieje v poriadku! ProsÃm skontroluj vÅ¡etky %{count} nižšie uvedené pochybenia imports: + modes: + merge: SpojiÅ¥ dohromady + merge_long: Ponechaj existujúce záznamy a pridaj k nim nové + overwrite: PrepÃÅ¡ + overwrite_long: NahraÄ súÄasné záznamy s novými preface: MôžeÅ¡ nahraÅ¥ dáta ktoré si exportoval/a z iného Mastodon serveru, ako sú naprÃklad zoznamy ľudà ktorých sledujeÅ¡, alebo blokujeÅ¡. success: Tvoje dáta boli nahraté úspeÅ¡ne, a teraz budú spracované v danom Äase types: blocking: Zoznam blokovaných + domain_blocking: Zoznam blokovaných domén following: Zoznam sledovaných muting: Zoznam ignorovaných upload: NahraÅ¥ @@ -812,6 +822,7 @@ sk: development: Vývoj edit_profile: Uprav profil export: ExportovaÅ¥ dáta + featured_tags: Popredne zvýraznené haÅ¡tagy followers: Povolenà následovatelia import: ImportovaÅ¥ migrate: Presunutie úÄtu @@ -869,9 +880,9 @@ sk: <li><em>Základné informácie o úÄte</em>: Ak sa na tomto serveri zaregistrujeÅ¡, budeÅ¡ môcÅ¥ byÅ¥ požiadaný/á zadaÅ¥ prezývku, emailovú adresu a heslo. BudeÅ¡ tiež môcÅ¥ zadaÅ¥ aj ÄalÅ¡ie profilové údaje, ako naprÃklad meno a životopis, a nahraÅ¥ profilovú fotku aj obrázok v záhlavÃ. Tvoja prezývka, meno, životopis, profilová fotka a obrázok v záhlavà sú vždy zobrazené verejne.</li><li><em>PrÃspevky, sledovania a iné verejné informácie</em>: Zoznam ľudÃ, ktorých sledujeÅ¡ je zobrazený verejne, a to isté platà aj pre zoznam tvojÃch následovateľov. KeÄ poÅ¡leÅ¡ správu, ukladá sa jej dátum a Äas, ale aj z akej aplikácie bola poslaná. Správy môžu obsahovaÅ¥ mediálne prÃlohy, ako obrázky a videá. Verejné, a nezaradené prÃspevky sú verejne prÃstupné. KeÄ si pripneÅ¡ prÃspevok na svoj profil, toto je tiež verejne dostupnou informáciou. Tvoje prÃspevky sú takisto doruÄené tvojÃm sledovateľom, a to aj v rámci iných serverov, kde je potom uložená kópia tvojho prÃspevku. Ak vymažeÅ¡ prÃspevok, táto akcia bude takisto doruÄená tvojÃm sledovateľom. Vyzdvihnutie, alebo obľúbenie iného prÃspevku je vždy verejne viditeľné.</li> - <li><em>Priame prÃspevky, a prÃspevky iba pre sledovateľov</em>: VÅ¡etky prÃspevky sú uložené a spracované na serveri. PrÃspevky iba pre sledovateľov sú doruÄené tvojÃm sledovateľom a užÃvateľom ktorà sú v nich spomenutÃ, priÄom priame prÃspevky sú doruÄené iba tÃm užÃvateľom ktorà sú v nich spomenutÃ. V niektorých prÃpadoch to môže znamenaÅ¥, že tieto prÃspevkz sú doruÄené aj v rámci iných serverov, a kópie prÃspevkov sú na nich uložené. + <li><em>Priame prÃspevky, a prÃspevky urÄené iba pre sledovateľov</em>: VÅ¡etky prÃspevky sú uložené a spracované na serveri. PrÃspevky iba pre sledovateľov sú doruÄené tvojÃm sledovateľom a užÃvateľom ktorà sú v nich spomenutÃ, priÄom priame prÃspevky sú doruÄené iba tÃm užÃvateľom ktorà sú v nich spomenutÃ. V niektorých prÃpadoch to môže znamenaÅ¥, že tieto prÃspevkz sú doruÄené aj v rámci iných serverov, a kópie prÃspevkov sú na nich uložené. V dobrej viere robÃme vÅ¡etko preto, aby bol prÃstup k tÃmto prÃspevkom vymedzený iba pre oprávnených použÃvateľov, ale môže sa staÅ¥, že iné servery v tomto ohľade zlyhajú. Preto je dôležité prezrieÅ¥ si a zhodnotiÅ¥, na aké servery patria tvoji následovatelia. V nastaveniach si môžeÅ¡ zapnúť voľbu ruÄne povoľovaÅ¥ a odmietaÅ¥ nových následovateľov. - <em>ProsÃm maj na pamäti, že správcovia tvojho, aj vzdialeného obdŕžiavajúceho servera majú možnosÅ¥ vidieÅ¥ dané prÃspevky a správy, ale aj že obdŕžitelia týchto správ si ich môzu odfotiÅ¥, skopÃrovaÅ¥, alebo ich inak zdieľaÅ¥. <em>Nezdieľaj žiadne nebezpeÄné, alebo ohrozujúce správy pomocou Mastodonu!</em></li> + <em>ProsÃm maj na pamäti, že správcovia tvojho, aj vzdialeného obdŕžiavajúceho servera majú možnosÅ¥ vidieÅ¥ dané prÃspevky a správy, ale aj, že obdŕžitelia týchto správ si ich môzu odfotiÅ¥, skopÃrovaÅ¥, alebo ich inak zdieľaÅ¥. <em>Nezdieľaj žiadne nebezpeÄné, alebo ohrozujúce správy pomocou Mastodonu!</em></li> <li><em>IPky a iné metadáta</em>: KeÄ sa prihlásiÅ¡, zaznamenáva sa IP adresa z ktorej si sa prihlásil/a, takisto ako aj názov tvojho prehliadaÄa. VÅ¡etky zaznamenané sezóny sú pre teba dostupné na konktolu, alebo na zamietnutie prÃstupu v nastaveniach. Posledná použitá IP adresa je uložená až po dobu dvanástich mesiacov. Môžeme si tiež ponechaÅ¥ serverové záznamy, ktoré obsahujú IP adresu každej požiadavky na tento server.</li> </ul> @@ -881,16 +892,15 @@ sk: <h3 id="use">NaÄo sú tvoje údaje použÃvané?</h3> <p>Hociktorá z informáciÃ, ktoré sú o tebe zozbierané, môže byÅ¥ použité následujúcimi spôsobmi:</p> - <ul> - <li>Pre zabezpeÄenie základného fungovania Mastodonu. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.</li> - <li>Pre lepÅ¡ie moderovanie komunity sa naprÃklad môže tvoja IP adresa porovnaÅ¥ s ostatnými už známimi adresami, aby bolo možné zistiÅ¥, Äi nedochádza naprÃklad k obchádzaniu vylúÄenia, aleb k iným poruÅ¡eniam pravidiel.</li> - <li>Emailová adresa ktorú poskytneÅ¡ môže byÅ¥ použitá na zasielanie informáciÃ, oboznámenà keÄ ostatnà užÃvatelia interaktujú s tvojÃm obsahom, alebo na posielanie správ, odpovedà na otázky a iné požiadavky.</li> + <li>Pre zabezpeÄenie základného fungovania Mastodonu. NarábaÅ¥ s užÃvateľským obsahom iných, ako aj prispievaÅ¥ svoj vlastný obsah, možeÅ¡ len keÄ si prihlásený/á. MôžeÅ¡ naprÃklad následovaÅ¥ iných ľudÃ, aby si potom videl/a ich prÃspevky v rámci svojej osobne prispôsobenej domácej osi.</li> + <li>Pre lepÅ¡ie moderovanie komunity sa naprÃklad môže tvoja IP adresa porovnaÅ¥ s ostatnými už známimi adresami, aby bolo možné zistiÅ¥, Äi nedochádza naprÃklad k obchádzaniu pravidiel vylúÄenia, aleb k iným poruÅ¡eniam zásad.</li> + <li>Emailová adresa, ktorú poskytneÅ¡, môže byÅ¥ použitá na zasielanie informáciÃ, oboznámenà keÄ ostatnà užÃvatelia interaktujú s tvojÃm obsahom, alebo na posielanie správ, odpovedà na otázky a iné požiadavky.</li> </ul> title: Podmienky užÃvania, a pravidlá súkromia pre %{instance} themes: - contrast: Vysoký kontrast - default: Mastodon + contrast: Mastodon (vysoký kontrast) + default: Mastodon (tmavý) mastodon-light: Mastodon (svetlý) time: formats: @@ -920,7 +930,7 @@ sk: warning: explanation: disable: Pokiaľ je tvoj úÄet zamrazený, tvoje dáta zostávajú nedoknuté, ale nemôžeÅ¡ v rámci neho niÄ robiÅ¥, až kým nebude odomknutý. - silence: Kým je úÄet obmedzený, tvoje prÃspevky na tomto serveri uvidia iba tà ľudia, ktorà ťa už následujú, a môžeÅ¡ byÅ¥ vylúÄený/á z rôznych verejných záznamov. Ostatnà ťa vÅ¡ak stále budú môcÅ¥ následovaÅ¥ manuálne. + silence: Kým máš úÄet obmedzený, tvoje prÃspevky na tomto serveri uvidia iba tà ľudia, ktorà ťa už následujú, a môžeÅ¡ byÅ¥ vylúÄený/á z rôznych verejných záznamov. Ostatnà ťa vÅ¡ak stále budú môcÅ¥ následovaÅ¥ manuálne. suspend: Tvoj úÄet bol vylúÄený, a vÅ¡etky tvoje prÃspevky a nahraté médiálné súbory boli nenávratne zmazané z tohto serveru, a zo serverov na ktorých si mal následovateľov. review_server_policies: PrehodnoÅ¥ pravidlá servera subject: @@ -940,7 +950,7 @@ sk: final_action: ZaÄni prispievaÅ¥ final_step: 'ZaÄni pÃsaÅ¥! Aj bez následovateľov budú tvoje verejné prÃspevky videné ostatnými, naprÃklad na miestnej osi a pod haÅ¡tagmi. Ak chceÅ¡, môžeÅ¡ sa ostatným predstaviÅ¥ pod haÅ¡tagom #introductions.' full_handle: Adresa tvojho profilu v celom formáte - full_handle_hint: Toto je Äo musÃÅ¡ daÅ¥ vedieÅ¥ svojÃm priateľom aby ti mohli posielaÅ¥ správy, alebo Å¥a následovaÅ¥ z inej instancie. + full_handle_hint: Toto je Äo musÃÅ¡ daÅ¥ vedieÅ¥ svojÃm priateľom aby ti mohli posielaÅ¥ správy, alebo Å¥a následovaÅ¥ z iného serveru. review_preferences_action: ZmeniÅ¥ nastavenia review_preferences_step: Daj si záležaÅ¥ na svojÃch nastaveniach, naprÃklad že aké emailové notifikácie chceÅ¡ dostávaÅ¥, alebo pod aký level súkromia sa tvoje prÃspevky majú sami automaticky zaradiÅ¥. Pokiaľ nemáš malátnosÅ¥ z pohybu, môžeÅ¡ si zvoliÅ¥ aj automatické spúšťanie GIF animáciÃ. subject: Vitaj na Mastodone diff --git a/config/locales/sq.yml b/config/locales/sq.yml index e583b9309f..b542ffc973 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1,23 +1,33 @@ --- sq: about: + about_hashtag_html: Këto janë mesazhe publike të etiketuar me <strong>#%{hashtag}</strong>. Mundeni të ndërveproni me ta, nëse keni një llogari kudo qoftë në fediverse. + about_mastodon_html: Mastodon-i është një rrjet shoqëror i bazuar në protokolle web të hapur dhe në software të lirë, me burim të hapur. Është i decentralizuar, si email-ii. about_this: Mbi administered_by: 'Administruar nga:' api: API apps: Aplikacione për celular + closed_registrations: Hëpërhë regjistrimet në këtë shërbyes janë të mbyllura. Por! Mund të gjeni një shërbyes tjetër për të krijuar një llogari dhe të mund të përdorni andej pikërisht të njëjtin rrjet të këtushëm. contact: Kontakt contact_missing: I parregulluar contact_unavailable: N/A documentation: Dokumentim + extended_description_html: | + <h3>Një vend i mirë për rregulla</h3> + <p>Përshkrimi i zgjeruar s’është sajuar ende.</p> features: + humane_approach_body: Duke nxjerrë mësime nga dështimet e rrjeteve të tjera, Mastodon-i synon të bëjë zgjedhje konceptuale etike, për të luftuar keqpërdorimin e mediave shoqërore. humane_approach_title: Një trajtim më njerëzor + not_a_product_body: Mastodon-i s’është rrjet komercial. Pa reklama, pa monetarizim të dhënash, pa gardhe. S’ka autoritet qendror. not_a_product_title: Jeni një person, jo një produkt + real_conversation_body: Me 500 shenja në dorën tuaj për t’i përdorur dhe mbulim për sinjalizime të imta lidhur me lëndën dhe median, mund të shpreheni ashtu si dëshironi. real_conversation_title: Ndërtuar për bashkëbisedim të njëmendtë + within_reach_body: Aplikacione të shumtë, për iOS, Android, dhe të tjera platforma, falë një ekosistemi API miqësor ndaj zhvilluesve, ju lejojnë të mbani lidhje me miqtë tuaj kudo. within_reach_title: Përherë i kapshëm generic_description: "%{domain} është një shërbyes te rrjeti" hosted_on: Mastodon i strehuar në %{domain} learn_more: Mësoni më tepër - other_instances: Listë instancash + other_instances: Listë shërbyesish privacy_policy: Rregulla privatësie source_code: Kod burim status_count_after: @@ -38,10 +48,20 @@ sq: following: Ndjekje joined: U bë pjesë më %{date} last_active: aktiv së fundi + link_verified_on: Pronësia e kësaj lidhjeje qe kontrolluar më %{date} media: Media + moved_html: "%{name} ka kaluar te %{new_profile_link}:" + network_hidden: Këto të dhëna nuk mund të kihen nothing_here: S’ka gjë këtu! people_followed_by: Persona të ndjekur nga %{name} people_who_follow: Persona që ndjekin %{name} + pin_errors: + following: Duhet ta ndiqni tashmë personin që doni të pasqyroni + posts: + one: Mesazh + other: Mesazhe + posts_tab_heading: Mesazhe + posts_with_replies: Mesazhe dhe përgjigje reserved_username: Emri i përdoruesit është i ruajtur për dikë roles: admin: Përgjegjës @@ -51,6 +71,7 @@ sq: admin: account_actions: action: Kryeje veprimin + title: Kryeni veprim moderimi te %{acct} account_moderation_notes: create: Lini një shënim created_msg: Shënimi i moderimit u krijua me sukses! @@ -98,9 +119,11 @@ sq: title: Vendndodhje login_status: Gjendje hyrjeje media_attachments: Bashkëngjitje media + memorialize: Shndërroje në përkujtimore moderation: active: Aktiv all: Krejt + silenced: U heshtua suspended: Të pezulluara title: Moderim moderation_notes: Shënime moderimesh @@ -111,6 +134,7 @@ sq: outbox_url: URL Mesazhesh të Dërguar perform_full_suspension: Pezulloje profile_url: URL profili + promote: Promovojeni protocol: Protokoll public: Publike push_subscription_expires: Pajtimi PuSH skadon më @@ -121,6 +145,7 @@ sq: already_confirmed: Ky përdorues është i ripohuar tashmë send: Ridërgo email ripohimi success: Email-i i ripohimit u dërgua me sukses! + reset: Riktheje te parazgjedhjet reset_password: Ricaktoni fjalëkalimin resubscribe: Ripajtohuni role: Leje @@ -130,10 +155,12 @@ sq: staff: Staf user: Përdorues search: Kërkoni + shared_inbox_url: URL kutie të përbashkët mesazesh show: - created_reports: Ka bërë raporte + created_reports: Ka bërë raportime targeted_reports: Raportuar nga të tjerë - silence: Heshtje + silence: Heshtoje + silenced: E heshtuar statuses: Gjendje subscribe: Pajtomë suspended: Të pezulluara @@ -147,6 +174,7 @@ sq: web: Web action_logs: actions: + assigned_to_self_report: "%{name} ia kaloi raportimin %{target} në ngarkim vetvetes" change_email_user: "%{name} ndryshoi adresën email të përdoruesit %{target}" confirm_user: "%{name} ripohoi adresën email të përdoruesit %{target}" create_account_warning: "%{name} dërgoi një sinjalizim për %{target}" @@ -156,23 +184,33 @@ sq: demote_user: "%{name} zhgradoi përdoruesin %{target}" destroy_custom_emoji: "%{name} asgjësoi emotikonin %{target}" destroy_domain_block: "%{name} zhbllokoi përkatësinë %{target}" + destroy_email_domain_block: "%{name} e shtoi në listë të lejuarash përkatësinë %{target}" + destroy_status: "%{name} hoqi gjendje nga %{target}" disable_2fa_user: "%{name} çaktivizoi domosdoshmëritë për dyfaktorësh për përdoruesin %{target}" disable_custom_emoji: "%{name} çaktivizoi emotikonin %{target}" disable_user: "%{name} çaktivizoi hyrje për përdoruesin %{target}" enable_custom_emoji: "%{name} aktivizoi emotikonin %{target}" enable_user: "%{name} aktivizoi hyrje për përdoruesin %{target}" + memorialize_account: "%{name} e shndërroi llogarinë e %{target} në një faqe përkujtimore" promote_user: "%{name} gradoi përdoruesin %{target}" remove_avatar_user: "%{name} hoqi avatarin e %{target}" - reopen_report: "%{name} rihapi raportin %{target}" + reopen_report: "%{name} rihapi raportimin %{target}" reset_password_user: "%{name} ricaktoi fjalëkalimi për përdoruesin %{target}" + resolve_report: "%{name} zgjidhi raportimin %{target}" silence_account: "%{name} heshtoi llogarinë e %{target}" suspend_account: "%{name} pezulloi llogarinë e %{target}" + unassigned_report: "%{name} rihapi raportimin %{target}" unsilence_account: "%{name} hoqi heshtimin për llogarinë %{target}" unsuspend_account: "%{name} hoqi pezullimin për llogarinë e %{target}" update_custom_emoji: "%{name} përditësoi emotikonin %{target}" + update_status: "%{name} përditësoi gjendjen me %{target}" + deleted_status: "(fshiu gjendjen)" + title: Auditim regjistri custom_emojis: by_domain: Përkatësi + copied_msg: Kopja vendore e emotikonëve u krijua me sukses copy: Kopjoje + copy_failed_msg: S’u bë dot një kopje vendore e emotikoneve created_msg: Emotikoni u krijua me sukses! delete: Fshije destroyed_msg: Emotikoni u asgjësua me sukses! @@ -182,21 +220,29 @@ sq: enable: Aktivizoje enabled_msg: Ai emotikon u aktivizua me sukses image_hint: PNG deri 50KB + listed: Në listë new: title: Shtoni emotikon të ri vetjak overwrite: Mbishkruaje shortcode: Kod i shkurtër + shortcode_hint: Të paktën 2 shenja, vetëm shenja alfanumerike dhe nënvija title: Emotikone vetjake + unlisted: Hequr prej liste update_failed_msg: S’u përditësua dot ai emotikon updated_msg: Emotikoni u përditësua me sukses! upload: Ngarkoje dashboard: + backlog: punë të prapambetura config: Formësim + feature_deletions: Fshirje llogarish feature_invites: Lidhje ftesash feature_profile_directory: Drejtori profilesh feature_registrations: Regjistrime feature_relay: Rele federimi features: Veçori + hidden_service: Federim me shërbime të fshehura + open_reports: raportime të hapur + recent_users: Përdorues së fundi search: Kërko tekstin e plotë single_user_mode: Mënyrë me përdorues të vetëm software: Software @@ -204,7 +250,7 @@ sq: title: Pult total_users: përdorues gjithsej trends: Tendenca - week_interactions: Ndërveprime këtë javë + week_interactions: ndërveprime këtë javë week_users_active: aktivë këtë javë week_users_new: përdorues këtë javë domain_blocks: @@ -214,25 +260,50 @@ sq: domain: Përkatësi new: create: Krijoni bllokim + hint: Bllokimi i përkatësisë nuk do të pengojë krijim zërash llogarie te baza e të dhënave, por do të aplikojë në mënyrë retroaktive dhe të vetvetishme metoda specifike moderimi mbi këto llogari. severity: + desc_html: "<strong>Heshtja</strong> do t’i bëjë postimet e llogarisë të padukshme për këdo që nuk i ndjek ato. <strong>Pezullimi</strong> do të heqë krejt lëndën e llogarisë, media, dhe të dhëna profili. Përdorni <strong>Asnjë</strong>, nëse thjesht doni të mos pranohen kartela media." noop: Asnjë - silence: Heshtje + silence: Heshtoji suspend: Pezulloje - title: Shtoni Bllokim i ri përkatësie + title: Bllokim i ri përkatësie + reject_media: Mos prano kartela media + reject_media_hint: Heq kartela media të depozituara lokalisht dhe nuk pranon të shkarkohen të tilla në të ardhmen. Pa peshë për pezullimet + reject_reports: Hidh tej raportimet + reject_reports_hint: Shpërfillini krejt raportimet e ardhura nga kjo përkatësi. Pa peshë për pezullimet + rejecting_media: mospranim kartelash media + rejecting_reports: mospranim raportimesh + severity: + silence: e heshtuar + suspend: e pezulluar show: - affected_accounts: Pat ndikim te një llogari në bazën e të dhënave + affected_accounts: + one: Pat ndikim te një llogari në bazën e të dhënave + other: Pat ndikim te %{count} llogari në bazën e të dhënave + retroactive: + silence: Hiqu heshtimin krejt llogarive ekzistuese nga kjo përkatësi + suspend: Hiqu pezullimin krejt llogarive ekzistuese nga kjo përkatësi + title: Zhbëje bllokimin e përkatësisë për %{domain} undo: Zhbëje undo: Zhbëje bllokimin e përkatësisë email_domain_blocks: add_new: Shtoni të ri + created_msg: Përkatësia email u shtua me sukses te lista e bllokimeve delete: Fshije + destroyed_msg: Përkatësia email u fshi me sukses nga lista e bllokimeve domain: Përkatësi new: create: Shtoni përkatësi + title: Zë i ri email në listë bllokimesh + title: Listë bllokimesh email-esh followers: back_to_account: Mbrapsht Te Llogaria title: Ndjekës të %{acct} instances: + delivery_available: Ka shpërndarje të mundshme + known_accounts: + one: "%{count} llogari e njohur" + other: "%{count} llogari të njohura" moderation: all: Krejt limited: E kufizuar @@ -247,20 +318,23 @@ sq: deactivate_all: Çaktivizoji krejt filter: all: Krejt - expired: Ka skaduar + available: I përdorshëm + expired: I skaduar title: Filtër title: Ftesa relays: add_new: Shtoni rele të re delete: Fshije + description_html: Një <strong>rele federimesh</strong> është një shërbyes ndërmjetës që shkëmben vëllime të mëdha mesazhesh publike mes shërbyesve që janë pajtuar në të dhe publikojnë në të. <strong>Mund t’u vijë në ndihmë shërbyesve të vegjël dhe të mesëm të gjejnë lëndë nga fediversi</strong>, gjë që përndryshe do të kërkonte që përdoruesit vendorë të ndiqnin dorazi persona të tjerë nëpër shërbyes të largët. disable: Çaktivizoje disabled: E çaktivizuar enable: Aktivizoje + enable_hint: Pasi të aktivizohet, shërbyesi juaj do të pajtohet te krejt mesazhet publike prej kësaj releje, dhe do të fillojë të dërgojë në të mesazhet publike të këtij shërbyesi. enabled: E aktivizuar inbox_url: URL releje pending: Në pritje të miratimit të relesë save_and_enable: Ruaje dhe aktivizoje - setup: Ujdisni një lidhje rele + setup: Ujdisni një lidhje releje status: Gjendje title: Rele report_notes: @@ -269,10 +343,11 @@ sq: reports: account: note: shënim - report: Raportoje - action_taken_by: 'Veprimi i ndërmarrë nga ' + report: raportojeni + action_taken_by: Veprimi i ndërmarrë nga are_you_sure: A jeni i sigurt? assign_to_self: Caktojani vetes + assigned: Iu caktua moderator comment: none: Asnjë created_at: Raportuar më @@ -283,38 +358,83 @@ sq: create_and_resolve: Zgjidhe me shënim create_and_unresolve: Rihape me shënim delete: Fshije + placeholder: Përshkruani ç’veprime janë ndërmarrë, ose çfarëdo përditësimi tjetër që lidhet me të… reopen: Rihape raportimin report: 'Raportim #%{id}' reported_account: Llogari e raportuar reported_by: Raportuar nga + resolved: I zgjidhur + resolved_msg: Raportimi u zgjidh me sukses! status: Gjendje title: Raportime + unassign: Hiqja unresolved: Të pazgjidhur updated_at: U përditësua më settings: + activity_api_enabled: + desc_html: Numër gjendjesh të postuara lokalisht, përdorues aktivë, dhe regjistrime të reja në kosha javorë + title: Botoni statistika përmbledhëse mbi veprimtarinë e përdoruesve + bootstrap_timeline_accounts: + desc_html: Emrat e përdoruesve ndajini prej njëri-tjetrit me presje. Do të funksionojë vetëm për llogari vendore dhe të pakyçura. Si parazgjedhje, kur lihet e zbrazët, është krejt përgjegjësit vendorë. + title: Ndjekje parazgjedhje për përdorues të rinj + contact_information: + email: Email biznesi + username: Emër përdoruesi kontakti custom_css: + desc_html: Modifikojeni pamjen me CSS të nagrkuar në çdo faqe title: CSS Vetjake + hero: + desc_html: E shfaqur në faqen ballore. Këshillohet të paktën 600x100px. Kur nuk caktohet gjë, përdoret miniaturë e shërbyesit + title: Figurë heroi mascot: + desc_html: E shfaqur në faqe të shumta. Këshillohet të paktën 293x205. Kur nuk caktohet gjë, përdoret simboli parazgjedhje title: Figurë simboli peers_api_enabled: - title: Boto listë instancash të zbuluara + desc_html: Emra përkatësish që ka hasur në fedivers ky shërbyes + title: Boto listë shërbyesish të gjetur + preview_sensitive_media: + desc_html: Në sajte të tjera, paraparjet e lidhjeve do të shfaqin një miniaturë, edhe pse medias i është vënë shenjë si rezervat + title: Shfaq në paraparje OpenGraph media me shenjën rezervat profile_directory: desc_html: Lejoju përdoruesve të jenë të zbulueshëm title: Aktivizo drejtori profilesh registrations: + closed_message: + desc_html: E shfaqur në faqen ballore, kur regjistrimet janë të mbyllura. Mund të përdorni etiketa HTML + title: Mesazh mbylljeje regjistrimesh + deletion: + desc_html: Lejo këdo të fshijë llogarinë e vet + title: Hapni fshirje llogarie + min_invite_role: + disabled: Asnjë + title: Lejo vetëm me ftesa open: - title: Hap regjistrim + desc_html: Lejo cilindo të krijojë llogari + title: Hapni regjistrimin + show_known_fediverse_at_about_page: + desc_html: Kur përdoret, do të shfaqë mesazhe prej krejt fediversit të njohur, si paraparje. Përndryshe do të shfaqë vetëm mesazhe vendore. + title: Shfaq te paraparja e rrjedhës kohore fedivers të njohur show_staff_badge: desc_html: Shfaq një stemë stafi në faqen e një përdoruesi title: Shfaq stemë stafi site_description: - title: Përshkrim instance + desc_html: Paragraf hyrës te faqja ballore. Përshkruani ç’e bën special këtë shërbyes Mastodon dhe çfarëdo gjëje tjetër të rëndësishme. Mund të përdorni etiketa HTML, veçanërisht <code><a></code> dhe <code><em></code>. + title: Përshkrim shërbyesi + site_description_extended: + desc_html: Një vend i mirë për kodin e sjelljes në shërbyesin tuaj, rregulla, udhëzime dhe gjëra të tjera që e bëjnë të veçantë këtë shërbyes. Mund të përdorni etiketa HTML + title: Informacion i zgjeruar vetjak + site_short_description: + desc_html: E shfaqur në anështyllë dhe etiketa meta. Përshkruani në një paragraf të vetëm ç’është Mastodon-i dhe ç’e bën special këtë shërbyes. Në u lëntë i zbrazët, për shërbyesin do të përdoret përshkrimi parazgjedhje. + title: Përshkrim i shkurtër shërbyesi site_terms: + desc_html: Mund të shkruani rregullat tuaja të privatësisë, kushtet e shërbimit ose gjëra të tjera ligjore. Mund të përdorni etiketa HTML title: Kushte vetjake shërbimi - site_title: Emër instance + site_title: Emër shërbyesi thumbnail: - title: Miniaturë instance + desc_html: I përdorur për paraparje përmes OpenGraph-it dhe API-t. Këshillohet 1200x630px + title: Miniaturë shërbyesi timeline_preview: + desc_html: Shfaqni rrjedhë kohore publike te faqja ardhjesh title: Paraparje rrjedhe kohore title: Rregullime sajti statuses: @@ -332,7 +452,10 @@ sq: with_media: Me media subscriptions: callback_url: URL Callback-u + confirmed: U ripohua expires_in: Skadon më + last_delivery: Dorëzimi e fundit + title: WebSub topic: Temë tags: accounts: Llogari @@ -347,9 +470,12 @@ sq: add_new: Shtoni të ri delete: Fshije edit: Përpunoni + edit_preset: Përpunoni sinjalizim të paracaktuar + title: Administroni sinjalizime të paracaktuara admin_mailer: new_report: body: "%{reporter} ka raportuar %{target}" + body_remote: Dikush nga %{domain} ka raportuar %{target} subject: Raport i ri për %{instance} (#%{id}) application_mailer: notification_preferences: Ndryshoni parapëlqime email-i @@ -363,13 +489,18 @@ sq: destroyed: Aplikacioni u fshi me sukses invalid_url: URL-ja e dhënë është e pavlefshme regenerate_token: Riprodho token hyrjesh + token_regenerated: Token-i i hyrjeve u riprodhuan me sukses + warning: Hapni sytë me ato të dhëna. Mos ia jepni kurrë njeriu! your_token: Token-i juaj për hyrje auth: + agreement_html: Duke klikuar mbi "Regjistrohuni" më poshtë, pajtoheni të ndiqni <a href="%{rules_path}">rregullat e shërbyesit</a> dhe <a href="%{terms_path}">kushtet tona të shërbimit</a>. change_password: Fjalëkalim confirm_email: Ripohoni email-in delete_account: Fshije llogarinë + delete_account_html: Nëse dëshironi të fshihni llogarinë tuaj, mund <a href="%{path}">ta bëni që këtu</a>. Do t’ju kërkohet ta ripohoni. didnt_get_confirmation: S’morët udhëzime ripohimi? forgot_password: Harruat fjalëkalimin tuaj? + invalid_reset_password_token: Token-i i ricaktimit të fjalëkalimit është i pavlefshëm ose ka skaduar. Ju lutemi, kërkoni një të ri. login: Hyni logout: Dalje migrate_account: Kaloni në një tjetër llogari @@ -378,6 +509,7 @@ sq: or_log_in_with: Ose bëni hyrjen me providers: cas: CAS + saml: SAML register: Regjistrohuni register_elsewhere: Regjistrohuni në një tjetër shërbyes resend_confirmation: Ridërgo udhëzime ripohimi @@ -386,11 +518,14 @@ sq: set_new_password: Caktoni fjalëkalim të ri authorize_follow: already_following: E ndiqni tashmë këtë llogari + error: Mjerisht, pati një gabim gjatë kërkimit të llogarisë së largët follow: Ndiqeni follow_request: 'Keni dërguar një kërkesë ndjekjeje te:' following: 'Sukses! Tani e ndiqni:' post_follow: + close: Ose, thjesht mund të mbyllni këtë dritare. return: Shfaq profilin e përdoruesit + web: Kalo në web title: Ndiq %{acct} datetime: distance_in_words: @@ -407,34 +542,65 @@ sq: x_months: "%{count}mj" x_seconds: "%{count}s" deletes: + bad_password_msg: Provë e bukur, trimosha! Fjalëkalim i pasaktë + confirm_password: Jepni fjalëkalimin tuaj të tanishëm që të verifikohet identiteti juaj + description_html: Kjo të heqë <strong>në mënyrë të përhershme, të pakthyeshme</strong> lëndë nga llogaria juaj dhe do ta çaktivizojë atë. Emri juaj i përdoruesit do të mbetet i rezervuar për të shmangur sozi të ardhme. proceed: Fshini llogarinë + success_msg: Llogaria juaj u fshi me sukses + warning_html: Garantohet vetëm fshirja e lëndës prej këtij shërbyesi të veçantë. Lënda që është ndarë gjerësisht me të tjerët ka gjasa të lërë gjurmë. Shërbyesit <em>offline</em> dhe shërbyesit që janë shpajtuar prej përditësimeve tuaja, s’do t’i përditësojnë bazat e tyre të të dhënave. + warning_title: Mund të ketë lëndë të përhapur directories: directory: Drejtori profilesh + enabled: Gjendeni te lista e drejtorisë. + enabled_but_waiting: Keni zgjedhur të jeni pjesë e drejtorisë, por ende s’keni numrin minimum të ndjekësve (%{min_followers}) për përfshirje në të. + explanation: Zbuloni përdorues bazuar në interesat e tyre explore_mastodon: Eksploroni %{title} + how_to_enable: S’keni zgjedhur të jeni i pranishëm te drejtoria. Mund ta bëni më poshtë. Përdorni te teksti i jetëshkrimit tuaj hashtagë, për t’u përfshirë nën hashtagë specifikë! people: one: "%{count} person" other: "%{count} persona" errors: '403': S’keni leje të shihni këtë faqe. - '404': Faqja që po kërkonit, nuk ekziston. - '410': Faqja që po kërkonit, nuk ekziston më. + '404': Faqja që po kërkonit, s’gjendet këtu. + '410': Faqja që po kërkonit, s’gjendet më këtu. '422': + content: Verifikimi i sigurisë dështoi. Mos i bllokoni gjë cookie-t? title: Verifikimi i sigurisë dështoi + '429': Shumë kërkesa të bëra brenda një intervali të dhënë '500': + content: Na ndjeni, diçka shkoi ters në anën tonë. title: Kjo faqe s’është e saktë + noscript_html: Që të përdorni aplikacionin web Mastodon, ju lutemi, aktivizoni JavaScript-in. Ndryshe, provoni për Mastodon-in një nga <a href="%{apps_path}">aplikacionet e brendshëm</a> të platformës tuaj. exports: archive_takeout: date: Datë + download: Shkarkoni arkivin tuaj + hint_html: Mund të kërkoni një arkiv të <strong>mesazheve tuaja dhe medias së ngarkuar</strong> nga ju. Të dhënat e eksportuara do të jenë në formatin ActivityPub, të lexueshme nga cilido software i përputhshëm me të. Mund të kërkoni arkiv çdo 7 ditë. + in_progress: Po përpilohet arkivi juaj… + request: Kërkoni arkivin tuaj size: Madhësi + blocks: Bllokoni csv: CSV + domain_blocks: Bllokime përkatësish + follows: Ndiqni lists: Lista + mutes: Heshtoni storage: Depozitim për media + featured_tags: + add_new: Shtoni të re + errors: + limit: Keni përdorur tashmë si të zgjedhur sasinë maksimum të hashtagëve filters: contexts: + home: Rrjedhë kohore vetjake notifications: Njoftime + public: Rrjedha publike kohore thread: Biseda edit: title: Përpunoni filtër + errors: + invalid_context: Ose s’u dha fare, ose u dha kontekst i pavlefshëm + invalid_irreversible: Filtrim i pakthyeshëm funksionon vetëm me kontekste <em>home</em> ose njoftimesh index: delete: Fshije title: Filtra @@ -442,8 +608,15 @@ sq: title: Shtoni filtër të ri followers: domain: Përkatësi + explanation_html: Nëse doni të garantoni privatësinë e gjendjeve tuaja, duhet të jeni në dijeni se cilët ju ndjekin. <strong>Gjendjet tuaja private u dërgohen krejt shërbyes ku keni ndjekës</strong>. Mund të donit t’i rishqyrtoni ato, dhe të hiqni ndjekës, nëse nuk besoni se privatësia juaj respektohet nga stafi apo software-i i këtyre shërbyesve. followers_count: Numër ndjekësish + lock_link: Kyçeni llogarinë tuaj purge: Hiqe nga ndjekësit + success: + one: Në përmbushje e sipër të bllokimit të butë të ndjekësve nga një përkatësi… + other: Në përmbushje e sipër të bllokimit të butë të ndjekësve nga %{count} përkatësi… + true_privacy_html: Ju lutemi, kini parasysh se <strong>privatësi e vërtetë mund të arrihet vetëm me fshehtëzim skaj-më-skaj</strong>. + unlocked_warning_html: Mund t’ju ndjekë cilido, që të shohë menjëherë gjendjet tuaja private. %{lock_link} që të jeni në gjendje të shqyrtoni dhe hidhni poshtë ndjekës. unlocked_warning_title: Llogaria juaj s’është kyçur footer: developers: Zhvillues @@ -453,10 +626,27 @@ sq: changes_saved_msg: Ndryshimet u ruajtën me sukses! copy: Kopjoje save_changes: Ruaji ndryshimet + validation_errors: + one: Diçka s’është ende si duhet! Ju lutemi, shqyrtoni gabimin më poshtë + other: Diçka s’është ende si duhet! Ju lutemi, shqyrtoni %{count} gabimet më poshtë imports: + modes: + merge: Përzieji + merge_long: Mbaji zërat ekzistues dhe shto të rinjtë + overwrite: Mbishkruaje + overwrite_long: Zëvendësoji zërat ekzistues me të rinjtë + preface: Mund të importoni të dhëna që keni eksportuar nga një shërbyes tjetër, bie fjala, një listë të personave që ndiqni ose bllokoni. + success: Të dhënat tuaja u ngarkuan me sukses dhe tani do të përpunohet në kohë types: blocking: Listë bllokimesh + domain_blocking: Listë bllokimesh përkatësish + following: Listë ndjekjesh + muting: Listë heshtimesh + upload: Ngarkoje + in_memoriam_html: In Memoriam. invites: + delete: Çaktivizoje + expired: Ka skaduar expires_in: '1800': 30 minuta '21600': 6 orë @@ -471,25 +661,59 @@ sq: one: 1 përdorim other: "%{count} përdorime" max_uses_prompt: Pa kufi + prompt: Prodhoni dhe ndani me të tjerët lidhje për të akorduar hyrje në këtë shërbyes table: expires_at: Skadon më uses: Përdorime title: Ftoni njerëz + lists: + errors: + limit: Keni mbërritur në numrin maksimum të sasisë së listave + media_attachments: + validations: + images_and_video: S’mund të bashkëngjitet video te një gjendje që përmban figura tashmë + too_many: S’mund të bashkëngjiten më shumë se 4 kartela migrations: + acct: emërpërdoruesi@përkatësi e llogarisë së re + currently_redirecting: 'Profili juaj është caktuar të ridrejtojë te:' proceed: Ruaje + updated_msg: Rregullimi juaj për migrim llogarish u përditësua me sukses! moderation: title: Moderim notification_mailer: digest: action: Shihini krejt njoftimet + body: Ja një përmbledhje e shkurtër e mesazheve që keni humbur që nga vizita juaj e fundit më %{since} + mention: "%{name} ju ka përmendur te:" + new_followers_summary: + one: Veç kësaj, u bëtë me një ndjekës të ri, teksa s’ishit këtu! Ëhë! + other: Veç kësaj, u bëtë me %{count} ndjekës të rinj, teksa s’ishit këtu! Shkëlqyeshëm! + subject: + one: "1 njoftim i ri që nga vizita juaj e fundit \U0001F418" + other: "%{count} 1 njoftime të reja që nga vizita juaj e fundit \U0001F418" + title: Gjatë mungesës tuaj… favourite: + body: 'Gjendja juaj u parapëlqye nga %{name}:' + subject: "%{name} parapëlqeu gjendjen tuaj" title: E parapëlqyer e re follow: + body: Tani ju ndjek %{name}! + subject: Tani ju ndjek %{name} title: Ndjekës i ri + follow_request: + action: Administroni kërkesa ndjekjeje + body: "%{name} ka kërkuar t’ju ndjekë" + subject: 'Ndjekës pezull: %{name}' + title: Kërkesë e re ndjekjeje mention: + action: Përgjigjuni body: 'U përmendët nga %{name} në:' subject: U përmendët nga %{name} title: Përmendje e re + reblog: + body: 'Gjendja juaj u përforcua nga %{name}:' + subject: "%{name} përforcoi gjendjen tuaj" + title: Përforcim i ri number: human: decimal_units: @@ -501,19 +725,46 @@ sq: thousand: K trillion: T pagination: + newer: Më të ri + next: Pasuesi + older: Më të vjetër + prev: I mëparshmi truncate: "…" preferences: languages: Gjuhë other: Tjetër publishing: Publikim web: Web + remote_follow: + acct: Jepni çiftin tuaj emërpërdoruesi@përkatësi prej të cilit doni që të veprohet + missing_resource: S’u gjet dot URL-ja e domosdoshme e ridrejtimit për llogarinë tuaj + no_account_html: S’keni llogari? Mund të <a href='%{sign_up_path}' target='_blank'>regjistroheni këtu</a> + proceed: Ripohoni ndjekjen + prompt: 'Do të ndiqni:' + reason_html: "<strong>Pse është i domosdoshëm ky hap?</strong> <code>%{instance}</code> mund të mos jetë shërbyesi ku jeni regjistruar, ndaj na duhet t’ju ridrejtojmë së pari te shërbyesi juaj Home." + remote_interaction: + favourite: + proceed: Ripohoni parapëlqimin + prompt: 'Doni të parapëlqeni këtë mesazh:' + reblog: + proceed: Ripohoni përforcimin + prompt: 'Doni të përforconi këtë mesazh:' + reply: + proceed: Ripohoni përgjigjen + prompt: 'Doni t’i përgjigjeni këtij mesazhi:' remote_unfollow: error: Gabim title: Titull + unfollowed: U hoq ndjekja + scheduled_statuses: + over_daily_limit: Keni tejkaluar kufirin e %{limit} mesazheve të planifikuara për atë ditë + over_total_limit: Keni tejkaluar kufirin prej %{limit} mesazhesh të planifikuara + too_soon: Data e planifikimit duhet të bjerë në të ardhmen sessions: activity: Veprimtaria e fundit browser: Shfletues browsers: + alipay: Alipay blackberry: Blackberry chrome: Chrome edge: Microsoft Edge @@ -532,6 +783,7 @@ sq: weibo: Weibo current_session: Sesioni i tanishëm description: "%{browser} në %{platform}" + explanation: Këta janë shfletuesit e futur në këtë çast te llogaria juaj Mastodon. ip: IP platforms: adobe_air: Adobe Air @@ -547,6 +799,7 @@ sq: windows_mobile: Windows Mobile windows_phone: Windows Phone revoke: Shfuqizoje + revoke_success: Sesioni u shfuqizua me sukses title: Sesione settings: authorized_apps: Aplikacione të autorizuara @@ -555,58 +808,203 @@ sq: development: Zhvillim edit_profile: Përpunoni profilin export: Eksportim të dhënash + featured_tags: Hashtagë të zgjedhur followers: Ndjekës të autorizuar import: Importo migrate: Migrim llogarie notifications: Njoftime preferences: Parapëlqime settings: Rregullime + two_factor_authentication: Mirëfilltësim Dyfaktorësh your_apps: Aplikacionet tuaja statuses: attached: + description: 'Bashkëngjitur: %{attached}' image: one: "%{count} figurë" other: "%{count} figura" video: one: "%{count} video" other: "%{count} video" + boosted_from_html: Përforcuar nga %{acct_link} content_warning: 'Sinjalizim lënde: %{warning}' + disallowed_hashtags: + one: 'përmbante një hashtag të palejuar: %{tags}' + other: 'përmbante hashtagët e palejuar: %{tags}' + language_detection: Zbulo gjuhë vetvetiu + open_in_web: Hape në internet + over_character_limit: u tejkalua kufi shenjash prej %{max} + pin_errors: + limit: Keni fiksuar tashmë numrin maksimum të mesazheve + ownership: S’mund të fiksohen mesazhet e të tjerëve + private: S’mund të fiksohet mesazh jopublik + reblog: S’mund të fiksohet një përforcim show_more: Shfaq më tepër + sign_in_to_participate: Bëni hyrjen, që të merrni pjesë te biseda title: '%{name}: "%{quote}"' visibilities: private: Vetëm ndjekësve private_long: Shfaqua vetëm ndjekësve public: Publike public_long: Mund ta shohë kushdo + unlisted: Jo në listë + unlisted_long: Mund ta shohë gjithkush, por s’gjendet në rrjedha publike kohore + stream_entries: + pinned: Mesazh i fiksuar + reblogged: të përforcuara + sensitive_content: Lëndë me spec + terms: + body_html: | + <h2>Rregulla Privatësie</h2> + <h3 id="collect">Ç’të dhëna grumbullojmë?</h3> + + <ul> + <li><em>Të dhëna bazë llogarie</em>: Nëse regjistroheni në këtë shërbyes, mund t’ju kërkohet të jepni një emër përdoruesi, një adresë email dhe një fjalëkalim. Mundet të jepni edhe të dhëna shtesë profili, të tilla si emër në ekran dhe jetëshkrim, dhe të ngarkoni një foto profili dhe figurë kryesh. Emri i përdoruesit, emri për në ekran, jetëshkrimi, fotoja e profilit dhe figura për kryet shfaqen përherë publikisht.</li> + <li><em>Postime, ndjekje dhe të tjera të dhëna publike</em>: Lista e personave që ndiqni shfaqet publikisht, po njësoj edhe ajo e ndjekësve tuaj. Kur parashtroni një mesazh, depozitohet data dhe koha, si dhe aplikacioni prej nga u parashtrua mesazhi. Mesazhet mund të përmbajnë bashkëngjitje media, bie fjala, foto dhe video. Postimet publike dhe ato të pashfaqura janë të passhme publikisht. Kur një postim e vini të zgjedhur në profilin tuaj, edhe ky është informacion i passhëm publikisht. Postimet tuaja janë u dërgohen ndjekësve tuaj, në disa raste kjo do të thotë se dërgohen në shërbyes të ndryshëm dhe në ta depozitohen kopje të tyre. Kur fshini postime, edhe kjo u dërgohet ndjekësve tuaj. Veprimi i riblogimit apo i parapëlqimit të një postimi tjetër është përherë publik.</li> + <li><em>Postime të drejtpërdrejta dhe ato vetëm për ndjekësit</em>: Krejt postimet depozitohen dhe trajtohen te shërbyesi. Postimet vetëm për ndjekës u dërgohen ndjekësve tuaj të cilët përmenden në to, dhe postimet e drejtpërdrejta u dërgohen vetëm përdoruesve të përmendur në to. Në disa raste kjo do të thotë se dërgohen në shërbyes të ndryshëm dhe në ta depozitohen kopje të tyre. Përpiqemi pa hile të kufizojmë hyrjen në këto postime vetëm të personave të autorizuar, por shërbyesit e tjerë mund të mos bëjnë të njëjtën gjë. Ndaj është e rëndësishme të shqyrtoni shërbyesit pjesë e të cilëve janë ndjekësit tuaj. Te rregullimet mund të përdorni një mundësi për të miratuar ose hedhur poshtë dorazi ndjekës të rinj. <em>Ju lutemi, mbani parasysh se operatorët e shërbyesit dhe cilido shërbyes marrës mund t’i shohin mesazhe të tillë</em>, dhe që marrësit mund të bëjnë për ta foto ekrani, t’i kopjojnë ose t’i rindajnë ato me të tjerët. <em>Mos u jepni të tjerëve të dhëna të rrezikshme përmes Mastodon-it.</em></li> + <li><em>IP dhe të tjera tejtëdhëna</em>: Kur bëni hyrjen, regjistrojmë adresën IP prej nga hytë, si dhe emrin e shfletuesit tuaj. Krejt sesionet e hyrjeve janë të shqyrtueshme nga ju dhe shfuqizim, që nga rregullimet. Adresa e fundit IP e përdorur depozitohet për 12 muaj. Mund të mbajmë edhe regjistra shërbyesi të cilët përfshijnë adresën IP të çdo kërkese ndaj shërbyesit tonë.</li> + </ul> + + <hr class="spacer" /> + + <h3 id="use">Përse i përdorim të dhënat tuaja?</h3> + + <p>Cilado prej të dhënave që grumbullojmë prej jush mund të përdoret në rrugët vijuese:</p> + + <ul> + <li>Për të mundësuar funksionimin bazë të Mastodon-it. Mundeni të ndërveproni me lëndën e personave të tjerë dhe të postoni lëndë tuajën vetëm kur jeni i futur në llogarinë tuaj. Për shembull, mund të ndiqni njerëz të tjerë për të parë postimet e tyre të ndërthurura te rrjedha juaj kohore e përshtatur.</li> + <li>Për të ndihmuar moderimin e bashkësisë, për shembull, duke krahasuar adresën tuaj IP me të tjera të njohura, për të përcaktuar shmangie nga dëbime ose cenime të tjera.</li> + <li>Adresa email që jepni mund të përdoret për t’ju dërguar informacion, njoftime mbi persona të tjerë që ndërveprojnë me lëndën tuaj ose që ju dërgojnë mesazhe, dhe për t’iu përgjigju pyetjeve dhe/ose kërkesave të tjera.</li> + </ul> + + <hr class="spacer" /> + + <h3 id="protect">Si i mbrojmë të dhënat tuaja?</h3> + + <p>Vëmë në punë një larmi masash sigurie për të ruajtur të parrezikuara të dhënat tuaja personale kur jepni, parashtroni, ose hyni në to. Mes të tjerash, sesioni juaj i shfletimit, si edhe trafiku mes aplikacioneve tuaja dhe API-t, sigurohen me SSL, dhe fjalëkalimi juaj mbrohet duke përdorur një algoritëm të sigurt njëdrejtimsh. Për të siguruar edhe më hyrjet te llogaria juaj, mund të aktivizoni mirëfilltësimin dyfaktorësh.</p> + + <hr class="spacer" /> + + <h3 id="data-retention">Cilat janë rregullat tona mbi mbajtjen e të dhënave?</h3> + + <p>Do të përpiqemi pa hile:</p> + + <ul> + <li>Të mbajmë regjistra shërbyesi që përmbajnë adresën IP të krejt kërkesave te ky shërbyes, sa kohë që regjistra të tillë mbahen, për jo më shumë se 90 ditë.</li> + <li>Të mbajmë adresat IP përshoqëruar me përdoruesit e regjistruar, për jo më shumë se 12 muaj.</li> + </ul> + + <p>Mund të kërkoni dhe të shkarkoni një arkiv të lëndës tuaj, përfshi postimet tuaja, bashkëngjitje media, foto profili, dhe figurë kryesh.</p> + + <p>Mund të fshini në mënyrë të pakthyeshme llogarinë tuaj në çfarëdo kohe.</p> + + <hr class="spacer"/> + + <h3 id="cookies">A përdorim <em>cookies</em>?</h3> + + <p>Po. <em>Cookie</em>-t janë kartela të vockla që një sajt ose furnizuesi i shërbimit për të i depoziton në diskun e kompjuterit tuaj përmes shfletuesit (nëse e lejoni ju). Këto <em>cookies</em> i bëjnë të mundur sajtit të njohë shfletuesin tuaj dhe, nëse keni një llogari të regjistuar, ta përshoqërojë atë me llogarinë tuaj të regjistuar.</p> + + <p>Ne i përdorim <em>cookie</em>-t për të kuptuar dhe ruajtur parapëlqimet tuaja, për vizita të ardhshme.</p> + + <hr class="spacer" /> + + <h3 id="disclose">A u japim palëve të treta ndonjë të dhënë?</h3> + + <p>Nuk u shesim, shkëmbejmë, ose transferojmë në rrugë të tjera palëve të treta të dhëna tuajat personale që lejojnë identifikimin tuaj. Kjo nuk përfshin palë të treta të besuara që nga ndihmojnë të xhirojmë sajtin tonë, të bëjmë punën tonë, ose t’ju shërbejmë juve, sa kohë që këto palë pajtohen t’i mbajnë të fshehta këto të dhëna. Mund të japim të dhëna tuajat kur besojmë se kjo është e nevojshme për të qenë në rregull me ligjin, për të zbatuar rregullat e sajtit tonë, ose për të mbrojtur të drejta, pronësi, ose siguri tonën apo të të tjerëve.</p> + + <p>Lënda juaj publike mund të shkarkohet nga shërbyes të tjerë në rrjet. Postimet tuaja publike dhe ato vetëm për ndjekësit dërgohen te shërbyesit ku gjenden ndjekësit tuaj, dhe mesazhet e drejtpërdrejtë jepen te shërbyesit e marrësve, për rastet ku këta ndjekës apo marrës gjenden në një tjetër shërbyes nga i këtushmi.</p> + + <p>Kur autorizoni një aplikacion të përdorë llogarinë tuaj, në varësi të shtrirje së lejeve që miratoni, aplikacioni mund të hyjë në të dhënat e profilit tuaj publik, listat tuaja të ndjekjeve, ndjekësit tuaj, lista tuajat, krejt postimet tuaja, dhe të parapëlqyerit tuaj. Aplikacionet s’mund të njohin kurrë adresën tuaj email ose fjalëkalimin.</p> + + <hr class="spacer" /> + + <h3 id="children">Përdorim i sajtit nga fëmijë</h3> + + <p>Nëse ky shërbyes gjendet në BE apo në ZEE: Krejt sajti, produktet dhe shërbimet tona u drejtohen personave që janë të paktën 16 vjeç. Nëse jeni nën moshën 16 vjeç, sipas kërkesave të GDPR-së (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>), mos e përdorni këtë sajt.</p> + + <p>Nëse ky shërbyes gjendet në ShBA: Krejt sajti, produktet dhe shërbimet tona u drejtohen personave që janë të paktën 13 vjeç. Nëse jeni nën moshën 13 vjeç, sipas kërkesave të COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>), mos e përdorni këtë sajt.</p> + + <p>Domosdoshmëritë e ligjit mund të jenë të ndryshme, nëse ky shërbyes gjendet në një tjetër juridiksion.</p> + + <hr class="spacer" /> + + <h3 id="changes">Ndryshime te Rregullat tona të Privatësisë</h3> + + <p>Nëse vendosim të ndryshojmë rregullat tona të privatësisë, këto ndryshime do t’i botojmë në këtë faqe.</p> + + <p>Ky dokument është CC-BY-SA. U përditësua së fundmi më 7 mars, 2018.</p> + + <p>Përshtatur fillimisht nga <a href="https://github.com/discourse/discourse">rregullat e privatësisë në Discourse</a>.</p> + title: Kushte Shërbimi dhe Rregulla Privatësie te %{instance} themes: - contrast: Me kontrast të lartë - default: Mastodon - mastodon-light: Mastodon (light) + contrast: Mastodon (Me shumë kontrast) + default: Mastodon (I errët) + mastodon-light: Mastodon (I çelët) time: formats: default: "%d %b, %Y, %H:%M" month: "%b %Y" two_factor_authentication: + code_hint: Që të bëhet ripohimi, jepni kodin e prodhuar nga aplikacioni juaj i mirëfilltësimeve + description_html: Nëse aktivizoni <strong>mirëfilltësimin dyfaktorësh</strong>, hyrja do të kërkojë të jeni në zotërim të telefonit tuaj, i cili do të prodhojë kod që duhet ta jepni. disable: Çaktivizoje enable: Aktivizoje + enabled: Mirëfilltësimi dyfaktorësh është i aktivizuar enabled_success: Mirëfilltësimi dyfaktorësh u aktivizua me sukses + generate_recovery_codes: Prodho kode rikthimesh + instructions_html: "<strong>Skanojeni këtë kod QR me Google Authenticator ose një aplikacion TOTP të ngjashëm në telefonin tuaj</strong>. Tani e tutje, ai aplikacion do të prodhojë kode të cilët duhet t’i jepni kur bëni hyrje." + lost_recovery_codes: Kodet e rikthimit ju lejojnë të rifitoni hyrje në llogarinë tuaj, nëse humbni telefonin tuaj. Nëse keni humbur kodet tuaj të rikthimit, mund t’i prodhoni sërish këtu. Kodet tuaj të vjetër të rikthimit do të bëhen të pavlefshëm. + manual_instructions: 'Nëse s’skanoni dot kodin QR dhe ju duhet ta jepni dorazi, ja e fshehta si tekst i thjeshtë:' + recovery_codes: Kopjeruani kode rikthimesh + recovery_codes_regenerated: Kodet e rikthimeve u riprodhuan me sukses + recovery_instructions_html: Në ndodhtë që të humbni hyrje te telefoni juaj, mund të përdorni një nga kodet e rikthimit më poshtë, që të rifitoni hyrje te llogaria juaj. <strong>Mbajini të parrezikuar kodet e rikthimeve</strong>. Për shembull, mund t’i shtypni dhe t’i ruani tok me dokumente të tjerë të rëndësishëm. + setup: Rregullojeni + wrong_code: Kodi i dhënë është i pavlefshëm! A janë të sakta koha e shërbyesit dhe koha e pajisjes? user_mailer: backup_ready: + explanation: Kërkuat një kopjeruajtje të plotë të llogarisë tuaj Mastodon. E keni gati për shkarkim! subject: Arkivi juaj është gati për shkarkim + title: Marrje arkivi me vete warning: + explanation: + disable: Kur llogaria juaj është e ngrirë, të dhënat në llogarinë tuaj mbeten të paprekura, por s’mund të kryeni ndonjë veprim, para se të shkyçet. + silence: Kur llogaria juaj është e kufizuar, mesazhet tuaj në këtë shërbyes do t’i shohin vetëm personat që ju ndjekin tashmë. dhe mund të liheni jashtë nga lista të ndryshme publike. Megjithatë, të tjerët prapë mund t’ju ndjekin dorazi. + suspend: Llogaria juaj është pezulluar, dhe krejt mesazhet tuaja dhe kartelat media të ngarkuara janë hequr në mënyrë të pakthyeshme nga ky shërbyes, dhe nga shërbyesit te të cilët kishit ndjekës. + review_server_policies: Shqyrtoni rregullat e shërbyesit subject: disable: Llogaria juaj %{acct} është ngrirë none: Sinjalizim për %{acct} silence: Llogaria juaj %{acct} është kufizuar + suspend: Llogaria juaj %{acct} është pezulluar + title: + disable: Llogari e ngrirë + none: Sinjalizim + silence: Llogari e kufizuar + suspend: Llogari e pezulluar welcome: + edit_profile_action: Rregullim profili + edit_profile_step: Profilin mund ta personalizoni duke ngarkuar një avatar, figurë kryesh, duke ndryshuar emrin tuaj në ekran, etj. Nëse dëshironi të shqyrtoni ndjekës të rinj, përpara se të jenë lejuar t’ju ndjekin, mund të kyçni llogarinë tuaj. explanation: Ja disa ndihmëza, sa për t’ia filluar final_action: Filloni të postoni + final_step: 'Filloni të postoni! Edhe pse pa ndjekës, mesazhet tuaj publike mund të shihen nga të tjerët, për shembull te rrjedha kohore vendore dhe në hashtagë. Mund të donit të prezantoni veten nën hashtagun #introductions.' + full_handle: Identifikuesi juaj i plotë + full_handle_hint: Kjo është ajo çka do të duhej t’u tregonit shokëve tuaj, që të mund t’ju dërgojnë mesazhe ose t’ju ndjekin nga një shërbyes tjetër. + review_preferences_action: Ndryshoni parapëlqime + review_preferences_step: Mos harroni të caktoni parapëlqimet tuaja, fjala vjen, ç’email-e dëshironi të merrni, ose çfarë shkalle privatësie do të donit të kishin, si parazgjedhje, postimet tuaja. Nëse nuk ju merren mendtë nga rrotullimi, mund të zgjidhni të aktivizoni vetëluajtje GIF-esh. subject: Mirë se vini te Mastodon-i + tip_federated_timeline: Rrjedha kohore e të federuarve është një pamje e fluksit të rrjetit Mastodon. Por përfshin vetëm persona te të cilët janë pajtuar fqinjët tuaj, pra s’është e plotë. + tip_following: Përgjegjësin e shërbyesit tuaj e ndiqni, si parazgjedhje. Për të gjetur më shumë persona interesantë, shihni te rrjedha kohore vendore dhe ajo e të federuarve. + tip_local_timeline: Rrjedha kohore vendore është një pamje e fluksit të njerëzve në %{instance}. Këta janë fqinjët tuaj më të afërt! + tip_mobile_webapp: Nëse shfletuesi juaj celular ju ofron të shtohet Mastodon-i te skena juaj e kreut, mund të merrni njoftime <em>push</em>. Nga shumë pikëpamje vepron si një aplikacion i brendshëm i platformës së celularit! tips: Ndihmëza title: Mirë se vini, %{name}! users: + follow_limit_reached: S’mund të ndiqni më tepër se %{limit} persona invalid_email: Adresa email është e pavlefshme invalid_otp_token: Kod dyfaktorësh i pavlefshëm + otp_lost_help_html: Nëse humbi hyrjen te të dy, mund të lidheni me %{email} + seamless_external_login: Jeni futur përmes një shërbimi të jashtëm, ndaj s’ka rregullime fjalëkalimi dhe email. signed_in_as: 'I futur si:' verification: + explanation_html: 'Mundeni <strong>të verifikoni veten si i zoti i lidhjeve te tejtëdhënat e profilit tuaj</strong>. Për këtë, sajti i lidhur duhet të përmbajë një lidhje për te profili juaj Mastodon. Lidhje për te ajo <strong>duhet</strong> të ketë një atribut <code>rel="me"</code>. Lënda tekst e lidhjes nuk ngre peshë. Ja një shembull:' verification: Verifikim diff --git a/config/locales/tr.yml b/config/locales/tr.yml index c38b73f2e2..fefbb66676 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1,73 +1,177 @@ --- tr: about: + about_hashtag_html: Bunlar <strong>#%{hashtag}X</strong> ile etiketlenen genel paylaşımlar. Açık alanda herhangi bir yerde bir hesabınız varsa, onlarla etkileÅŸime geçebilirsiniz. about_mastodon_html: Mastodon <em>ücretsiz ve açık kaynaklı</em> bir sosyal aÄŸdır. <em>MerkezileÅŸtirilmemiÅŸ</em> yapısı sayesinde diÄŸer ticari sosyal platformların aksine iletiÅŸimininizin tek bir firmada tutulmasının/yönetilmesinin önüne geçer. GüvendiÄŸiniz bir sunucuyu seçerek oradaki kiÅŸilerle etkileÅŸimde bulunabilirsiniz. Herkes kendi Mastodon sunucusunu kurabilir ve sorunsuz bir ÅŸekilde Mastodon <em>sosyal ağına</em> dahil edebilir. about_this: Bu sunucu hakkında - closed_registrations: Bu sunucu ÅŸu anda yeni kayıt almamaktadır. + administered_by: 'Tarafından yönetildi:' + api: API + apps: Mobil uygulamalar + closed_registrations: Bu sunucudaki kayıtlar ÅŸu anda kapalı. Ancak! Bir hesap oluÅŸturmak ve oradan aynı aÄŸa eriÅŸmek için farklı bir sunucu bulabilirsiniz. contact: Ä°letiÅŸim - other_instances: DiÄŸer sunucular + contact_missing: Ayarlanmadı + contact_unavailable: Yok + documentation: Belgeler + extended_description_html: | + <h3>Kural için iyi bir yer</h3> + <p>GeniÅŸletilmiÅŸ açıklama henüz ayarlanmamış.</p> + features: + humane_approach_body: DiÄŸer aÄŸların baÅŸarısızlıklarından öğrenen Mastodon, sosyal medyanın kötüye kullanımı ile mücadele etmek için etik tasarım seçimleri yapmayı amaçlamaktadır. + humane_approach_title: Daha insancıl bir yaklaşım + not_a_product_body: Mastodon ticari bir aÄŸ deÄŸildir. Reklam yok, Veri madenciliÄŸi yok, duvarlı bahçeler yok. Merkezi bir otorite yok. + not_a_product_title: Sen bir insansın, bir ürün deÄŸil + real_conversation_body: Emrindeki 500 karakter ve granüler içerik ve medya uyarıları için destek ile kendinizi istediÄŸiniz ÅŸekilde ifade edebilirsiniz. + real_conversation_title: Gerçek sohbet için üretildi + within_reach_body: GeliÅŸtirici dostu bir API ekosistemi sayesinde iOS, Android ve diÄŸer platformlar için birden fazla uygulama, arkadaÅŸlarınıza her yerden ulaÅŸmanızı saÄŸlar. + within_reach_title: Her zaman ulaşılabilir + generic_description: "%{domain} aÄŸdaki bir sunucudur" + hosted_on: Mastodon %{domain} üzerinde barındırılıyor + learn_more: Daha fazla bilgi edinin + other_instances: Sunucu listesi + privacy_policy: Gizlilik politikası source_code: Kaynak kodu - status_count_after: adet gönderi yazıldı. + status_count_after: + one: durum + other: durum status_count_before: Åžu ana kadar - user_count_after: kullanıcı var. + terms: Kullanım ÅŸartları + user_count_after: + one: kullanıcı + other: kullanıcı user_count_before: Kayıtlı + what_is_mastodon: Mastodon nedir? accounts: + choices_html: "%{name} seçimleri:" follow: Takip et - followers: Takipçiler + followers: + one: Takipçi + other: Takipçi following: Takip ediliyor + joined: "%{date} tarihinde katıldı" + link_verified_on: Bu baÄŸlantının mülkiyeti %{date} tarihinde kontrol edildi + media: Medya + moved_html: "%{name}, %{new_profile_link} adresine taşındı:" + network_hidden: Bu bilgi mevcut deÄŸil nothing_here: Burada henüz hiçbir gönderi yok! people_followed_by: Kullanıcı %{name}'in takip ettikleri people_who_follow: Kullanıcı %{name}'i takip edenler - posts: Gönderiler + pin_errors: + following: Onaylamak istediÄŸiniz kiÅŸiyi zaten takip ediyor olmalısınız + posts: + one: Toot + other: Tootlar + posts_tab_heading: Tootlar + posts_with_replies: Tootlar ve yanıtlar + reserved_username: Kullanıcı adı saklıdır + roles: + admin: Yönetici + bot: Bot + moderator: Denetleyici unfollow: Takibi bırak admin: + account_actions: + action: Eylemi gerçekleÅŸtir + account_moderation_notes: + create: Not bırakın + created_msg: Denetim notu baÅŸarıyla oluÅŸturuldu! + delete: Sil + destroyed_msg: Denetim notu baÅŸarıyla yok edildi! accounts: are_you_sure: Emin misiniz? + by_domain: Sunucu + change_email: + changed_msg: Hesap e-postası baÅŸarıyla deÄŸiÅŸtirildi! + current_email: Mevcut e-posta + label: E-postayı deÄŸiÅŸtir + new_email: Yeni e-posta + submit: E-postayı deÄŸiÅŸtir + title: "%{username} için e-postayı deÄŸiÅŸtir" confirm: Onayla confirmed: Onaylandı confirming: Onaylama + deleted: Silinen + disable: Devre dışı + disable_two_factor_authentication: 2AD kapat + disabled: Kapalı display_name: Görünen adınız domain: Sunucu edit: Düzenle email: E-posta - email_status: Email Durumu + email_status: E-posta durumu + enable: EtkinleÅŸtir + enabled: Etkin feed_url: Besleme linki followers: Takipçiler + followers_url: Takipçi baÄŸlantısı follows: Takip edilen + header: Ãœstbilgi + inbox_url: Gelen kutusu baÄŸlantısı + invited_by: Tarafından davet edildi + ip: IP + joined: Katıldı location: all: Hepsi local: Yerel remote: Uzaktan title: Konum + login_status: GiriÅŸ durumu media_attachments: Medya ekleri + memorialize: Bir hatıraya dön moderation: all: Hepsi silenced: Susturulanlar suspended: UzaklaÅŸtırılanlar title: Yönetim + moderation_notes: Denetleme notları most_recent_activity: Son aktivite most_recent_ip: Son IP not_subscribed: Abone edilmedi - perform_full_suspension: Tamamen uzaklaÅŸtır + perform_full_suspension: Askıya al profile_url: Profil linki + promote: Yükselt + protocol: Protokol public: Herkese açık push_subscription_expires: PuSH aboneliÄŸi dolumu + redownload: Profili yenile + remove_avatar: Avatarı kaldır + remove_header: Ãœstbilgiyi kaldır resend_confirmation: already_confirmed: Bu kullanıcı zaten onaylandı send: DoÄŸrulama epostasını yeniden gönder success: Onay e-postası baÅŸarıyla gönderildi! + reset: Sıfırla reset_password: Parolayı deÄŸiÅŸtir + resubscribe: Yeniden abone ol + role: Ä°zinler + roles: + admin: Yönetici + moderator: Denetleyici + staff: Personel + user: Kullanıcı salmon_url: Salmon Linki + search: Ara + shared_inbox_url: Paylaşılan gelen kutusu baÄŸlantısı show: - created_reports: Bu hesap tarafından gelen ÅŸikayetler - targeted_reports: Bu hesaba gelen ÅŸikayetler + created_reports: Yapılan ÅŸikayetler + targeted_reports: BaÅŸkaları tarafından ÅŸikayet edildi silence: Sustur + silenced: SusturulmuÅŸ statuses: Durumlar + subscribe: Abone ol + suspended: Askıya alındı title: Hesaplar + unconfirmed_email: Onaylanmamış e-posta undo_silenced: Susturmayı geri al undo_suspension: UzaklaÅŸtırmayı geri al + unsubscribe: Abonelikten çık username: Kullanıcı adı + warn: Uyar web: Web + action_logs: + actions: + confirm_user: "%{name} %{target} kullanıcısının e-posta adresini onayladı" + create_custom_emoji: "%{name} yeni ifade yükledi %{target}" + disable_2fa_user: "%{name}, %{target} kullanıcısı için iki adım gereksinimini kapattı" domain_blocks: add_new: Yeni ekle created_msg: Domain bloÄŸu ÅŸu an iÅŸleniyor @@ -131,7 +235,15 @@ tr: last_delivery: Son gönderim title: WebSub topic: Konu + tags: + accounts: Hesaplar + name: Etiketler + title: Etiketler title: Yönetim + warning_presets: + add_new: Yeni ekle + delete: Sil + edit: Düzenle application_mailer: settings: 'E-mail tercihlerini deÄŸiÅŸtir: %{link}' view: 'Görüntüle:' -- GitLab From 96db7191d8becc44eb3203ece94f71fe29f32e67 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Sat, 23 Feb 2019 22:20:20 +0100 Subject: [PATCH 122/192] Bump version to 2.7.3 (#10102) --- CHANGELOG.md | 17 +++++++++++++++++ lib/mastodon/version.rb | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3356d5422..b7040f9247 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,23 @@ Changelog All notable changes to this project will be documented in this file. +## [2.7.3] - 2019-02-23 +### Added + +- Add domain filter to the admin federation page ([ThibG](https://github.com/tootsuite/mastodon/pull/10071)) +- Add quick link from admin account view to block/unblock instance ([ThibG](https://github.com/tootsuite/mastodon/pull/10073)) + +### Fixed + +- Fix video player width not being updated to fit container width ([ThibG](https://github.com/tootsuite/mastodon/pull/10069)) +- Fix domain filter being shown in admin page when local filter is active ([ThibG](https://github.com/tootsuite/mastodon/pull/10074)) +- Fix crash when conversations have no valid participants ([ThibG](https://github.com/tootsuite/mastodon/pull/10078)) +- Fix error when performing admin actions on no statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10094)) + +### Changed + +- Change custom emojis to randomize stored file name ([hinaloe](https://github.com/tootsuite/mastodon/pull/10090)) + ## [2.7.2] - 2019-02-17 ### Added diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 81dd253ae9..005cd52f6d 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 2 + 3 end def pre -- GitLab From 57483f2ffb59aff3e4ab68f8d291e7c5e886dc77 Mon Sep 17 00:00:00 2001 From: Aditoo17 <42938951+Aditoo17@users.noreply.github.com> Date: Sat, 23 Feb 2019 22:20:35 +0100 Subject: [PATCH 123/192] I18n: Add language options for Kazakh and Lithuanian (#10104) --- app/helpers/settings_helper.rb | 2 ++ config/application.rb | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index e868b45c01..241addb832 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -29,7 +29,9 @@ module SettingsHelper it: 'Italiano', ja: '日本語', ka: 'ქáƒáƒ თული', + kk: 'Қазақша', ko: 'í•œêµì–´', + lt: 'Lietuvių', lv: 'LatvieÅ¡u', ml: 'മലയാളം', ms: 'Bahasa Melayu', diff --git a/config/application.rb b/config/application.rb index ae9ce48970..54df698112 100644 --- a/config/application.rb +++ b/config/application.rb @@ -63,7 +63,9 @@ module Mastodon :it, :ja, :ka, + :kk, :ko, + :lt, :lv, :ms, :nl, -- GitLab From e050958794e436a61863cc62b0d7c54afb971ca4 Mon Sep 17 00:00:00 2001 From: NOGISAKA Sadata <ngsksdt@gmail.com> Date: Sun, 24 Feb 2019 22:28:36 +0900 Subject: [PATCH 124/192] Skip some methods in BatchedRemoveStatusService when account is nil (#10095) * Skip some methods in BatchedRemoveStatusService when account is nil Sometimes `bin/tootctl accounts cull` fails with below error: undefined method `followers_for_local_distribution' for nil:NilClass (NoMethodError) This commit makes BatchedRemoveStatusService to skip below methods when `account` is nil: - unpush_from_home_timelines() - unpush_from_list_timelines() - batch_stream_entries() * Fix rubocop error: Use `next` to skip iteration. --- app/services/batched_remove_status_service.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb index cd3b14e08e..e328b17391 100644 --- a/app/services/batched_remove_status_service.rb +++ b/app/services/batched_remove_status_service.rb @@ -35,6 +35,8 @@ class BatchedRemoveStatusService < BaseService statuses.group_by(&:account_id).each_value do |account_statuses| account = account_statuses.first.account + next unless account + unpush_from_home_timelines(account, account_statuses) unpush_from_list_timelines(account, account_statuses) -- GitLab From 1dbf993bce5627e2c3fcab6e9c63b5279dff018a Mon Sep 17 00:00:00 2001 From: Sir-Boops <admin@boops.me> Date: Sun, 24 Feb 2019 08:32:40 -0700 Subject: [PATCH 125/192] Switch to Ubuntu for docker (#10100) --- Dockerfile | 205 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 121 insertions(+), 84 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2b15381ec5..aaad870ddb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,89 +1,126 @@ -FROM node:8.15-alpine as node -FROM ruby:2.6-alpine3.9 - -LABEL maintainer="https://github.com/tootsuite/mastodon" \ - description="Your self-hosted, globally interconnected microblogging community" - +FROM ubuntu:18.04 as build-dep + +# Use bash for the shell +SHELL ["bash", "-c"] + +# Install Node +ENV NODE_VER="8.15.0" +RUN echo "Etc/UTC" > /etc/localtime && \ + apt update && \ + apt -y dist-upgrade && \ + apt -y install wget make gcc g++ python && \ + cd ~ && \ + wget https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER.tar.gz && \ + tar xf node-v$NODE_VER.tar.gz && \ + cd node-v$NODE_VER && \ + ./configure --prefix=/opt/node && \ + make -j$(nproc) > /dev/null && \ + make install + +# Install jemalloc +ENV JE_VER="5.1.0" +RUN apt -y install autoconf && \ + cd ~ && \ + wget https://github.com/jemalloc/jemalloc/archive/$JE_VER.tar.gz && \ + tar xf $JE_VER.tar.gz && \ + cd jemalloc-$JE_VER && \ + ./autogen.sh && \ + ./configure --prefix=/opt/jemalloc && \ + make -j$(nproc) > /dev/null && \ + make install_bin install_include install_lib + +# Install ruby +ENV RUBY_VER="2.6.1" +ENV CPPFLAGS="-I/opt/jemalloc/include" +ENV LDFLAGS="-L/opt/jemalloc/lib/" +RUN apt -y install build-essential \ + bison libyaml-dev libgdbm-dev libreadline-dev \ + libncurses5-dev libffi-dev zlib1g-dev libssl-dev && \ + cd ~ && \ + wget https://cache.ruby-lang.org/pub/ruby/${RUBY_VER%.*}/ruby-$RUBY_VER.tar.gz && \ + tar xf ruby-$RUBY_VER.tar.gz && \ + cd ruby-$RUBY_VER && \ + ./configure --prefix=/opt/ruby \ + --with-jemalloc \ + --with-shared \ + --disable-install-doc && \ + ln -s /opt/jemalloc/lib/* /usr/lib/ && \ + make -j$(nproc) > /dev/null && \ + make install + +ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin" + +RUN npm install -g yarn && \ + gem install bundler + +COPY . /opt/mastodon + +RUN apt -y install git libicu-dev libidn11-dev \ + libpq-dev libprotobuf-dev protobuf-compiler && \ + cd /opt/mastodon && \ + bundle install -j$(nproc) --deployment --without development test && \ + yarn install --pure-lockfile + +FROM ubuntu:18.04 + +# Copy over all the langs needed for runtime +COPY --from=build-dep /opt/node /opt/node +COPY --from=build-dep /opt/ruby /opt/ruby +COPY --from=build-dep /opt/jemalloc /opt/jemalloc + +# Add more PATHs to the PATH +ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin" + +# Create the mastodon user ARG UID=991 ARG GID=991 - -ENV PATH=/mastodon/bin:$PATH \ - RAILS_SERVE_STATIC_FILES=true \ - RAILS_ENV=production \ - NODE_ENV=production - -ARG LIBICONV_VERSION=1.15 -ARG LIBICONV_DOWNLOAD_SHA256=ccf536620a45458d26ba83887a983b96827001e92a13847b45e4925cc8913178 - -EXPOSE 3000 4000 - -WORKDIR /mastodon - -COPY --from=node /usr/local/bin/node /usr/local/bin/node -COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules -COPY --from=node /usr/local/bin/npm /usr/local/bin/npm -COPY --from=node /opt/yarn-* /opt/yarn - -RUN apk add --no-cache -t build-dependencies \ - build-base \ - icu-dev \ - libidn-dev \ - openssl \ - libtool \ - libxml2-dev \ - libxslt-dev \ - postgresql-dev \ - protobuf-dev \ - python \ - && apk add --no-cache \ - ca-certificates \ - ffmpeg \ - file \ - git \ - icu-libs \ - imagemagick \ - libidn \ - libpq \ - libxml2 \ - libxslt \ - protobuf \ - tini \ - tzdata \ - && update-ca-certificates \ - && ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn \ - && ln -s /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg \ - && mkdir -p /tmp/src /opt \ - && wget -O libiconv.tar.gz "https://ftp.gnu.org/pub/gnu/libiconv/libiconv-$LIBICONV_VERSION.tar.gz" \ - && echo "$LIBICONV_DOWNLOAD_SHA256 *libiconv.tar.gz" | sha256sum -c - \ - && tar -xzf libiconv.tar.gz -C /tmp/src \ - && rm libiconv.tar.gz \ - && cd /tmp/src/libiconv-$LIBICONV_VERSION \ - && ./configure --prefix=/usr/local \ - && make -j$(getconf _NPROCESSORS_ONLN)\ - && make install \ - && libtool --finish /usr/local/lib \ - && cd /mastodon \ - && rm -rf /tmp/* - -COPY Gemfile Gemfile.lock package.json yarn.lock .yarnclean /mastodon/ - -RUN bundle config build.nokogiri --use-system-libraries --with-iconv-lib=/usr/local/lib --with-iconv-include=/usr/local/include \ - && bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without test development \ - && yarn install --pure-lockfile --ignore-engines \ - && yarn cache clean - -RUN addgroup -g ${GID} mastodon && adduser -h /mastodon -s /bin/sh -D -G mastodon -u ${UID} mastodon \ - && mkdir -p /mastodon/public/system /mastodon/public/assets /mastodon/public/packs \ - && chown -R mastodon:mastodon /mastodon/public - -COPY . /mastodon - -RUN chown -R mastodon:mastodon /mastodon - -VOLUME /mastodon/public/system - +RUN apt update && \ + echo "Etc/UTC" > /etc/localtime && \ + ln -s /opt/jemalloc/lib/* /usr/lib/ && \ + apt -y dist-upgrade && \ + apt install -y whois && \ + addgroup --gid $GID mastodon && \ + useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \ + echo "mastodon:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256`" | chpasswd + +# Copy over masto source from building and set permissions +COPY --from=build-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon + +# Install masto runtime deps +RUN apt -y --no-install-recommends install \ + libssl1.1 libpq5 imagemagick ffmpeg \ + libicu60 libprotobuf10 libidn11 libyaml-0-2 \ + file ca-certificates tzdata libreadline7 && \ + apt -y install gcc && \ + ln -s /opt/mastodon /mastodon && \ + gem install bundler + +# Clean up more dirs +RUN rm -rf /var/cache && \ + rm -rf /var/apt + +# Add tini +ENV TINI_VERSION="0.18.0" +ENV TINI_SUM="12d20136605531b09a2c2dac02ccee85e1b874eb322ef6baf7561cd93f93c855" +ADD https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini /tini +RUN echo "$TINI_SUM tini" | sha256sum -c - +RUN chmod +x /tini + +# Run masto services in prod mode +ENV RAILS_ENV="production" +ENV NODE_ENV="production" + +# Tell rails to serve static files +ENV RAILS_SERVE_STATIC_FILES="true" + +# Set the run user USER mastodon -RUN OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder bundle exec rails assets:precompile +# Precompile assets +RUN cd ~ && \ + OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \ + yarn cache clean -ENTRYPOINT ["/sbin/tini", "--"] +# Set the work dir and the container entry point +WORKDIR /opt/mastodon +ENTRYPOINT ["/tini", "--"] -- GitLab From 3a44827d3f69fedb9a41f9c8fb3b763deec6f723 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Mon, 25 Feb 2019 01:10:56 +0100 Subject: [PATCH 126/192] Fix web UI not removing notifications after block (#10108) Regression from #7311 --- app/javascript/mastodon/reducers/notifications.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index 19a02f5b15..c891f4a522 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -108,6 +108,7 @@ export default function notifications(state = initialState, action) { case NOTIFICATIONS_EXPAND_SUCCESS: return expandNormalizedNotifications(state, action.notifications, action.next); case ACCOUNT_BLOCK_SUCCESS: + return filterNotifications(state, action.relationship); case ACCOUNT_MUTE_SUCCESS: return action.relationship.muting_notifications ? filterNotifications(state, action.relationship) : state; case NOTIFICATIONS_CLEAR: -- GitLab From 16fb39cffc0a959220e376817672f010da87c995 Mon Sep 17 00:00:00 2001 From: mohemohe <mohemohe@users.noreply.github.com> Date: Mon, 25 Feb 2019 12:06:24 +0900 Subject: [PATCH 127/192] Fix fail health check due to missing wget (#10110) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index aaad870ddb..1263efc934 100644 --- a/Dockerfile +++ b/Dockerfile @@ -78,7 +78,7 @@ RUN apt update && \ echo "Etc/UTC" > /etc/localtime && \ ln -s /opt/jemalloc/lib/* /usr/lib/ && \ apt -y dist-upgrade && \ - apt install -y whois && \ + apt install -y whois wget && \ addgroup --gid $GID mastodon && \ useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \ echo "mastodon:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256`" | chpasswd -- GitLab From 9dd54ffb1c04dd7ba216a4420efce75fb9f603e7 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Mon, 25 Feb 2019 15:54:17 +0100 Subject: [PATCH 128/192] Avoid redundant HTTP request on some error cases (#10115) --- app/helpers/jsonld_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb index 5323972723..59e4ae6851 100644 --- a/app/helpers/jsonld_helper.rb +++ b/app/helpers/jsonld_helper.rb @@ -68,6 +68,7 @@ module JsonLdHelper return body_to_json(response.body_with_limit) if response.code == 200 end # If request failed, retry without doing it on behalf of a user + return if on_behalf_of.nil? build_request(uri).perform do |response| response.code == 200 ? body_to_json(response.body_with_limit) : nil end -- GitLab From 66adca6113fe5047c7ce55c031acc9a3e8b00c3b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Feb 2019 15:55:22 +0100 Subject: [PATCH 129/192] Bump sidekiq-unique-jobs from 6.0.9 to 6.0.11 (#10113) Bumps [sidekiq-unique-jobs](https://github.com/mhenrixon/sidekiq-unique-jobs) from 6.0.9 to 6.0.11. - [Release notes](https://github.com/mhenrixon/sidekiq-unique-jobs/releases) - [Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/blob/master/CHANGELOG.md) - [Commits](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v6.0.9...v6.0.11) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8d46764e78..02460bb6b0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -563,9 +563,9 @@ GEM rufus-scheduler (~> 3.2) sidekiq (>= 3) tilt (>= 1.4.0) - sidekiq-unique-jobs (6.0.9) + sidekiq-unique-jobs (6.0.11) concurrent-ruby (~> 1.0, >= 1.0.5) - sidekiq (>= 4.0, < 6.0) + sidekiq (>= 4.0, < 7.0) thor (~> 0) simple-navigation (4.0.5) activesupport (>= 2.3.2) -- GitLab From c07e59031f3e25fd0f9c50bcccacabf3ec3c42e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Feb 2019 15:55:53 +0100 Subject: [PATCH 130/192] Bump dotenv-rails from 2.6.0 to 2.7.1 (#10114) Bumps [dotenv-rails](https://github.com/bkeepers/dotenv) from 2.6.0 to 2.7.1. - [Release notes](https://github.com/bkeepers/dotenv/releases) - [Changelog](https://github.com/bkeepers/dotenv/blob/master/Changelog.md) - [Commits](https://github.com/bkeepers/dotenv/compare/v2.6.0...v2.7.1) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile | 2 +- Gemfile.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 3309be52be..a8bda438a2 100644 --- a/Gemfile +++ b/Gemfile @@ -13,7 +13,7 @@ gem 'hamlit-rails', '~> 0.2' gem 'pg', '~> 1.1' gem 'makara', '~> 0.4' gem 'pghero', '~> 2.2' -gem 'dotenv-rails', '~> 2.6' +gem 'dotenv-rails', '~> 2.7' gem 'aws-sdk-s3', '~> 1.30', require: false gem 'fog-core', '<= 2.1.0' diff --git a/Gemfile.lock b/Gemfile.lock index 02460bb6b0..524c9e51e4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -185,10 +185,10 @@ GEM unf (>= 0.0.5, < 1.0.0) doorkeeper (5.0.2) railties (>= 4.2) - dotenv (2.6.0) - dotenv-rails (2.6.0) - dotenv (= 2.6.0) - railties (>= 3.2, < 6.0) + dotenv (2.7.1) + dotenv-rails (2.7.1) + dotenv (= 2.7.1) + railties (>= 3.2, < 6.1) elasticsearch (6.0.2) elasticsearch-api (= 6.0.2) elasticsearch-transport (= 6.0.2) @@ -680,7 +680,7 @@ DEPENDENCIES devise-two-factor (~> 3.0) devise_pam_authenticatable2 (~> 9.2) doorkeeper (~> 5.0) - dotenv-rails (~> 2.6) + dotenv-rails (~> 2.7) fabrication (~> 2.20) faker (~> 1.9) fast_blank (~> 1.0) -- GitLab From 775e835ed6e30c95d628abe11aaae7bfc66fde23 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Feb 2019 15:56:35 +0100 Subject: [PATCH 131/192] Bump rubocop from 0.64.0 to 0.65.0 (#10112) Bumps [rubocop](https://github.com/rubocop-hq/rubocop) from 0.64.0 to 0.65.0. - [Release notes](https://github.com/rubocop-hq/rubocop/releases) - [Changelog](https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop-hq/rubocop/compare/v0.64.0...v0.65.0) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile | 2 +- Gemfile.lock | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index a8bda438a2..e6d7bd4d01 100644 --- a/Gemfile +++ b/Gemfile @@ -127,7 +127,7 @@ group :development do gem 'letter_opener', '~> 1.7' gem 'letter_opener_web', '~> 1.3' gem 'memory_profiler' - gem 'rubocop', '~> 0.64', require: false + gem 'rubocop', '~> 0.65', require: false gem 'brakeman', '~> 4.4', require: false gem 'bundler-audit', '~> 0.6', require: false gem 'scss_lint', '~> 0.57', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 524c9e51e4..b7cdf484f4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -418,6 +418,7 @@ GEM pry (~> 0.10) pry-rails (0.3.9) pry (>= 0.10.4) + psych (3.1.0) public_suffix (3.0.3) puma (3.12.0) pundit (2.0.1) @@ -525,11 +526,12 @@ GEM rspec-core (~> 3.0, >= 3.0.0) sidekiq (>= 2.4.0) rspec-support (3.8.0) - rubocop (0.64.0) + rubocop (0.65.0) jaro_winkler (~> 1.5.1) parallel (~> 1.10) parser (>= 2.5, != 2.5.1.1) powerpack (~> 0.1) + psych (>= 3.1.0) rainbow (>= 2.2.2, < 4.0) ruby-progressbar (~> 1.7) unicode-display_width (~> 1.4.0) @@ -746,7 +748,7 @@ DEPENDENCIES rqrcode (~> 0.10) rspec-rails (~> 3.8) rspec-sidekiq (~> 3.0) - rubocop (~> 0.64) + rubocop (~> 0.65) sanitize (~> 5.0) scss_lint (~> 0.57) sidekiq (~> 5.2) -- GitLab From 6e9481ad7dc95e365c55e862383f2a583b332110 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Feb 2019 19:46:12 +0900 Subject: [PATCH 132/192] Bump bootsnap from 1.4.0 to 1.4.1 (#10118) Bumps [bootsnap](https://github.com/Shopify/bootsnap) from 1.4.0 to 1.4.1. - [Release notes](https://github.com/Shopify/bootsnap/releases) - [Changelog](https://github.com/Shopify/bootsnap/blob/master/CHANGELOG.md) - [Commits](https://github.com/Shopify/bootsnap/compare/v1.4.0...v1.4.1) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index b7cdf484f4..65f7578037 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -98,7 +98,7 @@ GEM rack (>= 0.9.0) binding_of_caller (0.8.0) debug_inspector (>= 0.0.1) - bootsnap (1.4.0) + bootsnap (1.4.1) msgpack (~> 1.0) brakeman (4.4.0) browser (2.5.3) -- GitLab From ea58e31822d07ca2286f971bf6b0275954dd2726 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Feb 2019 20:16:48 +0900 Subject: [PATCH 133/192] Bump hamlit-rails from 0.2.0 to 0.2.1 (#10120) Bumps [hamlit-rails](https://github.com/mfung/hamlit-rails) from 0.2.0 to 0.2.1. - [Release notes](https://github.com/mfung/hamlit-rails/releases) - [Commits](https://github.com/mfung/hamlit-rails/compare/v0.2.0...v0.2.1) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 65f7578037..a92fadb8a8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -239,11 +239,11 @@ GEM http (~> 3.0) nokogiri (~> 1.8) oj (~> 3.0) - hamlit (2.8.8) + hamlit (2.9.2) temple (>= 0.8.0) thor tilt - hamlit-rails (0.2.0) + hamlit-rails (0.2.1) actionpack (>= 4.0.1) activesupport (>= 4.0.1) hamlit (>= 1.2.0) @@ -603,7 +603,7 @@ GEM climate_control (>= 0.0.3, < 1.0) thor (0.20.3) thread_safe (0.3.6) - tilt (2.0.8) + tilt (2.0.9) timers (4.2.0) tty-color (0.4.3) tty-command (0.8.2) -- GitLab From e7f20cc43ff21afa229da40ee4e5755495948772 Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Tue, 26 Feb 2019 15:21:36 +0100 Subject: [PATCH 134/192] Add type, limit, offset, min_id, max_id, account_id to search API (#10091) * Add type, limit, offset, min_id, max_id, account_id to search API Fix #8939 * Make the offset work on accounts and hashtags search as well * Assure brakeman we are not doing mass assignment here * Do not allow paginating unless a type is chosen * Fix search query and index id field on statuses instead of created_at --- app/chewy/statuses_index.rb | 2 +- .../api/v1/accounts/search_controller.rb | 5 +- app/controllers/api/v1/search_controller.rb | 26 +-- app/controllers/api/v2/search_controller.rb | 2 +- app/models/account.rb | 16 +- app/models/tag.rb | 8 +- app/services/account_search_service.rb | 11 +- app/services/search_service.rb | 84 ++++++-- config/brakeman.ignore | 181 ++++-------------- spec/services/account_search_service_spec.rb | 36 ++-- spec/services/search_service_spec.rb | 20 +- 11 files changed, 161 insertions(+), 230 deletions(-) diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb index eafc1818b8..8ce413f8a4 100644 --- a/app/chewy/statuses_index.rb +++ b/app/chewy/statuses_index.rb @@ -48,6 +48,7 @@ class StatusesIndex < Chewy::Index end root date_detection: false do + field :id, type: 'long' field :account_id, type: 'long' field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).join("\n\n") } do @@ -55,7 +56,6 @@ class StatusesIndex < Chewy::Index end field :searchable_by, type: 'long', value: ->(status, crutches) { status.searchable_by(crutches) } - field :created_at, type: 'date' end end end diff --git a/app/controllers/api/v1/accounts/search_controller.rb b/app/controllers/api/v1/accounts/search_controller.rb index 91c9f15472..4217b527a5 100644 --- a/app/controllers/api/v1/accounts/search_controller.rb +++ b/app/controllers/api/v1/accounts/search_controller.rb @@ -16,10 +16,11 @@ class Api::V1::Accounts::SearchController < Api::BaseController def account_search AccountSearchService.new.call( params[:q], - limit_param(DEFAULT_ACCOUNTS_LIMIT), current_account, + limit: limit_param(DEFAULT_ACCOUNTS_LIMIT), resolve: truthy_param?(:resolve), - following: truthy_param?(:following) + following: truthy_param?(:following), + offset: params[:offset] ) end end diff --git a/app/controllers/api/v1/search_controller.rb b/app/controllers/api/v1/search_controller.rb index dc1a37599e..6131cbbb69 100644 --- a/app/controllers/api/v1/search_controller.rb +++ b/app/controllers/api/v1/search_controller.rb @@ -3,7 +3,7 @@ class Api::V1::SearchController < Api::BaseController include Authorization - RESULTS_LIMIT = 5 + RESULTS_LIMIT = 20 before_action -> { doorkeeper_authorize! :read, :'read:search' } before_action :require_user! @@ -11,30 +11,22 @@ class Api::V1::SearchController < Api::BaseController respond_to :json def index - @search = Search.new(search) + @search = Search.new(search_results) render json: @search, serializer: REST::SearchSerializer end private - def search - search_results.tap do |search| - search[:statuses].keep_if do |status| - begin - authorize status, :show? - rescue Mastodon::NotPermittedError - false - end - end - end - end - def search_results SearchService.new.call( params[:q], - RESULTS_LIMIT, - truthy_param?(:resolve), - current_account + current_account, + limit_param(RESULTS_LIMIT), + search_params.merge(resolve: truthy_param?(:resolve)) ) end + + def search_params + params.permit(:type, :offset, :min_id, :max_id, :account_id) + end end diff --git a/app/controllers/api/v2/search_controller.rb b/app/controllers/api/v2/search_controller.rb index 2e91d68ee3..9aa6edc696 100644 --- a/app/controllers/api/v2/search_controller.rb +++ b/app/controllers/api/v2/search_controller.rb @@ -2,7 +2,7 @@ class Api::V2::SearchController < Api::V1::SearchController def index - @search = Search.new(search) + @search = Search.new(search_results) render json: @search, serializer: REST::V2::SearchSerializer end end diff --git a/app/models/account.rb b/app/models/account.rb index 12d7a747ee..87ce90178a 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -386,7 +386,7 @@ class Account < ApplicationRecord DeliveryFailureTracker.filter(urls) end - def search_for(terms, limit = 10) + def search_for(terms, limit = 10, offset = 0) textsearch, query = generate_query_for_search(terms) sql = <<-SQL.squish @@ -398,15 +398,15 @@ class Account < ApplicationRecord AND accounts.suspended = false AND accounts.moved_to_account_id IS NULL ORDER BY rank DESC - LIMIT ? + LIMIT ? OFFSET ? SQL - records = find_by_sql([sql, limit]) + records = find_by_sql([sql, limit, offset]) ActiveRecord::Associations::Preloader.new.preload(records, :account_stat) records end - def advanced_search_for(terms, account, limit = 10, following = false) + def advanced_search_for(terms, account, limit = 10, following = false, offset = 0) textsearch, query = generate_query_for_search(terms) if following @@ -427,10 +427,10 @@ class Account < ApplicationRecord AND accounts.moved_to_account_id IS NULL GROUP BY accounts.id ORDER BY rank DESC - LIMIT ? + LIMIT ? OFFSET ? SQL - records = find_by_sql([sql, account.id, account.id, account.id, limit]) + records = find_by_sql([sql, account.id, account.id, account.id, limit, offset]) else sql = <<-SQL.squish SELECT @@ -443,10 +443,10 @@ class Account < ApplicationRecord AND accounts.moved_to_account_id IS NULL GROUP BY accounts.id ORDER BY rank DESC - LIMIT ? + LIMIT ? OFFSET ? SQL - records = find_by_sql([sql, account.id, account.id, limit]) + records = find_by_sql([sql, account.id, account.id, limit, offset]) end ActiveRecord::Associations::Preloader.new.preload(records, :account_stat) diff --git a/app/models/tag.rb b/app/models/tag.rb index 4373e967b2..788a678bde 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -64,9 +64,13 @@ class Tag < ApplicationRecord end class << self - def search_for(term, limit = 5) + def search_for(term, limit = 5, offset = 0) pattern = sanitize_sql_like(term.strip) + '%' - Tag.where('lower(name) like lower(?)', pattern).order(:name).limit(limit) + + Tag.where('lower(name) like lower(?)', pattern) + .order(:name) + .limit(limit) + .offset(offset) end end diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb index 7edbd9b479..7bdffbbd22 100644 --- a/app/services/account_search_service.rb +++ b/app/services/account_search_service.rb @@ -1,11 +1,12 @@ # frozen_string_literal: true class AccountSearchService < BaseService - attr_reader :query, :limit, :options, :account + attr_reader :query, :limit, :offset, :options, :account - def call(query, limit, account = nil, options = {}) + def call(query, account = nil, options = {}) @query = query.strip - @limit = limit + @limit = options[:limit].to_i + @offset = options[:offset].to_i @options = options @account = account @@ -83,11 +84,11 @@ class AccountSearchService < BaseService end def advanced_search_results - Account.advanced_search_for(terms_for_query, account, limit, options[:following]) + Account.advanced_search_for(terms_for_query, account, limit, options[:following], offset) end def simple_search_results - Account.search_for(terms_for_query, limit) + Account.search_for(terms_for_query, limit, offset) end def terms_for_query diff --git a/app/services/search_service.rb b/app/services/search_service.rb index 1c31e0509a..e0da61dac5 100644 --- a/app/services/search_service.rb +++ b/app/services/search_service.rb @@ -1,18 +1,18 @@ # frozen_string_literal: true class SearchService < BaseService - attr_accessor :query, :account, :limit, :resolve - - def call(query, limit, resolve = false, account = nil) + def call(query, account, limit, options = {}) @query = query.strip @account = account - @limit = limit - @resolve = resolve + @options = options + @limit = limit.to_i + @offset = options[:type].blank? ? 0 : options[:offset].to_i + @resolve = options[:resolve] || false default_results.tap do |results| if url_query? results.merge!(url_resource_results) unless url_resource.nil? - elsif query.present? + elsif @query.present? results[:accounts] = perform_accounts_search! if account_searchable? results[:statuses] = perform_statuses_search! if full_text_searchable? results[:hashtags] = perform_hashtags_search! if hashtag_searchable? @@ -23,23 +23,46 @@ class SearchService < BaseService private def perform_accounts_search! - AccountSearchService.new.call(query, limit, account, resolve: resolve) + AccountSearchService.new.call( + @query, + @account, + limit: @limit, + resolve: @resolve, + offset: @offset + ) end def perform_statuses_search! - statuses = StatusesIndex.filter(term: { searchable_by: account.id }) - .query(multi_match: { type: 'most_fields', query: query, operator: 'and', fields: %w(text text.stemmed) }) - .limit(limit) - .objects - .compact + definition = StatusesIndex.filter(term: { searchable_by: @account.id }) + .query(multi_match: { type: 'most_fields', query: @query, operator: 'and', fields: %w(text text.stemmed) }) + + if @options[:account_id].present? + definition = definition.filter(term: { account_id: @options[:account_id] }) + end + + if @options[:min_id].present? || @options[:max_id].present? + range = {} + range[:gt] = @options[:min_id].to_i if @options[:min_id].present? + range[:lt] = @options[:max_id].to_i if @options[:max_id].present? + definition = definition.filter(range: { id: range }) + end + + results = definition.limit(@limit).offset(@offset).objects.compact + account_ids = results.map(&:account_id) + account_domains = results.map(&:account_domain) + preloaded_relations = relations_map_for_account(@account, account_ids, account_domains) - statuses.reject { |status| StatusFilter.new(status, account).filtered? } + results.reject { |status| StatusFilter.new(status, @account, preloaded_relations).filtered? } rescue Faraday::ConnectionFailed [] end def perform_hashtags_search! - Tag.search_for(query.gsub(/\A#/, ''), limit) + Tag.search_for( + @query.gsub(/\A#/, ''), + @limit, + @offset + ) end def default_results @@ -47,7 +70,7 @@ class SearchService < BaseService end def url_query? - query =~ /\Ahttps?:\/\// + @options[:type].blank? && @query =~ /\Ahttps?:\/\// end def url_resource_results @@ -55,7 +78,7 @@ class SearchService < BaseService end def url_resource - @_url_resource ||= ResolveURLService.new.call(query, on_behalf_of: @account) + @_url_resource ||= ResolveURLService.new.call(@query, on_behalf_of: @account) end def url_resource_symbol @@ -64,14 +87,37 @@ class SearchService < BaseService def full_text_searchable? return false unless Chewy.enabled? - !account.nil? && !((query.start_with?('#') || query.include?('@')) && !query.include?(' ')) + + statuses_search? && !@account.nil? && !((@query.start_with?('#') || @query.include?('@')) && !@query.include?(' ')) end def account_searchable? - !(query.include?('@') && query.include?(' ')) + account_search? && !(@query.include?('@') && @query.include?(' ')) end def hashtag_searchable? - !query.include?('@') + hashtag_search? && !@query.include?('@') + end + + def account_search? + @options[:type].blank? || @options[:type] == 'accounts' + end + + def hashtag_search? + @options[:type].blank? || @options[:type] == 'hashtags' + end + + def statuses_search? + @options[:type].blank? || @options[:type] == 'statuses' + end + + def relations_map_for_account(account, account_ids, domains) + { + blocking: Account.blocking_map(account_ids, account.id), + blocked_by: Account.blocked_by_map(account_ids, account.id), + muting: Account.muting_map(account_ids, account.id), + following: Account.following_map(account_ids, account.id), + domain_blocking_by_domain: Account.domain_blocking_map_by_domain(domains, account.id), + } end end diff --git a/config/brakeman.ignore b/config/brakeman.ignore index 58fb243da4..7e3828f7e0 100644 --- a/config/brakeman.ignore +++ b/config/brakeman.ignore @@ -1,5 +1,25 @@ { "ignored_warnings": [ + { + "warning_type": "Mass Assignment", + "warning_code": 105, + "fingerprint": "0117d2be5947ea4e4fbed9c15f23c6615b12c6892973411820c83d079808819d", + "check_name": "PermitAttributes", + "message": "Potentially dangerous key allowed for mass assignment", + "file": "app/controllers/api/v1/search_controller.rb", + "line": 30, + "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/", + "code": "params.permit(:type, :offset, :min_id, :max_id, :account_id)", + "render_path": null, + "location": { + "type": "method", + "class": "Api::V1::SearchController", + "method": "search_params" + }, + "user_input": ":account_id", + "confidence": "High", + "note": "" + }, { "warning_type": "SQL Injection", "warning_code": 0, @@ -20,25 +40,6 @@ "confidence": "High", "note": "" }, - { - "warning_type": "Cross-Site Scripting", - "warning_code": 4, - "fingerprint": "0adbe361b91afff22ba51e5fc2275ec703cc13255a0cb3eecd8dab223ab9f61e", - "check_name": "LinkToHref", - "message": "Potentially unsafe model attribute in link_to href", - "file": "app/views/admin/accounts/show.html.haml", - "line": 167, - "link": "https://brakemanscanner.org/docs/warning_types/link_to_href", - "code": "link_to(Account.find(params[:id]).inbox_url, Account.find(params[:id]).inbox_url)", - "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}], - "location": { - "type": "template", - "template": "admin/accounts/show" - }, - "user_input": "Account.find(params[:id]).inbox_url", - "confidence": "Weak", - "note": "" - }, { "warning_type": "SQL Injection", "warning_code": 0, @@ -46,7 +47,7 @@ "check_name": "SQL", "message": "Possible SQL injection", "file": "app/models/status.rb", - "line": 84, + "line": 87, "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", "code": "result.joins(\"INNER JOIN statuses_tags t#{id} ON t#{id}.status_id = statuses.id AND t#{id}.tag_id = #{id}\")", "render_path": null, @@ -59,44 +60,6 @@ "confidence": "Weak", "note": "" }, - { - "warning_type": "Cross-Site Scripting", - "warning_code": 4, - "fingerprint": "1fc29c578d0c89bf13bd5476829d272d54cd06b92ccf6df18568fa1f2674926e", - "check_name": "LinkToHref", - "message": "Potentially unsafe model attribute in link_to href", - "file": "app/views/admin/accounts/show.html.haml", - "line": 173, - "link": "https://brakemanscanner.org/docs/warning_types/link_to_href", - "code": "link_to(Account.find(params[:id]).shared_inbox_url, Account.find(params[:id]).shared_inbox_url)", - "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}], - "location": { - "type": "template", - "template": "admin/accounts/show" - }, - "user_input": "Account.find(params[:id]).shared_inbox_url", - "confidence": "Weak", - "note": "" - }, - { - "warning_type": "Cross-Site Scripting", - "warning_code": 4, - "fingerprint": "2129d4c1e63a351d28d8d2937ff0b50237809c3df6725c0c5ef82b881dbb2086", - "check_name": "LinkToHref", - "message": "Potentially unsafe model attribute in link_to href", - "file": "app/views/admin/accounts/show.html.haml", - "line": 75, - "link": "https://brakemanscanner.org/docs/warning_types/link_to_href", - "code": "link_to(Account.find(params[:id]).url, Account.find(params[:id]).url)", - "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}], - "location": { - "type": "template", - "template": "admin/accounts/show" - }, - "user_input": "Account.find(params[:id]).url", - "confidence": "Weak", - "note": "" - }, { "warning_type": "Mass Assignment", "warning_code": 105, @@ -104,7 +67,7 @@ "check_name": "PermitAttributes", "message": "Potentially dangerous key allowed for mass assignment", "file": "app/controllers/admin/reports_controller.rb", - "line": 80, + "line": 56, "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/", "code": "params.permit(:account_id, :resolved, :target_account_id)", "render_path": null, @@ -127,7 +90,7 @@ "line": 4, "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/", "code": "render(action => Admin::ActionLog.page(params[:page]), {})", - "render_path": [{"type":"controller","class":"Admin::ActionLogsController","method":"index","line":7,"file":"app/controllers/admin/action_logs_controller.rb"}], + "render_path": [{"type":"controller","class":"Admin::ActionLogsController","method":"index","line":7,"file":"app/controllers/admin/action_logs_controller.rb","rendered":{"name":"admin/action_logs/index","file":"/home/eugr/Projects/mastodon/app/views/admin/action_logs/index.html.haml"}}], "location": { "type": "template", "template": "admin/action_logs/index" @@ -143,7 +106,7 @@ "check_name": "Redirect", "message": "Possible unprotected redirect", "file": "app/controllers/remote_interaction_controller.rb", - "line": 20, + "line": 21, "link": "https://brakemanscanner.org/docs/warning_types/redirect/", "code": "redirect_to(RemoteFollow.new(resource_params).interact_address_for(Status.find(params[:id])))", "render_path": null, @@ -156,25 +119,6 @@ "confidence": "High", "note": "" }, - { - "warning_type": "Cross-Site Scripting", - "warning_code": 4, - "fingerprint": "64b5b2a02ede9c2b3598881eb5a466d63f7d27fe0946aa00d570111ec7338d2e", - "check_name": "LinkToHref", - "message": "Potentially unsafe model attribute in link_to href", - "file": "app/views/admin/accounts/show.html.haml", - "line": 176, - "link": "https://brakemanscanner.org/docs/warning_types/link_to_href", - "code": "link_to(Account.find(params[:id]).followers_url, Account.find(params[:id]).followers_url)", - "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}], - "location": { - "type": "template", - "template": "admin/accounts/show" - }, - "user_input": "Account.find(params[:id]).followers_url", - "confidence": "Weak", - "note": "" - }, { "warning_type": "Dynamic Render Path", "warning_code": 15, @@ -185,7 +129,7 @@ "line": 3, "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/", "code": "render(action => \"stream_entries/#{Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase}\", { Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase.to_sym => Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity, :centered => true, :autoplay => ActiveModel::Type::Boolean.new.cast(params[:autoplay]) })", - "render_path": [{"type":"controller","class":"StatusesController","method":"embed","line":59,"file":"app/controllers/statuses_controller.rb"}], + "render_path": [{"type":"controller","class":"StatusesController","method":"embed","line":63,"file":"app/controllers/statuses_controller.rb","rendered":{"name":"stream_entries/embed","file":"/home/eugr/Projects/mastodon/app/views/stream_entries/embed.html.haml"}}], "location": { "type": "template", "template": "stream_entries/embed" @@ -201,7 +145,7 @@ "check_name": "SQL", "message": "Possible SQL injection", "file": "app/models/status.rb", - "line": 89, + "line": 92, "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/", "code": "result.joins(\"LEFT OUTER JOIN statuses_tags t#{id} ON t#{id}.status_id = statuses.id AND t#{id}.tag_id = #{id}\")", "render_path": null, @@ -214,25 +158,6 @@ "confidence": "Weak", "note": "" }, - { - "warning_type": "Cross-Site Scripting", - "warning_code": 4, - "fingerprint": "82f7b0d09beb3ab68e0fa16be63cedf4e820f2490326e9a1cec05761d92446cd", - "check_name": "LinkToHref", - "message": "Potentially unsafe model attribute in link_to href", - "file": "app/views/admin/accounts/show.html.haml", - "line": 149, - "link": "https://brakemanscanner.org/docs/warning_types/link_to_href", - "code": "link_to(Account.find(params[:id]).salmon_url, Account.find(params[:id]).salmon_url)", - "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}], - "location": { - "type": "template", - "template": "admin/accounts/show" - }, - "user_input": "Account.find(params[:id]).salmon_url", - "confidence": "Weak", - "note": "" - }, { "warning_type": "Dynamic Render Path", "warning_code": 15, @@ -243,7 +168,7 @@ "line": 45, "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/", "code": "render(action => filtered_custom_emojis.eager_load(:local_counterpart).page(params[:page]), {})", - "render_path": [{"type":"controller","class":"Admin::CustomEmojisController","method":"index","line":11,"file":"app/controllers/admin/custom_emojis_controller.rb"}], + "render_path": [{"type":"controller","class":"Admin::CustomEmojisController","method":"index","line":11,"file":"app/controllers/admin/custom_emojis_controller.rb","rendered":{"name":"admin/custom_emojis/index","file":"/home/eugr/Projects/mastodon/app/views/admin/custom_emojis/index.html.haml"}}], "location": { "type": "template", "template": "admin/custom_emojis/index" @@ -279,10 +204,10 @@ "check_name": "Render", "message": "Render path contains parameter value", "file": "app/views/admin/accounts/index.html.haml", - "line": 67, + "line": 47, "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/", "code": "render(action => filtered_accounts.page(params[:page]), {})", - "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"index","line":12,"file":"app/controllers/admin/accounts_controller.rb"}], + "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"index","line":12,"file":"app/controllers/admin/accounts_controller.rb","rendered":{"name":"admin/accounts/index","file":"/home/eugr/Projects/mastodon/app/views/admin/accounts/index.html.haml"}}], "location": { "type": "template", "template": "admin/accounts/index" @@ -298,7 +223,7 @@ "check_name": "Redirect", "message": "Possible unprotected redirect", "file": "app/controllers/media_controller.rb", - "line": 10, + "line": 14, "link": "https://brakemanscanner.org/docs/warning_types/redirect/", "code": "redirect_to(MediaAttachment.attached.find_by!(:shortcode => ((params[:id] or params[:medium_id]))).file.url(:original))", "render_path": null, @@ -311,25 +236,6 @@ "confidence": "High", "note": "" }, - { - "warning_type": "Cross-Site Scripting", - "warning_code": 4, - "fingerprint": "bb0ad5c4a42e06e3846c2089ff5269c17f65483a69414f6ce65eecf2bb11fab7", - "check_name": "LinkToHref", - "message": "Potentially unsafe model attribute in link_to href", - "file": "app/views/admin/accounts/show.html.haml", - "line": 138, - "link": "https://brakemanscanner.org/docs/warning_types/link_to_href", - "code": "link_to(Account.find(params[:id]).remote_url, Account.find(params[:id]).remote_url)", - "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}], - "location": { - "type": "template", - "template": "admin/accounts/show" - }, - "user_input": "Account.find(params[:id]).remote_url", - "confidence": "Weak", - "note": "" - }, { "warning_type": "Redirect", "warning_code": 18, @@ -350,25 +256,6 @@ "confidence": "High", "note": "" }, - { - "warning_type": "Cross-Site Scripting", - "warning_code": 4, - "fingerprint": "e04aafe1e06cf8317fb6ac0a7f35783e45aa1274272ee6eaf28d39adfdad489b", - "check_name": "LinkToHref", - "message": "Potentially unsafe model attribute in link_to href", - "file": "app/views/admin/accounts/show.html.haml", - "line": 170, - "link": "https://brakemanscanner.org/docs/warning_types/link_to_href", - "code": "link_to(Account.find(params[:id]).outbox_url, Account.find(params[:id]).outbox_url)", - "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}], - "location": { - "type": "template", - "template": "admin/accounts/show" - }, - "user_input": "Account.find(params[:id]).outbox_url", - "confidence": "Weak", - "note": "" - }, { "warning_type": "Mass Assignment", "warning_code": 105, @@ -376,7 +263,7 @@ "check_name": "PermitAttributes", "message": "Potentially dangerous key allowed for mass assignment", "file": "app/controllers/api/v1/reports_controller.rb", - "line": 37, + "line": 36, "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/", "code": "params.permit(:account_id, :comment, :forward, :status_ids => ([]))", "render_path": null, @@ -399,7 +286,7 @@ "line": 23, "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/", "code": "render(partial => \"stream_entries/#{Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase}\", { :locals => ({ Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase.to_sym => Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity, :include_threads => true }) })", - "render_path": [{"type":"controller","class":"StatusesController","method":"show","line":30,"file":"app/controllers/statuses_controller.rb"}], + "render_path": [{"type":"controller","class":"StatusesController","method":"show","line":34,"file":"app/controllers/statuses_controller.rb","rendered":{"name":"stream_entries/show","file":"/home/eugr/Projects/mastodon/app/views/stream_entries/show.html.haml"}}], "location": { "type": "template", "template": "stream_entries/show" @@ -409,6 +296,6 @@ "note": "" } ], - "updated": "2018-10-20 23:24:45 +1300", - "brakeman_version": "4.2.1" + "updated": "2019-02-21 02:30:29 +0100", + "brakeman_version": "4.4.0" } diff --git a/spec/services/account_search_service_spec.rb b/spec/services/account_search_service_spec.rb index c6cbdcce10..7b071b378e 100644 --- a/spec/services/account_search_service_spec.rb +++ b/spec/services/account_search_service_spec.rb @@ -4,18 +4,18 @@ describe AccountSearchService, type: :service do describe '.call' do describe 'with a query to ignore' do it 'returns empty array for missing query' do - results = subject.call('', 10) + results = subject.call('', nil, limit: 10) expect(results).to eq [] end it 'returns empty array for hashtag query' do - results = subject.call('#tag', 10) + results = subject.call('#tag', nil, limit: 10) expect(results).to eq [] end it 'returns empty array for limit zero' do Fabricate(:account, username: 'match') - results = subject.call('match', 0) + results = subject.call('match', nil, limit: 0) expect(results).to eq [] end @@ -25,7 +25,7 @@ describe AccountSearchService, type: :service do it 'does not return a nil entry in the array for the exact match' do match = Fabricate(:account, username: 'matchingusername') - results = subject.call('match', 5) + results = subject.call('match', nil, limit: 5) expect(results).to eq [match] end end @@ -35,7 +35,7 @@ describe AccountSearchService, type: :service do before do allow(Account).to receive(:find_local) allow(Account).to receive(:search_for) - subject.call('@', 10) + subject.call('@', nil, limit: 10) end it 'uses find_local with empty query to look for local accounts' do @@ -47,7 +47,7 @@ describe AccountSearchService, type: :service do before do allow(Account).to receive(:find_local) allow(Account).to receive(:search_for) - subject.call('one', 10) + subject.call('one', nil, limit: 10) end it 'uses find_local to look for local accounts' do @@ -55,7 +55,7 @@ describe AccountSearchService, type: :service do end it 'uses search_for to find matches' do - expect(Account).to have_received(:search_for).with('one', 10) + expect(Account).to have_received(:search_for).with('one', 10, 0) end end @@ -65,16 +65,16 @@ describe AccountSearchService, type: :service do end it 'uses find_remote to look for remote accounts' do - subject.call('two@example.com', 10) + subject.call('two@example.com', nil, limit: 10) expect(Account).to have_received(:find_remote).with('two', 'example.com') end describe 'and there is no account provided' do it 'uses search_for to find matches' do allow(Account).to receive(:search_for) - subject.call('two@example.com', 10, nil, resolve: false) + subject.call('two@example.com', nil, limit: 10, resolve: false) - expect(Account).to have_received(:search_for).with('two example.com', 10) + expect(Account).to have_received(:search_for).with('two example.com', 10, 0) end end @@ -82,9 +82,9 @@ describe AccountSearchService, type: :service do it 'uses advanced_search_for to find matches' do account = Fabricate(:account) allow(Account).to receive(:advanced_search_for) - subject.call('two@example.com', 10, account, resolve: false) + subject.call('two@example.com', account, limit: 10, resolve: false) - expect(Account).to have_received(:advanced_search_for).with('two example.com', account, 10, nil) + expect(Account).to have_received(:advanced_search_for).with('two example.com', account, 10, nil, 0) end end end @@ -95,7 +95,7 @@ describe AccountSearchService, type: :service do partial = Fabricate(:account, username: 'exactness') exact = Fabricate(:account, username: 'exact') - results = subject.call('exact', 10) + results = subject.call('exact', nil, limit: 10) expect(results.size).to eq 2 expect(results).to eq [exact, partial] end @@ -114,7 +114,7 @@ describe AccountSearchService, type: :service do exact = Fabricate(:account, username: 'e') Rails.configuration.x.local_domain = 'example.com' - results = subject.call('e@example.com', 2) + results = subject.call('e@example.com', nil, limit: 2) expect(results.size).to eq 2 expect(results).to eq([exact, remote]).or eq([exact, remote_too]) end @@ -125,7 +125,7 @@ describe AccountSearchService, type: :service do service = double(call: nil) allow(ResolveAccountService).to receive(:new).and_return(service) - results = subject.call('newuser@remote.com', 10, nil, resolve: true) + results = subject.call('newuser@remote.com', nil, limit: 10, resolve: true) expect(service).to have_received(:call).with('newuser@remote.com') end @@ -133,7 +133,7 @@ describe AccountSearchService, type: :service do service = double(call: nil) allow(ResolveAccountService).to receive(:new).and_return(service) - results = subject.call('newuser@remote.com', 10, nil, resolve: false) + results = subject.call('newuser@remote.com', nil, limit: 10, resolve: false) expect(service).not_to have_received(:call) end end @@ -143,7 +143,7 @@ describe AccountSearchService, type: :service do partial = Fabricate(:account, username: 'exactness') exact = Fabricate(:account, username: 'exact', suspended: true) - results = subject.call('exact', 10) + results = subject.call('exact', nil, limit: 10) expect(results.size).to eq 1 expect(results).to eq [partial] end @@ -151,7 +151,7 @@ describe AccountSearchService, type: :service do it "does not return suspended remote accounts" do remote = Fabricate(:account, username: 'a', domain: 'remote', display_name: 'e', suspended: true) - results = subject.call('a@example.com', 2) + results = subject.call('a@example.com', nil, limit: 2) expect(results.size).to eq 0 expect(results).to eq [] end diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb index 671080f1d9..d064cd9b85 100644 --- a/spec/services/search_service_spec.rb +++ b/spec/services/search_service_spec.rb @@ -10,7 +10,7 @@ describe SearchService, type: :service do it 'returns empty results without searching' do allow(AccountSearchService).to receive(:new) allow(Tag).to receive(:search_for) - results = subject.call('', 10) + results = subject.call('', nil, 10) expect(results).to eq(empty_results) expect(AccountSearchService).not_to have_received(:new) @@ -27,7 +27,7 @@ describe SearchService, type: :service do it 'returns the empty results' do service = double(call: nil) allow(ResolveURLService).to receive(:new).and_return(service) - results = subject.call(@query, 10) + results = subject.call(@query, nil, 10) expect(service).to have_received(:call).with(@query, on_behalf_of: nil) expect(results).to eq empty_results @@ -40,7 +40,7 @@ describe SearchService, type: :service do service = double(call: account) allow(ResolveURLService).to receive(:new).and_return(service) - results = subject.call(@query, 10) + results = subject.call(@query, nil, 10) expect(service).to have_received(:call).with(@query, on_behalf_of: nil) expect(results).to eq empty_results.merge(accounts: [account]) end @@ -52,7 +52,7 @@ describe SearchService, type: :service do service = double(call: status) allow(ResolveURLService).to receive(:new).and_return(service) - results = subject.call(@query, 10) + results = subject.call(@query, nil, 10) expect(service).to have_received(:call).with(@query, on_behalf_of: nil) expect(results).to eq empty_results.merge(statuses: [status]) end @@ -67,8 +67,8 @@ describe SearchService, type: :service do service = double(call: [account]) allow(AccountSearchService).to receive(:new).and_return(service) - results = subject.call(query, 10) - expect(service).to have_received(:call).with(query, 10, nil, resolve: false) + results = subject.call(query, nil, 10) + expect(service).to have_received(:call).with(query, nil, limit: 10, offset: 0, resolve: false) expect(results).to eq empty_results.merge(accounts: [account]) end end @@ -77,17 +77,17 @@ describe SearchService, type: :service do it 'includes the tag in the results' do query = '#tag' tag = Tag.new - allow(Tag).to receive(:search_for).with('tag', 10).and_return([tag]) + allow(Tag).to receive(:search_for).with('tag', 10, 0).and_return([tag]) - results = subject.call(query, 10) - expect(Tag).to have_received(:search_for).with('tag', 10) + results = subject.call(query, nil, 10) + expect(Tag).to have_received(:search_for).with('tag', 10, 0) expect(results).to eq empty_results.merge(hashtags: [tag]) end it 'does not include tag when starts with @ character' do query = '@username' allow(Tag).to receive(:search_for) - results = subject.call(query, 10) + results = subject.call(query, nil, 10) expect(Tag).not_to have_received(:search_for) expect(results).to eq empty_results end -- GitLab From a5e7ada62fa2824be158f0b3bed7f3c39ce9c0fa Mon Sep 17 00:00:00 2001 From: abcang <abcang1015@gmail.com> Date: Tue, 26 Feb 2019 23:23:24 +0900 Subject: [PATCH 135/192] Improve account media query (#10121) --- app/controllers/api/v1/accounts/statuses_controller.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb index 6fdc827cb2..ed10f3f6a7 100644 --- a/app/controllers/api/v1/accounts/statuses_controller.rb +++ b/app/controllers/api/v1/accounts/statuses_controller.rb @@ -51,9 +51,9 @@ class Api::V1::Accounts::StatusesController < Api::BaseController # Also, Avoid getting slow by not narrowing down by `statuses.account_id`. # When narrowing down by `statuses.account_id`, `index_statuses_20180106` will be used # and the table will be joined by `Merge Semi Join`, so the query will be slow. - Status.joins(:media_attachments).merge(@account.media_attachments).permitted_for(@account, current_account) - .paginate_by_max_id(limit_param(DEFAULT_STATUSES_LIMIT), params[:max_id], params[:since_id]) - .reorder(id: :desc).distinct(:id).pluck(:id) + @account.statuses.joins(:media_attachments).merge(@account.media_attachments).permitted_for(@account, current_account) + .paginate_by_max_id(limit_param(DEFAULT_STATUSES_LIMIT), params[:max_id], params[:since_id]) + .reorder(id: :desc).distinct(:id).pluck(:id) end def pinned_scope -- GitLab From 7209a8b32f334726c0b0a78724152740ba0031be Mon Sep 17 00:00:00 2001 From: abcang <abcang1015@gmail.com> Date: Wed, 2 May 2018 23:14:51 +0900 Subject: [PATCH 136/192] Keep notification when muting_notifications is true (#7311) * Keep notification when muting_notifications is true * Retrun mute object * Fix test --- app/javascript/flavours/glitch/reducers/notifications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js index 6667966c02..c44674a80d 100644 --- a/app/javascript/flavours/glitch/reducers/notifications.js +++ b/app/javascript/flavours/glitch/reducers/notifications.js @@ -208,7 +208,7 @@ export default function notifications(state = initialState, action) { return expandNormalizedNotifications(state, action.notifications, action.next); case ACCOUNT_BLOCK_SUCCESS: case ACCOUNT_MUTE_SUCCESS: - return filterNotifications(state, action.relationship); + return action.relationship.muting_notifications ? filterNotifications(state, action.relationship) : state; case NOTIFICATIONS_CLEAR: return state.set('items', ImmutableList()).set('hasMore', false); case TIMELINE_DELETE: -- GitLab From 1e06ca1c0af98cf61b1114b93249fb447e795edb Mon Sep 17 00:00:00 2001 From: Eugen Rochko <eugen@zeonfederated.com> Date: Mon, 25 Feb 2019 01:10:56 +0100 Subject: [PATCH 137/192] Fix web UI not removing notifications after block (#10108) Regression from #7311 --- app/javascript/flavours/glitch/reducers/notifications.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/flavours/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js index c44674a80d..04ae3d406e 100644 --- a/app/javascript/flavours/glitch/reducers/notifications.js +++ b/app/javascript/flavours/glitch/reducers/notifications.js @@ -207,6 +207,7 @@ export default function notifications(state = initialState, action) { case NOTIFICATIONS_EXPAND_SUCCESS: return expandNormalizedNotifications(state, action.notifications, action.next); case ACCOUNT_BLOCK_SUCCESS: + return filterNotifications(state, action.relationship); case ACCOUNT_MUTE_SUCCESS: return action.relationship.muting_notifications ? filterNotifications(state, action.relationship) : state; case NOTIFICATIONS_CLEAR: -- GitLab From 9edab463682f5d5beb0a7f4e4574d708c95bbc52 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Wed, 27 Feb 2019 14:57:14 +0100 Subject: [PATCH 138/192] Fix mention processing for unknwon accounts on incoming ActivityPub Notes (#10125) `::FetchRemoteAccountService` is not `ActivityPub::FetchRemoteAccountService`, its second argument is the pre-fetched body. Passing `id: false` actually passed a `Hash` as the prefetched body, instead of properly resolving unknown remote accounts. --- app/lib/activitypub/activity/create.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index d7bd65c806..6d58aba709 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -159,7 +159,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity return if tag['href'].blank? account = account_from_uri(tag['href']) - account = ::FetchRemoteAccountService.new.call(tag['href'], id: false) if account.nil? + account = ::FetchRemoteAccountService.new.call(tag['href']) if account.nil? return if account.nil? -- GitLab From 74258ef77a24211a1fe59f6a9cb9244a4ad3caa3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Feb 2019 14:58:08 +0100 Subject: [PATCH 139/192] Bump hamlit-rails from 0.2.1 to 0.2.2 (#10124) Bumps [hamlit-rails](https://github.com/mfung/hamlit-rails) from 0.2.1 to 0.2.2. - [Release notes](https://github.com/mfung/hamlit-rails/releases) - [Commits](https://github.com/mfung/hamlit-rails/compare/v0.2.1...v0.2.2) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index a92fadb8a8..d23f894407 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -243,7 +243,7 @@ GEM temple (>= 0.8.0) thor tilt - hamlit-rails (0.2.1) + hamlit-rails (0.2.2) actionpack (>= 4.0.1) activesupport (>= 4.0.1) hamlit (>= 1.2.0) -- GitLab From 34315fcda53a3ce29a50a253bd63f7e70ef8e4b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Feb 2019 15:02:57 +0100 Subject: [PATCH 140/192] Bump capybara from 3.13.2 to 3.14.0 (#10119) Bumps [capybara](https://github.com/teamcapybara/capybara) from 3.13.2 to 3.14.0. - [Release notes](https://github.com/teamcapybara/capybara/releases) - [Changelog](https://github.com/teamcapybara/capybara/blob/master/History.md) - [Commits](https://github.com/teamcapybara/capybara/compare/3.13.2...3.14.0) Signed-off-by: dependabot[bot] <support@dependabot.com> --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index e6d7bd4d01..46d77f6626 100644 --- a/Gemfile +++ b/Gemfile @@ -107,7 +107,7 @@ group :production, :test do end group :test do - gem 'capybara', '~> 3.13' + gem 'capybara', '~> 3.14' gem 'climate_control', '~> 0.2' gem 'faker', '~> 1.9' gem 'microformats', '~> 4.1' diff --git a/Gemfile.lock b/Gemfile.lock index d23f894407..447444740a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -126,7 +126,7 @@ GEM sshkit (~> 1.3) capistrano-yarn (2.0.2) capistrano (~> 3.0) - capybara (3.13.2) + capybara (3.14.0) addressable mini_mime (>= 0.1.3) nokogiri (~> 1.8) @@ -671,7 +671,7 @@ DEPENDENCIES capistrano-rails (~> 1.4) capistrano-rbenv (~> 2.1) capistrano-yarn (~> 2.0) - capybara (~> 3.13) + capybara (~> 3.14) charlock_holmes (~> 0.7.6) chewy (~> 5.0) cld3 (~> 3.2.3) -- GitLab From df0120670398246739144466bf327193383ba530 Mon Sep 17 00:00:00 2001 From: trwnh <a@trwnh.com> Date: Wed, 27 Feb 2019 08:03:28 -0600 Subject: [PATCH 141/192] Allow getting-started to scroll on short screens (#10075) At 480px height, there is not enough space to fully display the footer. --- app/javascript/styles/mastodon/components.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index d88557559e..0163e90b93 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2336,6 +2336,7 @@ a.account__display-name { .getting-started { color: $dark-text-color; + overflow: auto; &__footer { flex: 0 0 auto; -- GitLab From 76ed481aa7b67d624675cdaa85bac583853fd24d Mon Sep 17 00:00:00 2001 From: Thibaut Girka <thib@sitedethib.com> Date: Tue, 19 Feb 2019 11:35:13 +0100 Subject: [PATCH 142/192] Port public page mastodon-light fixes from upstream --- .../glitch/styles/mastodon-light/diff.scss | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss index 339ee7cf08..6f105d3fad 100644 --- a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss +++ b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss @@ -317,3 +317,58 @@ } } +.button.logo-button { + color: $white; + + svg path:first-child { + fill: $white; + } +} + +.public-layout { + .header, + .public-account-header, + .public-account-bio { + box-shadow: none; + } + + .header { + background: lighten($ui-base-color, 12%); + } + + .public-account-header { + &__image { + background: lighten($ui-base-color, 12%); + + &::after { + box-shadow: none; + } + } + + &__tabs { + &__name { + h1, + h1 small { + color: $white; + } + } + } + } +} + +.account__section-headline a.active::after { + border-color: transparent transparent $white; +} + +.hero-widget, +.box-widget, +.contact-widget, +.landing-page__information.contact-widget, +.moved-account-widget, +.memoriam-widget, +.activity-stream, +.nothing-here, +.directory__tag > a, +.directory__tag > div { + box-shadow: none; +} -- GitLab From 6e8743d17a92438bd2332e97f824bc212fa4b96e Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Wed, 27 Feb 2019 19:13:16 +0100 Subject: [PATCH 143/192] Fix direct timeline pagination in the WebUI (#10126) The `hasMore` property of timelines in redux store was set whenever an API request returned only one page of results, *even* if the query only requested newer conversations (using `since_id`), causing `hasMore` to be incorrectly set to false whenever fetching new toots in the direct timeline, which happens each time the direct message column is opened. (Basically #9516 for direct messages) --- app/javascript/mastodon/actions/conversations.js | 7 +++++-- app/javascript/mastodon/reducers/conversations.js | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/javascript/mastodon/actions/conversations.js b/app/javascript/mastodon/actions/conversations.js index 3c2ea96806..c6e062ef73 100644 --- a/app/javascript/mastodon/actions/conversations.js +++ b/app/javascript/mastodon/actions/conversations.js @@ -41,13 +41,15 @@ export const expandConversations = ({ maxId } = {}) => (dispatch, getState) => { params.since_id = getState().getIn(['conversations', 'items', 0, 'last_status']); } + const isLoadingRecent = !!params.since_id; + api(getState).get('/api/v1/conversations', { params }) .then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedAccounts(response.data.reduce((aggr, item) => aggr.concat(item.accounts), []))); dispatch(importFetchedStatuses(response.data.map(item => item.last_status).filter(x => !!x))); - dispatch(expandConversationsSuccess(response.data, next ? next.uri : null)); + dispatch(expandConversationsSuccess(response.data, next ? next.uri : null, isLoadingRecent)); }) .catch(err => dispatch(expandConversationsFail(err))); }; @@ -56,10 +58,11 @@ export const expandConversationsRequest = () => ({ type: CONVERSATIONS_FETCH_REQUEST, }); -export const expandConversationsSuccess = (conversations, next) => ({ +export const expandConversationsSuccess = (conversations, next, isLoadingRecent) => ({ type: CONVERSATIONS_FETCH_SUCCESS, conversations, next, + isLoadingRecent, }); export const expandConversationsFail = error => ({ diff --git a/app/javascript/mastodon/reducers/conversations.js b/app/javascript/mastodon/reducers/conversations.js index 955a07754d..9564bffcd2 100644 --- a/app/javascript/mastodon/reducers/conversations.js +++ b/app/javascript/mastodon/reducers/conversations.js @@ -35,7 +35,7 @@ const updateConversation = (state, item) => state.update('items', list => { } }); -const expandNormalizedConversations = (state, conversations, next) => { +const expandNormalizedConversations = (state, conversations, next, isLoadingRecent) => { let items = ImmutableList(conversations.map(conversationToMap)); return state.withMutations(mutable => { @@ -66,7 +66,7 @@ const expandNormalizedConversations = (state, conversations, next) => { }); } - if (!next) { + if (!next && !isLoadingRecent) { mutable.set('hasMore', false); } @@ -81,7 +81,7 @@ export default function conversations(state = initialState, action) { case CONVERSATIONS_FETCH_FAIL: return state.set('isLoading', false); case CONVERSATIONS_FETCH_SUCCESS: - return expandNormalizedConversations(state, action.conversations, action.next); + return expandNormalizedConversations(state, action.conversations, action.next, action.isLoadingRecent); case CONVERSATIONS_UPDATE: return updateConversation(state, action.conversation); case CONVERSATIONS_MOUNT: -- GitLab From 9d3c6f1849120e732a9230959cb302575765ea8c Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Thu, 28 Feb 2019 15:22:21 +0100 Subject: [PATCH 144/192] Improved remote thread fetching (#10106) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fetch up to 5 replies when discovering a new remote status This is used for resolving threads downwards. The originating server must add a “replies†attributes with such replies for it to be useful. * Add some tests for ActivityPub::FetchRepliesWorker * Add specs for ActivityPub::FetchRepliesService * Serialize up to 5 public self-replies for ActivityPub notes * Add specs for ActivityPub::NoteSerializer * Move exponential backoff logic to a worker concern * Fetch first page of paginated collections when fetching thread replies * Add specs for paginated collections in replies * Move Note replies serialization to a first CollectionPage The collection isn't actually paginable yet as it has no id nor a `next` field. This may come in another PR. * Use pluck(:uri) instead of map(&:uri) to improve performances * Fix fetching replies when they are in a CollectionPage --- app/lib/activitypub/activity/create.rb | 10 ++ .../concerns/status_threading_concern.rb | 4 + .../activitypub/collection_presenter.rb | 2 +- .../activitypub/collection_serializer.rb | 5 +- .../activitypub/note_serializer.rb | 13 ++ .../activitypub/fetch_replies_service.rb | 60 +++++++++ .../activitypub/fetch_replies_worker.rb | 12 ++ app/workers/concerns/exponential_backoff.rb | 11 ++ app/workers/fetch_reply_worker.rb | 12 ++ app/workers/thread_resolve_worker.rb | 5 +- spec/serializers/activitypub/note_spec.rb | 44 +++++++ .../activitypub/fetch_replies_service_spec.rb | 122 ++++++++++++++++++ .../activitypub/fetch_replies_worker_spec.rb | 40 ++++++ 13 files changed, 333 insertions(+), 7 deletions(-) create mode 100644 app/services/activitypub/fetch_replies_service.rb create mode 100644 app/workers/activitypub/fetch_replies_worker.rb create mode 100644 app/workers/concerns/exponential_backoff.rb create mode 100644 app/workers/fetch_reply_worker.rb create mode 100644 spec/serializers/activitypub/note_spec.rb create mode 100644 spec/services/activitypub/fetch_replies_service_spec.rb create mode 100644 spec/workers/activitypub/fetch_replies_worker_spec.rb diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 6d58aba709..0980f94bac 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -40,6 +40,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity end resolve_thread(@status) + fetch_replies(@status) distribute(@status) forward_for_reply if @status.public_visibility? || @status.unlisted_visibility? end @@ -213,6 +214,15 @@ class ActivityPub::Activity::Create < ActivityPub::Activity ThreadResolveWorker.perform_async(status.id, in_reply_to_uri) end + def fetch_replies(status) + collection = @object['replies'] + return if collection.nil? + replies = ActivityPub::FetchRepliesService.new.call(status, collection, false) + return if replies.present? + uri = value_or_id(collection) + ActivityPub::FetchRepliesWorker.perform_async(status.id, uri) unless uri.nil? + end + def conversation_from_uri(uri) return nil if uri.nil? return Conversation.find_by(id: OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')) if OStatus::TagManager.instance.local_id?(uri) diff --git a/app/models/concerns/status_threading_concern.rb b/app/models/concerns/status_threading_concern.rb index b9c800c2aa..15eb695cd0 100644 --- a/app/models/concerns/status_threading_concern.rb +++ b/app/models/concerns/status_threading_concern.rb @@ -11,6 +11,10 @@ module StatusThreadingConcern find_statuses_from_tree_path(descendant_ids(limit, max_child_id, since_child_id, depth), account, promote: true) end + def self_replies(limit) + account.statuses.where(in_reply_to_id: id, visibility: [:public, :unlisted]).reorder(id: :asc).limit(limit) + end + private def ancestor_ids(limit) diff --git a/app/presenters/activitypub/collection_presenter.rb b/app/presenters/activitypub/collection_presenter.rb index ec84ab1a3d..28331f0c41 100644 --- a/app/presenters/activitypub/collection_presenter.rb +++ b/app/presenters/activitypub/collection_presenter.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true class ActivityPub::CollectionPresenter < ActiveModelSerializers::Model - attributes :id, :type, :size, :items, :part_of, :first, :last, :next, :prev + attributes :id, :type, :size, :items, :page, :part_of, :first, :last, :next, :prev end diff --git a/app/serializers/activitypub/collection_serializer.rb b/app/serializers/activitypub/collection_serializer.rb index e8960131bb..b03609957d 100644 --- a/app/serializers/activitypub/collection_serializer.rb +++ b/app/serializers/activitypub/collection_serializer.rb @@ -7,7 +7,8 @@ class ActivityPub::CollectionSerializer < ActiveModel::Serializer super end - attributes :id, :type + attribute :id, if: -> { object.id.present? } + attribute :type attribute :total_items, if: -> { object.size.present? } attribute :next, if: -> { object.next.present? } attribute :prev, if: -> { object.prev.present? } @@ -37,6 +38,6 @@ class ActivityPub::CollectionSerializer < ActiveModel::Serializer end def page? - object.part_of.present? + object.part_of.present? || object.page.present? end end diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb index c9d23e25fa..6b0978ad3c 100644 --- a/app/serializers/activitypub/note_serializer.rb +++ b/app/serializers/activitypub/note_serializer.rb @@ -13,6 +13,8 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer has_many :media_attachments, key: :attachment has_many :virtual_tags, key: :tag + has_one :replies, serializer: ActivityPub::CollectionSerializer + def id ActivityPub::TagManager.instance.uri_for(object) end @@ -33,6 +35,17 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer { object.language => Formatter.instance.format(object) } end + def replies + ActivityPub::CollectionPresenter.new( + type: :unordered, + first: ActivityPub::CollectionPresenter.new( + type: :unordered, + page: true, + items: object.self_replies(5).pluck(:uri) + ) + ) + end + def language? object.language.present? end diff --git a/app/services/activitypub/fetch_replies_service.rb b/app/services/activitypub/fetch_replies_service.rb new file mode 100644 index 0000000000..95c486a431 --- /dev/null +++ b/app/services/activitypub/fetch_replies_service.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +class ActivityPub::FetchRepliesService < BaseService + include JsonLdHelper + + def call(parent_status, collection_or_uri, allow_synchronous_requests = true) + @account = parent_status.account + @allow_synchronous_requests = allow_synchronous_requests + + @items = collection_items(collection_or_uri) + return if @items.nil? + + FetchReplyWorker.push_bulk(filtered_replies) + + @items + end + + private + + def collection_items(collection_or_uri) + collection = fetch_collection(collection_or_uri) + return unless collection.is_a?(Hash) + + collection = fetch_collection(collection['first']) if collection['first'].present? + return unless collection.is_a?(Hash) + + case collection['type'] + when 'Collection', 'CollectionPage' + collection['items'] + when 'OrderedCollection', 'OrderedCollectionPage' + collection['orderedItems'] + end + end + + def fetch_collection(collection_or_uri) + return collection_or_uri if collection_or_uri.is_a?(Hash) + return unless @allow_synchronous_requests + return if invalid_origin?(collection_or_uri) + collection = fetch_resource_without_id_validation(collection_or_uri) + raise Mastodon::UnexpectedResponseError if collection.nil? + collection + end + + def filtered_replies + # Only fetch replies to the same server as the original status to avoid + # amplification attacks. + + # Also limit to 5 fetched replies to limit potential for DoS. + @items.map { |item| value_or_id(item) }.reject { |uri| invalid_origin?(uri) }.take(5) + end + + def invalid_origin?(url) + return true if unsupported_uri_scheme?(url) + + needle = Addressable::URI.parse(url).host + haystack = Addressable::URI.parse(@account.uri).host + + !haystack.casecmp(needle).zero? + end +end diff --git a/app/workers/activitypub/fetch_replies_worker.rb b/app/workers/activitypub/fetch_replies_worker.rb new file mode 100644 index 0000000000..bf466db542 --- /dev/null +++ b/app/workers/activitypub/fetch_replies_worker.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class ActivityPub::FetchRepliesWorker + include Sidekiq::Worker + include ExponentialBackoff + + sidekiq_options queue: 'pull', retry: 3 + + def perform(parent_status_id, replies_uri) + ActivityPub::FetchRepliesService.new.call(Status.find(parent_status_id), replies_uri) + end +end diff --git a/app/workers/concerns/exponential_backoff.rb b/app/workers/concerns/exponential_backoff.rb new file mode 100644 index 0000000000..f2b931e331 --- /dev/null +++ b/app/workers/concerns/exponential_backoff.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module ExponentialBackoff + extend ActiveSupport::Concern + + included do + sidekiq_retry_in do |count| + 15 + 10 * (count**4) + rand(10 * (count**4)) + end + end +end diff --git a/app/workers/fetch_reply_worker.rb b/app/workers/fetch_reply_worker.rb new file mode 100644 index 0000000000..f7aa25e815 --- /dev/null +++ b/app/workers/fetch_reply_worker.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class FetchReplyWorker + include Sidekiq::Worker + include ExponentialBackoff + + sidekiq_options queue: 'pull', retry: 3 + + def perform(child_url) + FetchRemoteStatusService.new.call(child_url) + end +end diff --git a/app/workers/thread_resolve_worker.rb b/app/workers/thread_resolve_worker.rb index c18a778d55..8bba9ca75e 100644 --- a/app/workers/thread_resolve_worker.rb +++ b/app/workers/thread_resolve_worker.rb @@ -2,13 +2,10 @@ class ThreadResolveWorker include Sidekiq::Worker + include ExponentialBackoff sidekiq_options queue: 'pull', retry: 3 - sidekiq_retry_in do |count| - 15 + 10 * (count**4) + rand(10 * (count**4)) - end - def perform(child_status_id, parent_url) child_status = Status.find(child_status_id) parent_status = FetchRemoteStatusService.new.call(parent_url) diff --git a/spec/serializers/activitypub/note_spec.rb b/spec/serializers/activitypub/note_spec.rb new file mode 100644 index 0000000000..55bfbc16bf --- /dev/null +++ b/spec/serializers/activitypub/note_spec.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe ActivityPub::NoteSerializer do + let!(:account) { Fabricate(:account) } + let!(:other) { Fabricate(:account) } + let!(:parent) { Fabricate(:status, account: account, visibility: :public) } + let!(:reply1) { Fabricate(:status, account: account, thread: parent, visibility: :public) } + let!(:reply2) { Fabricate(:status, account: account, thread: parent, visibility: :public) } + let!(:reply3) { Fabricate(:status, account: other, thread: parent, visibility: :public) } + let!(:reply4) { Fabricate(:status, account: account, thread: parent, visibility: :public) } + let!(:reply5) { Fabricate(:status, account: account, thread: parent, visibility: :direct) } + + before(:each) do + @serialization = ActiveModelSerializers::SerializableResource.new(parent, serializer: ActivityPub::NoteSerializer, adapter: ActivityPub::Adapter) + end + + subject { JSON.parse(@serialization.to_json) } + + it 'has a Note type' do + expect(subject['type']).to eql('Note') + end + + it 'has a replies collection' do + expect(subject['replies']['type']).to eql('Collection') + end + + it 'has a replies collection with a first Page' do + expect(subject['replies']['first']['type']).to eql('CollectionPage') + end + + it 'includes public self-replies in its replies collection' do + expect(subject['replies']['first']['items']).to include(reply1.uri, reply2.uri, reply4.uri) + end + + it 'does not include replies from others in its replies collection' do + expect(subject['replies']['first']['items']).to_not include(reply3.uri) + end + + it 'does not include replies with direct visibility in its replies collection' do + expect(subject['replies']['first']['items']).to_not include(reply5.uri) + end +end diff --git a/spec/services/activitypub/fetch_replies_service_spec.rb b/spec/services/activitypub/fetch_replies_service_spec.rb new file mode 100644 index 0000000000..65c4533411 --- /dev/null +++ b/spec/services/activitypub/fetch_replies_service_spec.rb @@ -0,0 +1,122 @@ +require 'rails_helper' + +RSpec.describe ActivityPub::FetchRepliesService, type: :service do + let(:actor) { Fabricate(:account, domain: 'example.com', uri: 'http://example.com/account') } + let(:status) { Fabricate(:status, account: actor) } + let(:collection_uri) { 'http://example.com/replies/1' } + + let(:items) do + [ + 'http://example.com/self-reply-1', + 'http://example.com/self-reply-2', + 'http://example.com/self-reply-3', + 'http://other.com/other-reply-1', + 'http://other.com/other-reply-2', + 'http://other.com/other-reply-3', + 'http://example.com/self-reply-4', + 'http://example.com/self-reply-5', + 'http://example.com/self-reply-6', + ] + end + + let(:payload) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + type: 'Collection', + id: collection_uri, + items: items, + }.with_indifferent_access + end + + subject { described_class.new } + + describe '#call' do + context 'when the payload is a Collection with inlined replies' do + context 'when passing the collection itself' do + it 'spawns workers for up to 5 replies on the same server' do + allow(FetchReplyWorker).to receive(:push_bulk) + subject.call(status, payload) + expect(FetchReplyWorker).to have_received(:push_bulk).with(['http://example.com/self-reply-1', 'http://example.com/self-reply-2', 'http://example.com/self-reply-3', 'http://example.com/self-reply-4', 'http://example.com/self-reply-5']) + end + end + + context 'when passing the URL to the collection' do + before do + stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) + end + + it 'spawns workers for up to 5 replies on the same server' do + allow(FetchReplyWorker).to receive(:push_bulk) + subject.call(status, collection_uri) + expect(FetchReplyWorker).to have_received(:push_bulk).with(['http://example.com/self-reply-1', 'http://example.com/self-reply-2', 'http://example.com/self-reply-3', 'http://example.com/self-reply-4', 'http://example.com/self-reply-5']) + end + end + end + + context 'when the payload is an OrderedCollection with inlined replies' do + let(:payload) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + type: 'OrderedCollection', + id: collection_uri, + orderedItems: items, + }.with_indifferent_access + end + + context 'when passing the collection itself' do + it 'spawns workers for up to 5 replies on the same server' do + allow(FetchReplyWorker).to receive(:push_bulk) + subject.call(status, payload) + expect(FetchReplyWorker).to have_received(:push_bulk).with(['http://example.com/self-reply-1', 'http://example.com/self-reply-2', 'http://example.com/self-reply-3', 'http://example.com/self-reply-4', 'http://example.com/self-reply-5']) + end + end + + context 'when passing the URL to the collection' do + before do + stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) + end + + it 'spawns workers for up to 5 replies on the same server' do + allow(FetchReplyWorker).to receive(:push_bulk) + subject.call(status, collection_uri) + expect(FetchReplyWorker).to have_received(:push_bulk).with(['http://example.com/self-reply-1', 'http://example.com/self-reply-2', 'http://example.com/self-reply-3', 'http://example.com/self-reply-4', 'http://example.com/self-reply-5']) + end + end + end + + context 'when the payload is a paginated Collection with inlined replies' do + let(:payload) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + type: 'Collection', + id: collection_uri, + first: { + type: 'CollectionPage', + partOf: collection_uri, + items: items, + } + }.with_indifferent_access + end + + context 'when passing the collection itself' do + it 'spawns workers for up to 5 replies on the same server' do + allow(FetchReplyWorker).to receive(:push_bulk) + subject.call(status, payload) + expect(FetchReplyWorker).to have_received(:push_bulk).with(['http://example.com/self-reply-1', 'http://example.com/self-reply-2', 'http://example.com/self-reply-3', 'http://example.com/self-reply-4', 'http://example.com/self-reply-5']) + end + end + + context 'when passing the URL to the collection' do + before do + stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) + end + + it 'spawns workers for up to 5 replies on the same server' do + allow(FetchReplyWorker).to receive(:push_bulk) + subject.call(status, collection_uri) + expect(FetchReplyWorker).to have_received(:push_bulk).with(['http://example.com/self-reply-1', 'http://example.com/self-reply-2', 'http://example.com/self-reply-3', 'http://example.com/self-reply-4', 'http://example.com/self-reply-5']) + end + end + end + end +end diff --git a/spec/workers/activitypub/fetch_replies_worker_spec.rb b/spec/workers/activitypub/fetch_replies_worker_spec.rb new file mode 100644 index 0000000000..91ef3c4b92 --- /dev/null +++ b/spec/workers/activitypub/fetch_replies_worker_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe ActivityPub::FetchRepliesWorker do + subject { described_class.new } + + let(:account) { Fabricate(:account, uri: 'https://example.com/user/1') } + let(:status) { Fabricate(:status, account: account) } + + let(:payload) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: 'https://example.com/statuses_replies/1', + type: 'Collection', + items: [], + } + end + + let(:json) { Oj.dump(payload) } + + describe 'perform' do + it 'performs a request if the collection URI is from the same host' do + stub_request(:get, 'https://example.com/statuses_replies/1').to_return(status: 200, body: json) + subject.perform(status.id, 'https://example.com/statuses_replies/1') + expect(a_request(:get, 'https://example.com/statuses_replies/1')).to have_been_made.once + end + + it 'does not perform a request if the collection URI is from a different host' do + stub_request(:get, 'https://other.com/statuses_replies/1').to_return(status: 200) + subject.perform(status.id, 'https://other.com/statuses_replies/1') + expect(a_request(:get, 'https://other.com/statuses_replies/1')).to_not have_been_made + end + + it 'raises when request fails' do + stub_request(:get, 'https://example.com/statuses_replies/1').to_return(status: 500) + expect { subject.perform(status.id, 'https://example.com/statuses_replies/1') }.to raise_error Mastodon::UnexpectedResponseError + end + end +end -- GitLab From d8498b39838eb352a9b268e0f22b1b025320dc73 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Thu, 28 Feb 2019 18:16:34 +0100 Subject: [PATCH 145/192] Give the `replies` collection an identifier and enable pagination (#10128) --- app/controllers/statuses_controller.rb | 53 +++++++++++++++++++ app/lib/activitypub/tag_manager.rb | 6 +++ .../activitypub/note_serializer.rb | 10 ++-- config/routes.rb | 1 + 4 files changed, 67 insertions(+), 3 deletions(-) diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index 15d59fd893..3686bd9fd8 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -18,6 +18,7 @@ class StatusesController < ApplicationController before_action :redirect_to_original, only: [:show] before_action :set_referrer_policy_header, only: [:show] before_action :set_cache_headers + before_action :set_replies, only: [:replies] content_security_policy only: :embed do |p| p.frame_ancestors(false) @@ -63,8 +64,37 @@ class StatusesController < ApplicationController render 'stream_entries/embed', layout: 'embedded' end + def replies + skip_session! + + render json: replies_collection_presenter, + serializer: ActivityPub::CollectionSerializer, + adapter: ActivityPub::Adapter, + content_type: 'application/activity+json', + skip_activities: true + end + private + def replies_collection_presenter + page = ActivityPub::CollectionPresenter.new( + id: replies_account_status_url(@account, @status, page_params), + type: :unordered, + part_of: replies_account_status_url(@account, @status), + next: next_page, + items: @replies.map { |status| status.local ? status : status.id } + ) + if page_requested? + page + else + ActivityPub::CollectionPresenter.new( + id: replies_account_status_url(@account, @status), + type: :unordered, + first: page + ) + end + end + def create_descendant_thread(starting_depth, statuses) depth = starting_depth + statuses.size if depth < DESCENDANTS_DEPTH_LIMIT @@ -174,4 +204,27 @@ class StatusesController < ApplicationController return if @status.public_visibility? || @status.unlisted_visibility? response.headers['Referrer-Policy'] = 'origin' end + + def page_requested? + params[:page] == 'true' + end + + def set_replies + @replies = page_params[:other_accounts] ? Status.where.not(account_id: @account.id) : @account.statuses + @replies = @replies.where(in_reply_to_id: @status.id, visibility: [:public, :unlisted]) + @replies = @replies.paginate_by_min_id(DESCENDANTS_LIMIT, params[:min_id]) + end + + def next_page + last_reply = @replies.last + return if last_reply.nil? + same_account = last_reply.account_id == @account.id + return unless same_account || @replies.size == DESCENDANTS_LIMIT + same_account = false unless @replies.size == DESCENDANTS_LIMIT + replies_account_status_url(@account, @status, page: true, min_id: last_reply.id, other_accounts: !same_account) + end + + def page_params + { page: true, other_accounts: params[:other_accounts], min_id: params[:min_id] }.compact + end end diff --git a/app/lib/activitypub/tag_manager.rb b/app/lib/activitypub/tag_manager.rb index be3a562d00..892bb9974a 100644 --- a/app/lib/activitypub/tag_manager.rb +++ b/app/lib/activitypub/tag_manager.rb @@ -48,6 +48,12 @@ class ActivityPub::TagManager activity_account_status_url(target.account, target) end + def replies_uri_for(target, page_params = nil) + raise ArgumentError, 'target must be a local activity' unless %i(note comment activity).include?(target.object_type) && target.local? + + replies_account_status_url(target.account, target, page_params) + end + # Primary audience of a status # Public statuses go out to primarily the public collection # Unlisted and private statuses go out primarily to the followers collection diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb index 6b0978ad3c..4aab993a9c 100644 --- a/app/serializers/activitypub/note_serializer.rb +++ b/app/serializers/activitypub/note_serializer.rb @@ -13,7 +13,7 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer has_many :media_attachments, key: :attachment has_many :virtual_tags, key: :tag - has_one :replies, serializer: ActivityPub::CollectionSerializer + has_one :replies, serializer: ActivityPub::CollectionSerializer, if: :local? def id ActivityPub::TagManager.instance.uri_for(object) @@ -36,12 +36,16 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer end def replies + replies = object.self_replies(5).pluck(:id, :uri) + last_id = replies.last&.first ActivityPub::CollectionPresenter.new( type: :unordered, + id: ActivityPub::TagManager.instance.replies_uri_for(object), first: ActivityPub::CollectionPresenter.new( type: :unordered, - page: true, - items: object.self_replies(5).pluck(:uri) + part_of: ActivityPub::TagManager.instance.replies_uri_for(object), + items: replies.map(&:second), + next: last_id ? ActivityPub::TagManager.instance.replies_uri_for(object, page: true, min_id: last_id) : nil ) ) end diff --git a/config/routes.rb b/config/routes.rb index ded62981d4..9a83d0f882 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -56,6 +56,7 @@ Rails.application.routes.draw do member do get :activity get :embed + get :replies end end -- GitLab From ee7d79c0ce411ff7754e3ac31dbf27cb9e298f73 Mon Sep 17 00:00:00 2001 From: ThibG <thib@sitedethib.com> Date: Thu, 28 Feb 2019 21:35:16 +0100 Subject: [PATCH 146/192] Fix serialization of boosts (#10129) The condition introduced by #9998 was wrong, serializing boosts that weren't self-boosts, and not serializing self-boosts. --- app/serializers/activitypub/activity_serializer.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/serializers/activitypub/activity_serializer.rb b/app/serializers/activitypub/activity_serializer.rb index b51e8c5442..c001e28aae 100644 --- a/app/serializers/activitypub/activity_serializer.rb +++ b/app/serializers/activitypub/activity_serializer.rb @@ -3,8 +3,8 @@ class ActivityPub::ActivitySerializer < ActiveModel::Serializer attributes :id, :type, :actor, :published, :to, :cc - has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, unless: :owned_announce? - attribute :proper_uri, key: :object, if: :owned_announce? + has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, if: :serialize_object? + attribute :proper_uri, key: :object, unless: :serialize_object? attribute :atom_uri, if: :announce? def id @@ -43,7 +43,9 @@ class ActivityPub::ActivitySerializer < ActiveModel::Serializer object.reblog? end - def owned_announce? - announce? && object.account == object.proper.account && object.proper.private_visibility? + def serialize_object? + return true unless announce? + # Serialize private self-boosts of local toots + object.account == object.proper.account && object.proper.private_visibility? && object.local? end end -- GitLab From 54179b652993fd773332f61e89d3b1a14a3817ce Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Fri, 1 Feb 2019 16:32:07 +0100 Subject: [PATCH 147/192] {mastodon,flavours/glitch/util}/api.js: Remove csrf-token query --- app/javascript/flavours/glitch/util/api.js | 12 ++---------- app/javascript/mastodon/api.js | 12 ++---------- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/app/javascript/flavours/glitch/util/api.js b/app/javascript/flavours/glitch/util/api.js index 033d2d67b5..65aa61ba71 100644 --- a/app/javascript/flavours/glitch/util/api.js +++ b/app/javascript/flavours/glitch/util/api.js @@ -1,5 +1,4 @@ import axios from 'axios'; -import ready from './ready'; import LinkHeader from 'http-link-header'; export const getLinks = response => { @@ -12,17 +11,10 @@ export const getLinks = response => { return LinkHeader.parse(value); }; -let csrfHeader = {}; -function setCSRFHeader() { - const csrfToken = document.querySelector('meta[name=csrf-token]').content; - csrfHeader['X-CSRF-Token'] = csrfToken; -} -ready(setCSRFHeader); - export default getState => axios.create({ - headers: Object.assign(csrfHeader, getState ? { + headers: getState ? { 'Authorization': `Bearer ${getState().getIn(['meta', 'access_token'], '')}`, - } : {}), + } : {}, transformResponse: [function (data) { try { diff --git a/app/javascript/mastodon/api.js b/app/javascript/mastodon/api.js index 4be3eadb02..65aa61ba71 100644 --- a/app/javascript/mastodon/api.js +++ b/app/javascript/mastodon/api.js @@ -1,6 +1,5 @@ import axios from 'axios'; import LinkHeader from 'http-link-header'; -import ready from './ready'; export const getLinks = response => { const value = response.headers.link; @@ -12,17 +11,10 @@ export const getLinks = response => { return LinkHeader.parse(value); }; -let csrfHeader = {}; -function setCSRFHeader() { - const csrfToken = document.querySelector('meta[name=csrf-token]').content; - csrfHeader['X-CSRF-Token'] = csrfToken; -} -ready(setCSRFHeader); - export default getState => axios.create({ - headers: Object.assign(csrfHeader, getState ? { + headers: getState ? { 'Authorization': `Bearer ${getState().getIn(['meta', 'access_token'], '')}`, - } : {}), + } : {}, transformResponse: [function (data) { try { -- GitLab From d680a5aad20d433f5959c2e7f31f9fab82f782e4 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Fri, 1 Feb 2019 16:37:53 +0100 Subject: [PATCH 148/192] package.json: Add (npm run) dev command --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index ecd9f86ebd..e20462a4dc 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "build:development": "cross-env RAILS_ENV=development NODE_ENV=development ./bin/webpack", "build:production": "cross-env RAILS_ENV=production NODE_ENV=production ./bin/webpack", "manage:translations": "node ./config/webpack/translationRunner.js", + "dev": "cross-env NODE_ENV=development webpack-dev-server --config config/webpack/development.js --progress --color", "start": "node ./streaming/index.js", "test": "${npm_execpath} run test:lint && ${npm_execpath} run test:jest", "test:lint": "eslint --ext=js .", -- GitLab From b0c19578f197ee0a3e358a05c46ac4837de64ba7 Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Thu, 29 Mar 2018 01:46:07 +0200 Subject: [PATCH 149/192] README.md: full rewrite for pleroma --- README.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 470e379dc0..d512a01952 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,74 @@ -# Mastodon Glitch Edition # +# Glitch-fe: glitch-soc frontend for pleroma -> Now with automated deploys! +Here is a fork of mastodon. We could really just remove all of the code except +for the frontend, but to easily pull the upstream repo we'll just keep +everything. This is my fork for the moment with the idea of making the mastofe +just as polished as the pleromafe. If you want to get access, open an issue or +hit me up at howl@social.zxq.co. -[][circleci] +# Development -[circleci]: https://circleci.com/gh/glitch-soc/mastodon +I use a combination of the pleroma backend + yarn + nginx to do local +development. I refuse to install Ruby. Here's how to get it running on your own +machine: -So here's the deal: we all work on this code, and then it runs on dev.glitch.social and anyone who uses that does so absolutely at their own risk. can you dig it? +## Install yarn -- You can view documentation for this project at [glitch-soc.github.io/docs/](https://glitch-soc.github.io/docs/). -- And contributing guidelines are available [here](CONTRIBUTING.md) and [here](https://glitch-soc.github.io/docs/contributing/). +Yarn will be needed to set up the mastodon frontend for development. Check out +https://yarnpkg.com/lang/en/docs/install/ . For Debian, it's like this: + +```sh +# import yarn pub key and repo +curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - +echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list +sudo apt-get update +sudo apt-get install yarn +``` + +## Mastodon Frontend Setup + +```sh +# Install dependencies +yarn install -D +npm run dev +# check that http://localhost:3035/packs/common.css works in your browser once +# webpack is done compiling. if css shows up, then it should have worked! +``` + +## nginx setup + +I'll assume that you have already fired up pleroma using the installation guide. +To work on the frontend while still having the backend up, use this nginx +config. + +``` +server { + listen 80; + server_name pleroma.testing; + + location /packs { + add_header 'Access-Control-Allow-Origin' '*'; + proxy_http_version 1.1; + proxy_set_header Host $http_host; + + proxy_pass http://localhost:3035; + } + + location / { + add_header 'Access-Control-Allow-Origin' '*'; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + + proxy_pass http://localhost:4000; + } +} +``` + +Change the `server_name` if you like. I personally like to create a new entry +in /etc/hosts and add `127.0.0.1 pleroma.testing`, but you do what suits you. + +If you have enough luck, navigating to your \<server\_name\>/web should show +you the mastodon frontend, and should also work with all the nice things of +webpack such as hot reloading. Have fun! -- GitLab From 284e503556c75a824c62d6c7ca8849144a072243 Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Thu, 29 Mar 2018 23:47:13 +0200 Subject: [PATCH 150/192] Fix going to /web and getting redirected to /web/web --- app/javascript/mastodon/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/main.js b/app/javascript/mastodon/main.js index 5d73caa108..da4884fd3d 100644 --- a/app/javascript/mastodon/main.js +++ b/app/javascript/mastodon/main.js @@ -12,7 +12,7 @@ function main() { if (window.history && history.replaceState) { const { pathname, search, hash } = window.location; const path = pathname + search + hash; - if (!(/^\/web[$/]/).test(path)) { + if (!(/^\/web($|\/)/).test(path)) { history.replaceState(null, document.title, `/web${path}`); } } -- GitLab From d629448248b285908f9606c221f504585c84b5e3 Mon Sep 17 00:00:00 2001 From: Lain Iwakura <lain@soykaf.club> Date: Tue, 14 Nov 2017 16:24:10 +0100 Subject: [PATCH 151/192] Handle character limit in initial state in frontend. --- app/javascript/mastodon/initial_state.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 6068246ae5..418659b918 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -12,7 +12,7 @@ export const boostModal = getMeta('boost_modal'); export const deleteModal = getMeta('delete_modal'); export const me = getMeta('me'); export const searchEnabled = getMeta('search_enabled'); -export const maxChars = (initialState && initialState.max_toot_chars) || 500; +export const maxChars = getMeta('max_toot_chars') || getMeta('char_limit') || 5000; export const invitesEnabled = getMeta('invites_enabled'); export const version = getMeta('version'); export const mascot = getMeta('mascot'); -- GitLab From 57e9ddf4a7b9c4da357656a004d6df9b64d704b5 Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Sat, 31 Mar 2018 16:50:55 +0200 Subject: [PATCH 152/192] Remove unnecessary ruby from build scripts --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e20462a4dc..37b64a0e1e 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,9 @@ }, "scripts": { "postversion": "git push --tags", - "build:development": "cross-env RAILS_ENV=development NODE_ENV=development ./bin/webpack", - "build:production": "cross-env RAILS_ENV=production NODE_ENV=production ./bin/webpack", + "build:development": "cross-env NODE_ENV=development webpack --config config/webpack/development.js", + "build:production": "cross-env NODE_ENV=production webpack --config config/webpack/production.js", + "build": "cross-env NODE_ENV=production webpack --config config/webpack/production.js", "manage:translations": "node ./config/webpack/translationRunner.js", "dev": "cross-env NODE_ENV=development webpack-dev-server --config config/webpack/development.js --progress --color", "start": "node ./streaming/index.js", -- GitLab From b7749da458984703bc96a984b3dd885f35906264 Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Sat, 31 Mar 2018 18:31:24 +0200 Subject: [PATCH 153/192] remove bundle analyzer, remove chunk hashes from css --- config/webpack/production.js | 11 ----- config/webpack/shared.js | 2 +- package.json | 1 - yarn.lock | 83 +++--------------------------------- 4 files changed, 6 insertions(+), 91 deletions(-) diff --git a/config/webpack/production.js b/config/webpack/production.js index d37e11792b..e938367c29 100644 --- a/config/webpack/production.js +++ b/config/webpack/production.js @@ -5,7 +5,6 @@ const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const CompressionPlugin = require('compression-webpack-plugin'); const zopfli = require('@gfx/zopfli'); const sharedConfig = require('./shared.js'); -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const OfflinePlugin = require('offline-plugin'); const { publicPath } = require('./configuration.js'); const path = require('path'); @@ -65,16 +64,6 @@ module.exports = merge(sharedConfig, { }, test: /\.(js|css|html|json|ico|svg|eot|otf|ttf)$/, }), - new BundleAnalyzerPlugin({ // generates report.html and stats.json - analyzerMode: 'static', - generateStatsFile: true, - statsOptions: { - // allows usage with http://chrisbateman.github.io/webpack-visualizer/ - chunkModules: true, - }, - openAnalyzer: false, - logLevel: 'silent', // do not bother Webpacker, who runs with --json and parses stdout - }), new OfflinePlugin({ publicPath: publicPath, // sw.js must be served from the root to avoid scope issues caches: { diff --git a/config/webpack/shared.js b/config/webpack/shared.js index 938bab9f5e..f1ce03900f 100644 --- a/config/webpack/shared.js +++ b/config/webpack/shared.js @@ -98,7 +98,7 @@ module.exports = { } ), new MiniCssExtractPlugin({ - filename: env.NODE_ENV === 'production' ? '[name]-[contenthash].css' : '[name].css', + filename: '[name].css', }), new AssetsManifestPlugin({ publicPath: true, diff --git a/package.json b/package.json index 37b64a0e1e..6fe70a36ee 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,6 @@ "uws": "10.148.0", "webpack": "^4.28.3", "webpack-assets-manifest": "^3.1.1", - "webpack-bundle-analyzer": "^3.0.3", "webpack-cli": "^3.1.2", "webpack-merge": "^4.1.5", "websocket.js": "^0.1.12" diff --git a/yarn.lock b/yarn.lock index 3137b08563..297941b061 100644 --- a/yarn.lock +++ b/yarn.lock @@ -991,7 +991,7 @@ acorn-walk@^6.0.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== -acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2, acorn@^5.7.3: +acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== @@ -1584,16 +1584,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -bfj@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz#05a3b7784fbd72cfa3c22e56002ef99336516c48" - integrity sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ== - dependencies: - bluebird "^3.5.1" - check-types "^7.3.0" - hoopy "^0.1.2" - tryer "^1.0.0" - big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" @@ -1609,7 +1599,7 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== -bluebird@^3.5.1, bluebird@^3.5.3: +bluebird@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== @@ -1956,11 +1946,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -check-types@^7.3.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4" - integrity sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg== - cheerio@^1.0.0-rc.2: version "1.0.0-rc.2" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" @@ -2150,7 +2135,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.11.0, commander@^2.18.0, commander@^2.19.0: +commander@^2.11.0, commander@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== @@ -2987,11 +2972,6 @@ double-ended-queue@^2.1.0-0: resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw= -duplexer@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= - duplexify@^3.4.2, duplexify@^3.6.0: version "3.6.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" @@ -3015,7 +2995,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^2.3.4, ejs@^2.6.1: +ejs@^2.3.4: version "2.6.1" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== @@ -3516,7 +3496,7 @@ expect@^23.6.0: jest-message-util "^23.4.0" jest-regex-util "^23.3.0" -express@^4.16.2, express@^4.16.3, express@^4.16.4: +express@^4.16.2, express@^4.16.4: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== @@ -3718,11 +3698,6 @@ fileset@^2.0.2: glob "^7.0.3" minimatch "^3.0.3" -filesize@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" - integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== - fill-range@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" @@ -4058,14 +4033,6 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -gzip-size@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80" - integrity sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA== - dependencies: - duplexer "^0.1.1" - pify "^3.0.0" - handle-thing@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" @@ -4221,11 +4188,6 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -hoopy@^0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" - integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== - hosted-git-info@^2.1.4: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" @@ -6464,11 +6426,6 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -opener@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" - integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== - opn@^5.1.0: version "5.4.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" @@ -9114,11 +9071,6 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -tryer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" - integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== - tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -9462,24 +9414,6 @@ webpack-assets-manifest@^3.1.1: tapable "^1.0.0" webpack-sources "^1.0.0" -webpack-bundle-analyzer@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.0.3.tgz#dbc7fff8f52058b6714a20fddf309d0790e3e0a0" - integrity sha512-naLWiRfmtH4UJgtUktRTLw6FdoZJ2RvCR9ePbwM9aRMsS/KjFerkPZG9epEvXRAw5d5oPdrs9+3p+afNjxW8Xw== - dependencies: - acorn "^5.7.3" - bfj "^6.1.1" - chalk "^2.4.1" - commander "^2.18.0" - ejs "^2.6.1" - express "^4.16.3" - filesize "^3.6.1" - gzip-size "^5.0.0" - lodash "^4.17.10" - mkdirp "^0.5.1" - opener "^1.5.1" - ws "^6.0.0" - webpack-cli@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746" @@ -9722,13 +9656,6 @@ ws@^5.2.0: dependencies: async-limiter "~1.0.0" -ws@^6.0.0: - version "6.1.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" - integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== - dependencies: - async-limiter "~1.0.0" - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" -- GitLab From 9215eb120291e00f79801275733e1a7ca82aab66 Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Sat, 31 Mar 2018 17:55:08 +0200 Subject: [PATCH 154/192] remove gzip on assets, add build.sh pickups: - build.sh: Make the target dir configurable - build.sh: Auto-update yarn dependencies Co-authored-by: Haelwenn (lanodan) Monnier <contact@hacktivis.me> --- build.sh | 10 ++++++++++ config/webpack/production.js | 13 ++----------- package.json | 1 - yarn.lock | 14 +------------- 4 files changed, 13 insertions(+), 25 deletions(-) create mode 100755 build.sh diff --git a/build.sh b/build.sh new file mode 100755 index 0000000000..9a218c3a2e --- /dev/null +++ b/build.sh @@ -0,0 +1,10 @@ +#!/bin/sh +TARGET="../pleroma" # Where pleroma’s repository is sitting + +yarn install -D + +rm -rf public/packs public/assets +env -i "PATH=$PATH" npm run build +cp public/assets/sw.js "${TARGET}/priv/static/sw.js" +rm -rf "${TARGET}/priv/static/packs" +cp -r public/packs "${TARGET}/priv/static/packs" diff --git a/config/webpack/production.js b/config/webpack/production.js index e938367c29..0e9aa0c1c0 100644 --- a/config/webpack/production.js +++ b/config/webpack/production.js @@ -2,8 +2,6 @@ const merge = require('webpack-merge'); const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); -const CompressionPlugin = require('compression-webpack-plugin'); -const zopfli = require('@gfx/zopfli'); const sharedConfig = require('./shared.js'); const OfflinePlugin = require('offline-plugin'); const { publicPath } = require('./configuration.js'); @@ -29,8 +27,8 @@ module.exports = merge(sharedConfig, { mode: 'production', output: { - filename: '[name]-[chunkhash].js', - chunkFilename: '[name]-[chunkhash].js', + filename: '[name].js', + chunkFilename: '[name].js', }, devtool: 'source-map', // separate sourcemap file, suitable for production @@ -58,12 +56,6 @@ module.exports = merge(sharedConfig, { }, plugins: [ - new CompressionPlugin({ - algorithm(input, compressionOptions, callback) { - return zopfli.gzip(input, compressionOptions, callback); - }, - test: /\.(js|css|html|json|ico|svg|eot|otf|ttf)$/, - }), new OfflinePlugin({ publicPath: publicPath, // sw.js must be served from the root to avoid scope issues caches: { @@ -87,7 +79,6 @@ module.exports = merge(sharedConfig, { '/emoji/sheet_10.png', // used in emoji-mart ], excludes: [ - '**/*.gz', '**/*.map', 'stats.json', 'report.html', diff --git a/package.json b/package.json index 6fe70a36ee..715e3c2112 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,6 @@ "babel-plugin-transform-react-remove-prop-types": "^0.4.21", "babel-runtime": "^6.26.0", "classnames": "^2.2.5", - "compression-webpack-plugin": "^2.0.0", "cross-env": "^5.1.4", "css-loader": "^2.1.0", "cssnano": "^4.1.8", diff --git a/yarn.lock b/yarn.lock index 297941b061..3ae3aee47b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2162,18 +2162,6 @@ compressible@~2.0.14: dependencies: mime-db ">= 1.36.0 < 2" -compression-webpack-plugin@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-2.0.0.tgz#46476350c1eb27f783dccc79ac2f709baa2cffbc" - integrity sha512-bDgd7oTUZC8EkRx8j0sjyCfeiO+e5sFcfgaFcjVhfQf5lLya7oY2BczxcJ7IUuVjz5m6fy8IECFmVFew3xLk8Q== - dependencies: - cacache "^11.2.0" - find-cache-dir "^2.0.0" - neo-async "^2.5.0" - schema-utils "^1.0.0" - serialize-javascript "^1.4.0" - webpack-sources "^1.0.1" - compression@^1.5.2: version "1.7.3" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" @@ -9491,7 +9479,7 @@ webpack-merge@^4.1.5: dependencies: lodash "^4.17.5" -webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.3.0: +webpack-sources@^1.0.0, webpack-sources@^1.1.0, webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== -- GitLab From 88b6545bf42a1b41209492955e431ca62d82c909 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Tue, 3 Jul 2018 13:45:58 +0200 Subject: [PATCH 155/192] README.md: document deployement with build.sh --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index d512a01952..f22b062f40 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,15 @@ everything. This is my fork for the moment with the idea of making the mastofe just as polished as the pleromafe. If you want to get access, open an issue or hit me up at howl@social.zxq.co. +# Deployement + +This is what you want to do to update the mastofe bundled with pleroma. + +- Run ``build.sh`` at the root of this repo, you can set the ``TARGET`` environment variable if pleroma isn’t at ``../pleroma`` (default value of ``TARGET``) +- Go to pleroma repo: + - ``git add priv/static/sw.js priv/static/packs`` + - ``git commit -m "update mastofe"`` + # Development I use a combination of the pleroma backend + yarn + nginx to do local -- GitLab From e93efea87e033c861d6f8bbfdd63d098304c0366 Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Sat, 31 Mar 2018 19:12:24 +0200 Subject: [PATCH 156/192] Default when there is no applicationServerKey meta on the page --- .../mastodon/actions/push_notifications/registerer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/actions/push_notifications/registerer.js b/app/javascript/mastodon/actions/push_notifications/registerer.js index b0f42b6a20..67bf7cb4e9 100644 --- a/app/javascript/mastodon/actions/push_notifications/registerer.js +++ b/app/javascript/mastodon/actions/push_notifications/registerer.js @@ -14,7 +14,10 @@ const urlBase64ToUint8Array = (base64String) => { return decodeBase64(base64); }; -const getApplicationServerKey = () => document.querySelector('[name="applicationServerKey"]').getAttribute('content'); +const getApplicationServerKey = () => { + const k = document.querySelector('[name="applicationServerKey"]'); + return k === null ? '' : k.getAttribute('content'); +}; const getRegistration = () => navigator.serviceWorker.ready; -- GitLab From ff48341b91e41bd4860e97fa41e3d8e6c11a3c17 Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Sun, 1 Apr 2018 11:11:45 +0200 Subject: [PATCH 157/192] fix the homepage being loaded issue --- app/javascript/mastodon/service_worker/entry.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/service_worker/entry.js b/app/javascript/mastodon/service_worker/entry.js index b354f3b332..eb66f8457e 100644 --- a/app/javascript/mastodon/service_worker/entry.js +++ b/app/javascript/mastodon/service_worker/entry.js @@ -10,7 +10,7 @@ function openWebCache() { } function fetchRoot() { - return fetch('/', { credentials: 'include', redirect: 'manual' }); + return fetch('/web', { credentials: 'include', redirect: 'manual' }); } // const firefox = navigator.userAgent.match(/Firefox\/(\d+)/); @@ -19,7 +19,7 @@ function fetchRoot() { // Cause a new version of a registered Service Worker to replace an existing one // that is already installed, and replace the currently active worker on open pages. self.addEventListener('install', function(event) { - event.waitUntil(Promise.all([openWebCache(), fetchRoot()]).then(([cache, root]) => cache.put('/', root))); + event.waitUntil(Promise.all([openWebCache(), fetchRoot()]).then(([cache, root]) => cache.put('/web', root))); }); self.addEventListener('activate', function(event) { event.waitUntil(self.clients.claim()); @@ -27,17 +27,17 @@ self.addEventListener('activate', function(event) { self.addEventListener('fetch', function(event) { const url = new URL(event.request.url); - if (url.pathname.startsWith('/web/')) { + if (url.pathname.startsWith('/web')) { const asyncResponse = fetchRoot(); const asyncCache = openWebCache(); event.respondWith(asyncResponse.then( response => { const clonedResponse = response.clone(); - asyncCache.then(cache => cache.put('/', clonedResponse)).catch(); + asyncCache.then(cache => cache.put('/web', clonedResponse)).catch(); return response; }, - () => asyncCache.then(cache => cache.match('/')))); + () => asyncCache.then(cache => cache.match('/web')))); } else if (url.pathname === '/auth/sign_out') { const asyncResponse = fetch(event.request); const asyncCache = openWebCache(); @@ -45,7 +45,7 @@ self.addEventListener('fetch', function(event) { event.respondWith(asyncResponse.then(response => { if (response.ok || response.type === 'opaqueredirect') { return Promise.all([ - asyncCache.then(cache => cache.delete('/')), + asyncCache.then(cache => cache.delete('/web')), indexedDB.deleteDatabase('mastodon'), ]).then(() => response); } -- GitLab From bfe8dc3db51e4e0b2cd63d7a4c0f3b5d4511494b Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Mon, 2 Apr 2018 13:22:25 +0200 Subject: [PATCH 158/192] package.json: Add description field APPARENTLY NPM ADDS A npm_package_description WHICH IS THE description FIELD IN package.json WHICH HOWEVER IF NOT SET BECOMES THE SECOND LINE OF THE README LIKE WHAT THE FUCKKKKKKKKKKKKK --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 715e3c2112..062e2f2f12 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "mastodon", + "description": "mastodon", "license": "AGPL-3.0-or-later", "engines": { "node": ">=8 <11" -- GitLab From 2429af16ca674789412e173442981fd59250bad0 Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Mon, 2 Apr 2018 18:25:08 +0200 Subject: [PATCH 159/192] always make /web/login go through Original commit: 011eda089abad18c89324ca4bcb6930bb682a0b9 --- app/javascript/mastodon/service_worker/entry.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/mastodon/service_worker/entry.js b/app/javascript/mastodon/service_worker/entry.js index eb66f8457e..9ab0bd333a 100644 --- a/app/javascript/mastodon/service_worker/entry.js +++ b/app/javascript/mastodon/service_worker/entry.js @@ -28,6 +28,10 @@ self.addEventListener('fetch', function(event) { const url = new URL(event.request.url); if (url.pathname.startsWith('/web')) { + // we always make /web/login go through + if (url.pathname.startsWith('/web/login')) { + return; + } const asyncResponse = fetchRoot(); const asyncCache = openWebCache(); -- GitLab From ebabad436ffa7492b65b699a782b63dbdce066e1 Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Sat, 31 Mar 2018 14:54:56 +0200 Subject: [PATCH 160/192] handle empty message (ping) in ws --- app/javascript/flavours/glitch/util/stream.js | 5 ++++- app/javascript/mastodon/stream.js | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/javascript/flavours/glitch/util/stream.js b/app/javascript/flavours/glitch/util/stream.js index 9928d0dd76..d869d93db4 100644 --- a/app/javascript/flavours/glitch/util/stream.js +++ b/app/javascript/flavours/glitch/util/stream.js @@ -74,7 +74,10 @@ export default function getStream(streamingAPIBaseURL, accessToken, stream, { co const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?${params.join('&')}`); ws.onopen = connected; - ws.onmessage = e => received(JSON.parse(e.data)); + ws.onmessage = e => { + if (e.data !== '') + received(JSON.parse(e.data)); + }; ws.onclose = disconnected; ws.onreconnect = reconnected; diff --git a/app/javascript/mastodon/stream.js b/app/javascript/mastodon/stream.js index 9928d0dd76..d869d93db4 100644 --- a/app/javascript/mastodon/stream.js +++ b/app/javascript/mastodon/stream.js @@ -74,7 +74,10 @@ export default function getStream(streamingAPIBaseURL, accessToken, stream, { co const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?${params.join('&')}`); ws.onopen = connected; - ws.onmessage = e => received(JSON.parse(e.data)); + ws.onmessage = e => { + if (e.data !== '') + received(JSON.parse(e.data)); + }; ws.onclose = disconnected; ws.onreconnect = reconnected; -- GitLab From 784e01a6e57d90d63fc34043c6f12b1f01189fa7 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Tue, 17 Apr 2018 18:41:21 +0200 Subject: [PATCH 161/192] app/javascript/mastodon/components/media_gallery.js: Add support for audio attachements --- .../glitch/components/media_gallery.js | 15 +++++++++++++ .../glitch/styles/components/media.scss | 22 +++++++++++++++++++ .../mastodon/components/media_gallery.js | 12 ++++++++++ .../styles/mastodon/components.scss | 8 +++++++ 4 files changed, 57 insertions(+) diff --git a/app/javascript/flavours/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js index 1fa25ee4ec..adf61b7d2a 100644 --- a/app/javascript/flavours/glitch/components/media_gallery.js +++ b/app/javascript/flavours/glitch/components/media_gallery.js @@ -176,6 +176,21 @@ class Item extends React.PureComponent { /> </a> ); + } else if (attachment.get('type') === 'audio') { + thumbnail = ( + <div + className='media-gallery__audio' + aria-label={attachment.get('description')} + role='application' + > + <span><p>sound<br/>only</p></span> + <span><p>{attachment.get('description')}</p></span> + <audio + src={attachment.get('url')} + controls + /> + </div> + ); } else if (attachment.get('type') === 'gifv') { const autoPlay = !isIOS() && autoPlayGif; diff --git a/app/javascript/flavours/glitch/styles/components/media.scss b/app/javascript/flavours/glitch/styles/components/media.scss index e8011bde90..1772e84120 100644 --- a/app/javascript/flavours/glitch/styles/components/media.scss +++ b/app/javascript/flavours/glitch/styles/components/media.scss @@ -74,6 +74,28 @@ } } +.media-gallery__audio { + height: 100%; + display: flex; + flex-direction: column; + + span { + text-align: center; + color: $darker-text-color; + display: flex; + height: 100%; + align-items: center; + + p { + width: 100%; + } + } + + audio { + width: 100%; + } +} + .media-gallery { box-sizing: border-box; margin-top: 8px; diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js index a2bc952556..b95c35c352 100644 --- a/app/javascript/mastodon/components/media_gallery.js +++ b/app/javascript/mastodon/components/media_gallery.js @@ -150,6 +150,18 @@ class Item extends React.PureComponent { /> </a> ); + } else if (attachment.get('type') === 'audio') { + thumbnail = ( + <div className='media-gallery__audio'> + <audio + className='media-gallery__item-audio-thumbnail' + aria-label={attachment.get('description')} + role='application' + src={attachment.get('url')} + controls + /> + </div> + ); } else if (attachment.get('type') === 'gifv') { const autoPlay = !isIOS() && autoPlayGif; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 5eef07a6ee..d49ccd40b6 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -4317,6 +4317,14 @@ a.status-card.compact:hover { } } +.media-gallery__audio { + margin-top: 32px; + + audio { + width: 100%; + } +} + .attachment-list { display: flex; font-size: 14px; -- GitLab From 22a21fb12df93f1389c9444adeb3057a5bc28e9c Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Sat, 21 Apr 2018 17:58:19 +0200 Subject: [PATCH 162/192] Getting-Started column customisation (panel, notice) --- .../glitch/features/getting_started/index.js | 88 ++++++++------ .../flavours/glitch/reducers/index.js | 2 + .../flavours/glitch/reducers/pleroma.js | 18 +++ .../glitch/styles/components/index.scss | 8 +- app/javascript/mastodon/actions/pleroma.js | 107 ++++++++++++++++++ .../features/getting_started/index.js | 60 +++++++--- app/javascript/mastodon/locales/en.json | 1 + app/javascript/mastodon/locales/fr.json | 1 + app/javascript/mastodon/reducers/index.js | 2 + app/javascript/mastodon/reducers/pleroma.js | 18 +++ .../styles/mastodon/components.scss | 34 ++++-- 11 files changed, 281 insertions(+), 58 deletions(-) create mode 100644 app/javascript/flavours/glitch/reducers/pleroma.js create mode 100644 app/javascript/mastodon/actions/pleroma.js create mode 100644 app/javascript/mastodon/reducers/pleroma.js diff --git a/app/javascript/flavours/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js index 7b645c9d09..ac90863919 100644 --- a/app/javascript/flavours/glitch/features/getting_started/index.js +++ b/app/javascript/flavours/glitch/features/getting_started/index.js @@ -14,6 +14,7 @@ import { List as ImmutableList } from 'immutable'; import { createSelector } from 'reselect'; import { fetchLists } from 'flavours/glitch/actions/lists'; import { preferencesLink, profileLink, signOutLink } from 'flavours/glitch/util/backend_links'; +import { fetchPanel, fetchPleromaConfig } from 'mastodon/actions/pleroma'; const messages = defineMessages({ heading: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, @@ -52,6 +53,8 @@ const makeMapStateToProps = () => { columns: state.getIn(['settings', 'columns']), unreadFollowRequests: state.getIn(['user_lists', 'follow_requests', 'items'], ImmutableList()).size, unreadNotifications: state.getIn(['notifications', 'unread']), + customPanelEnabled: state.getIn(['custom_panel', 'enabled']), + customPanel: state.getIn(['custom_panel', 'panel']), }); return mapStateToProps; @@ -61,6 +64,8 @@ const mapDispatchToProps = dispatch => ({ fetchFollowRequests: () => dispatch(fetchFollowRequests()), fetchLists: () => dispatch(fetchLists()), openSettings: () => dispatch(openModal('SETTINGS', {})), + fetchPanel: () => dispatch(fetchPanel()), + fetchPleromaConfig: () => dispatch(fetchPleromaConfig()), }); const badgeDisplay = (number, limit) => { @@ -88,6 +93,10 @@ export default class GettingStarted extends ImmutablePureComponent { lists: ImmutablePropTypes.list, fetchLists: PropTypes.func.isRequired, openSettings: PropTypes.func.isRequired, + fetchPanel: PropTypes.func.isRequired, + fetchPleromaConfig: PropTypes.func.isRequired, + customPanelEnabled: PropTypes.bool, + customPanel: PropTypes.string.isRequired, }; componentWillMount () { @@ -95,15 +104,18 @@ export default class GettingStarted extends ImmutablePureComponent { } componentDidMount () { - const { myAccount, fetchFollowRequests } = this.props; + const { myAccount, fetchFollowRequests, fetchPleromaConfig, fetchPanel } = this.props; if (myAccount.get('locked')) { fetchFollowRequests(); } + + fetchPleromaConfig(); + fetchPanel(); } render () { - const { intl, myAccount, columns, multiColumn, unreadFollowRequests, unreadNotifications, lists, openSettings } = this.props; + const { intl, myAccount, columns, multiColumn, unreadFollowRequests, unreadNotifications, lists, openSettings, customPanelEnabled, customPanel } = this.props; const navItems = []; let listItems = []; @@ -149,39 +161,49 @@ export default class GettingStarted extends ImmutablePureComponent { </div>, ]); + const dot = ' • '; + const staticContent = (customPanelEnabled ? <div dangerouslySetInnerHTML={{__html: customPanel}} style={{marginLeft: -12, marginRight: -12}} /> : + <p> + <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/FAQ.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.faq' defaultMessage='FAQ' /></a> + {dot} + <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/User-guide.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.userguide' defaultMessage='User Guide' /></a> + {dot} + <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.appsshort' defaultMessage='Apps' /></a> + {dot} + <a href='https://pleroma.social'><FormattedMessage id='getting_started.pleroma' defaultMessage='Pleroma' /></a> + </p> + ); + return ( <Column name='getting-started' icon='asterisk' heading={intl.formatMessage(messages.heading)} label={intl.formatMessage(messages.menu)} hideHeadingOnMobile> - <div className='scrollable optionally-scrollable'> - <div className='getting-started__wrapper'> - <ColumnSubheading text={intl.formatMessage(messages.navigation_subheading)} /> - {navItems} - <ColumnSubheading text={intl.formatMessage(messages.lists_subheading)} /> - {listItems} - <ColumnSubheading text={intl.formatMessage(messages.settings_subheading)} /> - { preferencesLink !== undefined && <ColumnLink icon='cog' text={intl.formatMessage(messages.preferences)} href={preferencesLink} /> } - <ColumnLink icon='cogs' text={intl.formatMessage(messages.settings)} onClick={openSettings} /> - <ColumnLink icon='sign-out' text={intl.formatMessage(messages.sign_out)} href={signOutLink} method='delete' /> - </div> - - <div className='getting-started__footer'> - <ul> - {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>} - <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li> - <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li> - <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li> - <li><a href='https://docs.joinmastodon.org' target='_blank'><FormattedMessage id='getting_started.documentation' defaultMessage='Documentation' /></a></li> - </ul> - - <p> - <FormattedMessage - id='getting_started.open_source_notice' - defaultMessage='Glitchsoc is open source software, a friendly fork of {Mastodon}. You can contribute or report issues on GitHub at {github}.' - values={{ - github: <span><a href='https://github.com/glitch-soc/mastodon' rel='noopener' target='_blank'>glitch-soc/mastodon</a> (v{version})</span>, - Mastodon: <a href='https://github.com/tootsuite/mastodon' rel='noopener' target='_blank'>Mastodon</a> }} - /> - </p> - </div> + <div className='getting-started__wrapper scrollable'> + <ColumnSubheading text={intl.formatMessage(messages.navigation_subheading)} /> + {navItems} + <ColumnSubheading text={intl.formatMessage(messages.lists_subheading)} /> + {listItems} + <ColumnSubheading text={intl.formatMessage(messages.settings_subheading)} /> + { preferencesLink !== undefined && <ColumnLink icon='cog' text={intl.formatMessage(messages.preferences)} href={preferencesLink} /> } + <ColumnLink icon='cogs' text={intl.formatMessage(messages.settings)} onClick={openSettings} /> + <ColumnLink icon='sign-out' text={intl.formatMessage(messages.sign_out)} href={signOutLink} method='delete' /> + </div> + + <div className='getting-started getting-started__panel scrollable'> + {staticContent} + </div> + + <div className='getting-started__footer scrollable'> + <p> + <FormattedMessage + id='getting_started.mastofe_notice' + defaultMessage='Mastofe is a libre distribution of the frontend from {glitchsoc}, a friendly fork of {mastodon}. You can contribute or report issues at {mastofe}.' + values={{ + mastofe: <a href='https://git.pleroma.social/pleroma/mastofe' rel='noopener' target='_blank'>Mastofe</a>, + glitchsoc: <a href='https://github.com/glitch-soc/mastodon' rel='noopener' target='_blank'>glitch-soc</a>, + mastodon: <a href='https://github.com/tootsuite/mastodon' rel='noopener' target='_blank'>Mastodon</a>, + pleroma: <a href='https://pleroma.social' rel='noopener' target='_blank'>Pleroma</a> + }} + /> + </p> </div> </Column> ); diff --git a/app/javascript/flavours/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js index 5b1ec4abca..05523a016e 100644 --- a/app/javascript/flavours/glitch/reducers/index.js +++ b/app/javascript/flavours/glitch/reducers/index.js @@ -29,6 +29,7 @@ import listEditor from './list_editor'; import listAdder from './list_adder'; import filters from './filters'; import pinnedAccountsEditor from './pinned_accounts_editor'; +import custom_panel from './pleroma'; const reducers = { dropdown_menu, @@ -61,6 +62,7 @@ const reducers = { listAdder, filters, pinnedAccountsEditor, + custom_panel, }; export default combineReducers(reducers); diff --git a/app/javascript/flavours/glitch/reducers/pleroma.js b/app/javascript/flavours/glitch/reducers/pleroma.js new file mode 100644 index 0000000000..938eb94166 --- /dev/null +++ b/app/javascript/flavours/glitch/reducers/pleroma.js @@ -0,0 +1,18 @@ +import { Map as ImmutableMap } from 'immutable'; +import { PANEL_FETCH_SUCCESS, PLEROMA_CONFIG_FETCH_SUCCESS } from 'mastodon/actions/pleroma'; + +const initialPanel = ImmutableMap({ + enabled: false, + panel: '' +}); + +export default function custom_panel(state = initialPanel, action) { + switch (action.type) { + case PANEL_FETCH_SUCCESS: + return state.set('panel', action.panel); break; + case PLEROMA_CONFIG_FETCH_SUCCESS: + return state.set('enabled', (action.config || {}).site.pleromafe.showInstanceSpecificPanel || false); + } + + return state; +}; diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss index 8e90aa545b..4fd79ee449 100644 --- a/app/javascript/flavours/glitch/styles/components/index.scss +++ b/app/javascript/flavours/glitch/styles/components/index.scss @@ -744,10 +744,15 @@ color: $dark-text-color; } + &__panel { + height: min-content; + } + + &__panel, &__footer { - flex: 0 0 auto; padding: 10px; padding-top: 20px; + flex: 0 1 auto; ul { margin-bottom: 10px; @@ -760,7 +765,6 @@ p { color: $dark-text-color; font-size: 13px; - margin-bottom: 20px; a { color: $dark-text-color; diff --git a/app/javascript/mastodon/actions/pleroma.js b/app/javascript/mastodon/actions/pleroma.js new file mode 100644 index 0000000000..7b879acb4b --- /dev/null +++ b/app/javascript/mastodon/actions/pleroma.js @@ -0,0 +1,107 @@ +import api from '../api'; + +export const TOS_FETCH_REQUEST = 'TOS_FETCH_REQUEST'; +export const TOS_FETCH_SUCCESS = 'TOS_FETCH_SUCCESS'; +export const TOS_FETCH_FAIL = 'TOS_FETCH_FAIL'; +export const PANEL_FETCH_REQUEST = 'PANEL_FETCH_REQUEST'; +export const PANEL_FETCH_SUCCESS = 'PANEL_FETCH_SUCCESS'; +export const PANEL_FETCH_FAIL = 'PANEL_FETCH_FAIL'; +export const PLEROMA_CONFIG_FETCH_REQUEST = 'PLEROMA_CONFIG_FETCH_REQUEST'; +export const PLEROMA_CONFIG_FETCH_SUCCESS = 'PLEROMA_CONFIG_FETCH_SUCCESS'; +export const PLEROMA_CONFIG_FETCH_FAIL = 'PLEROMA_CONFIG_FETCH_FAIL'; + +export function fetchTOS() { + return (dispatch, getState) => { + dispatch(fetchTOSRequest()); + + api(getState).get('/static/terms-of-service.html').then(response => { + dispatch(fetchTOSSuccess(response.data)); + }).catch(error => { + dispatch(fetchTOSFail(error)); + }); + }; +}; + +export function fetchPanel() { + return (dispatch, getState) => { + dispatch(fetchPanelRequest()); + + api(getState).get('/instance/panel.html').then(response => { + dispatch(fetchPanelSuccess(response.data)); + }).catch(error => { + dispatch(fetchPanelFail(error)); + }); + }; +}; + +export function fetchPleromaConfig() { + return (dispatch, getState) => { + dispatch(fetchPleromaConfigRequest()); + + api(getState).get('/static/config.json').then(response => { + dispatch(fetchPleromaConfigSuccess(response.data)); + }).catch(error => { + dispatch(fetchPleromaConfigFail(error)); + }); + }; +}; + +export function fetchTOSRequest() { + return { + type: TOS_FETCH_REQUEST, + }; +}; + +export function fetchTOSSuccess(tos) { + return { + type: TOS_FETCH_SUCCESS, + tos, + }; +}; + +export function fetchTOSFail(error) { + return { + type: TOS_FETCH_FAIL, + error, + }; +}; + +export function fetchPanelRequest() { + return { + type: PANEL_FETCH_REQUEST, + }; +}; + +export function fetchPanelSuccess(panel) { + return { + type: PANEL_FETCH_SUCCESS, + panel, + }; +}; + +export function fetchPanelFail(error) { + return { + type: PANEL_FETCH_FAIL, + error, + }; +}; + +export function fetchPleromaConfigRequest() { + return { + type: PLEROMA_CONFIG_FETCH_REQUEST, + }; +}; + +export function fetchPleromaConfigSuccess(config) { + return { + type: PLEROMA_CONFIG_FETCH_SUCCESS, + config, + }; +}; + +export function fetchPleromaConfigFail(error) { + return { + type: PLEROMA_CONFIG_FETCH_FAIL, + error, + }; +}; diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js index e1f84de276..c05e5cb110 100644 --- a/app/javascript/mastodon/features/getting_started/index.js +++ b/app/javascript/mastodon/features/getting_started/index.js @@ -7,8 +7,9 @@ import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { me, invitesEnabled, version, profile_directory } from '../../initial_state'; +import { me, invitesEnabled, profile_directory } from '../../initial_state'; import { fetchFollowRequests } from '../../actions/accounts'; +import { fetchPanel, fetchPleromaConfig } from 'mastodon/actions/pleroma'; import { List as ImmutableList } from 'immutable'; import { Link } from 'react-router-dom'; import NavigationBar from '../compose/components/navigation_bar'; @@ -39,10 +40,14 @@ const messages = defineMessages({ const mapStateToProps = state => ({ myAccount: state.getIn(['accounts', me]), unreadFollowRequests: state.getIn(['user_lists', 'follow_requests', 'items'], ImmutableList()).size, + customPanelEnabled: state.getIn(['custom_panel', 'enabled']), + customPanel: state.getIn(['custom_panel', 'panel']), }); const mapDispatchToProps = dispatch => ({ fetchFollowRequests: () => dispatch(fetchFollowRequests()), + fetchPanel: () => dispatch(fetchPanel()), + fetchPleromaConfig: () => dispatch(fetchPleromaConfig()), }); const badgeDisplay = (number, limit) => { @@ -65,20 +70,27 @@ class GettingStarted extends ImmutablePureComponent { columns: ImmutablePropTypes.list, multiColumn: PropTypes.bool, fetchFollowRequests: PropTypes.func.isRequired, + fetchPanel: PropTypes.func.isRequired, + fetchPleromaConfig: PropTypes.func.isRequired, unreadFollowRequests: PropTypes.number, unreadNotifications: PropTypes.number, + customPanelEnabled: PropTypes.bool, + customPanel: PropTypes.string.isRequired, }; componentDidMount () { - const { myAccount, fetchFollowRequests } = this.props; + const { myAccount, fetchFollowRequests, fetchPleromaConfig, fetchPanel } = this.props; if (myAccount.get('locked')) { fetchFollowRequests(); } + + fetchPleromaConfig(); + fetchPanel(); } render () { - const { intl, myAccount, multiColumn, unreadFollowRequests } = this.props; + const { intl, myAccount, multiColumn, unreadFollowRequests, customPanelEnabled, customPanel } = this.props; const navItems = []; let i = 1; @@ -130,12 +142,25 @@ class GettingStarted extends ImmutablePureComponent { if (!multiColumn) { navItems.push( <ColumnSubheading key={i++} text={intl.formatMessage(messages.settings_subheading)} />, - <ColumnLink key={i++} icon='gears' text={intl.formatMessage(messages.preferences)} href='/settings/preferences' />, + <ColumnLink key={i++} icon='gears' text={intl.formatMessage(messages.preferences)} href='/user-settings' />, ); height += 34 + 48; } + const dot = ' • '; + const staticContent = (customPanelEnabled ? <div dangerouslySetInnerHTML={{ __html: customPanel }} style={{ marginLeft: -12, marginRight: -12 }} /> : ( + <p> + <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/FAQ.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.faq' defaultMessage='FAQ' /></a> + {dot} + <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/User-guide.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.userguide' defaultMessage='User Guide' /></a> + {dot} + <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.appsshort' defaultMessage='Apps' /></a> + {dot} + <a href='https://pleroma.social'><FormattedMessage id='getting_started.pleroma' defaultMessage='Pleroma' /></a> + </p> ) + ); + return ( <Column label={intl.formatMessage(messages.menu)}> {multiColumn && <div className='column-header__wrapper'> @@ -148,31 +173,36 @@ class GettingStarted extends ImmutablePureComponent { </div>} <div className='getting-started'> - <div className='getting-started__wrapper' style={{ height }}> + <div className='getting-started__wrapper scrollable' style={{ height }}> {!multiColumn && <NavigationBar account={myAccount} />} {navItems} </div> {!multiColumn && <div className='flex-spacer' />} - <div className='getting-started__footer'> + <div className='getting-started getting-started__panel scrollable'> + {staticContent} + </div> + + {!multiColumn && <div className='flex-spacer' />} + + <div className='getting-started__footer scrollable'> <ul> {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>} {multiColumn && <li><Link to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link> · </li>} - <li><a href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a> · </li> - <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li> - <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li> - <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li> - <li><a href='/settings/applications' target='_blank'><FormattedMessage id='getting_started.developers' defaultMessage='Developers' /></a> · </li> - <li><a href='https://docs.joinmastodon.org' target='_blank'><FormattedMessage id='getting_started.documentation' defaultMessage='Documentation' /></a> · </li> <li><a href='/auth/sign_out' data-method='delete'><FormattedMessage id='navigation_bar.logout' defaultMessage='Logout' /></a></li> </ul> <p> <FormattedMessage - id='getting_started.open_source_notice' - defaultMessage='Mastodon is open source software. You can contribute or report issues on GitHub at {github}.' - values={{ github: <span><a href='https://github.com/tootsuite/mastodon' rel='noopener' target='_blank'>tootsuite/mastodon</a> (v{version})</span> }} + id='getting_started.mastofe_notice' + defaultMessage='Mastofe is a libre distribution of the frontend from {glitchsoc}, a friendly fork of {mastodon}. You can contribute or report issues at {mastofe}.' + values={{ + mastofe: <a href='https://git.pleroma.social/pleroma/mastofe' rel='noopener' target='_blank'>Mastofe</a>, + glitchsoc: <a href='https://github.com/glitch-soc/mastodon' rel='noopener' target='_blank'>glitch-soc</a>, + mastodon: <a href='https://github.com/tootsuite/mastodon' rel='noopener' target='_blank'>Mastodon</a>, + pleroma: <a href='https://pleroma.social' rel='noopener' target='_blank'>Pleroma</a>, + }} /> </p> </div> diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index c050188390..522d0c6932 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -141,6 +141,7 @@ "getting_started.heading": "Getting started", "getting_started.invite": "Invite people", "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.mastofe_notice": "Mastofe is a libre distribution of the frontend from {glitchsoc}, a friendly fork of {mastodon}. You can contribute or report issues at {mastofe}.", "getting_started.security": "Security", "getting_started.terms": "Terms of service", "hashtag.column_header.tag_mode.all": "and {additional}", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index f88f29b110..ab53227539 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -137,6 +137,7 @@ "getting_started.heading": "Pour commencer", "getting_started.invite": "Inviter des gens", "getting_started.open_source_notice": "Mastodon est un logiciel libre. Vous pouvez contribuer et envoyer vos commentaires et rapports de bogues via {github} sur GitHub.", + "getting_started.mastofe_notice": "Mastofe est une distribution libre du frontend {glitchsoc}, un fork amical de {mastodon}. Vous pouvez contribuer ou rapporter des bogues via {mastofe}.", "getting_started.security": "Sécurité", "getting_started.terms": "Conditions d’utilisation", "hashtag.column_header.tag_mode.all": "et {additional}", diff --git a/app/javascript/mastodon/reducers/index.js b/app/javascript/mastodon/reducers/index.js index 0f0de849f7..20bd5d5607 100644 --- a/app/javascript/mastodon/reducers/index.js +++ b/app/javascript/mastodon/reducers/index.js @@ -29,6 +29,7 @@ import listAdder from './list_adder'; import filters from './filters'; import conversations from './conversations'; import suggestions from './suggestions'; +import { custom_panel } from './pleroma'; const reducers = { dropdown_menu, @@ -61,6 +62,7 @@ const reducers = { filters, conversations, suggestions, + custom_panel, }; export default combineReducers(reducers); diff --git a/app/javascript/mastodon/reducers/pleroma.js b/app/javascript/mastodon/reducers/pleroma.js new file mode 100644 index 0000000000..4cbf59b0bc --- /dev/null +++ b/app/javascript/mastodon/reducers/pleroma.js @@ -0,0 +1,18 @@ +import { Map as ImmutableMap } from 'immutable'; +import { PANEL_FETCH_SUCCESS, PLEROMA_CONFIG_FETCH_SUCCESS } from '../actions/pleroma'; + +const initialPanel = ImmutableMap({ + enabled: false, + panel: '', +}); + +export function custom_panel(state = initialPanel, action) { + switch (action.type) { + case PANEL_FETCH_SUCCESS: + return state.set('panel', action.panel); break; + case PLEROMA_CONFIG_FETCH_SUCCESS: + return state.set('enabled', (action.config || {}).showInstanceSpecificPanel || false); + } + + return state; +}; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index d49ccd40b6..f761d38c9d 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1904,11 +1904,19 @@ a.account__display-name { margin-bottom: 0; } - .getting-started__wrapper, .getting-started__trends, .search { margin-bottom: 10px; } + + .getting-started__panel { + margin: 10px 0; + } + + .column, + .drawer { + min-width: 330px; + } } @media screen and (max-width: 630px) { @@ -2326,10 +2334,6 @@ a.account__display-name { background: $ui-base-color; } -.getting-started__wrapper { - flex: 0 0 auto; -} - .flex-spacer { flex: 1 1 auto; } @@ -2337,11 +2341,21 @@ a.account__display-name { .getting-started { color: $dark-text-color; overflow: auto; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + &__wrapper, + &__panel, &__footer { - flex: 0 0 auto; + height: min-content; + } + + &__panel, + &__footer + { padding: 10px; padding-top: 20px; + flex-grow: 0; ul { margin-bottom: 10px; @@ -2352,9 +2366,7 @@ a.account__display-name { } p { - color: $dark-text-color; font-size: 13px; - margin-bottom: 20px; a { color: $dark-text-color; @@ -2374,6 +2386,12 @@ a.account__display-name { } } + &__wrapper, + &__footer + { + color: $dark-text-color; + } + &__trends { background: $ui-base-color; flex: 0 1 auto; -- GitLab From 386ec146ea4e7c889e267108739933316d046ad3 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Sat, 23 Jun 2018 16:42:30 +0200 Subject: [PATCH 163/192] app/javascript/mastodon/components/hashtag.js: Do not crash when hashtag.history is undefined --- app/javascript/flavours/glitch/components/hashtag.js | 2 +- app/javascript/mastodon/components/hashtag.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/flavours/glitch/components/hashtag.js b/app/javascript/flavours/glitch/components/hashtag.js index d75edd9947..79fada42d7 100644 --- a/app/javascript/flavours/glitch/components/hashtag.js +++ b/app/javascript/flavours/glitch/components/hashtag.js @@ -20,7 +20,7 @@ const Hashtag = ({ hashtag }) => ( </div> <div className='trends__item__sparkline'> - <Sparklines width={50} height={28} data={hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}> + <Sparklines width={50} height={28} data={hashtag.get('history') && hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}> <SparklinesCurve style={{ fill: 'none' }} /> </Sparklines> </div> diff --git a/app/javascript/mastodon/components/hashtag.js b/app/javascript/mastodon/components/hashtag.js index f091d7893e..9e0506f606 100644 --- a/app/javascript/mastodon/components/hashtag.js +++ b/app/javascript/mastodon/components/hashtag.js @@ -20,7 +20,7 @@ const Hashtag = ({ hashtag }) => ( </div> <div className='trends__item__sparkline'> - <Sparklines width={50} height={28} data={hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}> + <Sparklines width={50} height={28} data={hashtag.get('history') && hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}> <SparklinesCurve style={{ fill: 'none' }} /> </Sparklines> </div> -- GitLab From a04ac7446fddfd3ffd1dbd6432f37cfcc5c99b66 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Tue, 26 Jun 2018 15:24:16 +0200 Subject: [PATCH 164/192] app/javascript/styles/mastodon/components.scss: Fix notifications text color MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is because pleroma doesn’t put a “<p></p>†everywhere in the statuses. It was done previously in 68fd7ee6a435c3fdef82b2b92d9e8f6f550a61aa Co-authored-by: Morgan Bazalgette <the@howl.moe> --- app/javascript/flavours/glitch/styles/components/status.scss | 1 + app/javascript/styles/mastodon/components.scss | 1 + 2 files changed, 2 insertions(+) diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss index 9d2757065e..65d3ee2251 100644 --- a/app/javascript/flavours/glitch/styles/components/status.scss +++ b/app/javascript/flavours/glitch/styles/components/status.scss @@ -590,6 +590,7 @@ } .muted { + .status__content, .status__content p, .status__content a { color: $dark-text-color; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index f761d38c9d..d975af397d 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1460,6 +1460,7 @@ a.account__display-name { } .muted { + .status__content, .status__content p, .status__content a { color: $dark-text-color; -- GitLab From 1593fa866d7c3efac56e1efcd6ab9afdb1d48da1 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Tue, 26 Jun 2018 15:47:12 +0200 Subject: [PATCH 165/192] Remove extra /settings/profile; Change /settings/{profile,preferences} to /user-settings --- .../mastodon/features/account/components/action_bar.js | 3 +-- app/javascript/mastodon/features/account/components/header.js | 2 +- .../mastodon/features/compose/components/action_bar.js | 3 +-- .../mastodon/features/compose/components/navigation_bar.js | 2 -- .../mastodon/features/compose/containers/warning_container.js | 2 +- app/javascript/mastodon/features/compose/index.js | 2 +- 6 files changed, 5 insertions(+), 9 deletions(-) diff --git a/app/javascript/mastodon/features/account/components/action_bar.js b/app/javascript/mastodon/features/account/components/action_bar.js index 8ed4c917ab..812f66e930 100644 --- a/app/javascript/mastodon/features/account/components/action_bar.js +++ b/app/javascript/mastodon/features/account/components/action_bar.js @@ -88,8 +88,7 @@ class ActionBar extends React.PureComponent { } if (account.get('id') === me) { - menu.push({ text: intl.formatMessage(messages.edit_profile), href: '/settings/profile' }); - menu.push({ text: intl.formatMessage(messages.preferences), href: '/settings/preferences' }); + menu.push({ text: intl.formatMessage(messages.preferences), href: '/user-settings' }); menu.push({ text: intl.formatMessage(messages.pins), to: '/pinned' }); menu.push(null); menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' }); diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js index 7fe6d6a4f8..8a137a0c06 100644 --- a/app/javascript/mastodon/features/account/components/header.js +++ b/app/javascript/mastodon/features/account/components/header.js @@ -88,7 +88,7 @@ class Header extends ImmutablePureComponent { }; openEditProfile = () => { - window.open('/settings/profile', '_blank'); + window.open('/user-settings', '_blank'); } render () { diff --git a/app/javascript/mastodon/features/compose/components/action_bar.js b/app/javascript/mastodon/features/compose/components/action_bar.js index 95d6eeb06d..e8d23c6948 100644 --- a/app/javascript/mastodon/features/compose/components/action_bar.js +++ b/app/javascript/mastodon/features/compose/components/action_bar.js @@ -30,8 +30,7 @@ class ActionBar extends React.PureComponent { let menu = []; - menu.push({ text: intl.formatMessage(messages.edit_profile), href: '/settings/profile' }); - menu.push({ text: intl.formatMessage(messages.preferences), href: '/settings/preferences' }); + menu.push({ text: intl.formatMessage(messages.preferences), href: '/user-settings' }); menu.push({ text: intl.formatMessage(messages.pins), to: '/pinned' }); menu.push(null); menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' }); diff --git a/app/javascript/mastodon/features/compose/components/navigation_bar.js b/app/javascript/mastodon/features/compose/components/navigation_bar.js index 9910eb4f9f..f4b2932242 100644 --- a/app/javascript/mastodon/features/compose/components/navigation_bar.js +++ b/app/javascript/mastodon/features/compose/components/navigation_bar.js @@ -27,8 +27,6 @@ export default class NavigationBar extends ImmutablePureComponent { <Permalink href={this.props.account.get('url')} to={`/accounts/${this.props.account.get('id')}`}> <strong className='navigation-bar__profile-account'>@{this.props.account.get('acct')}</strong> </Permalink> - - <a href='/settings/profile' className='navigation-bar__profile-edit'><FormattedMessage id='navigation_bar.edit_profile' defaultMessage='Edit profile' /></a> </div> <div className='navigation-bar__actions'> diff --git a/app/javascript/mastodon/features/compose/containers/warning_container.js b/app/javascript/mastodon/features/compose/containers/warning_container.js index 8200a319f7..41fd25a70b 100644 --- a/app/javascript/mastodon/features/compose/containers/warning_container.js +++ b/app/javascript/mastodon/features/compose/containers/warning_container.js @@ -15,7 +15,7 @@ const mapStateToProps = state => ({ const WarningWrapper = ({ needsLockWarning, hashtagWarning, directMessageWarning }) => { if (needsLockWarning) { - return <Warning message={<FormattedMessage id='compose_form.lock_disclaimer' defaultMessage='Your account is not {locked}. Anyone can follow you to view your follower-only posts.' values={{ locked: <a href='/settings/profile'><FormattedMessage id='compose_form.lock_disclaimer.lock' defaultMessage='locked' /></a> }} />} />; + return <Warning message={<FormattedMessage id='compose_form.lock_disclaimer' defaultMessage='Your account is not {locked}. Anyone can follow you to view your follower-only posts.' values={{ locked: <a href='/user-settings'><FormattedMessage id='compose_form.lock_disclaimer.lock' defaultMessage='locked' /></a> }} />} />; } if (hashtagWarning) { diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js index fff329106d..b65d056cf7 100644 --- a/app/javascript/mastodon/features/compose/index.js +++ b/app/javascript/mastodon/features/compose/index.js @@ -91,7 +91,7 @@ class Compose extends React.PureComponent { {!columns.some(column => column.get('id') === 'PUBLIC') && ( <Link to='/timelines/public' className='drawer__tab' title={intl.formatMessage(messages.public)} aria-label={intl.formatMessage(messages.public)}><Icon id='globe' fixedWidth /></Link> )} - <a href='/settings/preferences' className='drawer__tab' title={intl.formatMessage(messages.preferences)} aria-label={intl.formatMessage(messages.preferences)}><Icon id='cog' fixedWidth /></a> + <a href='/user-settings' className='drawer__tab' title={intl.formatMessage(messages.preferences)} aria-label={intl.formatMessage(messages.preferences)}><Icon id='cog' fixedWidth /></a> <a href='/auth/sign_out' className='drawer__tab' data-method='delete' title={intl.formatMessage(messages.logout)} aria-label={intl.formatMessage(messages.logout)}><Icon id='sign-out' fixedWidth /></a> </nav> ); -- GitLab From c8f3a3bc9adb8909ae9c1d8a39851714a6121b22 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Tue, 26 Jun 2018 20:46:28 +0200 Subject: [PATCH 166/192] [mastofe] Adds deleting others notice if you have the rights(~moderator) Closes: https://git.pleroma.social/pleroma/mastofe/issues/20 --- .../flavours/glitch/components/status_action_bar.js | 5 ++++- app/javascript/flavours/glitch/util/initial_state.js | 3 +++ app/javascript/mastodon/components/status_action_bar.js | 5 ++++- app/javascript/mastodon/initial_state.js | 3 +++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js index 1d3130604c..dda174f66f 100644 --- a/app/javascript/flavours/glitch/components/status_action_bar.js +++ b/app/javascript/flavours/glitch/components/status_action_bar.js @@ -5,7 +5,7 @@ import IconButton from './icon_button'; import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { me, isStaff } from 'flavours/glitch/util/initial_state'; +import { me, isStaff, deleteOthersNotice } from 'flavours/glitch/util/initial_state'; import RelativeTimestamp from './relative_timestamp'; import { accountAdminLink, statusAdminLink } from 'flavours/glitch/util/backend_links'; @@ -242,6 +242,9 @@ export default class StatusActionBar extends ImmutablePureComponent { }); } } + if ( deleteOthersNotice ) { + menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); + } } if (status.get('in_reply_to_id', null) === null) { diff --git a/app/javascript/flavours/glitch/util/initial_state.js b/app/javascript/flavours/glitch/util/initial_state.js index a3c65563c2..c34a818ff2 100644 --- a/app/javascript/flavours/glitch/util/initial_state.js +++ b/app/javascript/flavours/glitch/util/initial_state.js @@ -10,6 +10,7 @@ const initialState = element && function () { }(); const getMeta = (prop) => initialState && initialState.meta && initialState.meta[prop]; +const getRight = (prop) => initialState && initialState.rights && initialState.rights[prop]; export const reduceMotion = getMeta('reduce_motion'); export const autoPlayGif = getMeta('auto_play_gif'); @@ -27,4 +28,6 @@ export const version = getMeta('version'); export const mascot = getMeta('mascot'); export const isStaff = getMeta('is_staff'); +export const deleteOthersNotice = getRight('delete_others_notice'); + export default initialState; diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index 53d17d4180..77e7699d54 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -5,7 +5,7 @@ import IconButton from './icon_button'; import DropdownMenuContainer from '../containers/dropdown_menu_container'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { me, isStaff } from '../initial_state'; +import { me, deleteOthersNotice, isStaff } from '../initial_state'; const messages = defineMessages({ delete: { id: 'status.delete', defaultMessage: 'Delete' }, @@ -227,6 +227,9 @@ class StatusActionBar extends ImmutablePureComponent { menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` }); menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}` }); } + if ( deleteOthersNotice ) { + menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); + } } if (status.get('visibility') === 'direct') { diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 418659b918..670d31d940 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -2,6 +2,7 @@ const element = document.getElementById('initial-state'); const initialState = element && JSON.parse(element.textContent); const getMeta = (prop) => initialState && initialState.meta && initialState.meta[prop]; +const getRight = (prop) => initialState && initialState.rights && initialState.rights[prop]; export const reduceMotion = getMeta('reduce_motion'); export const autoPlayGif = getMeta('auto_play_gif'); @@ -19,4 +20,6 @@ export const mascot = getMeta('mascot'); export const profile_directory = getMeta('profile_directory'); export const isStaff = getMeta('is_staff'); +export const deleteOthersNotice = getRight('delete_others_notice'); + export default initialState; -- GitLab From dc2f44d706c64fb89118f0d99b030dc30d277235 Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Sat, 31 Mar 2018 17:03:44 +0200 Subject: [PATCH 167/192] Add GitLab CI config --- .gitlab-ci.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000..f7048a79bc --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,23 @@ +image: alpine:latest + +before_script: + - apk add yarn + - yarn global add node-gyp + - yarn install + +cache: + paths: + - node_modules + +test: + script: + - yarn run test:jest + +build: + script: + - yarn run build + artifacts: + paths: + - public/packs + - public/assets + expire_in: 1 week -- GitLab From 5795433a293bdd83f37a22c2da289990c78d8626 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Tue, 3 Jul 2018 14:16:27 +0200 Subject: [PATCH 168/192] Remove countableText to count all text --- .../mastodon/features/compose/components/compose_form.js | 5 ++--- app/javascript/mastodon/features/compose/util/counter.js | 9 --------- 2 files changed, 2 insertions(+), 12 deletions(-) delete mode 100644 app/javascript/mastodon/features/compose/util/counter.js diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index 8909b39fd3..9ab95d2993 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -16,7 +16,6 @@ import WarningContainer from '../containers/warning_container'; import { isMobile } from '../../../is_mobile'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { length } from 'stringz'; -import { countableText } from '../util/counter'; import Icon from 'mastodon/components/icon'; import { maxChars } from '../../../initial_state'; @@ -85,7 +84,7 @@ class ComposeForm extends ImmutablePureComponent { // Submit disabled: const { is_submitting, is_changing_upload, is_uploading, anyMedia } = this.props; - const fulltext = [this.props.spoiler_text, countableText(this.props.text)].join(''); + const fulltext = [this.props.spoiler_text, this.props.text].join(''); if (is_submitting || is_uploading || is_changing_upload || length(fulltext) > maxChars || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) { return; @@ -162,7 +161,7 @@ class ComposeForm extends ImmutablePureComponent { render () { const { intl, onPaste, showSearch, anyMedia } = this.props; const disabled = this.props.is_submitting; - const text = [this.props.spoiler_text, countableText(this.props.text)].join(''); + const text = [this.props.spoiler_text, this.props.text].join(''); const disabledButton = disabled || this.props.is_uploading || this.props.is_changing_upload || length(text) > maxChars || (text.length !== 0 && text.trim().length === 0 && !anyMedia); let publishText = ''; diff --git a/app/javascript/mastodon/features/compose/util/counter.js b/app/javascript/mastodon/features/compose/util/counter.js deleted file mode 100644 index 700ba21635..0000000000 --- a/app/javascript/mastodon/features/compose/util/counter.js +++ /dev/null @@ -1,9 +0,0 @@ -import { urlRegex } from './url_regex'; - -const urlPlaceholder = 'xxxxxxxxxxxxxxxxxxxxxxx'; - -export function countableText(inputText) { - return inputText - .replace(urlRegex, urlPlaceholder) - .replace(/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/ig, '$1@$3'); -}; -- GitLab From 5ad5c3bbd4b7f00544bd0344b15dba09bf7fd062 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Tue, 3 Jul 2018 14:00:32 +0200 Subject: [PATCH 169/192] Remove branded images and their usage --- .../flavours/glitch/actions/compose.js | 6 ------ .../flavours/glitch/features/drawer/index.js | 15 +++------------ .../images/elephant_ui_disappointed.svg | 1 - .../glitch/images/elephant_ui_working.svg | 1 - .../flavours/glitch/images/mbstobon-ui-0.png | Bin 39646 -> 0 bytes .../flavours/glitch/images/mbstobon-ui-1.png | Bin 43609 -> 0 bytes .../flavours/glitch/images/mbstobon-ui-2.png | Bin 40376 -> 0 bytes .../flavours/glitch/images/mbstobon-ui-3.png | Bin 32449 -> 0 bytes .../glitch/styles/components/drawer.scss | 18 ------------------ .../glitch/styles/components/index.scss | 4 ---- .../glitch/styles/components/modal.scss | 1 - .../components/regeneration_indicator.scss | 5 ----- .../flavours/glitch/styles/modal.scss | 1 - app/javascript/images/elephant-fren.png | Bin 34530 -> 0 bytes .../images/elephant_ui_disappointed.svg | 1 - .../images/elephant_ui_greeting.svg | 1 - app/javascript/images/elephant_ui_plane.svg | 1 - app/javascript/images/elephant_ui_working.svg | 1 - app/javascript/images/logo.svg | 1 - app/javascript/images/logo_alt.svg | 1 - app/javascript/images/logo_full.svg | 1 - app/javascript/images/logo_transparent.svg | 1 - app/javascript/images/preview.jpg | Bin 292252 -> 0 bytes .../mastodon/features/compose/index.js | 6 ------ .../mastodon/features/introduction/index.js | 3 +-- .../styles/mastodon/components.scss | 5 ----- app/javascript/styles/mastodon/modal.scss | 1 - 27 files changed, 4 insertions(+), 71 deletions(-) delete mode 100644 app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg delete mode 100644 app/javascript/flavours/glitch/images/elephant_ui_working.svg delete mode 100644 app/javascript/flavours/glitch/images/mbstobon-ui-0.png delete mode 100644 app/javascript/flavours/glitch/images/mbstobon-ui-1.png delete mode 100644 app/javascript/flavours/glitch/images/mbstobon-ui-2.png delete mode 100644 app/javascript/flavours/glitch/images/mbstobon-ui-3.png delete mode 100644 app/javascript/images/elephant-fren.png delete mode 100644 app/javascript/images/elephant_ui_disappointed.svg delete mode 100644 app/javascript/images/elephant_ui_greeting.svg delete mode 100644 app/javascript/images/elephant_ui_plane.svg delete mode 100644 app/javascript/images/elephant_ui_working.svg delete mode 100644 app/javascript/images/logo.svg delete mode 100644 app/javascript/images/logo_alt.svg delete mode 100644 app/javascript/images/logo_full.svg delete mode 100644 app/javascript/images/logo_transparent.svg delete mode 100644 app/javascript/images/preview.jpg diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index 0dd1766bc7..a24316da21 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -66,12 +66,6 @@ export function changeCompose(text) { }; }; -export function cycleElefriendCompose() { - return { - type: COMPOSE_CYCLE_ELEFRIEND, - }; -}; - export function replyCompose(status, router) { return (dispatch, getState) => { dispatch({ diff --git a/app/javascript/flavours/glitch/features/drawer/index.js b/app/javascript/flavours/glitch/features/drawer/index.js index c8121b8e55..c1a88187df 100644 --- a/app/javascript/flavours/glitch/features/drawer/index.js +++ b/app/javascript/flavours/glitch/features/drawer/index.js @@ -13,7 +13,6 @@ import { showSearch, submitSearch, } from 'flavours/glitch/actions/search'; -import { cycleElefriendCompose } from 'flavours/glitch/actions/compose'; // Components. import Composer from 'flavours/glitch/features/composer'; @@ -35,7 +34,6 @@ const messages = defineMessages({ const mapStateToProps = state => ({ account: state.getIn(['accounts', me]), columns: state.getIn(['settings', 'columns']), - elefriend: state.getIn(['compose', 'elefriend']), results: state.getIn(['search', 'results']), searchHidden: state.getIn(['search', 'hidden']), searchValue: state.getIn(['search', 'value']), @@ -52,9 +50,6 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ onClear () { dispatch(clearSearch()); }, - onClickElefriend () { - dispatch(cycleElefriendCompose()); - }, onShow () { dispatch(showSearch()); }, @@ -81,12 +76,10 @@ class Drawer extends React.Component { const { account, columns, - elefriend, intl, multiColumn, onChange, onClear, - onClickElefriend, onOpenSettings, onShow, onSubmit, @@ -98,7 +91,7 @@ class Drawer extends React.Component { unreadNotifications, showNotificationsBadge, } = this.props; - const computedClass = classNames('drawer', `mbstobon-${elefriend}`); + const computedClass = classNames('drawer', 'mbstobon'); // The result. return ( @@ -125,9 +118,9 @@ class Drawer extends React.Component { {!isSearchPage && <div className='drawer__inner'> <DrawerAccount account={account} /> <Composer /> - {multiColumn && ( + {multiColumn && mascot && ( <div className='drawer__inner__mastodon'> - {mascot ? <img alt='' draggable='false' src={mascot} /> : <button className='mastodon' onClick={onClickElefriend} />} + <img alt='' draggable='false' src={mascot} /> </div> )} </div>} @@ -154,7 +147,6 @@ Drawer.propTypes = { account: ImmutablePropTypes.map, columns: ImmutablePropTypes.list, results: ImmutablePropTypes.map, - elefriend: PropTypes.number, searchHidden: PropTypes.bool, searchValue: PropTypes.string, submitted: PropTypes.bool, @@ -164,7 +156,6 @@ Drawer.propTypes = { // Dispatch props. onChange: PropTypes.func, onClear: PropTypes.func, - onClickElefriend: PropTypes.func, onShow: PropTypes.func, onSubmit: PropTypes.func, onOpenSettings: PropTypes.func, diff --git a/app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg b/app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg deleted file mode 100644 index 580c15a138..0000000000 --- a/app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" height="134.11569" width="134.61565" viewBox="0 0 134.61565 134.11569"><path d="M82.69963 103.86569c6.8 1.5 11 2.4 11.3-6.200005.3-8.6-1.8-17.3-1.8-17.3l-13.6 1.1 4.1 22.400005z" class="st32" fill="#3a434e" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.39963 112.96569c-.2 10.3-.6 17.5 6.5 17.4 7.1-.1 12.6 1.1 13.6-5.3 1.1-6.3 1.9-20.6.7-28.000005" class="st32" fill="#3a434e" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M86.39963 97.66569c-1.4-7.5-4.1-23.2-4.1-23.2s13.2-1.5 10.4-13c-2.7-11.4-7.5-22.6-11-31.1s-14.5-16.9-28.6-15.7c-19.2 1.6-25.6 7-31.6 23.1-5.4 14.4-10.4 47.2-8.9 63.3.8 8.7 5 13.7 14.4 13.5 9.4-.2 39.8-.8 49.8-2.8.3-.1.6-.1.9-.2" class="st33" fill="#56606b"/><path d="M85.89963 97.76569l-4.1-23.2c0-.3.1-.5.4-.6 2.6-.4 5.3-1.4 7.3-3.1 1-.8 1.9-1.9 2.4-3.1.5-1.2.7-2.5.6-3.9 0-1.3-.4-2.6-.7-4-.3-1.3-.7-2.7-1.1-4-.8-2.7-1.7-5.3-2.6-7.9-1.9-5.2-4-10.4-6.1-15.5-.5-1.3-1-2.6-1.7-3.8-.6-1.2-1.4-2.3-2.3-3.4-1.7-2.1-3.8-4-6-5.5-4.6-3-10-4.7-15.4-4.9-2.7-.1-5.5.3-8.2.6-2.7.4-5.5.9-8.1 1.7-2.6.8-5.1 1.9-7.3 3.5s-4.1 3.6-5.6 5.8c-1.5 2.3-2.8 4.7-3.9 7.3-.6 1.3-1.1 2.5-1.6 3.8-.4 1.3-.9 2.6-1.3 3.9-1.6 5.3-2.8 10.7-3.9 16.1-1 5.4-1.9 10.9-2.6 16.4-.7 5.5-1.2 11-1.3 16.6-.1 2.8-.1 5.5.1 8.3.1 2.8.5 5.5 1.6 8 1 2.5 2.9 4.6 5.4 5.7 2.4 1.1 5.2 1.3 8 1.3 5.6-.1 11.1-.2 16.7-.4 11.1-.4 22.2-.8 33.2-2.3.1 0 .2.1.2.2s0 .2-.1.2c-2.7.9-5.5 1.2-8.3 1.4-2.8.2-5.6.5-8.3.6-5.6.3-11.1.6-16.7.7-5.6.2-11.1.3-16.7.4-2.8.1-5.7-.1-8.4-1.3s-4.7-3.5-5.8-6.2c-1.1-2.6-1.5-5.5-1.6-8.3-.2-2.8-.2-5.6-.1-8.4.2-5.6.7-11.1 1.3-16.7.7-5.5 1.5-11 2.6-16.5s2.3-10.9 3.9-16.3c.4-1.3.9-2.7 1.3-4 .5-1.3 1-2.6 1.6-3.9 1.1-2.6 2.4-5.1 4-7.4 1.6-2.3 3.6-4.4 5.9-6.1 2.3-1.7 4.9-2.8 7.6-3.7 2.7-.8 5.5-1.4 8.2-1.7 2.8-.3 5.5-.7 8.4-.6 5.6.2 11.2 1.9 15.9 5 2.4 1.6 4.5 3.5 6.3 5.7.9 1.1 1.7 2.3 2.4 3.5.7 1.3 1.2 2.6 1.7 3.9 2.1 5.1 4.2 10.3 6.1 15.5.9 2.6 1.8 5.3 2.6 7.9.4 1.3.8 2.7 1.1 4 .3 1.3.7 2.7.8 4.2.1 1.4-.1 2.9-.7 4.3s-1.5 2.5-2.6 3.5c-2.3 1.9-5 2.8-7.9 3.3l.4-.6 4.1 23.2c0 .3-.1.5-.4.6-.3.1-.7.5-.7.2z"/><path d="M26.49963 114.06569c-4.7 0-7.4-2.1-10-4.4-2.3-2-3.2-4.6-3.4-8.6-.1-2.700005-.6-10.000005.4-18.800005 3.8.9 9.7 3.8 13.4 7.6 5.6 5.7 17.7 6.3 22.7 6.3h1.8l.1-.4s.5-2.6 1.8-5.2l.3-.6-.7-.1c-.4-.1-10.9-1.9-9.7-10.8.7-4.9 13.3-7.9 33.9-7.9 2.2 0 3.8 0 4.2.1l3.5 2.2c-1.5.5-2.6.6-2.6.6l-.5.1.1.5c0 .2 2.8 16.4 4.1 24 0 0-7.9 13.100005-8 13.000005-.1-.1-.3-.1-.3-.1-.3 0-.7.1-.9.1-9.9 1.7-39.6 2.4-49.3 2.6l-.9-.2z" class="st34" fill="#3a434e"/><path d="M45.89963 51.36569c-.7 0-1.4-.6-1.4-1.4v-5.1c0-.7.6-1.4 1.4-1.4.7 0 1.4.6 1.4 1.4v5.1c-.1.8-.7 1.4-1.4 1.4z"/><path d="M72.89963 30.365685c-3.5.4-2.7 2.9-1.2 3.5 1.5.6 3.7.1 4.3-1.6.4-1.6-1.3-2.1-3.1-1.9z" class="st35" fill="#4f5862"/><path d="M44.29963 53.965685c-.4.7-1.5.2-2.7-.6-1.2-.8-2.1-1.5-1.6-2.2.4-.7 1.6-.4 2.8.4 1.2.8 2 1.7 1.5 2.4z" class="st34" fill="#4f5862"/><path d="M27.29963 36.165685c0-5.6-3.7-9.4-7.9-9.8-4.2-.4-9-.3-14.0000002 11.3-5.00000001 11.6-6.7 15.7-2.6 17.9 4.1 2.2 9.5000002 1.5 11.3000002-1.4 0 0 5.3 3.8 9.7-3.8" class="st36" fill="#56606b" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M11.19963 40.565685c-2.7000002 5.1-2.7000002 7.7-.5 8.5 2.2.8 4.1.7 6.4-3 0 0 2 .7 4.9-4.1.9-1.5-.7-2.6-.7-2.6s-4.8 1.3-7.1-5l-3 6.2z" class="st34" fill="#3a434e" fill-opacity="0"/><path d="M9.7996298 43.365685l4.4000002-9s1.8 6.3 7.8 4.9" class="st7" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M27.89963 67.365685c-4.9.8-9.7 4.5-9.3 15.7.4 11.2.5 18.700005 6.1 20.000005 5.5 1.3 13.8.3 14.1-7.100005.3-7.4.3-16.1.3-16.1" class="st36" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M28.69963 102.96569c-1.4 0-2.8-.2-4.1-.5-1.2-.3-2.2-.9-3-2 .5.2 1.1.3 1.7.3 1.2 0 5.2-.5 5.8-7.200005.7-7.4 2.8-10.9 6.6-10.9.8 0 1.6.1 2.6.4 0 3.4-.1 8.3-.2 12.7-.2 6.700005-7.2 7.200005-9.4 7.200005z" class="st34" fill="#3a434e"/><path d="M50.69963 18.965685c-5.2 2.9-14.6 4.7-18.1-1.5-3-5.4 2.1-9.6999996 7.8-9.9999996 5.7-.3 7.6 1.2 7.6 1.2s1.9-5.9 9.3-7.69999998c3.9-1 6-.1 6.2 1.19999998 0 0 3.6-.9 4 3.5 0 0 3.9-.4 3.1 5.1999996-.8 5.6-10.6 10.1-17.7 6.4 0 0-1.1 1.2-2.2 1.7z" class="st33" fill="#56606b"/><path d="M40.79963 21.665685c-2.7 0-4.8-.9-6.3-2.3-.7-1.1-.8-2.9-.3-4.3.8-1.9 2.6-3.3 4.6-3.7 1.2-.2 2.6-.4 3.9-.4 3.3 0 6.2.8 7.3 1.9l.6.6.3-.7s.7-2 2.2-2c.2 0 .5.1.8.2 2.2.9 3.5 1.2 4.6 1.2.5 0 .9-.1 1.3-.2.1-.1.4-.1.6-.1.6 0 1.5.3 1.8.8.2.3.2.6.1 1l-.2.6h.7c.4 0 1.4.2 1.8.9.2.4.2 1-.2 1.7-1.8.8-3.8 1.2-5.7 1.2-2 0-4 0-5.6-.8 0 0-1.2 1.3-2.2 1.8-3.1 1.6-7 2.6-10.1 2.6z" class="st34" fill="#3a434e" fill-opacity=".94117647"/><path d="M61.79963 18.66569c-3.1.5-6.3.1-8.9-1.5.7.2 1.5.4 2.2.5.7.2 1.4.2 2.2.3.7.1 1.4 0 2.2 0 .7-.1 1.4-.1 2.2-.2h.1c.3 0 .5.1.6.4-.1.2-.3.5-.6.5z"/><path d="M37.59963 21.26569c-2.4-.4-4.8-2.1-5.7-4.5-.5-1.2-.7-2.6-.3-3.9.3-1.3 1.1-2.4 2.1-3.3 2-1.7 4.6-2.5 7.1-2.6 1.3-.1 2.5 0 3.8.1.6.1 1.3.2 1.9.4.6.2 1.2.4 1.9.8l-.8.2c.6-1.6 1.6-3 2.8-4.2 1.2-1.2 2.6-2.2 4.1-2.9 1.5-.7 3.2-1.1 4.8-1.3.8-.1 1.7-.1 2.6.1.4.1.9.3 1.3.6s.7.8.8 1.3l-.6-.4c.6-.1 1.2-.1 1.7 0 .6.1 1.1.4 1.6.8.4.4.7.9.9 1.5.1.3.2.5.2.8l.1.8-.5-.4c1 0 1.9.3 2.6.9.7.7 1 1.6 1.1 2.5.1.9 0 1.7-.1 2.5-.2.9-.5 1.7-1 2.4-.9 1.4-2.2 2.5-3.7 3.4-1.4.9-3 1.4-4.6 1.8-.3.1-.5-.1-.6-.4-.1-.3.1-.5.4-.6 1.5-.3 3-.9 4.3-1.7 1.3-.8 2.5-1.8 3.3-3.1.4-.6.7-1.3.8-2 .1-.7.2-1.5.1-2.2-.1-.7-.3-1.4-.8-1.9-.5-.4-1.2-.7-1.8-.7-.3 0-.5-.2-.5-.4l-.1-.7c-.1-.2-.1-.4-.2-.7-.2-.4-.4-.8-.7-1.1-.3-.3-.7-.5-1.1-.6-.4-.1-.9-.1-1.3 0-.3.1-.5-.1-.6-.4-.1-.5-.7-.9-1.4-1.1-.7-.2-1.5-.2-2.2-.1-1.5.2-3.1.6-4.5 1.2-1.4.7-2.7 1.6-3.8 2.7-1.1 1.1-2 2.5-2.5 3.8-.1.3-.4.4-.6.3h-.1c-.4-.2-1-.5-1.5-.6-.6-.1-1.2-.2-1.7-.3-1.2-.1-2.4-.2-3.6-.1-2.4.1-4.7.8-6.5 2.3-.9.7-1.6 1.7-1.9 2.8-.3 1.1-.2 2.3.2 3.4s1.1 2.1 1.9 2.9c.6.9 1.7 1.5 2.9 1.9z"/><path d="M63.49963 2.1656854c0 3.5-2.6 5.5-4.3 6.1m8.3-2.6c.2 3.4-3.3 5.1999996-3.3 5.1999996" class="st7" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.29963 84.765685c2.6 2.3 3 4.3-2.4 4.8-5.3.5-25.7 2.4-28.2 2.6-2.4.3-3.4 1.7-3.4 2.8 0 1.1.5 3.2 4 3.1 3.4-.1 23.8-1.5 30.4-2.4 6.6-.8 14.4-2.4 13.4-9s-5.4-8.7-5.4-8.7l-8.4 6.8z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.29963 84.765685c2.6 2.3 3 4.3-2.4 4.8-5.3.5-25.7 2.4-28.2 2.6-2.4.3-3.4 1.7-3.4 2.8 0 1.1.5 3.2 4 3.1 3.4-.1 23.8-1.5 30.4-2.4 6.6-.8 13.8-2.3 13.4-9-.3-5.5-3.1-7-4.4-8.1-.5-.1-1-.1-1.6-.2l-7.8 6.4z" fill="#625d28" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M102.69963 64.665685c5.4-.1 10.3-1.9 12.2-6.5 1.9-4.6 8.7-10.1 14.2-2.1 5.4 8.1 6.6 17.3 2.8 23.7-3.8 6.5-12.1 3.5-14.9-.5-2.7-4-8.6-2.9-14.5-2.7-5.9.2.2-11.9.2-11.9z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.89963 54.865685s10.2 21.3 13.5 26.8c3.2 5.5 12.9 6.2 17.4 3.5 4.5-2.7 7.3-7.3 8-15.1.7-7.9-2.4-14.9-10-15.2-7.6-.3-11.9 7.6-12.1 13.7" class="st36" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.89963 54.865685s10.2 21.3 13.5 26.8c3.2 5.5 12.9 6.2 17.4 3.5 4.5-2.7 7.3-7.3 8-15.1.7-7.9-2.4-14.9-10-15.2-7.6-.3-11.9 7.6-12.1 13.7" class="st36" fill="#56606b" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.19963 86.165685c-3.7 0-8.3-1.3-10.4-4.8-.9-1.5-2.4-4.3-4.4-8.4l5.9-.1c4 7.4 5.9 9.8 8 9.8 3.9 0 6-3.4 6.9-9.5.2-1.2.3-2.3.4-3.4.5-4.6.9-7.2 3.4-7.5.3 0 .6-.1.9-.1 2.1 0 2.5 1.2 3.1 2.8.1.2.2.5.2.7.1 1.3.1 2.7 0 4.2-.7 7.3-3.1 11.9-7.7 14.7-1.6 1-3.9 1.6-6.3 1.6z" class="st34" fill="#3a434e"/><path d="M89.19963 63.86569l-.3 6.6c-.1 1.1-.2 2.2-.4 3.3-.1.6-.3 1.1-.5 1.7-.3.5-.6 1.1-1.2 1.5-.2.1-.5.1-.7-.2-.1-.2-.1-.5.2-.7.7-.4 1.1-1.5 1.3-2.5.2-1 .4-2.1.5-3.2.2-2.2.3-4.4.5-6.6 0-.2.2-.3.3-.3.2.1.3.3.3.4z"/><path d="M52.29963 68.665685c-6.3.6-11.1 3.9-10 10.7 1.1 6.8 7.6 8.1 16 7.7 8.4-.4 26.4-1.3 26.4-1.3s-3.3-1.7-4.8-3.3c-.5-.6-1-1.4-1.6-2.5-1.6.1-15.5.8-22.7 1-3.4.1-3.8-1.2-3.9-1.8-.3-1.2.5-2.7 2.8-2.8 3.1-.2 10.8-.7 21.4-.7h11.5s.9-.3 1-9.1c0-.1-29.8 1.5-36.1 2.1z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M56.19963 86.665685c-8.8 0-12.6-2.3-13.5-7.4 0-.1 0-.2-.1-.4 1.2 1.5 3.5 2.7 5.6 2.7 1.4 0 2.6-.5 3.6-1.5.5.7 1.4 1.4 3.7 1.4h.4c6.9-.2 19.5-.8 22.1-.9.6 1.1 1.2 1.9 1.6 2.4.9 1 2.4 1.9 3.6 2.5-5 .3-18.1.9-24.7 1.2h-2.3z" class="st39" fill="#625d28"/><path d="M44.09963 57.865685c-2.2-.6-5.8-8.3-8.7-8.7-2.9-.3-6.6 1.6-3.2 8.5 3.4 6.9 8 10 14.3 8.2 6.3-1.8 12.7-5.1 14.5-8.3 1.8-3.2-.6-6.2-4.8-4.3-4.1 1.7-9.9 5.2-12.1 4.6z" fill="#b3bfcd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M43.09963 65.865685c-4.3 0-7.7-2.7-10.4-8.4-1.4-2.8-1.7-5.1-.8-6.4.8-1.3 2.3-1.4 2.9-1.4h.6c.4 0 .8.2 1.2.6-.7.1-1.3.5-1.6 1.2-.6 1.2-.3 2.9.9 4.7l.4.6c2.1 3.1 4.1 6 7.8 6 .9 0 1.9-.2 2.9-.6 5.6-2 9.4-3.6 11.1-5.4 1.2-1.3 1.9-2.6 1.7-3.6.5.2.9.5 1.1.9.5.8.4 1.9-.2 3-1.6 2.8-7.4 6.2-14.2 8.1-1.2.5-2.3.7-3.4.7z" class="st35" fill="#93a1b5"/><path d="M13.89963 107.66569c-.1 5.1 1.3 10.2 2.3 14.8 1.3 5.5 1.3 10.1 5.2 10.7 3.9.6 10.1.9 14.4 0 4.3-.9 4.1-5.2 4.5-8.2.4-3.1 0-10.7 0-10.7s-1.1-1.4-3-1.9" class="st34" fill="#3a434e"/><path d="M14.39963 107.66569c-.1 5.2 1.3 10.3 2.5 15.4l.8 3.9c.3 1.3.6 2.5 1.1 3.6.3.5.6 1 1.1 1.4.5.3 1 .5 1.6.6 1.3.2 2.6.3 3.9.4 2.6.2 5.2.2 7.8 0 1.3-.1 2.6-.3 3.7-.7 1.1-.4 1.9-1.4 2.3-2.6.4-1.2.5-2.4.7-3.7.1-.7.2-1.3.2-1.9.1-.6.1-1.3.1-1.9 0-2.6 0-5.2-.2-7.8l.1.3c-.1-.2-.3-.4-.5-.6l-.6-.6c-.4-.4-.9-.7-1.5-.9-.1 0-.1-.1-.1-.2s.1-.1.2-.1c.6.1 1.2.3 1.7.6.3.1.5.3.8.5.3.2.5.4.8.6.1.1.1.2.1.2.1 2.6.2 5.3.2 7.9 0 .7 0 1.3-.1 2s-.2 1.3-.2 2c-.1 1.3-.3 2.7-.7 4-.5 1.3-1.5 2.6-2.8 3.1-1.4.6-2.7.7-4 .8-2.7.2-5.3.2-8 0-1.3-.1-2.6-.2-4-.4-.7-.1-1.4-.4-2-.8-.6-.5-1-1.1-1.4-1.7-.6-1.3-.9-2.6-1.2-3.9l-.8-3.9c-1.1-5.1-2.6-10.3-2.5-15.6 0-.3.2-.5.5-.5.2 0 .4.2.4.5z"/><path d="M68.19963 86.665685l.4 4.6s.3 1.5 2.4 1.5c2.1-.1 2.2-2 2.2-2l-.1-4.5-4.9.4z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M110.49963 71.465685c-.5 1.8.5 2.9 3.8 4.6 3.3 1.8 4 5.1 8.2 6 4.3.9 8.2-4.5 3.8-10.1-4.5-5.6-14.1-6.5-15.8-.5z" class="st39" fill="#625d28"/><circle r="1.7" cy="57.765686" cx="126.09963" fill="#99988c"/><path d="M17.39963 115.26569s.8 3.9 1.1 6.3c.3 2.4.9 3.8 5.9 3.2 5-.6 4.9-1.5 5.1-6.4.2-4.9-.1-7.4-3.7-7.6-3.6-.2-9.1.7-8.4 4.5z" class="st33" fill="#56606b"/><path fill="#3a434e" class="st34" d="M11.19963 40.565685c-2.7000002 5.1-2.7000002 7.7-.5 8.5 2.2.8 4.1.7 6.4-3 0 0 2 .7 4.9-4.1.9-1.5-.7-2.6-.7-2.6s-4.8 1.3-7.1-5l-3 6.2z"/></svg> \ No newline at end of file diff --git a/app/javascript/flavours/glitch/images/elephant_ui_working.svg b/app/javascript/flavours/glitch/images/elephant_ui_working.svg deleted file mode 100644 index 8ba475db0a..0000000000 --- a/app/javascript/flavours/glitch/images/elephant_ui_working.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 124.12477 127.91685" width="124.12476" height="127.91685"><path d="M72.584191 46.815676c-2.3-2.2-4.2-2.5-6.6-.6-2.4 1.9-2.1 4.8.9 7.6 3.1 2.9 4.7 4.1 6.7 5 2.1.9 5.4 2.5 10.5-2s10.2-11.1 9.4-14.7c-.8-3.6-4.1-1.8-6.8 1.2s-3.7 4-5.4 5.2c-1.5 1.3-3.8 3-8.7-1.7z" class="st0" style="fill:#93a1b5;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M116.384191 75.015676c0 6.3-3.9 9.8-9.1 9.8-5.3 0-9.9-3.5-9.9-9.8 0-6.3 4.3-10.3 9.5-10.3s9.5 4 9.5 10.3z" style="fill:#3a434e;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M54.184191 16.615676c-23 1.2-30.5 14.1-32.8 27.8-3 18.2-8.2 44.2-9.2 53.2s-1 16 6 22 11 5 23 7 19 0 20-8l16.8-1.1s14.5 5.5 18.8 6.9c4.3 1.4 10.6.5 12.1-7.1s.2-12.5-6.6-14.4c-6.8-1.9-10.6-2.9-10.6-2.9l4.4-30.1s17.4 1.6 22.6-20c0 0 3.9 1.1 4.8-2.8.9-3.9-2.6-6.2-5.6-4.8l-2.5-1s-.2-3.8-3.5-4.2c-2.1-.2-6 3.4-3 7.4 0 0-3.4 8.9-12 7.8-8.6-1.1-12.5-11.2-15-18.2s-10.7-18.3-27.7-17.5z" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M95.484191 69.915676c-.6 0-1.2 0-1.8-.1-4.2-.2-10.9-2.4-17-7.8-.7-1-.4-2-.2-2.5.5-1.1 1.7-1.8 3-1.8.8 0 1.5.3 2.2.8 3 2.2 7.8 5.1 13.8 5.1.9 0 1.8-.1 2.7-.2 7.2-1 12.1-5.8 14.3-9.9.6-1.2 1.3-2.5 1.8-3.5.2-.5.3-.7.6-.9.3-.2 1 .2 1 .2l2.1.8c-4.5 17.8-17.4 19.2-21.2 19.2h-1.3v.6z" class="st3" style="fill:#3a434e;opacity:.98;fill-opacity:1"/><path d="M48.884191 126.915676c-2.2 0-4.7-.2-7.6-.7-2.8-.5-5.1-.8-7.1-1-6.9-.9-10.3-1.3-15.6-5.9-7-6-6.8-13-5.8-21.6.3-2.3.8-5.9 1.7-11.2 3.1 1.4 6.1 2.2 8.7 2.2 3.1 0 5.4-1.2 6.6-3.4 1.6 1.9 6.9 7.3 13.3 7.3 1 0 1.9-.1 2.8-.4 3.5-1 19.8-2.1 46.9-3.4l-1.7 11.7.4.1s3.8 1 10.6 2.9c6.1 1.7 7.9 5.6 6.3 13.8-1.3 6.6-6.2 7.3-8.2 7.3-1.1 0-2.2-.2-3.3-.5-4.2-1.4-18.6-6.8-18.7-6.9h-.1l-17.3 1.2-.1.4c-.7 5.4-4.5 8.1-11.8 8.1z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M41.184191 103.415676c-3.8-1.4-6-1.4-7.7-1.4-1.8 0-4.6 3.3 1.4 5.4 6 2.1 10.3 3.4 10.3 3.4s1.8-2.1 3.5-2.9c1.6-.8 2.3-.9 2.3-.9l-9.8-3.6z" style="fill:#56606b;fill-opacity:1"/><path d="M27.584191 38.615676c1.2-5-2.1-8.2-5.7-9.2-3.5-1-8.4-1.7-13.9 6.9s-9.5 16.5-6.4 20.6c3.1 4.1 9.3 3.4 11.8-.8 0 0 5.7 3.8 9.5-4.2" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M10.884191 45.115676c-1.6 2.5-.8 5 2 5.9 2.7 1 5-1.5 6.5-3.8 1.6-2.3 3.6-5.9 3.6-5.9s-3.7 1.2-5.6-.2c-2-1.4-1.5-3.8-1.5-3.8l-5 7.8z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M22.684191 41.415676c-2.6 1.1-6.8.6-6.9-4.1 0 0-5.1 7.6-5.9 9.6" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M67.584191 5.215676c0-3.4-3.9-2.6-3.9-2.6 0-1.2-2-3.5-8.5-.6-6.4 2.9-7.3 6-7.3 6-3.8-1.7-9.6-2.6-13.5.8-3.9 3.4-4.3 10 2.3 13.5 0 0 2.9.9 7.7-.4 4.8-1.3 7.7-3.3 7.7-3.3s3.7 2.3 9 .6c5.3-1.7 9.9-4.5 10.3-10.1.5-5.7-3.8-3.9-3.8-3.9z" style="fill:#56606b;fill-opacity:1"/><path d="M67.084191 16.315676c-1-5.5-7-3-7-3 .5-2.1-3-4.1-5.5-2.7-2.5 1.4-6.6-.1-6.6-.1-6.4-4.4-14.3-2.1-16.1 2-1.1 3.3.2 7.3 4.8 9.7 0 0 2.9.9 7.7-.4 4.8-1.3 7.7-3.3 7.7-3.3s3.7 2.3 9 .6c2.3-.6 4.3-1.5 6-2.8 0 .1 0 0 0 0z" style="fill:#3a434e;fill-opacity:1"/><path d="M36.684191 22.715676c-.1 0-.2 0-.2-.1-3.1-1.6-5-4.1-5.4-7-.3-2.7.8-5.4 3-7.3 3.9-3.3 9.5-2.8 13.6-1.1.5-1.1 2.2-3.5 7.3-5.8 4.5-2 6.9-1.5 8-.8.6.4.9.9 1.1 1.3.7-.1 2-.1 3 .7.5.4.9 1 1 1.8.7-.1 1.8-.2 2.7.4 1 .7 1.4 2.1 1.2 4.1-.4 5-3.9 8.5-10.7 10.6-5.5 1.7-9.3-.6-9.4-.7-.2-.1-.3-.5-.2-.7.1-.2.5-.3.7-.2 0 0 3.6 2.2 8.6.6 6.3-2 9.6-5.1 10-9.7.1-1.6-.2-2.8-.8-3.3-.9-.7-2.3-.1-2.3-.1-.2.1-.3 0-.5 0-.1-.1-.2-.2-.2-.4 0-.8-.2-1.3-.6-1.7-.9-.8-2.6-.4-2.7-.4-.1 0-.3 0-.4-.1-.1-.1-.2-.2-.2-.4 0-.3-.2-.7-.7-1-.6-.4-2.6-1.1-7.1.8-6.1 2.7-7 5.6-7 5.7 0 .1-.1.3-.3.3-.1.1-.3.1-.4 0-3.9-1.7-9.3-2.4-13 .8-1.9 1.7-2.9 4.1-2.6 6.4.3 2.5 2 4.7 4.8 6.2.2.1.3.4.2.7-.1.3-.3.4-.5.4z"/><path d="M40.584191 84.115676s6.3 16.8 7.1 19.3c.8 2.5 1.8 3.4 7.3 3 5.5-.4 6.7-21.5 6.7-21.5l-21.1-.8z" style="fill:#191b22;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M51.084191 103.415676c-1.7-2.1-1.9-4.2-1.9-4.2l2-10.9 3-1.4-3.1 16.5zm33.9-35.3l-23.9 1.9 1.2 8 25.2 1.1 4.6-9c-2.3-.3-4.7-.9-7.1-2z" class="st9" style="fill:#191b22;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M28.484191 82.915676c7.2 9.4 12.7 11.4 21.8 7.7 8.5-3.4 15.4-9 15.1-15-.3-6-2.1-10.3-9.1-9.8-2.3.2-6.8 2.8-9.6 4.4-1.8 1-4.2 2.2-6 .4-1.8-1.8-4.3-4.4-4.3-4.4" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M49.284191 80.515676c-.3-.2-.5-.4-.7-.6-1.2.7-2.3 1.3-2.8 1.6-2 1.2-3.8.5-4.7-.3-.9-.9-2.3-2.4-5.5-1.5-3.7 1-4.5 5.7-2.5 8.4 6.5 6.1 12.8 4.1 15.2 3.3 2.4-.8 6.3-2.7 6.3-2.7l.6-6c-2-.8-4.1-.9-5.9-2.2z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M28.484191 82.915676c7.2 9.4 12.7 11.4 21.8 7.7 8.5-3.4 15.4-9 15.1-15-.3-6-2.1-10.3-9.1-9.8-2.3.2-6.8 2.8-9.6 4.4-1.8 1-4.2 2.2-6 .4-1.8-1.8-4.3-4.4-4.3-4.4m35.4-8.6c6.5 8.3 15.5 12.5 21.8 12.7" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M53.184191 104.415676c-1.6.1-2.7-1.1-2.4-2.7l4.9-25.9c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6.5 3.7.7 4.6.2.9.3 3 .1 4.6l-2.2 21.3c-.2 1.6-1.7 3.1-3.3 3.3l-45.6 4z" style="fill:#191b22;fill-opacity:1"/><path d="M53.184191 104.415676c-1.6.1-2.7-1.1-2.4-2.7l4.9-25.9c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6.5 3.7.7 4.6.2.9.3 3 .1 4.6l-2.2 21.3c-.2 1.6-1.7 3.1-3.3 3.3l-45.6 4z" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M55.684191 105.915676c-1.6.1-2.3-.4-2-2l4.4-25.6c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6 1.3 2.9 2.5 2.8 1.2-.1 1.9 1.2 1.6 2.8l-5.2 24.9c-.3 1.6-2 3.1-3.6 3.2l-45.5 3.1z" style="fill:#191b22;fill-opacity:1"/><path d="M53.184191 104.315676l4.9-26c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6 1.3 2.9 2.5 2.8 1.2-.1 1.9 1.2 1.6 2.8l-5.2 24.9c-.3 1.6-2 3.1-3.6 3.2l-46.7 3.7m9.2-103.9c-.3 2.9-2.9 4.9-4.1 5.8m8-3.2c-.7 3.5-4 6-4 6" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M39.884191 53.615676c-2.3-2.2-4.2-2.5-6.6-.6-2.4 1.9-2.1 4.8.9 7.6 3.1 2.9 4.7 4.1 6.7 5 2 .9 5.4 2.5 10.5-2s10.2-11.1 9.4-14.7c-.8-3.6-4.1-1.8-6.8 1.2s-3.7 4-5.4 5.2c-1.7 1.2-3.8 3-8.7-1.7z" class="st0" style="fill:#93a1b5;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M44.384191 61.315676c-2.3 0-4.7-1.2-6.6-3.1-.9-.9-1.1-2-.7-2.9.3-.8 1.1-1.3 1.8-1.3.2 0 .5 0 .7.1 2.3 2.1 4.2 3.2 5.9 3.2 1.6 0 2.7-.8 3.5-1.4 1.7-1.3 2.8-2.3 5.5-5.3.9-1.1 1.9-1.9 2.7-2.4.3.2.6.4.7.8.2.8-.2 2-.7 2.7-.9 1.3-4.9 5.4-9 8.4-1.1.7-2.4 1.2-3.8 1.2z" style="fill:#b3bfcd;fill-opacity:1"/><path d="M45.784191 50.115676c-.7 0-1.4-.6-1.4-1.4v-6.1c0-.7.6-1.4 1.4-1.4.7 0 1.4.6 1.4 1.4v6.1c0 .8-.6 1.4-1.4 1.4z"/><path d="M61.184191 118.215676c.7-7.1-3.5-10.6-9.2-11.1-5.7-.5-10.2 6.8-9.1 13.1 1.1 6.3 6.7 7.2 6.7 7.2" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M52.084191 107.515676c-2.2-.7-4.3-1.4-6.5-2.2-2.1-.8-4.3-1.5-6.4-2.3-.1 0-.2-.2-.1-.3 0-.1.2-.2.3-.2 2.2.6 4.4 1.3 6.5 1.9 2.2.7 4.3 1.3 6.5 2 .3.1.4.4.3.6-.1.4-.4.6-.6.5zm25.4 10.1c-.2-1.4-.2-2.9.1-4.2.2-1.4.6-2.7 1.1-4-.3 1.3-.5 2.7-.6 4.1 0 1.4.1 2.7.4 4 .1.3-.1.5-.3.6-.2.1-.6-.1-.7-.5 0 .1 0 .1 0 0z"/><path d="M104.284191 103.615676c-3.6-.7-8.5 2.1-9.5 9.7s2.1 10.7 5.3 11.6m15.1-83.5l-.39999 1.4m-1.90001-1.2c2.4 1.7 6.4 3.4 6.4 3.4m-1.6-2.6l-.60001 1.59999" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M47.484191 79.215676c3.2 2.7 7 3.3 7 3.3" style="fill:none;stroke:#000;stroke-miterlimit:10"/><path d="M69.284191 24.315676c-3.5.4-2.7 2.9-1.2 3.5 1.5.6 3.7.1 4.3-1.6.4-1.6-1.3-2.1-3.1-1.9z" style="fill:#4f5862;fill-opacity:1"/></svg> \ No newline at end of file diff --git a/app/javascript/flavours/glitch/images/mbstobon-ui-0.png b/app/javascript/flavours/glitch/images/mbstobon-ui-0.png deleted file mode 100644 index 25e1707c9932ea9091d2d794f3ca78b7f6b45978..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39646 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 diff --git a/app/javascript/flavours/glitch/images/mbstobon-ui-1.png b/app/javascript/flavours/glitch/images/mbstobon-ui-1.png deleted file mode 100644 index 64cf3cbf322e9a636e9fcbefa1fbe0786e27172e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43609 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 BhnD~V diff --git a/app/javascript/flavours/glitch/images/mbstobon-ui-2.png b/app/javascript/flavours/glitch/images/mbstobon-ui-2.png deleted file mode 100644 index b767a9122a05a7154fb0c6d1cd3bf9dc81627e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40376 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 diff --git a/app/javascript/flavours/glitch/images/mbstobon-ui-3.png b/app/javascript/flavours/glitch/images/mbstobon-ui-3.png deleted file mode 100644 index a1fb642a003b2e2b652b1e6022a84f08dc76105f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32449 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%0Arc|r&DC@j0pAQE7yV9T$8x=q-T1FG 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 Cr$1f* diff --git a/app/javascript/flavours/glitch/styles/components/drawer.scss b/app/javascript/flavours/glitch/styles/components/drawer.scss index f4931c36cc..df6d848c60 100644 --- a/app/javascript/flavours/glitch/styles/components/drawer.scss +++ b/app/javascript/flavours/glitch/styles/components/drawer.scss @@ -325,21 +325,3 @@ height: 100%; background: rgba($base-overlay-background, 0.5); } - -@for $i from 0 through 3 { - .mbstobon-#{$i} .drawer__inner__mastodon { - @if $i == 3 { - background: url('~flavours/glitch/images/wave-drawer.png') no-repeat bottom / 100% auto, lighten($ui-base-color, 13%); - } @else { - background: url('~flavours/glitch/images/wave-drawer-glitched.png') no-repeat bottom / 100% auto, lighten($ui-base-color, 13%); - } - - & > .mastodon { - background: url("~flavours/glitch/images/mbstobon-ui-#{$i}.png") no-repeat left bottom / contain; - - @if $i != 3 { - filter: contrast(50%) brightness(50%); - } - } - } -} diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss index 4fd79ee449..fb85869418 100644 --- a/app/javascript/flavours/glitch/styles/components/index.scss +++ b/app/javascript/flavours/glitch/styles/components/index.scss @@ -908,10 +908,6 @@ .missing-indicator { padding-top: 20px + 48px; - - .regeneration-indicator__figure { - background-image: url('~flavours/glitch/images/elephant_ui_disappointed.svg'); - } } .scrollable > div > :first-child .notification__dismiss-overlay > .wrappy { diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss index 3598959e73..d15111827e 100644 --- a/app/javascript/flavours/glitch/styles/components/modal.scss +++ b/app/javascript/flavours/glitch/styles/components/modal.scss @@ -255,7 +255,6 @@ } .onboarding-modal__page__wrapper-0 { - background: url('~images/elephant_ui_greeting.svg') no-repeat left bottom / auto 250px; height: 100%; padding: 0; } diff --git a/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss b/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss index 178df66525..e550552d7d 100644 --- a/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss +++ b/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss @@ -18,7 +18,6 @@ } &__figure { - background: url('~flavours/glitch/images/elephant_ui_working.svg') no-repeat center 0; width: 100%; height: 160px; background-size: contain; @@ -30,10 +29,6 @@ &.missing-indicator { padding-top: 20px + 48px; - - .regeneration-indicator__figure { - background-image: url('~flavours/glitch/images/elephant_ui_disappointed.svg'); - } } &__label { diff --git a/app/javascript/flavours/glitch/styles/modal.scss b/app/javascript/flavours/glitch/styles/modal.scss index 10de454c69..2a0d477ac9 100644 --- a/app/javascript/flavours/glitch/styles/modal.scss +++ b/app/javascript/flavours/glitch/styles/modal.scss @@ -15,7 +15,6 @@ > * { flex: 1; max-height: 235px; - background: url('~images/elephant_ui_plane.svg') no-repeat left bottom / contain; } } diff --git a/app/javascript/images/elephant-fren.png b/app/javascript/images/elephant-fren.png deleted file mode 100644 index 38b1e3cba5a677da3cc109e3a149112b8d940b5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34530 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 N002ovPDHLkV1lb~=Bxk! diff --git a/app/javascript/images/elephant_ui_disappointed.svg b/app/javascript/images/elephant_ui_disappointed.svg deleted file mode 100644 index 580c15a138..0000000000 --- a/app/javascript/images/elephant_ui_disappointed.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" height="134.11569" width="134.61565" viewBox="0 0 134.61565 134.11569"><path d="M82.69963 103.86569c6.8 1.5 11 2.4 11.3-6.200005.3-8.6-1.8-17.3-1.8-17.3l-13.6 1.1 4.1 22.400005z" class="st32" fill="#3a434e" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.39963 112.96569c-.2 10.3-.6 17.5 6.5 17.4 7.1-.1 12.6 1.1 13.6-5.3 1.1-6.3 1.9-20.6.7-28.000005" class="st32" fill="#3a434e" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M86.39963 97.66569c-1.4-7.5-4.1-23.2-4.1-23.2s13.2-1.5 10.4-13c-2.7-11.4-7.5-22.6-11-31.1s-14.5-16.9-28.6-15.7c-19.2 1.6-25.6 7-31.6 23.1-5.4 14.4-10.4 47.2-8.9 63.3.8 8.7 5 13.7 14.4 13.5 9.4-.2 39.8-.8 49.8-2.8.3-.1.6-.1.9-.2" class="st33" fill="#56606b"/><path d="M85.89963 97.76569l-4.1-23.2c0-.3.1-.5.4-.6 2.6-.4 5.3-1.4 7.3-3.1 1-.8 1.9-1.9 2.4-3.1.5-1.2.7-2.5.6-3.9 0-1.3-.4-2.6-.7-4-.3-1.3-.7-2.7-1.1-4-.8-2.7-1.7-5.3-2.6-7.9-1.9-5.2-4-10.4-6.1-15.5-.5-1.3-1-2.6-1.7-3.8-.6-1.2-1.4-2.3-2.3-3.4-1.7-2.1-3.8-4-6-5.5-4.6-3-10-4.7-15.4-4.9-2.7-.1-5.5.3-8.2.6-2.7.4-5.5.9-8.1 1.7-2.6.8-5.1 1.9-7.3 3.5s-4.1 3.6-5.6 5.8c-1.5 2.3-2.8 4.7-3.9 7.3-.6 1.3-1.1 2.5-1.6 3.8-.4 1.3-.9 2.6-1.3 3.9-1.6 5.3-2.8 10.7-3.9 16.1-1 5.4-1.9 10.9-2.6 16.4-.7 5.5-1.2 11-1.3 16.6-.1 2.8-.1 5.5.1 8.3.1 2.8.5 5.5 1.6 8 1 2.5 2.9 4.6 5.4 5.7 2.4 1.1 5.2 1.3 8 1.3 5.6-.1 11.1-.2 16.7-.4 11.1-.4 22.2-.8 33.2-2.3.1 0 .2.1.2.2s0 .2-.1.2c-2.7.9-5.5 1.2-8.3 1.4-2.8.2-5.6.5-8.3.6-5.6.3-11.1.6-16.7.7-5.6.2-11.1.3-16.7.4-2.8.1-5.7-.1-8.4-1.3s-4.7-3.5-5.8-6.2c-1.1-2.6-1.5-5.5-1.6-8.3-.2-2.8-.2-5.6-.1-8.4.2-5.6.7-11.1 1.3-16.7.7-5.5 1.5-11 2.6-16.5s2.3-10.9 3.9-16.3c.4-1.3.9-2.7 1.3-4 .5-1.3 1-2.6 1.6-3.9 1.1-2.6 2.4-5.1 4-7.4 1.6-2.3 3.6-4.4 5.9-6.1 2.3-1.7 4.9-2.8 7.6-3.7 2.7-.8 5.5-1.4 8.2-1.7 2.8-.3 5.5-.7 8.4-.6 5.6.2 11.2 1.9 15.9 5 2.4 1.6 4.5 3.5 6.3 5.7.9 1.1 1.7 2.3 2.4 3.5.7 1.3 1.2 2.6 1.7 3.9 2.1 5.1 4.2 10.3 6.1 15.5.9 2.6 1.8 5.3 2.6 7.9.4 1.3.8 2.7 1.1 4 .3 1.3.7 2.7.8 4.2.1 1.4-.1 2.9-.7 4.3s-1.5 2.5-2.6 3.5c-2.3 1.9-5 2.8-7.9 3.3l.4-.6 4.1 23.2c0 .3-.1.5-.4.6-.3.1-.7.5-.7.2z"/><path d="M26.49963 114.06569c-4.7 0-7.4-2.1-10-4.4-2.3-2-3.2-4.6-3.4-8.6-.1-2.700005-.6-10.000005.4-18.800005 3.8.9 9.7 3.8 13.4 7.6 5.6 5.7 17.7 6.3 22.7 6.3h1.8l.1-.4s.5-2.6 1.8-5.2l.3-.6-.7-.1c-.4-.1-10.9-1.9-9.7-10.8.7-4.9 13.3-7.9 33.9-7.9 2.2 0 3.8 0 4.2.1l3.5 2.2c-1.5.5-2.6.6-2.6.6l-.5.1.1.5c0 .2 2.8 16.4 4.1 24 0 0-7.9 13.100005-8 13.000005-.1-.1-.3-.1-.3-.1-.3 0-.7.1-.9.1-9.9 1.7-39.6 2.4-49.3 2.6l-.9-.2z" class="st34" fill="#3a434e"/><path d="M45.89963 51.36569c-.7 0-1.4-.6-1.4-1.4v-5.1c0-.7.6-1.4 1.4-1.4.7 0 1.4.6 1.4 1.4v5.1c-.1.8-.7 1.4-1.4 1.4z"/><path d="M72.89963 30.365685c-3.5.4-2.7 2.9-1.2 3.5 1.5.6 3.7.1 4.3-1.6.4-1.6-1.3-2.1-3.1-1.9z" class="st35" fill="#4f5862"/><path d="M44.29963 53.965685c-.4.7-1.5.2-2.7-.6-1.2-.8-2.1-1.5-1.6-2.2.4-.7 1.6-.4 2.8.4 1.2.8 2 1.7 1.5 2.4z" class="st34" fill="#4f5862"/><path d="M27.29963 36.165685c0-5.6-3.7-9.4-7.9-9.8-4.2-.4-9-.3-14.0000002 11.3-5.00000001 11.6-6.7 15.7-2.6 17.9 4.1 2.2 9.5000002 1.5 11.3000002-1.4 0 0 5.3 3.8 9.7-3.8" class="st36" fill="#56606b" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M11.19963 40.565685c-2.7000002 5.1-2.7000002 7.7-.5 8.5 2.2.8 4.1.7 6.4-3 0 0 2 .7 4.9-4.1.9-1.5-.7-2.6-.7-2.6s-4.8 1.3-7.1-5l-3 6.2z" class="st34" fill="#3a434e" fill-opacity="0"/><path d="M9.7996298 43.365685l4.4000002-9s1.8 6.3 7.8 4.9" class="st7" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M27.89963 67.365685c-4.9.8-9.7 4.5-9.3 15.7.4 11.2.5 18.700005 6.1 20.000005 5.5 1.3 13.8.3 14.1-7.100005.3-7.4.3-16.1.3-16.1" class="st36" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M28.69963 102.96569c-1.4 0-2.8-.2-4.1-.5-1.2-.3-2.2-.9-3-2 .5.2 1.1.3 1.7.3 1.2 0 5.2-.5 5.8-7.200005.7-7.4 2.8-10.9 6.6-10.9.8 0 1.6.1 2.6.4 0 3.4-.1 8.3-.2 12.7-.2 6.700005-7.2 7.200005-9.4 7.200005z" class="st34" fill="#3a434e"/><path d="M50.69963 18.965685c-5.2 2.9-14.6 4.7-18.1-1.5-3-5.4 2.1-9.6999996 7.8-9.9999996 5.7-.3 7.6 1.2 7.6 1.2s1.9-5.9 9.3-7.69999998c3.9-1 6-.1 6.2 1.19999998 0 0 3.6-.9 4 3.5 0 0 3.9-.4 3.1 5.1999996-.8 5.6-10.6 10.1-17.7 6.4 0 0-1.1 1.2-2.2 1.7z" class="st33" fill="#56606b"/><path d="M40.79963 21.665685c-2.7 0-4.8-.9-6.3-2.3-.7-1.1-.8-2.9-.3-4.3.8-1.9 2.6-3.3 4.6-3.7 1.2-.2 2.6-.4 3.9-.4 3.3 0 6.2.8 7.3 1.9l.6.6.3-.7s.7-2 2.2-2c.2 0 .5.1.8.2 2.2.9 3.5 1.2 4.6 1.2.5 0 .9-.1 1.3-.2.1-.1.4-.1.6-.1.6 0 1.5.3 1.8.8.2.3.2.6.1 1l-.2.6h.7c.4 0 1.4.2 1.8.9.2.4.2 1-.2 1.7-1.8.8-3.8 1.2-5.7 1.2-2 0-4 0-5.6-.8 0 0-1.2 1.3-2.2 1.8-3.1 1.6-7 2.6-10.1 2.6z" class="st34" fill="#3a434e" fill-opacity=".94117647"/><path d="M61.79963 18.66569c-3.1.5-6.3.1-8.9-1.5.7.2 1.5.4 2.2.5.7.2 1.4.2 2.2.3.7.1 1.4 0 2.2 0 .7-.1 1.4-.1 2.2-.2h.1c.3 0 .5.1.6.4-.1.2-.3.5-.6.5z"/><path d="M37.59963 21.26569c-2.4-.4-4.8-2.1-5.7-4.5-.5-1.2-.7-2.6-.3-3.9.3-1.3 1.1-2.4 2.1-3.3 2-1.7 4.6-2.5 7.1-2.6 1.3-.1 2.5 0 3.8.1.6.1 1.3.2 1.9.4.6.2 1.2.4 1.9.8l-.8.2c.6-1.6 1.6-3 2.8-4.2 1.2-1.2 2.6-2.2 4.1-2.9 1.5-.7 3.2-1.1 4.8-1.3.8-.1 1.7-.1 2.6.1.4.1.9.3 1.3.6s.7.8.8 1.3l-.6-.4c.6-.1 1.2-.1 1.7 0 .6.1 1.1.4 1.6.8.4.4.7.9.9 1.5.1.3.2.5.2.8l.1.8-.5-.4c1 0 1.9.3 2.6.9.7.7 1 1.6 1.1 2.5.1.9 0 1.7-.1 2.5-.2.9-.5 1.7-1 2.4-.9 1.4-2.2 2.5-3.7 3.4-1.4.9-3 1.4-4.6 1.8-.3.1-.5-.1-.6-.4-.1-.3.1-.5.4-.6 1.5-.3 3-.9 4.3-1.7 1.3-.8 2.5-1.8 3.3-3.1.4-.6.7-1.3.8-2 .1-.7.2-1.5.1-2.2-.1-.7-.3-1.4-.8-1.9-.5-.4-1.2-.7-1.8-.7-.3 0-.5-.2-.5-.4l-.1-.7c-.1-.2-.1-.4-.2-.7-.2-.4-.4-.8-.7-1.1-.3-.3-.7-.5-1.1-.6-.4-.1-.9-.1-1.3 0-.3.1-.5-.1-.6-.4-.1-.5-.7-.9-1.4-1.1-.7-.2-1.5-.2-2.2-.1-1.5.2-3.1.6-4.5 1.2-1.4.7-2.7 1.6-3.8 2.7-1.1 1.1-2 2.5-2.5 3.8-.1.3-.4.4-.6.3h-.1c-.4-.2-1-.5-1.5-.6-.6-.1-1.2-.2-1.7-.3-1.2-.1-2.4-.2-3.6-.1-2.4.1-4.7.8-6.5 2.3-.9.7-1.6 1.7-1.9 2.8-.3 1.1-.2 2.3.2 3.4s1.1 2.1 1.9 2.9c.6.9 1.7 1.5 2.9 1.9z"/><path d="M63.49963 2.1656854c0 3.5-2.6 5.5-4.3 6.1m8.3-2.6c.2 3.4-3.3 5.1999996-3.3 5.1999996" class="st7" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.29963 84.765685c2.6 2.3 3 4.3-2.4 4.8-5.3.5-25.7 2.4-28.2 2.6-2.4.3-3.4 1.7-3.4 2.8 0 1.1.5 3.2 4 3.1 3.4-.1 23.8-1.5 30.4-2.4 6.6-.8 14.4-2.4 13.4-9s-5.4-8.7-5.4-8.7l-8.4 6.8z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.29963 84.765685c2.6 2.3 3 4.3-2.4 4.8-5.3.5-25.7 2.4-28.2 2.6-2.4.3-3.4 1.7-3.4 2.8 0 1.1.5 3.2 4 3.1 3.4-.1 23.8-1.5 30.4-2.4 6.6-.8 13.8-2.3 13.4-9-.3-5.5-3.1-7-4.4-8.1-.5-.1-1-.1-1.6-.2l-7.8 6.4z" fill="#625d28" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M102.69963 64.665685c5.4-.1 10.3-1.9 12.2-6.5 1.9-4.6 8.7-10.1 14.2-2.1 5.4 8.1 6.6 17.3 2.8 23.7-3.8 6.5-12.1 3.5-14.9-.5-2.7-4-8.6-2.9-14.5-2.7-5.9.2.2-11.9.2-11.9z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.89963 54.865685s10.2 21.3 13.5 26.8c3.2 5.5 12.9 6.2 17.4 3.5 4.5-2.7 7.3-7.3 8-15.1.7-7.9-2.4-14.9-10-15.2-7.6-.3-11.9 7.6-12.1 13.7" class="st36" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.89963 54.865685s10.2 21.3 13.5 26.8c3.2 5.5 12.9 6.2 17.4 3.5 4.5-2.7 7.3-7.3 8-15.1.7-7.9-2.4-14.9-10-15.2-7.6-.3-11.9 7.6-12.1 13.7" class="st36" fill="#56606b" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.19963 86.165685c-3.7 0-8.3-1.3-10.4-4.8-.9-1.5-2.4-4.3-4.4-8.4l5.9-.1c4 7.4 5.9 9.8 8 9.8 3.9 0 6-3.4 6.9-9.5.2-1.2.3-2.3.4-3.4.5-4.6.9-7.2 3.4-7.5.3 0 .6-.1.9-.1 2.1 0 2.5 1.2 3.1 2.8.1.2.2.5.2.7.1 1.3.1 2.7 0 4.2-.7 7.3-3.1 11.9-7.7 14.7-1.6 1-3.9 1.6-6.3 1.6z" class="st34" fill="#3a434e"/><path d="M89.19963 63.86569l-.3 6.6c-.1 1.1-.2 2.2-.4 3.3-.1.6-.3 1.1-.5 1.7-.3.5-.6 1.1-1.2 1.5-.2.1-.5.1-.7-.2-.1-.2-.1-.5.2-.7.7-.4 1.1-1.5 1.3-2.5.2-1 .4-2.1.5-3.2.2-2.2.3-4.4.5-6.6 0-.2.2-.3.3-.3.2.1.3.3.3.4z"/><path d="M52.29963 68.665685c-6.3.6-11.1 3.9-10 10.7 1.1 6.8 7.6 8.1 16 7.7 8.4-.4 26.4-1.3 26.4-1.3s-3.3-1.7-4.8-3.3c-.5-.6-1-1.4-1.6-2.5-1.6.1-15.5.8-22.7 1-3.4.1-3.8-1.2-3.9-1.8-.3-1.2.5-2.7 2.8-2.8 3.1-.2 10.8-.7 21.4-.7h11.5s.9-.3 1-9.1c0-.1-29.8 1.5-36.1 2.1z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M56.19963 86.665685c-8.8 0-12.6-2.3-13.5-7.4 0-.1 0-.2-.1-.4 1.2 1.5 3.5 2.7 5.6 2.7 1.4 0 2.6-.5 3.6-1.5.5.7 1.4 1.4 3.7 1.4h.4c6.9-.2 19.5-.8 22.1-.9.6 1.1 1.2 1.9 1.6 2.4.9 1 2.4 1.9 3.6 2.5-5 .3-18.1.9-24.7 1.2h-2.3z" class="st39" fill="#625d28"/><path d="M44.09963 57.865685c-2.2-.6-5.8-8.3-8.7-8.7-2.9-.3-6.6 1.6-3.2 8.5 3.4 6.9 8 10 14.3 8.2 6.3-1.8 12.7-5.1 14.5-8.3 1.8-3.2-.6-6.2-4.8-4.3-4.1 1.7-9.9 5.2-12.1 4.6z" fill="#b3bfcd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M43.09963 65.865685c-4.3 0-7.7-2.7-10.4-8.4-1.4-2.8-1.7-5.1-.8-6.4.8-1.3 2.3-1.4 2.9-1.4h.6c.4 0 .8.2 1.2.6-.7.1-1.3.5-1.6 1.2-.6 1.2-.3 2.9.9 4.7l.4.6c2.1 3.1 4.1 6 7.8 6 .9 0 1.9-.2 2.9-.6 5.6-2 9.4-3.6 11.1-5.4 1.2-1.3 1.9-2.6 1.7-3.6.5.2.9.5 1.1.9.5.8.4 1.9-.2 3-1.6 2.8-7.4 6.2-14.2 8.1-1.2.5-2.3.7-3.4.7z" class="st35" fill="#93a1b5"/><path d="M13.89963 107.66569c-.1 5.1 1.3 10.2 2.3 14.8 1.3 5.5 1.3 10.1 5.2 10.7 3.9.6 10.1.9 14.4 0 4.3-.9 4.1-5.2 4.5-8.2.4-3.1 0-10.7 0-10.7s-1.1-1.4-3-1.9" class="st34" fill="#3a434e"/><path d="M14.39963 107.66569c-.1 5.2 1.3 10.3 2.5 15.4l.8 3.9c.3 1.3.6 2.5 1.1 3.6.3.5.6 1 1.1 1.4.5.3 1 .5 1.6.6 1.3.2 2.6.3 3.9.4 2.6.2 5.2.2 7.8 0 1.3-.1 2.6-.3 3.7-.7 1.1-.4 1.9-1.4 2.3-2.6.4-1.2.5-2.4.7-3.7.1-.7.2-1.3.2-1.9.1-.6.1-1.3.1-1.9 0-2.6 0-5.2-.2-7.8l.1.3c-.1-.2-.3-.4-.5-.6l-.6-.6c-.4-.4-.9-.7-1.5-.9-.1 0-.1-.1-.1-.2s.1-.1.2-.1c.6.1 1.2.3 1.7.6.3.1.5.3.8.5.3.2.5.4.8.6.1.1.1.2.1.2.1 2.6.2 5.3.2 7.9 0 .7 0 1.3-.1 2s-.2 1.3-.2 2c-.1 1.3-.3 2.7-.7 4-.5 1.3-1.5 2.6-2.8 3.1-1.4.6-2.7.7-4 .8-2.7.2-5.3.2-8 0-1.3-.1-2.6-.2-4-.4-.7-.1-1.4-.4-2-.8-.6-.5-1-1.1-1.4-1.7-.6-1.3-.9-2.6-1.2-3.9l-.8-3.9c-1.1-5.1-2.6-10.3-2.5-15.6 0-.3.2-.5.5-.5.2 0 .4.2.4.5z"/><path d="M68.19963 86.665685l.4 4.6s.3 1.5 2.4 1.5c2.1-.1 2.2-2 2.2-2l-.1-4.5-4.9.4z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M110.49963 71.465685c-.5 1.8.5 2.9 3.8 4.6 3.3 1.8 4 5.1 8.2 6 4.3.9 8.2-4.5 3.8-10.1-4.5-5.6-14.1-6.5-15.8-.5z" class="st39" fill="#625d28"/><circle r="1.7" cy="57.765686" cx="126.09963" fill="#99988c"/><path d="M17.39963 115.26569s.8 3.9 1.1 6.3c.3 2.4.9 3.8 5.9 3.2 5-.6 4.9-1.5 5.1-6.4.2-4.9-.1-7.4-3.7-7.6-3.6-.2-9.1.7-8.4 4.5z" class="st33" fill="#56606b"/><path fill="#3a434e" class="st34" d="M11.19963 40.565685c-2.7000002 5.1-2.7000002 7.7-.5 8.5 2.2.8 4.1.7 6.4-3 0 0 2 .7 4.9-4.1.9-1.5-.7-2.6-.7-2.6s-4.8 1.3-7.1-5l-3 6.2z"/></svg> \ No newline at end of file diff --git a/app/javascript/images/elephant_ui_greeting.svg b/app/javascript/images/elephant_ui_greeting.svg deleted file mode 100644 index f3eb4b142a..0000000000 --- a/app/javascript/images/elephant_ui_greeting.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="266.89999" width="463.97818" viewBox="0 0 463.97818 266.89999"><g transform="translate(-184 -205.1)"><defs><path id="a" d="M184 151h494.79999v321H184z"/></defs><clipPath id="b"><use height="100%" width="100%" xlink:href="#a" overflow="visible"/></clipPath><path clip-path="url(#b)" d="M525.7 478c-.5 0-.9-.2-1.2-.6-.3-.4-.4-.9-.2-1.3.2-.6 20-65 22-72 .2-.7.5-1.4.9-2.1.1-.4.3-.8.6-1.1l.3-.3c8.2-11.9 29.8-12.9 36.2-12.9 2.4 0 5 .1 7.6.3 13.6.9 25.2 3.7 33.6 8 6.4 3.3 10.7 7.4 12.2 11.8.1.2.2.4.2.6.2.6.3 1.3.4 1.9.6 5.4-1 13.6-2 18.5-1 5-11.9 47.7-12 48.1-.2.7-.8 1.1-1.5 1.1h-97.1z"/></g><g transform="translate(-184 -205.1)"><defs><path id="c" d="M184 151h494.79999v321H184z"/></defs><clipPath id="d"><use height="100%" width="100%" xlink:href="#c" overflow="visible"/></clipPath><path clip-path="url(#d)" d="M414.9 482.9c-.6 0-1.2-.4-1.4-.9H295.2l-81.3.8c-.6 0-1.1-.3-1.3-.8h-33.9c-.8 0-1.5-.7-1.5-1.5v-168c0-.3.1-.7.3-.9l2.9-3.8c-1.4-3-5.5-12.9-2.1-21.9-.2-.4-.3-.8-.5-1.2-1.9-5-2.6-10.8-2.3-17.1 0-1.1.1-2.2.3-3.3l.4-3.1.4-2.1c.5-3.2 1.3-6 2.2-8.4 2-5.4 5.5-10.4 10-14.3 4.1-3.6 9.1-6.5 15-8.6 7.6-2.7 16.2-4.1 25.5-4.1 2.4 0 5 .1 7.5.3 2.1-3.2 4.6-5.8 7.3-7.8 1.6-1.3 3.3-2.3 4.9-3.1 1.6-.8 3.5-1.7 5.4-2.2 2.9-.9 6.2-1.4 9.6-1.4.6 0 1.3 0 1.9.1 3.6.2 7.1 1 10.5 2.4 4.4-3.1 9.4-5.2 14.6-6.2 2.3-.4 4.7-.7 7.1-.7 3.3 0 6.5.4 9.6 1.3 2.8.8 5.5 1.8 7.8 3 2.5 1.3 4.8 2.9 6.9 4.7 3.9 3.3 7.2 7.6 9.5 12.5 7.9.2 15.5 3.2 21.7 8.3 3.2 2.7 5.9 5.9 7.9 9.4 2.1 3.6 3.5 7.5 4.2 11.5.7 3.7.7 7.8.2 12.2-.6 5-1.5 8.6-3 11.9-.8 1.8-1.9 3.5-3.3 5.3-1.4 1.6-2.6 2.9-3.9 4 25.8 10.3 47.4 26.8 62.7 48 8.3 11.3 16 24.7 22.9 39.7 7.1-5.1 14.6-12.5 23.2-23.3 22.7-28.1 60.2-50.7 89-53.6 4.5-.4 9-.7 13.3-.7 18.2 0 30.4 3.9 34.1 5.3 1.8-3.1 7.3-11.3 15.7-11.3 1.5 0 3 .3 4.5.8 4.6 1.5 7.8 4.3 9.4 8.2 1.5 3.5 1.3 7.4.7 10.5 1-.3 2.1-.5 3.4-.5 3.3 0 6.4 1.4 9.2 4.2 3.8 3.8 5.2 10.5 3.4 16.5-1.5 4.9-6.3 13.7-22.2 17-5.9 1.2-11.5 1.8-16.7 1.8-11.1 0-17.2-2.8-18.9-3.8-3.9.6-37.3 6.7-56.4 42.2-3.7 6.9-8.6 15.8-14 24.3 2.8 6.9 3.5 16 2.2 26.3-2.5 18.9-10 40-10.1 40.2-.2.6-.8 1-1.4 1l-94.8.9z"/></g><g transform="translate(-184 -205.1)"><defs><path id="e" d="M184 151h494.79999v321H184z"/></defs><clipPath id="f"><use height="100%" width="100%" xlink:href="#e" overflow="visible"/></clipPath><g clip-path="url(#f)"><path d="M414.9 481.4c-8.2-22.8-2.2-33.8 10.8-38.8s27 0 40 24c0 0 7-5 11-25s10-38 27-38c11 0 19 14 16 37-2.5 18.9-10 39.9-10 39.9l-94.8.9z" fill="#ebded8" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M415.1 480.7c-6.4-18.1-4.1-29.8 7-35.9 6.6 4 12.9 11.4 18.7 22.1l.3.5.5-.3c.2-.2 5.6-4.2 9.7-18.8 4.9 4.2 9.6 10.5 14 18.6l-3.7-3.4-.8-1.9c.3-.2 12.4.2 16.4-19.8 2.4-11.8 5.7-24.7 12.7-31.8 4.9 6.5 6.7 17.6 5 30.7-2.3 17.4-8.9 36.7-9.9 39.4l-69.9.6z" class="st4" fill="#fff"/><path d="M469.8 480.5H178.7v-168l3.5-4.5c61-42 180-46.3 235 30" class="st5" fill="#fccf84" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M417.2 338c-55.6-75.9-174-72-235-30l-3.5 4.5v168h291.1S458.9 395 417.2 338z" class="st6" fill="#fccf84"/><path d="M416.8 338.3c-6.4-8.7-13.8-16.6-22-23.5-8.2-6.9-17.3-12.8-26.9-17.7-19.2-9.8-40.4-15.4-61.8-17.4-21.4-2-43.2-.7-64.3 4-10.5 2.3-20.9 5.5-30.8 9.6-10 4.1-19.6 9.1-28.5 15.1l.1-.1-3.5 4.5.1-.3v168l-.5-.5h291.1l-.5.6c-1.8-12.6-4.4-25.1-7.4-37.5-3.1-12.4-6.6-24.6-10.9-36.7-4.2-12-9-23.9-14.7-35.3-2.8-5.7-5.9-11.3-9.1-16.8-3.2-5.5-6.7-10.8-10.4-16zm.8-.6c3.8 5.2 7.3 10.5 10.6 16 3.2 5.5 6.4 11.1 9.2 16.9 5.7 11.5 10.6 23.3 14.9 35.4 4.3 12.1 7.9 24.3 11 36.8 3.1 12.4 5.8 24.9 7.7 37.6.1.7-.4 1.3-1.1 1.4h-.2l-291-.8c-.3 0-.5-.2-.5-.5v-168c0-.1 0-.2.1-.3l3.5-4.5.1-.1c9-6.1 18.6-11.1 28.6-15.2s20.4-7.3 31-9.6c21.1-4.7 43-6.1 64.6-4 21.5 2.1 42.8 7.7 62.2 17.5 9.7 4.9 18.8 10.9 27.1 17.8s15.8 14.9 22.2 23.6z"/><path d="M182.3 479.7V323.5s42.9-30 87.3 15.6 79.6 126 148 110.2c56.4-13-17 21.8-17 21.8l-218.3 8.6z" class="st7" fill="#b88671"/><path d="M179.2 312.7l3.3-4.3c16.5-11.3 37.2-19.9 60.1-24.9l79.2.8c1 .5 9.3 4.6 9 10.1-.2 3.6-4.5 9.2-23.3 15-40.8 12.5-119.2 21.1-126.2 21.8l-2.1-18.5z" class="st7" fill="#b88671"/><path d="M181.1 283.7c-6.4 10.6 1.1 24.3 1.1 24.3l11.7-7.5-12.8-16.8z" fill="#a6725c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M646.4 325.7c-.2.2-.4.5-.6.8-4.6 8.1-16.2 13.7-32.9 13.7s-25.8-8.1-25.8-8.1c-65.8 3.5-80.5 51.6-124.5 93.1-44 41.5-131.1 34.9-220.8 17l-7.5 8.8 4.5 29.4s221.6-.5 230.5-.5c-1.6-12.3-2.6-16.4-2.6-16.4 31.7-17.9 49.4-44.9 65.1-74.1 21-39 58-43 58-43s11 7 35 2c17.1-3.5 22.5-14.3 21.6-22.7z" class="st7" fill="#b88671"/><path d="M241.8 392.5c-3.8 0-7-3.1-7.1-6.9l-.2-28c0-3.8 3.1-7 6.9-7.1 3.8 0 7 3.1 7.1 6.9l.2 28c.1 3.9-3 7.1-6.9 7.1zm157.5 0c-3.8.1-7.1-3-7.2-6.8l-.7-28c-.1-3.8 3-7.1 6.8-7.2 3.8-.1 7.1 3 7.2 6.8l.7 28c.1 3.9-2.9 7.1-6.8 7.2z"/><path d="M213.9 482.3c-.4 0-.8-.3-.9-.7-7.6-21.1-3.9-34.2 11.4-40.1 3.1-1.2 6.3-1.8 9.3-1.8 11.5 0 22 8.5 31.3 25.1 1.9-2 6.7-8.4 9.8-23.6 4-20.2 10.2-38.8 28-38.8 4.1 0 7.8 1.8 10.8 5.1 5.8 6.6 8.1 18.7 6.2 33-2.5 18.8-10 39.9-10.1 40.1-.1.4-.5.7-.9.7-.1.1-94.9 1-94.9 1z" class="st4" fill="#fff"/><path d="M302.7 403.5c11 0 19 14 16 37-2.5 18.9-10 39.9-10 39.9l-94.8.9c-8.2-22.8-2.2-33.8 10.8-38.8 2.9-1.1 5.9-1.8 9-1.8 10.3 0 21 7.2 31 25.8 0 0 7-5 11-25s10-38 27-38m0-2c-18.5 0-24.8 19-29 39.6-2.6 12.9-6.4 19.3-8.6 22.1-9.3-16.2-19.9-24.4-31.5-24.4-3.2 0-6.4.6-9.7 1.9-7.5 2.9-12.4 7.6-14.5 14-2.4 7-1.5 16 2.6 27.4.3.8 1 1.3 1.9 1.3l94.8-.9c.8 0 1.6-.5 1.9-1.3.1-.2 7.6-21.3 10.1-40.3 1.9-14.6-.5-26.9-6.5-33.8-3.2-3.7-7.1-5.6-11.5-5.6z"/><path d="M282.8 480.7c7.3-7 11.4-16.5 13.5-23.5 2.1-6.9 6.8-29.2 7.8-36.6.4-3.1 1.9-10.4 6.8-10.4 1 0 2.7.5 3.9 1.1 4.2 6.7 5.4 17 3.7 29.7-2.3 17.4-8.9 36.7-9.9 39.4l-25.8.3zm-69.3.1c-7.1-20-3.6-32.6 10.6-38.1.5-.2.9-.3 1.3-.5-1.5 1.3-2.6 3.2-3.4 5.3-2.4 6.3-.9 15.2 4 24.3 2 3.6 4 6.6 6.1 8.9l-18.6.1z" class="st9" fill="#ebded8"/><path d="M264.8 465.8c-4 4-7 5-7 5" class="st10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M525.7 476.5s20-65 22-72 15-17 44-15 44 12 45 21c.6 5.1-1 13-2 18s-12 48-12 48h-97z" class="st5" fill="#fccf84" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M550.8 475.7l18-59.1c2.3.6 13.2 3.2 27.4 3.2 5.1 0 10.1-.3 14.9-1 16.8-2.2 21.9-3.9 25.1-8.9v.3c.6 5.1-1 13.1-2 17.8-.9 4.7-10.8 43.3-11.9 47.6h-71.5v.1z" class="st7" fill="#b88671"/><path d="M548.9 401.8c-2.2 2.7 4.8 11.7 23.8 15.7s44 1 53-1 10.6-7.9 10.6-7.9m-49 11.1c-.6 10.8 3.4 14.8 7.4 14.8s8.5-6.6 8.3-15.1m-2.4 10.6c1.1 5.5 6.1 5.5 9.1 4.5s6-5 5-16m-.7 10.9c1.6 4.1 5.9 4.1 8.7 3.2 3-1 6-5 5-16" class="st10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M364.5 264.6c1.4-18.7-12.6-35.1-31.3-36.5-.7-.1-1.5-.1-2.2-.1-5.2-11.8-16.5-20.4-30.2-21.4-9-.7-17.5 2-24.2 7-3.2-1.4-6.6-2.3-10.3-2.6-11.9-.9-22.8 5.1-28.7 14.6-25.3-2.1-53.4 5.5-59 30.9-6.1 27.6 5.1 42.5 25 49.4 18.5 6.5 41.1 8.4 52.7 8.8 13.2.4 41.2-1.7 62.2-8.5 13-4.2 24.7-10.8 26-11.3 14.6-8.7 18.8-14.4 20-30.3z" class="st11" fill="#e0b37d"/><path d="M364.5 264.6c1.4-18.7-12.6-35.1-31.3-36.5-.7-.1-1.5-.1-2.2-.1-5.2-11.8-16.5-20.4-30.2-21.4-9-.7-17.5 2-24.2 7-3.2-1.4-6.6-2.3-10.3-2.6-11.9-.9-22.8 5.1-28.7 14.6-25.3-2.1-53.4 5.5-59 30.9-6.1 27.6 5.1 42.5 25 49.4 18.5 6.5 41.1 8.4 52.7 8.8 13.2.4 41.2-1.7 62.2-8.5 13-4.2 24.7-10.8 26-11.3 14.6-8.7 18.8-14.4 20-30.3z" class="st11" fill="#e0b37d"/><path d="M355.3 266.5c-2.1-17.9-8.8-23.1-21.6-26.6.5 5.9-.4 9.5-.7 10.7-.6 2.4-1.6 4.2-3.1 4.2-1 0-1.9-.7-2.2-1.8-.2-.7-.4-1.6-.6-2.8-.4-2.1-1-5.3-2.5-10.3-3.6-12.7-15.3-18.4-25.3-18.4-3.7 0-7.5 1.1-10.4 2.5 12.1 15.4 3.5 31.3 1.6 34.5-3.1 5.3-8.9 6-9.1 6l-.8.1c-1.2.1-1.7-.6-.9-1.2.8-.6 1.9-1.6 2.3-2.9.9-4 1.5-11.4-1.7-21.6-3.2-10-14.4-17.3-26.6-17.3-5.5 0-11 1.5-15.7 4.4l-.1.1h-.2c-2.6-.2-5.3-.3-7.9-.3-27.4 0-46.3 11.5-50.5 30.8-5.5 24.8 2.8 41.9 24.7 49.5 20.8 7.3 45.4 8.4 52.5 8.6h3.4c15.5 0 40.5-3.2 58.7-9 10.6-3.4 20.5-8.5 24.2-10.4.9-.5 1.5-.8 1.6-.8 2.6-1.5 2.3-1.3 4.1-2.6 4.3-4.7 8-15.2 6.8-25.4z" class="st12" fill="#a6725c"/><path d="M288.7 261c3.5-4.6 5.7-10.2 6.1-16.3 1-13.4-6.7-26-18.3-31.1" class="st10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M331.4 227.9c2.5 5.9 3.3 12.4 2.5 18.7 0 .1-.1.1-.1.1-.1 0-.1-.1-.1-.1.6-6.3-.5-12.6-3.2-18.3-.1-.3 0-.5.2-.7.3-.1.6 0 .7.3z"/><path d="M237.9 226.2c-4.1 7.2-3.8 14.9-5 20.8-.8 3.7-5.7 14.4-12.7 19.3" class="st10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M367.7 358.5c0 16 18 30 40 30s37-8 58-34 58-50 88-53 48 5 48 5 7-15 19-11 10 16 8 20c0 0 7-5 14 2s6 26-18 31-35-2-35-2-37 4-58 43-42 72-101 88" class="st6" fill="#fccf84"/><path d="M368.2 358.5c.1 2.8.7 5.6 1.8 8.2.3.6.6 1.3 1 1.9l.5.9.6.9c.4.6.8 1.2 1.2 1.7l1.4 1.6c.4.6 1 1 1.5 1.5l1.5 1.5c1.1.9 2.1 1.8 3.4 2.6l1.8 1.2 1.9 1c1.2.7 2.5 1.3 3.8 1.9 5.2 2.3 10.9 3.4 16.5 3.7 5.7.2 11.4-.2 17-1.4 5.5-1.2 10.8-3.4 15.6-6.4 4.9-3 9.3-6.6 13.4-10.5 1-1 2.1-2 3.1-3l3-3.1c1.9-2.2 3.9-4.3 5.7-6.5 1.8-2.2 3.8-4.4 5.7-6.7.9-1.1 2-2.1 3-3.2s2-2.2 3.1-3.2c8.3-8.2 17.4-15.7 27.3-22 9.8-6.3 20.2-11.9 31.3-15.7 2.7-1 5.6-1.8 8.4-2.6 1.4-.4 2.9-.6 4.3-1l2.2-.5 2.2-.3c1.5-.2 2.9-.5 4.4-.6l4.4-.3c2.9-.1 5.8-.2 8.8-.2 5.8.1 11.7.5 17.5 1.5 2.9.5 5.8 1 8.6 1.8 2.8.7 5.6 1.6 8.4 2.7l-.7.2c1.9-3.7 4.4-7 7.9-9.5 1.7-1.2 3.7-2.1 5.8-2.4 2.1-.3 4.3 0 6.2.7 2 .7 3.8 1.7 5.4 3.1 1.6 1.4 2.7 3.3 3.4 5.2.7 2 .9 4.1.7 6.2-.1 2.1-.6 4.1-1.5 6.1l-.7-.6c1.8-1.1 3.8-1.7 5.9-1.8 2.1 0 4.2.5 5.9 1.6 1.8 1.1 3.3 2.5 4.4 4.2l.8 1.3.6 1.4c.2.5.3 1 .4 1.5.1.5.3 1 .3 1.5.6 4-.2 8.2-2.2 11.8-2 3.5-5.1 6.3-8.6 8.3-3.5 2-7.4 3.2-11.2 4.1-3.9.8-7.8 1.4-11.8 1.6-4 .2-8 .2-11.9-.3-2-.3-3.9-.6-5.9-1.2-1.9-.6-3.8-1.2-5.6-2.2l.3.1c-4.3.6-8.6 1.9-12.8 3.4-4.1 1.5-8.2 3.4-12 5.6-7.7 4.3-14.6 10-20.5 16.6-2.9 3.3-5.6 6.8-8 10.5-2.4 3.7-4.4 7.6-6.6 11.5-4.3 7.8-8.7 15.6-13.5 23.1-4.9 7.5-10.3 14.6-16.4 21.2l-2.3 2.4c-.8.8-1.5 1.6-2.4 2.4l-4.9 4.6c-3.5 2.9-6.9 5.8-10.6 8.3l-2.7 2c-.9.6-1.9 1.2-2.9 1.8-1.9 1.2-3.8 2.4-5.8 3.5-4 2.1-7.9 4.3-12.1 6l-3.1 1.4-1.5.7c-.5.2-1 .4-1.6.6l-6.3 2.3c-2.1.8-4.2 1.4-6.4 2.1l-6.4 2c-.5.1-1-.1-1.1-.6-.1-.5.1-1 .6-1.1l6.4-1.9c2.1-.7 4.3-1.2 6.3-2l6.2-2.3c.5-.2 1-.4 1.6-.6l1.5-.7 3-1.3c4.1-1.7 8-3.8 11.9-5.8 1.9-1.1 3.8-2.3 5.7-3.4.9-.6 1.9-1.1 2.8-1.8l2.7-1.9c3.7-2.5 7.1-5.3 10.5-8.1l4.9-4.5c.8-.7 1.6-1.6 2.3-2.4l2.3-2.4c6-6.5 11.4-13.6 16.3-21s9.3-15.1 13.6-22.9c2.1-3.9 4.2-7.9 6.7-11.6 2.5-3.7 5.2-7.3 8.2-10.6 6-6.6 13.1-12.3 20.9-16.7 3.9-2.2 8-4.1 12.2-5.6 4.2-1.5 8.5-2.8 13-3.4.1 0 .2 0 .3.1 1.6.9 3.5 1.6 5.4 2.1 1.9.5 3.8.9 5.7 1.1 3.9.5 7.8.6 11.7.3 7.8-.7 15.8-1.8 22.6-5.6 3.3-2 6.3-4.6 8.2-8 2-3.3 2.7-7.3 2.1-11.1 0-.5-.2-.9-.3-1.4-.1-.5-.2-.9-.4-1.4l-.5-1.3-.7-1.2c-1-1.6-2.5-2.9-4.1-3.9-1.6-1-3.5-1.5-5.4-1.5-1.9 0-3.8.6-5.3 1.6-.2.2-.5.1-.7-.2-.1-.1-.1-.3 0-.5.8-1.7 1.3-3.7 1.4-5.7.1-2-.1-4-.7-5.8-.6-1.8-1.7-3.5-3.1-4.8-1.5-1.3-3.2-2.2-5.1-2.9-.9-.3-1.9-.6-2.8-.7-1-.1-1.9-.1-2.9 0-1.9.3-3.7 1.1-5.4 2.2-3.2 2.3-5.7 5.6-7.5 9.1-.1.2-.4.4-.6.2-2.6-1.1-5.4-1.9-8.2-2.6-2.8-.7-5.6-1.3-8.5-1.7-5.7-.9-11.5-1.3-17.3-1.3-5.8 0-11.6.2-17.3 1.1l-2.1.3-2.1.5c-1.4.3-2.8.6-4.2 1-2.8.8-5.6 1.5-8.3 2.6-10.9 3.8-21.2 9.3-30.9 15.6-9.7 6.3-18.7 13.7-26.9 21.9-1.1 1-2 2.1-3 3.1-1 1.1-2 2.1-2.9 3.2-1.9 2.2-3.8 4.4-5.6 6.7-1.8 2.3-3.8 4.4-5.7 6.6l-3 3.2c-1 1.1-2.1 2.1-3.1 3.1-4.2 4-8.7 7.8-13.7 10.8-5 3.1-10.5 5.4-16.2 6.6-5.7 1.2-11.6 1.6-17.5 1.4-5.8-.3-11.7-1.6-17-4-1.3-.6-2.7-1.2-3.9-2l-1.9-1.1-1.8-1.3-.9-.6c-.3-.2-.6-.5-.9-.7l-1.7-1.4-1.6-1.6c-.5-.5-1-1-1.5-1.6l-1.4-1.7c-.4-.6-.8-1.2-1.2-1.9l-.6-.9-.5-1c-.3-.7-.7-1.3-1-2-1.1-2.8-1.7-5.7-1.8-8.7 0-.3.2-.5.5-.5-.4 0-.1.2-.1.5z"/><linearGradient gradientTransform="matrix(1 0 0 -1 0 1080)" y2="628.47382" x2="501.4595" y1="761.37598" x1="522.04169" gradientUnits="userSpaceOnUse" id="g"><stop offset="0" stop-color="#e5b77e"/><stop offset="1" stop-color="#b88671"/></linearGradient><path d="M408.5 480c-13.2-1.7-24.4-9.7-33.3-23.7 39.6-3.4 68.1-12.2 87.7-30.7 12.5-11.8 22.6-24 32.3-35.8 24.1-29.3 45-54.6 91.7-57.2 1.3 1.1 10.5 8.1 26 8.1 15.7 0 28-5 33.1-13.5v.8c0 .3 0 .6-.1 1v.2c0 .3-.1.5-.1.8l-.1.3c0 .3-.1.6-.2.9v.1c-.1.4-.2.7-.3 1l-.1.2c-.1.3-.2.6-.3.8l-.1.3c-.1.3-.3.7-.4 1l-.1.1c-.2.4-.3.6-.5.9l-.2.3c-.2.3-.3.6-.5.8l-.1.2c-.2.3-.4.6-.7 1l-.1.2c-.2.3-.4.6-.6.8l-.2.3-.9.9-.1.1-.8.8-.3.3c-.3.2-.6.5-.9.7l-.2.2c-.4.3-.7.6-1.1.8l-.3.2c-.3.2-.6.4-1 .6l-.4.2c-.4.3-.9.5-1.4.7l-.1.1c-.4.2-.9.4-1.4.6l-.4.2c-.4.2-.8.3-1.3.5l-.3.1c-.5.2-1.1.4-1.7.6l-.4.1c-.5.1-.9.3-1.4.4l-.5.1c-.6.2-1.3.3-1.9.5-5.7 1.2-11.1 1.8-16.2 1.8-12.4 0-18.4-3.7-18.4-3.7l-.1-.1h-.2c-.4 0-37.5 4.5-58.4 43.3-.6 1.1-1.2 2.2-1.7 3.2l-2.4 4.3c-.6 1.1-1.2 2.1-1.8 3.2l-.1.1c-.6 1.1-1.2 2-1.7 3l-.6 1c-.4.7-1.9 3.2-1.9 3.2-.6 1-1.1 1.9-1.7 2.9l-.4.6c-.5.9-1.1 1.7-1.6 2.6l-.7 1.1c-.4.7-.9 1.3-1.3 2l-.7 1.1c-.6.9-1.2 1.8-1.8 2.6l-.5.8c-.5.8-1.1 1.5-1.6 2.3-.2.3-.8 1.1-.8 1.1-.4.6-.9 1.2-1.3 1.8l-.8 1.1c-.6.8-1.2 1.6-1.9 2.4l-.7.9c-.5.7-1.1 1.4-1.7 2-.3.3-.9 1.1-.9 1.1-.5.6-1 1.1-1.4 1.7 0 0-.7.8-.9 1.1-.7.7-1.4 1.5-2 2.2l-.9.9-1.8 1.8-.9.9-.2.2c-.5.5-1 1-1.6 1.5l-.1.1c-.3.3-.6.6-1 .9-.8.7-1.5 1.4-2.3 2.1-.3.3-.6.5-.9.8l-.2.2c-.6.5-1.3 1.1-1.9 1.6-.4.3-.8.6-1.2 1-.6.5-1.2.9-1.8 1.4l-.2.2c-.3.3-.6.5-1 .7-.9.7-1.8 1.3-2.7 2-.3.2-.5.4-.8.5l-.4.3c-.7.5-1.4 1-2.2 1.5-.4.3-.8.5-1.2.8-.7.4-1.3.9-2 1.3l-.3.2c-.4.2-.7.5-1.1.7-1.1.6-2.1 1.3-3.2 1.9-11.1 6.3-23.5 11.2-37.8 15.1-.1.1-4.5 2.1-11.1 3h-11v-.2z" fill="url(#g)"/><path d="M570 334.7c4.9-.8 6.4-3.3 9.2-3.8 3.2-.6 5.4 0 7.7 1.8 2.3 1.7 2.2 4.4 2.2 4.4l-7 2.8-12.1-5.2z" class="st11" fill="#e0b37d"/><path d="M236.6 421c-.6 7.7-9.4 8.9-21.8 8.9s-20.8-.8-21.4-8.5c-.6-7.7 8-11.2 21.4-11.2 13.3-.1 22.4 3.1 21.8 10.8z" class="st12" fill="#a6725c"/><path d="M590.4 423.3c-.5 2.8 3.2 3.7 5.6 3.7 2.4 0 3.9-1.3 4-3 .2-1.7-1.2-2.7-3.6-2.7-2.4 0-5.6-.3-6 2zm18.7-2.3c-1.4.1-3.2.1-4.4.6 0 1.4-.1 2.8-.4 4.2 1.2.9 3.2 1.1 4.7 1 2.4-.1 3.8-1.5 3.8-3.3.1-1.8-1.3-2.7-3.7-2.5zm12.8-1.3c-1.4.2-3.1.3-4.3.8.1 1.4 0 2.8-.2 4.2 1.3.8 3.3.9 4.8.7 2.4-.3 3.7-1.8 3.6-3.5-.1-1.7-1.5-2.5-3.9-2.2z" class="st6" fill="#fccf84"/><path d="M269.2 314.5c6.5-1 13-1.5 19.5-2.4 6.5-.9 12.9-2 19.2-3.5 6.3-1.5 12.6-3.4 18.6-5.9 3-1.2 6-2.5 8.9-3.9 1.5-.7 2.9-1.4 4.4-2.2 1.5-.7 2.8-1.5 4.4-2.2h-.1c3.3-2 6.6-4.1 9.6-6.6 1.5-1.2 2.8-2.6 4.1-4.1 1.2-1.5 2.2-3.1 3-4.8 1.6-3.5 2.3-7.3 2.8-11.2.5-3.9.5-7.7-.1-11.5-.7-3.8-2-7.5-3.9-10.8-1.9-3.3-4.4-6.3-7.4-8.8-5.9-5-13.5-7.9-21.2-8h-.3l-.1-.3c-2.2-4.8-5.4-9.2-9.4-12.7-2-1.7-4.2-3.2-6.6-4.5-2.3-1.2-4.8-2.2-7.4-2.9-5.1-1.4-10.6-1.6-15.8-.6-5.2 1-10.2 3.2-14.5 6.4l-.2.2-.3-.1c-3.3-1.5-6.9-2.4-10.6-2.6-3.6-.2-7.3.2-10.8 1.3-1.8.5-3.4 1.3-5.1 2.1-1.6.9-3.2 1.8-4.6 3-2.9 2.2-5.3 5-7.3 8.1l-.2.3h-.3c-11.1-.9-22.5 0-33 3.7-5.2 1.9-10.2 4.5-14.4 8.1-4.2 3.6-7.5 8.3-9.4 13.4-1 2.6-1.6 5.3-2.1 8l-.4 2.1-.3 2.1c-.2 1.4-.4 2.8-.4 4.2-.3 5.5.2 11.2 2.1 16.4.9 2.6 2.3 5 3.8 7.4.4.6.9 1.1 1.3 1.6s.8 1.1 1.4 1.6c1 1 1.9 2 3 2.9 4.2 3.6 9.2 6.2 14.4 8.4-5.4-1.6-10.6-4.1-15-7.7-1.1-.9-2.1-1.9-3.1-2.9-.5-.5-.9-1.1-1.4-1.6-.4-.6-.9-1.1-1.3-1.7-1.6-2.4-3-4.8-3.9-7.6-2-5.4-2.6-11.1-2.3-16.8 0-1.4.2-2.8.4-4.2l.2-2.1.4-2.1c.5-2.8 1.1-5.6 2.1-8.2 2-5.3 5.4-10.1 9.7-13.9 4.3-3.8 9.4-6.5 14.7-8.4 10.7-3.8 22.3-4.6 33.5-3.6l-.5.2c2-3.2 4.5-6.1 7.5-8.3 1.5-1.2 3.1-2.1 4.7-3.1 1.7-.8 3.4-1.6 5.2-2.1 3.6-1.2 7.4-1.5 11.2-1.3 3.8.2 7.5 1.1 10.9 2.6l-.5.1c4.4-3.2 9.5-5.5 14.9-6.5s11-.9 16.2.6c2.6.7 5.2 1.7 7.6 3 2.4 1.3 4.7 2.8 6.8 4.6 4.2 3.5 7.4 8.1 9.7 13l-.5-.3c8 0 15.9 3 22 8.1 3 2.6 5.7 5.6 7.7 9.1s3.4 7.3 4.1 11.2c.7 3.9.7 8 .2 11.9-.5 3.9-1.2 7.9-2.9 11.6-.8 1.8-1.9 3.5-3.2 5.1-1.3 1.5-2.7 3-4.2 4.2-3 2.6-6.4 4.7-9.8 6.7h-.1c-1.4.7-2.9 1.5-4.3 2.2-1.5.7-2.9 1.5-4.4 2.2-3 1.4-6 2.7-9 3.9-6.1 2.5-12.4 4.4-18.8 5.9s-12.9 2.6-19.4 3.5c-6.3.5-12.9 1.2-19.4 1zm341.8-5.8c2.4.4 4.8.9 7.1 1.7 2.3.7 4.6 1.8 6.7 2.9 2.2 1.1 4.2 2.5 6.1 4.1 1.9 1.5 3.7 3.3 5.1 5.2v.2h-.1c-1.9-1.6-3.7-3.2-5.6-4.6-1.9-1.5-4-2.7-6-3.9-2.1-1.2-4.3-2.2-6.5-3-2.2-.9-4.5-1.6-6.9-2.3-.1 0-.1-.1-.1-.1l.2-.2z"/></g></g><g transform="translate(-184 -205.1)"><defs><path id="h" d="M184 151h494.79999v321H184z"/></defs><clipPath id="i"><use height="100%" width="100%" xlink:href="#h" overflow="visible"/></clipPath><g clip-path="url(#i)"><path d="M270.6 223.8c1-.7 2.1-1.3 3.2-1.7 1.1-.4 2.3-.8 3.5-1 1.2-.2 2.4-.4 3.6-.4 1.2 0 2.4 0 3.6.2-2.4.3-4.7.6-7.1 1.1-1.2.2-2.3.5-3.5.8-1 .3-2.1.7-3.3 1z" class="st15" fill="#fce79c"/></g></g><g transform="translate(-184 -205.1)"><defs><path id="j" d="M184 151h494.79999v321H184z"/></defs><clipPath id="k"><use height="100%" width="100%" xlink:href="#j" overflow="visible"/></clipPath><g clip-path="url(#k)"><path d="M317 225.4c1.7-.9 3.6-1.4 5.5-1.4 1 0 1.9.1 2.8.3.9.2 1.8.5 2.6 1.1-1.9-.2-3.7-.3-5.5-.3-.9 0-1.8 0-2.7.1l-2.7.2z" class="st15" fill="#fce79c"/></g></g></svg> \ No newline at end of file diff --git a/app/javascript/images/elephant_ui_plane.svg b/app/javascript/images/elephant_ui_plane.svg deleted file mode 100644 index a2624d170e..0000000000 --- a/app/javascript/images/elephant_ui_plane.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 292.85862 204.49997" width="292.85861" height="204.49997"><g transform="translate(-395.89999 -820.4)"><defs><path id="a" d="M395.89999 745.09998H690.5v279.79999H395.89999z"/></defs><clipPath id="b"><use xlink:href="#a" width="100%" height="100%" overflow="visible"/></clipPath><path class="st53" d="M339.3 1028.6c1.5-3.2 14.4-31.3 27.4-58.8-6-9.3-2-17 1.5-23.7 1.9-3.7 3.8-7.1 3.6-10.4-.8-22 8.1-38.3 22.8-41.6 2.8-.6 5.2-.9 7.5-.9 3 0 5.6.5 8.1 1.6 1.4-1.3 2.8-2.6 4.2-3.8-2.8-2.6-4.3-5.5-4.5-8.8-.3-4.5 2.2-9.5 6.8-13.7 5.3-4.8 16.5-12.9 31.7-12.9.9 0 1.7 0 2.6.1-.4-.9-1-2-2.1-2.9-2.1-1.6-1.9-3.2-1.6-4 .7-2.1 3.6-3.2 8.1-3.2 3.9 0 9.7 1.2 14 4.4.3-.7.7-1.3 1.3-1.7.5-.3 1.3-.5 2.2-.5 3.4 0 10.6 2.7 15.5 9.9 3.6 5.3 3.6 10.8.1 16 18.3 4.7 30.1 15.6 39.5 24.4 2.5 2.4 5 4.6 7.3 6.5 10.7 8.9 21.4 13.2 32.7 13.2.9 0 1.8 0 2.7-.1 2-13.5-4.1-25.5-10-35.7-6.2-10.7-6.4-12.1-4.9-13.9l.1-.1c.6-.7 1.3-1 2.1-1.1h.3c1.7 0 4.5 1 13 8.7 9.9 9 16.9 22.2 19.2 36.5 8.9-4.9 15.2-12.5 17.1-20.3 2-8.6.5-16.8-4.2-22.7l-13.1 6.1-7-16.9-15.6 3.2 7.2-19.5h.1l-.2-.5 4.6-11.1 65.7 11.9c3.1.6 3.9 2.7 3.6 4.5l-.2 1-.4-.1c-.3.4-.6.7-1 .9-.7.3-7.5 3.6-21 9.9 2.1 2.9 2.2 6.1.4 9.4-1.1 1.9-2.5 6.2.4 13.3 3.7 8.9 3.5 29.2-8.3 46.2-8.1 11.7-18.3 23-37.6 26.6-3 4.6-6.5 9-10.2 12.6-7.8 7.6-24 15.3-42.3 15.3-5.3 0-10.7-.6-15.9-1.9-7.6 12.9-10.5 26.2-10.6 32.1-.2 11 .9 16.1.9 16.2l.4 1.8-164.9.8.9-2.3z" clip-path="url(#b)"/><path class="st53" d="M339.8 1028.8c.1-.3 13.9-30.1 27.5-59.1-6.1-9.2-2.1-16.8 1.4-23.5 2-3.7 3.8-7.3 3.7-10.6-.8-21.7 8-37.9 22.4-41 2.7-.6 5.1-.9 7.4-.9 3 0 5.7.5 8.2 1.7 1.6-1.6 3.2-3 4.9-4.4-3-2.6-4.6-5.5-4.8-8.8-.3-4.4 2.1-9.2 6.6-13.3 5.3-4.8 16.4-12.8 31.4-12.8 1.1 0 2.2 0 3.3.1-.3-1.1-1-2.7-2.5-3.8-1.8-1.4-1.7-2.8-1.5-3.4.6-1.8 3.4-2.9 7.6-2.9 4.4 0 10.3 1.5 14.3 4.8.1-.9.6-1.7 1.3-2.1.4-.3 1.1-.4 1.9-.4 3.3 0 10.3 2.6 15.1 9.7 3.6 5.3 3.5 10.9-.3 16.1 18.6 4.6 30.5 15.6 40 24.4 2.6 2.4 5 4.6 7.3 6.5 10.8 8.9 21.6 13.3 33.1 13.3 1 0 2.1 0 3.1-.1 2.2-13.9-4-26.1-10-36.4-6.3-10.9-6.2-11.8-5-13.3l.1-.1c.2-.2.7-.9 1.8-.9h.2c1.5 0 4.2 1 12.7 8.6 10 9.1 17 22.5 19.2 36.9 9.3-5 16-12.8 17.9-20.9 2.1-8.9.4-17.4-4.5-23.4l-13 6.1-6.9-16.8-15.1 3.1 6.8-18.4h.6l-.5-1 4.4-10.6 65.3 11.8c3.5.7 3.3 3.2 3.2 3.9l-.1.5h-.2c-.2.4-.6.8-1 1-.7.3-7.9 3.7-21.6 10.2.1.1.2.2.3.4 2 2.7 2.2 5.8.4 8.9-1.1 2-2.6 6.4.4 13.7 3.6 8.8 3.4 28.8-8.2 45.7-8.1 11.7-18.2 22.9-37.5 26.4-3 4.7-6.5 9.1-10.3 12.7-7.8 7.5-23.7 15.1-42 15.1-5.4 0-10.9-.7-16.1-2-7.7 13.1-10.7 26.7-10.9 32.7-.2 11.1.9 16.2.9 16.3l.3 1.2-163.5.8.5-1.7z" clip-path="url(#b)"/><path d="M577.5 843.7l-1-2.1 3.9-9.4 64.5 11.6c2.4.5 2.5 2 2.4 2.8" clip-path="url(#b)" fill="#fff" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M584.2 856.7l6.9 16.6s53.7-25.1 55.5-26c.9-.5 1.5-2.2-1-2.3-2.5-.1-69.6-1.4-69.6-1.4l-5.9 16 14.1-2.9z" clip-path="url(#b)" fill="#fff" stroke="#000" stroke-width="1.70000005" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M585.1 857l58.9-11.2 1.4-.5h.4c.8 0 .7.3.8.6.1.3-.1.6-.4.8L587 861.5l-1.9-4.5z" clip-path="url(#b)" fill="#d1d3d4"/><path class="st57" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M584.20001 856.70001l61.79999-11.5"/><path class="st58" d="M388.5 927.9c20-40 49.9-56.3 83.4-54.9 33.6 1.4 48.8 21.7 62.4 32.9 13.6 11.2 27.5 15.6 43.4 12.5 15.9-3.1 28.5-14.6 31.2-26.1 2.7-11.5-1-20.7-6.1-25.8-5.1-5.1-1.4-8.1 4.1-6.8 5.4 1.4 8.1 3.4 8.1 3.4s7.8-6.4 9.8-3.7c2 2.7 1.7 5.4.3 7.8-1.4 2.4-2.7 7.1.3 14.6 3.1 7.5 4.1 27.1-8.1 44.8-12.2 17.6-26.5 30.1-62.1 26.5-38.5-3.9-54.6 44.2-54.9 59-.2 11.5.9 16.5.9 16.5l-160.7.8c.2-.1 33.4-72.4 48-101.5z" clip-path="url(#b)" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st59" d="M399.4 989.3c-6.1 0-9.9-4.3-10-4.3l-.2-.2-.3.1c-3.1 1-6.1 1.5-9 1.5-6.1 0-11.4-2.2-15.6-6.5 1.4-3 2.9-6.1 4.3-9.1.1.1.1.2.2.3 6.1 8 12.7 9.7 17 9.7 3.2 0 5.6-.9 6.6-1.3.7 1.3 3 4.7 7.5 4.7 1.2 0 2.5-.3 3.9-.8 6.7-2.5 15.7-13.1 18.3-22.1 3.2 5.7-2.8 18.3-13.8 25.3-3 1.7-6 2.7-8.9 2.7zm24.5-78.1c-5.7-11.1-10.8-14.2-12.4-14.9 15.7-15.3 34.7-23 56.6-23 1.3 0 2.5 0 3.8.1 2.1.1 4.2.3 6.4.5 1.5 2.7-.4 5.6-.8 6.3-3 .8-11.2 6.5-18.5 11.6-1.9 1.3-3.7 2.6-5.3 3.7-5.3 3.7-13.6 4.2-18 4.2-1.8 0-2.9-.1-2.9-.1h-.3l-8.6 11.6zm95.3 49c4.2-7.1 12.6-15.2 28.3-15.2 3.5 0 7.2.4 11 1.2 3.4.7 7 1.1 10.6 1.1 15.9 0 29.8-7.9 34.8-12.5 6.5-6 10.5-9.8 12-12.4 1.4-2.4 3.2-2.8 4.7-2 .1.1-.7 1.1-.6 1.1-.9 1.7-1.9 3.3-3 4.8-11.5 16.6-23.9 26.9-50 26.9-3.6 0-7.5-.2-11.6-.6-1.5-.2-3-.2-4.4-.2-9.4 0-18.1 3.2-25.9 9.4l-5.9-1.6z" clip-path="url(#b)" fill="#38434f"/><path class="st58" d="M427.4 920.5c-9.1-24.2-19-27.9-32.4-25-13.4 3-22.4 18-21.6 40 .4 10.2-15.5 20.5-4.3 35s23.5 8 23.5 8 3 7.1 11 4.1 16.7-13.5 18.5-21.6" clip-path="url(#b)" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st59" d="M417.2 934.2c-7.3.5-8.6-4.8-7.3-7 1.2-2.1 4.6-3.2 4.6-3.2s-5.3-.2-6.3-4c-1-3.7 4-5.3 4-5.3s-2.9-8.6-13.3-6.1-14.4 11.7-14.2 19c.6 15.3-10.2 22.8 0 29.7 10.1 6.9 23.7-2.8 28.5-11.3 4.8-8.5 4-11.8 4-11.8z" clip-path="url(#b)" fill="#38434f"/><path class="st57" d="M392.6 978.6c6.3-3.9 9.1-7.5 9.1-7.5m15.5-36.9c-7.3.5-8.6-4.8-7.3-7 1.2-2.1 4.6-3.2 4.6-3.2s-5.3-.2-6.3-4c-1-3.7 4-5.3 4-5.3s-2.9-8.6-13.3-6.1-14.6 11.7-14.2 19" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M417.5 891.4c-9.8-6.9-6.2-16 .3-21.8 6.5-5.8 19-14 35.2-12.2 0 0-.2-3.5-3.1-5.8s-.5-4.5 5.5-4.5 12.9 2.6 15.8 6.9c0 0-1.4-3.2.4-4.4 1.8-1.2 10.2 1 15.6 9s1.1 14.9-5.2 19.9c-6.3 5-36.2 11.6-48.8 10.9" clip-path="url(#b)" fill="#53606c"/><g class="st53" clip-path="url(#b)"><path class="st36" d="M459.5 878.7c-11.1.6-22.1 3.3-32.9 6.1-4.1 1.1-8.2 2.2-12.4 2-.4 0-.8-.1-1.3-.1 1 1.6 2.5 3.2 4.6 4.7l15.6-2.1c11.3.7 37-4.7 46.4-9.4-6.5-1.1-13.3-1.5-20-1.2z" fill="#38434f"/></g><path class="st59" d="M417.5 890.8c-3.5-2.5-5.3-5.5-5.5-8.8-.2-3.2 1.2-6.7 4-9.9-.4 1.6-.2 3.2.5 4.7 1.2 2.5 3.6 4 6.3 4 2.1 0 4.3-.9 6.3-2.6 7.2-6 19.4-10.4 29.1-10.4 1.9 0 3.7.2 5.3.5 7.7 1.6 12.3 3.7 13.8 6.7.8 1.6.8 3.3 0 5.4-10.1 4.3-31.2 8.6-42.1 8.6-.7 0-1.4 0-2.1-.1-1.4-.1-2.8-.1-4-.1-7.5-.1-10.6 1.4-11.6 2z" clip-path="url(#b)" fill="#38434f"/><path class="st57" d="M471.2 854c2.2 3.4 1.1 6.7 1.1 6.7" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M489.6 967.9c34.6 23.5 68.7 8.7 80.2-2.4 11.4-11.1 20.8-28.5 20-45.9-.8-17.4-8.5-32.9-19.5-42.8-10.7-9.6-12.4-8.7-13.2-7.7-.8 1-1.4 1.1 5 12.2s13.4 24.6 9.5 40.2c-3.9 15.6-15.6 29.9-29.6 34-14 4-21.6-1.4-26.1-3.2 0 0 1 4-3.4 4.3-4.3.3-11.1-2.9-11.1-2.9s2.7 3 .1 5-5.9-.9-5.9-.9 2.5 2.2 1.5 3.3c-1 1.1-2.3.8-4.2-.6 0 0 3.2 3.6 1 5.5s-4.3 1.9-4.3 1.9z" clip-path="url(#b)" fill="#b3becd" stroke="#000" stroke-width="1.60000002" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M528.6 979.9c-13.1 0-25.8-3.9-37.6-11.7.9-.2 2.1-.7 3.3-1.8 1.4-1.3 1-3 .3-4.3.4.1.8.2 1.1.2.7 0 1.3-.3 1.8-.8.3-.3.4-.6.4-1 0-.3-.1-.6-.2-.9.6.2 1.2.4 1.9.4.9 0 1.7-.3 2.4-.8.3-.2.5-.5.7-.8 12.6 6.2 22.6 9.1 31.5 9.1 7.8 0 14.7-2.3 21.1-6.9 16.8-12.3 21.3-21.3 24.6-27.9l.3-.6c2.3-4.5 4.2-6.5 6.4-6.5.9 0 1.7.3 2.7.9-1.4 13.6-8.7 28-19.6 38.6-7.9 7.4-23.4 14.8-41.1 14.8z" clip-path="url(#b)" fill="#92a1b5"/><path class="st57" d="M489.6 967.9c-3.9.1-6.7-.9-6.7-.9" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M484 908.3c-2.2.9-2.1 3.2.1 6.7 2.1 3.5 4.5 7.9 5.9 10.3 1.4 2.4 2.6 3.5 4 2.8 1.4-.6 1.8-2 .4-4.9-1.4-2.9-5.8-11-7.2-12.7-1.6-1.7-2.4-2.5-3.2-2.2z" clip-path="url(#b)" fill="#38434f" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st57" d="M525.9 907.8c2.5-3.7 4.8-5.2 4.8-5.2m3.8 11.9c1.5-3.1 3.7-5.6 3.7-5.6m11.9 13.3c1-3.9 2.7-5.6 2.7-5.6m10.7 9c.6-4.6.9-6.6.9-6.6" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><g class="st53" clip-path="url(#b)"><path class="st49" d="M504.9 862.2c.8-.4 1.5-.8 2.2-1.1" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M519.8 856.2c13.6-3.5 22.1.5 28.2 3.3 5.3 2.4 11.6 4.7 17.6 5.3" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="4.5286,13.5857"/><path class="st49" d="M572.4 864.5c.8-.2 1.6-.4 2.4-.7" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></g><g class="st53" clip-path="url(#b)"><path d="M491.2 946.7c-4.1 1.1-6.1 1.8-10 3.5-2.1.9-4.6.1-5.6-1.9s0-4.6 2.3-5.6c4.3-1.9 6.6-2.7 11.2-3.9 2.4-.6 4.8.8 5.3 2.9.4 2.2-1 4.4-3.2 5z" fill="#505762"/></g><path class="st57" d="M515.8 952.3c-.2-2.3-1.7-3.3-1.7-3.3" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><g class="st53" clip-path="url(#b)"><path d="M454.5 887.5c-3.5.7-7.1 1.3-10.6 1.7-3.6.4-7.2.8-10.8.6-.3 0-.5-.2-.5-.5s.2-.5.5-.5c3.5.2 7.1-.1 10.6-.4 3.5-.4 7.1-.9 10.6-1.6.2 0 .4.1.4.3.1.2 0 .4-.2.4z"/></g><g class="st53" clip-path="url(#b)"><path d="M417.2 891.8c-2.2-1.6-4.3-3.6-5.4-6.2l-.4-1-.2-1-.1-.5v-.5c0-.4-.1-.7-.1-1.1 0-1.4.2-2.8.7-4.1.9-2.6 2.6-4.9 4.4-6.9 1.9-2 4-3.6 6.2-5.2s4.6-2.9 7-4.1c2.4-1.2 5-2.2 7.6-2.9 5.2-1.5 10.7-1.9 16.1-1.4l-.6.5c-.2-1.3-.7-2.7-1.4-3.8-.4-.6-.8-1.1-1.4-1.5-.5-.5-1.2-1-1.5-1.9-.1-.2-.1-.5-.1-.7.1-.2.1-.5.2-.7.2-.4.6-.7.9-.9.7-.5 1.4-.7 2.2-.9 1.5-.3 3-.4 4.4-.4 2.9.1 5.9.7 8.6 1.8 2.7 1.1 5.3 2.8 7.1 5.3l-.9.5c-.3-.7-.5-1.3-.5-2.1-.1-.7 0-1.5.4-2.3.3-.3.5-.7 1-.8.2-.1.4-.1.6-.2.2 0 .4-.1.6-.1.7 0 1.4.1 2.1.2 1.4.3 2.6.8 3.9 1.4 1.2.6 2.4 1.3 3.5 2.1 2.2 1.6 4.1 3.6 5.6 5.9.7 1.2 1.4 2.4 1.8 3.7.3.6.4 1.3.5 2 .1.3.1.7.1 1v1c-.1 2.8-1.3 5.5-3 7.6-1.7 2.2-3.6 4-5.9 5.6-2.4 1.4-4.9 2.3-7.4 3.2-2.5.8-5.1 1.5-7.8 1.9 1.2-.5 2.5-.9 3.7-1.4l3.7-1.3c2.5-.9 5-1.8 7.2-3.2 2.1-1.5 4-3.3 5.6-5.4 1.5-2.1 2.6-4.5 2.7-7 .1-2.5-.8-5-2.2-7.1-1.4-2.2-3.2-4.1-5.3-5.6-2.1-1.5-4.4-2.8-6.9-3.4-.6-.1-1.2-.2-1.8-.2-.6 0-1 .1-1.3.5-.5.8-.2 2.3.2 3.4.1.3 0 .5-.3.6-.2.1-.4 0-.6-.2-1.6-2.3-4-3.8-6.6-4.9-2.6-1.1-5.4-1.7-8.2-1.7-1.4 0-2.8.1-4.2.4-.7.2-1.3.4-1.8.7-.5.4-.8.8-.7 1.3.1.5.6.9 1.2 1.4.6.5 1.1 1.1 1.5 1.7.9 1.3 1.4 2.7 1.6 4.3 0 .3-.2.5-.4.5h-.1c-5.3-.5-10.7-.1-15.8 1.4-2.5.7-5 1.7-7.4 2.8-2.4 1.2-4.7 2.5-6.8 4.1-2.2 1.5-4.3 3.2-6.1 5.1-1.8 1.9-3.4 4.1-4.2 6.5-.4 1.2-.6 2.5-.7 3.8 0 .3.1.6.1 1v.5l.1.5.2.9.4.9c1 2.4 2.9 4.3 5 5.8.2.2.3.5.1.7-.2.2-.4.3-.7.1z"/></g><g class="st53" clip-path="url(#b)"><path class="st36" d="M615.1 863.2c2 1.2 2.3 1.8 2.3 1.8" fill="#38434f"/><path d="M615.3 862.9l1.2.9c.2.2.4.3.6.5.2.2.3.4.5.6 0 .1 0 .2-.1.2h-.2l-.5-.5c-.2-.1-.4-.3-.6-.4-.4-.3-.8-.5-1.3-.7-.2-.1-.2-.3-.1-.5s.2-.2.5-.1c-.1 0-.1 0 0 0z"/></g></g></svg> \ No newline at end of file diff --git a/app/javascript/images/elephant_ui_working.svg b/app/javascript/images/elephant_ui_working.svg deleted file mode 100644 index 8ba475db0a..0000000000 --- a/app/javascript/images/elephant_ui_working.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 124.12477 127.91685" width="124.12476" height="127.91685"><path d="M72.584191 46.815676c-2.3-2.2-4.2-2.5-6.6-.6-2.4 1.9-2.1 4.8.9 7.6 3.1 2.9 4.7 4.1 6.7 5 2.1.9 5.4 2.5 10.5-2s10.2-11.1 9.4-14.7c-.8-3.6-4.1-1.8-6.8 1.2s-3.7 4-5.4 5.2c-1.5 1.3-3.8 3-8.7-1.7z" class="st0" style="fill:#93a1b5;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M116.384191 75.015676c0 6.3-3.9 9.8-9.1 9.8-5.3 0-9.9-3.5-9.9-9.8 0-6.3 4.3-10.3 9.5-10.3s9.5 4 9.5 10.3z" style="fill:#3a434e;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M54.184191 16.615676c-23 1.2-30.5 14.1-32.8 27.8-3 18.2-8.2 44.2-9.2 53.2s-1 16 6 22 11 5 23 7 19 0 20-8l16.8-1.1s14.5 5.5 18.8 6.9c4.3 1.4 10.6.5 12.1-7.1s.2-12.5-6.6-14.4c-6.8-1.9-10.6-2.9-10.6-2.9l4.4-30.1s17.4 1.6 22.6-20c0 0 3.9 1.1 4.8-2.8.9-3.9-2.6-6.2-5.6-4.8l-2.5-1s-.2-3.8-3.5-4.2c-2.1-.2-6 3.4-3 7.4 0 0-3.4 8.9-12 7.8-8.6-1.1-12.5-11.2-15-18.2s-10.7-18.3-27.7-17.5z" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M95.484191 69.915676c-.6 0-1.2 0-1.8-.1-4.2-.2-10.9-2.4-17-7.8-.7-1-.4-2-.2-2.5.5-1.1 1.7-1.8 3-1.8.8 0 1.5.3 2.2.8 3 2.2 7.8 5.1 13.8 5.1.9 0 1.8-.1 2.7-.2 7.2-1 12.1-5.8 14.3-9.9.6-1.2 1.3-2.5 1.8-3.5.2-.5.3-.7.6-.9.3-.2 1 .2 1 .2l2.1.8c-4.5 17.8-17.4 19.2-21.2 19.2h-1.3v.6z" class="st3" style="fill:#3a434e;opacity:.98;fill-opacity:1"/><path d="M48.884191 126.915676c-2.2 0-4.7-.2-7.6-.7-2.8-.5-5.1-.8-7.1-1-6.9-.9-10.3-1.3-15.6-5.9-7-6-6.8-13-5.8-21.6.3-2.3.8-5.9 1.7-11.2 3.1 1.4 6.1 2.2 8.7 2.2 3.1 0 5.4-1.2 6.6-3.4 1.6 1.9 6.9 7.3 13.3 7.3 1 0 1.9-.1 2.8-.4 3.5-1 19.8-2.1 46.9-3.4l-1.7 11.7.4.1s3.8 1 10.6 2.9c6.1 1.7 7.9 5.6 6.3 13.8-1.3 6.6-6.2 7.3-8.2 7.3-1.1 0-2.2-.2-3.3-.5-4.2-1.4-18.6-6.8-18.7-6.9h-.1l-17.3 1.2-.1.4c-.7 5.4-4.5 8.1-11.8 8.1z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M41.184191 103.415676c-3.8-1.4-6-1.4-7.7-1.4-1.8 0-4.6 3.3 1.4 5.4 6 2.1 10.3 3.4 10.3 3.4s1.8-2.1 3.5-2.9c1.6-.8 2.3-.9 2.3-.9l-9.8-3.6z" style="fill:#56606b;fill-opacity:1"/><path d="M27.584191 38.615676c1.2-5-2.1-8.2-5.7-9.2-3.5-1-8.4-1.7-13.9 6.9s-9.5 16.5-6.4 20.6c3.1 4.1 9.3 3.4 11.8-.8 0 0 5.7 3.8 9.5-4.2" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M10.884191 45.115676c-1.6 2.5-.8 5 2 5.9 2.7 1 5-1.5 6.5-3.8 1.6-2.3 3.6-5.9 3.6-5.9s-3.7 1.2-5.6-.2c-2-1.4-1.5-3.8-1.5-3.8l-5 7.8z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M22.684191 41.415676c-2.6 1.1-6.8.6-6.9-4.1 0 0-5.1 7.6-5.9 9.6" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M67.584191 5.215676c0-3.4-3.9-2.6-3.9-2.6 0-1.2-2-3.5-8.5-.6-6.4 2.9-7.3 6-7.3 6-3.8-1.7-9.6-2.6-13.5.8-3.9 3.4-4.3 10 2.3 13.5 0 0 2.9.9 7.7-.4 4.8-1.3 7.7-3.3 7.7-3.3s3.7 2.3 9 .6c5.3-1.7 9.9-4.5 10.3-10.1.5-5.7-3.8-3.9-3.8-3.9z" style="fill:#56606b;fill-opacity:1"/><path d="M67.084191 16.315676c-1-5.5-7-3-7-3 .5-2.1-3-4.1-5.5-2.7-2.5 1.4-6.6-.1-6.6-.1-6.4-4.4-14.3-2.1-16.1 2-1.1 3.3.2 7.3 4.8 9.7 0 0 2.9.9 7.7-.4 4.8-1.3 7.7-3.3 7.7-3.3s3.7 2.3 9 .6c2.3-.6 4.3-1.5 6-2.8 0 .1 0 0 0 0z" style="fill:#3a434e;fill-opacity:1"/><path d="M36.684191 22.715676c-.1 0-.2 0-.2-.1-3.1-1.6-5-4.1-5.4-7-.3-2.7.8-5.4 3-7.3 3.9-3.3 9.5-2.8 13.6-1.1.5-1.1 2.2-3.5 7.3-5.8 4.5-2 6.9-1.5 8-.8.6.4.9.9 1.1 1.3.7-.1 2-.1 3 .7.5.4.9 1 1 1.8.7-.1 1.8-.2 2.7.4 1 .7 1.4 2.1 1.2 4.1-.4 5-3.9 8.5-10.7 10.6-5.5 1.7-9.3-.6-9.4-.7-.2-.1-.3-.5-.2-.7.1-.2.5-.3.7-.2 0 0 3.6 2.2 8.6.6 6.3-2 9.6-5.1 10-9.7.1-1.6-.2-2.8-.8-3.3-.9-.7-2.3-.1-2.3-.1-.2.1-.3 0-.5 0-.1-.1-.2-.2-.2-.4 0-.8-.2-1.3-.6-1.7-.9-.8-2.6-.4-2.7-.4-.1 0-.3 0-.4-.1-.1-.1-.2-.2-.2-.4 0-.3-.2-.7-.7-1-.6-.4-2.6-1.1-7.1.8-6.1 2.7-7 5.6-7 5.7 0 .1-.1.3-.3.3-.1.1-.3.1-.4 0-3.9-1.7-9.3-2.4-13 .8-1.9 1.7-2.9 4.1-2.6 6.4.3 2.5 2 4.7 4.8 6.2.2.1.3.4.2.7-.1.3-.3.4-.5.4z"/><path d="M40.584191 84.115676s6.3 16.8 7.1 19.3c.8 2.5 1.8 3.4 7.3 3 5.5-.4 6.7-21.5 6.7-21.5l-21.1-.8z" style="fill:#191b22;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M51.084191 103.415676c-1.7-2.1-1.9-4.2-1.9-4.2l2-10.9 3-1.4-3.1 16.5zm33.9-35.3l-23.9 1.9 1.2 8 25.2 1.1 4.6-9c-2.3-.3-4.7-.9-7.1-2z" class="st9" style="fill:#191b22;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M28.484191 82.915676c7.2 9.4 12.7 11.4 21.8 7.7 8.5-3.4 15.4-9 15.1-15-.3-6-2.1-10.3-9.1-9.8-2.3.2-6.8 2.8-9.6 4.4-1.8 1-4.2 2.2-6 .4-1.8-1.8-4.3-4.4-4.3-4.4" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M49.284191 80.515676c-.3-.2-.5-.4-.7-.6-1.2.7-2.3 1.3-2.8 1.6-2 1.2-3.8.5-4.7-.3-.9-.9-2.3-2.4-5.5-1.5-3.7 1-4.5 5.7-2.5 8.4 6.5 6.1 12.8 4.1 15.2 3.3 2.4-.8 6.3-2.7 6.3-2.7l.6-6c-2-.8-4.1-.9-5.9-2.2z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M28.484191 82.915676c7.2 9.4 12.7 11.4 21.8 7.7 8.5-3.4 15.4-9 15.1-15-.3-6-2.1-10.3-9.1-9.8-2.3.2-6.8 2.8-9.6 4.4-1.8 1-4.2 2.2-6 .4-1.8-1.8-4.3-4.4-4.3-4.4m35.4-8.6c6.5 8.3 15.5 12.5 21.8 12.7" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M53.184191 104.415676c-1.6.1-2.7-1.1-2.4-2.7l4.9-25.9c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6.5 3.7.7 4.6.2.9.3 3 .1 4.6l-2.2 21.3c-.2 1.6-1.7 3.1-3.3 3.3l-45.6 4z" style="fill:#191b22;fill-opacity:1"/><path d="M53.184191 104.415676c-1.6.1-2.7-1.1-2.4-2.7l4.9-25.9c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6.5 3.7.7 4.6.2.9.3 3 .1 4.6l-2.2 21.3c-.2 1.6-1.7 3.1-3.3 3.3l-45.6 4z" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M55.684191 105.915676c-1.6.1-2.3-.4-2-2l4.4-25.6c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6 1.3 2.9 2.5 2.8 1.2-.1 1.9 1.2 1.6 2.8l-5.2 24.9c-.3 1.6-2 3.1-3.6 3.2l-45.5 3.1z" style="fill:#191b22;fill-opacity:1"/><path d="M53.184191 104.315676l4.9-26c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6 1.3 2.9 2.5 2.8 1.2-.1 1.9 1.2 1.6 2.8l-5.2 24.9c-.3 1.6-2 3.1-3.6 3.2l-46.7 3.7m9.2-103.9c-.3 2.9-2.9 4.9-4.1 5.8m8-3.2c-.7 3.5-4 6-4 6" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M39.884191 53.615676c-2.3-2.2-4.2-2.5-6.6-.6-2.4 1.9-2.1 4.8.9 7.6 3.1 2.9 4.7 4.1 6.7 5 2 .9 5.4 2.5 10.5-2s10.2-11.1 9.4-14.7c-.8-3.6-4.1-1.8-6.8 1.2s-3.7 4-5.4 5.2c-1.7 1.2-3.8 3-8.7-1.7z" class="st0" style="fill:#93a1b5;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M44.384191 61.315676c-2.3 0-4.7-1.2-6.6-3.1-.9-.9-1.1-2-.7-2.9.3-.8 1.1-1.3 1.8-1.3.2 0 .5 0 .7.1 2.3 2.1 4.2 3.2 5.9 3.2 1.6 0 2.7-.8 3.5-1.4 1.7-1.3 2.8-2.3 5.5-5.3.9-1.1 1.9-1.9 2.7-2.4.3.2.6.4.7.8.2.8-.2 2-.7 2.7-.9 1.3-4.9 5.4-9 8.4-1.1.7-2.4 1.2-3.8 1.2z" style="fill:#b3bfcd;fill-opacity:1"/><path d="M45.784191 50.115676c-.7 0-1.4-.6-1.4-1.4v-6.1c0-.7.6-1.4 1.4-1.4.7 0 1.4.6 1.4 1.4v6.1c0 .8-.6 1.4-1.4 1.4z"/><path d="M61.184191 118.215676c.7-7.1-3.5-10.6-9.2-11.1-5.7-.5-10.2 6.8-9.1 13.1 1.1 6.3 6.7 7.2 6.7 7.2" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M52.084191 107.515676c-2.2-.7-4.3-1.4-6.5-2.2-2.1-.8-4.3-1.5-6.4-2.3-.1 0-.2-.2-.1-.3 0-.1.2-.2.3-.2 2.2.6 4.4 1.3 6.5 1.9 2.2.7 4.3 1.3 6.5 2 .3.1.4.4.3.6-.1.4-.4.6-.6.5zm25.4 10.1c-.2-1.4-.2-2.9.1-4.2.2-1.4.6-2.7 1.1-4-.3 1.3-.5 2.7-.6 4.1 0 1.4.1 2.7.4 4 .1.3-.1.5-.3.6-.2.1-.6-.1-.7-.5 0 .1 0 .1 0 0z"/><path d="M104.284191 103.615676c-3.6-.7-8.5 2.1-9.5 9.7s2.1 10.7 5.3 11.6m15.1-83.5l-.39999 1.4m-1.90001-1.2c2.4 1.7 6.4 3.4 6.4 3.4m-1.6-2.6l-.60001 1.59999" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M47.484191 79.215676c3.2 2.7 7 3.3 7 3.3" style="fill:none;stroke:#000;stroke-miterlimit:10"/><path d="M69.284191 24.315676c-3.5.4-2.7 2.9-1.2 3.5 1.5.6 3.7.1 4.3-1.6.4-1.6-1.3-2.1-3.1-1.9z" style="fill:#4f5862;fill-opacity:1"/></svg> \ No newline at end of file diff --git a/app/javascript/images/logo.svg b/app/javascript/images/logo.svg deleted file mode 100644 index 034a9c2217..0000000000 --- a/app/javascript/images/logo.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.4144 232.00976"><path d="M211.80734 139.0875c-3.18125 16.36625-28.4925 34.2775-57.5625 37.74875-15.15875 1.80875-30.08375 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.39125 27.9425 21.11625.7225 39.91875-5.20625 39.91875-5.20625l.8675 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23234 213.82 1.40609 165.31125.20859 116.09125c-.365-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67234 3.45375 78.20359.2425 107.86484 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.975 14.7525 32.975 65.0825 0 0 .41375 37.13375-4.59875 62.915" fill="#3088d4"/><path d="M177.50984 80.077v60.94125h-24.14375v-59.15c0-12.46875-5.24625-18.7975-15.74-18.7975-11.6025 0-17.4175 7.5075-17.4175 22.3525v32.37625H96.20734V85.42325c0-14.845-5.81625-22.3525-17.41875-22.3525-10.49375 0-15.74 6.32875-15.74 18.7975v59.15H38.90484V80.077c0-12.455 3.17125-22.3525 9.54125-29.675 6.56875-7.3225 15.17125-11.07625 25.85-11.07625 12.355 0 21.71125 4.74875 27.8975 14.2475l6.01375 10.08125 6.015-10.08125c6.185-9.49875 15.54125-14.2475 27.8975-14.2475 10.6775 0 19.28 3.75375 25.85 11.07625 6.36875 7.3225 9.54 17.22 9.54 29.675" fill="#fff"/></svg> diff --git a/app/javascript/images/logo_alt.svg b/app/javascript/images/logo_alt.svg deleted file mode 100644 index 102d4c787e..0000000000 --- a/app/javascript/images/logo_alt.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.41507 232.00976"><path d="M211.80683 139.0875c-3.1825 16.36625-28.4925 34.2775-57.5625 37.74875-15.16 1.80875-30.0825 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.3925 27.9425 21.115.7225 39.91625-5.20625 39.91625-5.20625l.86875 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23183 213.82 1.40558 165.31125.20808 116.09125c-.36375-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67058 3.45375 78.20308.2425 107.86433 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.97625 14.7525 32.97625 65.0825 0 0 .4125 37.13375-4.6 62.915" fill="#3088d4"/><path d="M65.68743 96.45938c0 9.01375-7.3075 16.32125-16.3225 16.32125-9.01375 0-16.32-7.3075-16.32-16.32125 0-9.01375 7.30625-16.3225 16.32-16.3225 9.015 0 16.3225 7.30875 16.3225 16.3225M124.52893 96.45938c0 9.01375-7.30875 16.32125-16.3225 16.32125-9.01375 0-16.32125-7.3075-16.32125-16.32125 0-9.01375 7.3075-16.3225 16.32125-16.3225 9.01375 0 16.3225 7.30875 16.3225 16.3225M183.36933 96.45938c0 9.01375-7.3075 16.32125-16.32125 16.32125-9.01375 0-16.32125-7.3075-16.32125-16.32125 0-9.01375 7.3075-16.3225 16.32125-16.3225 9.01375 0 16.32125 7.30875 16.32125 16.3225" fill="#fff"/></svg> diff --git a/app/javascript/images/logo_full.svg b/app/javascript/images/logo_full.svg deleted file mode 100644 index c33883342d..0000000000 --- a/app/javascript/images/logo_full.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 713.35878 175.8678"><path d="M160.55476 105.43125c-2.4125 12.40625-21.5975 25.9825-43.63375 28.61375-11.49125 1.3725-22.80375 2.63125-34.8675 2.07875-19.73-.90375-35.2975-4.71-35.2975-4.71 0 1.92125.11875 3.75.355 5.46 2.565 19.47 19.3075 20.6375 35.16625 21.18125 16.00625.5475 30.2575-3.9475 30.2575-3.9475l.65875 14.4725s-11.19625 6.01125-31.14 7.11625c-10.99875.605-24.65375-.27625-40.56-4.485C6.99851 162.08 1.06601 125.31.15851 88-.11899 76.9225.05226 66.47625.05226 57.74125c0-38.1525 24.99625-49.335 24.99625-49.335C37.65226 2.6175 59.27976.18375 81.76351 0h.5525c22.48375.18375 44.125 2.6175 56.72875 8.40625 0 0 24.99625 11.1825 24.99625 49.335 0 0 .3125 28.1475-3.48625 47.69" fill="#3088d4"/><path d="M34.65751 48.494c0-5.55375 4.5025-10.055 10.055-10.055 5.55375 0 10.055 4.50125 10.055 10.055 0 5.5525-4.50125 10.055-10.055 10.055-5.5525 0-10.055-4.5025-10.055-10.055M178.86476 60.69975v46.195h-18.30125v-44.8375c0-9.4525-3.9775-14.24875-11.9325-14.24875-8.79375 0-13.2025 5.69125-13.2025 16.94375V89.2935h-18.19375V64.75225c0-11.2525-4.40875-16.94375-13.2025-16.94375-7.955 0-11.9325 4.79625-11.9325 14.24875v44.8375H73.79851v-46.195c0-9.44125 2.40375-16.94375 7.2325-22.495 4.98-5.55 11.50125-8.395 19.595-8.395 9.36625 0 16.45875 3.59875 21.14625 10.79875l4.56 7.6425 4.55875-7.6425c4.68875-7.2 11.78-10.79875 21.1475-10.79875 8.09375 0 14.61375 2.845 19.59375 8.395 4.82875 5.55125 7.2325 13.05375 7.2325 22.495M241.91276 83.663625c3.77625-3.99 5.595-9.015 5.595-15.075 0-6.06-1.81875-11.085-5.595-14.9275-3.63625-3.99125-8.25375-5.91125-13.84875-5.91125-5.59625 0-10.2125 1.92-13.84875 5.91125-3.6375 3.8425-5.45625 8.8675-5.45625 14.9275 0 6.06 1.81875 11.085 5.45625 15.075 3.63625 3.8425 8.2525 5.76375 13.84875 5.76375 5.595 0 10.2125-1.92125 13.84875-5.76375m5.595-52.025h18.04625v73.9h-18.04625v-8.72125c-5.455 7.2425-13.01 10.79-22.80125 10.79-9.3725 0-17.34625-3.695-24.06125-11.23375-6.57375-7.5375-9.93125-16.84875-9.93125-27.785 0-10.78875 3.3575-20.10125 9.93125-27.63875 6.715-7.5375 14.68875-11.38 24.06125-11.38 9.79125 0 17.34625 3.5475 22.80125 10.78875v-8.72zM326.26951 67.258625c5.315 3.99 7.97375 9.60625 7.83375 16.7 0 7.53875-2.65875 13.45-8.11375 17.58875-5.45625 3.99125-12.03 6.06-20.00375 6.06-14.40875 0-24.20125-5.9125-29.3775-17.58875l15.66875-9.31c2.0975 6.35375 6.71375 9.60625 13.70875 9.60625 6.43375 0 9.6525-2.07 9.6525-6.35625 0-3.10375-4.1975-5.91125-12.73-8.1275-3.21875-.8875-5.87625-1.77375-7.97375-2.51375-2.9375-1.18125-5.455-2.5125-7.55375-4.1375-5.17625-3.99-7.83375-9.3125-7.83375-16.11 0-7.2425 2.5175-13.00625 7.55375-17.145 5.17625-4.28625 11.47-6.355 19.025-6.355 12.03 0 20.84375 5.1725 26.5775 15.66625l-15.38625 8.8675c-2.23875-5.02375-6.015-7.53625-11.19125-7.53625-5.45625 0-8.11375 2.06875-8.11375 6.05875 0 3.10375 4.19625 5.91125 12.73 8.12875 6.575 1.4775 11.75 3.695 15.5275 6.50375M383.626635 49.966125h-15.8075v30.7425c0 3.695 1.4 5.91125 4.0575 6.945 1.95875.74 5.875.8875 11.75.59125v17.29375c-12.16875 1.4775-20.9825.295-26.15875-3.69625-5.175-3.8425-7.69375-10.93625-7.69375-21.13375v-30.7425h-12.17v-18.3275h12.17v-14.9275l18.045-5.76375v20.69125h15.8075v18.3275zM441.124885 83.2205c3.6375-3.84375 5.455-8.72125 5.455-14.6325 0-5.91125-1.8175-10.78875-5.455-14.63125-3.6375-3.84375-8.11375-5.76375-13.57-5.76375-5.455 0-9.93125 1.92-13.56875 5.76375-3.4975 3.99-5.31625 8.8675-5.31625 14.63125 0 5.765 1.81875 10.6425 5.31625 14.6325 3.6375 3.8425 8.11375 5.76375 13.56875 5.76375 5.45625 0 9.9325-1.92125 13.57-5.76375m-39.86875 13.15375c-7.13375-7.5375-10.63125-16.70125-10.63125-27.78625 0-10.9375 3.4975-20.1 10.63125-27.6375 7.13375-7.5375 15.9475-11.38 26.29875-11.38 10.3525 0 19.165 3.8425 26.3 11.38 7.135 7.5375 10.77125 16.84875 10.77125 27.6375 0 10.9375-3.63625 20.24875-10.77125 27.78625-7.135 7.53875-15.8075 11.2325-26.3 11.2325-10.49125 0-19.165-3.69375-26.29875-11.2325M524.92126 83.663625c3.6375-3.99 5.455-9.015 5.455-15.075 0-6.06-1.8175-11.085-5.455-14.9275-3.63625-3.99125-8.25375-5.91125-13.84875-5.91125-5.59625 0-10.2125 1.92-13.98875 5.91125-3.63625 3.8425-5.45625 8.8675-5.45625 14.9275 0 6.06 1.82 11.085 5.45625 15.075 3.77625 3.8425 8.5325 5.76375 13.98875 5.76375 5.595 0 10.2125-1.92125 13.84875-5.76375m5.455-81.585h18.04625v103.46h-18.04625v-8.72125c-5.315 7.2425-12.87 10.79-22.66125 10.79-9.3725 0-17.485-3.695-24.2-11.23375-6.575-7.5375-9.9325-16.84875-9.9325-27.785 0-10.78875 3.3575-20.10125 9.9325-27.63875 6.715-7.5375 14.8275-11.38 24.2-11.38 9.79125 0 17.34625 3.5475 22.66125 10.78875v-38.28zM611.79626 83.2205c3.63625-3.84375 5.455-8.72125 5.455-14.6325 0-5.91125-1.81875-10.78875-5.455-14.63125-3.6375-3.84375-8.11375-5.76375-13.57-5.76375-5.455 0-9.9325 1.92-13.56875 5.76375-3.49875 3.99-5.31625 8.8675-5.31625 14.63125 0 5.765 1.8175 10.6425 5.31625 14.6325 3.63625 3.8425 8.11375 5.76375 13.56875 5.76375 5.45625 0 9.9325-1.92125 13.57-5.76375m-39.86875 13.15375c-7.135-7.5375-10.63125-16.70125-10.63125-27.78625 0-10.9375 3.49625-20.1 10.63125-27.6375 7.135-7.5375 15.9475-11.38 26.29875-11.38 10.3525 0 19.165 3.8425 26.3 11.38 7.135 7.5375 10.77125 16.84875 10.77125 27.6375 0 10.9375-3.63625 20.24875-10.77125 27.78625-7.135 7.53875-15.8075 11.2325-26.3 11.2325-10.49125 0-19.16375-3.69375-26.29875-11.2325M713.35876 60.163875v45.37375h-18.04625v-43.00875c0-4.8775-1.25875-8.5725-3.77625-11.38-2.37875-2.5125-5.73625-3.84375-10.0725-3.84375-10.2125 0-15.3875 6.06-15.3875 18.3275v39.905h-18.04625v-73.89875h18.04625v8.27625c4.33625-6.94625 11.19-10.345 20.84375-10.345 7.69375 0 13.98875 2.66 18.885 8.12875 5.035 5.46875 7.55375 12.85875 7.55375 22.465" fill="#fff"/></svg> diff --git a/app/javascript/images/logo_transparent.svg b/app/javascript/images/logo_transparent.svg deleted file mode 100644 index abd6d1f67d..0000000000 --- a/app/javascript/images/logo_transparent.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.4144 232.00976"><path d="M107.86523 0C78.203984.2425 49.672422 3.4535937 33.044922 11.089844c0 0-32.97656262 14.752031-32.97656262 65.082031 0 11.525-.224375 25.306175.140625 39.919925 1.19750002 49.22 9.02375002 97.72843 54.53124962 109.77343 20.9825 5.55375 38.99711 6.71547 53.505856 5.91797 26.31125-1.45875 41.08203-9.38867 41.08203-9.38867l-.86914-19.08984s-18.80171 5.92758-39.91796 5.20508c-20.921254-.7175-43.006879-2.25516-46.390629-27.94141-.3125-2.25625-.46875-4.66938-.46875-7.20313 0 0 20.536953 5.0204 46.564449 6.21289 15.915.73001 30.8393-.93343 45.99805-2.74218 29.07-3.47125 54.38125-21.3818 57.5625-37.74805 5.0125-25.78125 4.59961-62.916015 4.59961-62.916015 0-50.33-32.97461-65.082031-32.97461-65.082031C166.80539 3.4535938 138.255.2425 108.59375 0h-.72852zM74.296875 39.326172c12.355 0 21.710234 4.749297 27.896485 14.248047l6.01367 10.080078 6.01563-10.080078c6.185-9.49875 15.54023-14.248047 27.89648-14.248047 10.6775 0 19.28156 3.753672 25.85156 11.076172 6.36875 7.3225 9.53907 17.218828 9.53907 29.673828v60.941408h-24.14454V81.869141c0-12.46875-5.24453-18.798829-15.73828-18.798829-11.6025 0-17.41797 7.508516-17.41797 22.353516v32.375002H96.207031V85.423828c0-14.845-5.815468-22.353515-17.417969-22.353516-10.49375 0-15.740234 6.330079-15.740234 18.798829v59.148439H38.904297V80.076172c0-12.455 3.171016-22.351328 9.541015-29.673828 6.568751-7.3225 15.172813-11.076172 25.851563-11.076172z" fill="#fff"/></svg> \ No newline at end of file diff --git a/app/javascript/images/preview.jpg b/app/javascript/images/preview.jpg deleted file mode 100644 index ec28567484445dd96612b642c4b90df996744d44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292252 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�FIi=YqwF;RZnl$dz=$3MMp;w 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 diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js index b65d056cf7..8a67eae611 100644 --- a/app/javascript/mastodon/features/compose/index.js +++ b/app/javascript/mastodon/features/compose/index.js @@ -12,7 +12,6 @@ import Motion from '../ui/util/optional_motion'; import spring from 'react-motion/lib/spring'; import SearchResultsContainer from './containers/search_results_container'; import { changeComposing } from '../../actions/compose'; -import elephantUIPlane from '../../../images/elephant_ui_plane.svg'; import { mascot } from '../../initial_state'; import Icon from 'mastodon/components/icon'; @@ -107,11 +106,6 @@ class Compose extends React.PureComponent { {!isSearchPage && <div className='drawer__inner' onFocus={this.onFocus}> <NavigationContainer onClose={this.onBlur} /> <ComposeFormContainer /> - {multiColumn && ( - <div className='drawer__inner__mastodon'> - <img alt='' draggable='false' src={mascot || elephantUIPlane} /> - </div> - )} </div>} <Motion defaultStyle={{ x: isSearchPage ? 0 : -100 }} style={{ x: spring(showSearch || isSearchPage ? 0 : -100, { stiffness: 210, damping: 20 }) }}> diff --git a/app/javascript/mastodon/features/introduction/index.js b/app/javascript/mastodon/features/introduction/index.js index 754477bb99..6bc40c3eee 100644 --- a/app/javascript/mastodon/features/introduction/index.js +++ b/app/javascript/mastodon/features/introduction/index.js @@ -8,11 +8,10 @@ import { closeOnboarding } from '../../actions/onboarding'; import screenHello from '../../../images/screen_hello.svg'; import screenFederation from '../../../images/screen_federation.svg'; import screenInteractions from '../../../images/screen_interactions.svg'; -import logoTransparent from '../../../images/logo_transparent.svg'; const FrameWelcome = ({ domain, onNext }) => ( <div className='introduction__frame'> - <div className='introduction__illustration' style={{ background: `url(${logoTransparent}) no-repeat center center / auto 80%` }}> + <div className='introduction__illustration'> <img src={screenHello} alt='' /> </div> diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index d975af397d..532d06ccaa 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2714,7 +2714,6 @@ a.status-card.compact:hover { } &__figure { - background: url('~images/elephant_ui_working.svg') no-repeat center 0; width: 100%; height: 160px; background-size: contain; @@ -2726,10 +2725,6 @@ a.status-card.compact:hover { &.missing-indicator { padding-top: 20px + 48px; - - .regeneration-indicator__figure { - background-image: url('~images/elephant_ui_disappointed.svg'); - } } &__label { diff --git a/app/javascript/styles/mastodon/modal.scss b/app/javascript/styles/mastodon/modal.scss index 10de454c69..2a0d477ac9 100644 --- a/app/javascript/styles/mastodon/modal.scss +++ b/app/javascript/styles/mastodon/modal.scss @@ -15,7 +15,6 @@ > * { flex: 1; max-height: 235px; - background: url('~images/elephant_ui_plane.svg') no-repeat left bottom / contain; } } -- GitLab From a8728445674027f2c1ee7b07c7527e131c4ce67a Mon Sep 17 00:00:00 2001 From: Morgan Bazalgette <the@howl.moe> Date: Sat, 31 Mar 2018 16:31:39 +0200 Subject: [PATCH 170/192] Pleroma theme for mastofe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - resize columns dynamically, with min width of 330↵ - Change colours of mastodon frontend↵ - make avatars circled↵ - add slight hint of rounding on main ui components↵ --- .../glitch/styles/components/status.scss | 2 +- .../flavours/glitch/styles/variables.scss | 20 ++++++++++++------- .../features/compose/components/search.js | 2 +- .../styles/mastodon/components.scss | 12 ++++++++--- app/javascript/styles/mastodon/variables.scss | 14 +++++++++---- 5 files changed, 34 insertions(+), 16 deletions(-) diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss index 65d3ee2251..774f91cf6a 100644 --- a/app/javascript/flavours/glitch/styles/components/status.scss +++ b/app/javascript/flavours/glitch/styles/components/status.scss @@ -32,7 +32,7 @@ } a { - color: $secondary-text-color; + color: $pleroma-links; text-decoration: none; &:hover { diff --git a/app/javascript/flavours/glitch/styles/variables.scss b/app/javascript/flavours/glitch/styles/variables.scss index 1ed1a57787..f817f08c55 100644 --- a/app/javascript/flavours/glitch/styles/variables.scss +++ b/app/javascript/flavours/glitch/styles/variables.scss @@ -8,11 +8,17 @@ $gold-star: #ca8f04; // Dark Goldenrod $red-bookmark: $warning-red; +// Pleroma-Dark colors +$pleroma-bg: #121a24; +$pleroma-fg: #182230; +$pleroma-text: #b9b9ba; +$pleroma-links: #d8a070; + // Values from the classic Mastodon UI -$classic-base-color: #282c37; // Midnight Express -$classic-primary-color: #9baec8; // Echo Blue -$classic-secondary-color: #d9e1e8; // Pattens Blue -$classic-highlight-color: #2b90d9; // Summer Sky +$classic-base-color: $pleroma-bg; +$classic-primary-color: #9baec8; +$classic-secondary-color: #d9e1e8; +$classic-highlight-color: #d8a070; // Variables for defaults in UI $base-shadow-color: $black !default; @@ -51,9 +57,9 @@ $media-modal-media-max-height: 80%; $no-gap-breakpoint: 415px; -$font-sans-serif: 'mastodon-font-sans-serif' !default; -$font-display: 'mastodon-font-display' !default; -$font-monospace: 'mastodon-font-monospace' !default; +$font-sans-serif: sans-serif !default; +$font-display: sans-serif !default; +$font-monospace: monospace !default; // Avatar border size (8% default, 100% for rounded avatars) $ui-avatar-border-size: 8%; diff --git a/app/javascript/mastodon/features/compose/components/search.js b/app/javascript/mastodon/features/compose/components/search.js index 1ab197ac58..8f34df49ac 100644 --- a/app/javascript/mastodon/features/compose/components/search.js +++ b/app/javascript/mastodon/features/compose/components/search.js @@ -21,7 +21,7 @@ class SearchPopout extends React.PureComponent { const { style } = this.props; const extraInformation = searchEnabled ? <FormattedMessage id='search_popout.tips.full_text' defaultMessage='Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.' /> : <FormattedMessage id='search_popout.tips.text' defaultMessage='Simple text returns matching display names, usernames and hashtags' />; return ( - <div style={{ ...style, position: 'absolute', width: 285 }}> + <div style={{ ...style, position: 'absolute', width: 315 }}> <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}> {({ opacity, scaleX, scaleY }) => ( <div className='search-popout' style={{ opacity: opacity, transform: `scale(${scaleX}, ${scaleY})` }}> diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 532d06ccaa..ca644c9c0e 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -669,7 +669,7 @@ } a { - color: $secondary-text-color; + color: $pleroma-links; text-decoration: none; &:hover { @@ -1862,6 +1862,8 @@ a.account__display-name { > .scrollable { background: $ui-base-color; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; } } @@ -1875,7 +1877,7 @@ a.account__display-name { } .drawer { - width: 300px; + width: 330px; box-sizing: border-box; display: flex; flex-direction: column; @@ -1944,7 +1946,7 @@ a.account__display-name { .column, .drawer { - flex: 0 0 auto; + flex: 1 1 auto; padding: 10px; padding-left: 5px; padding-right: 5px; @@ -1989,6 +1991,7 @@ a.account__display-name { overflow-y: auto; width: 100%; height: 100%; + border-radius: 2px; &.darker { background: $ui-base-color; @@ -2025,6 +2028,7 @@ a.account__display-name { margin-bottom: 10px; display: flex; flex-direction: row; + border-radius: 2px; a { transition: background 100ms ease-in; @@ -2775,6 +2779,8 @@ a.status-card.compact:hover { z-index: 2; outline: 0; overflow: hidden; + border-top-left-radius: 2px; + border-top-right-radius: 2px; & > button { margin: 0; diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss index a82c442296..bb07eefb54 100644 --- a/app/javascript/styles/mastodon/variables.scss +++ b/app/javascript/styles/mastodon/variables.scss @@ -6,11 +6,17 @@ $error-red: #df405a !default; // Cerise $warning-red: #ff5050 !default; // Sunset Orange $gold-star: #ca8f04 !default; // Dark Goldenrod +// Pleroma-Dark colors +$pleroma-bg: #121a24; +$pleroma-fg: #182230; +$pleroma-text: #b9b9ba; +$pleroma-links: #d8a070; + // Values from the classic Mastodon UI -$classic-base-color: #282c37; // Midnight Express -$classic-primary-color: #9baec8; // Echo Blue -$classic-secondary-color: #d9e1e8; // Pattens Blue -$classic-highlight-color: #2b90d9; // Summer Sky +$classic-base-color: $pleroma-bg; +$classic-primary-color: #9baec8; +$classic-secondary-color: #d9e1e8; +$classic-highlight-color: #d8a070; // Variables for defaults in UI $base-shadow-color: $black !default; -- GitLab From f8cd770a7e889ac66296492a3f0f47a51db3fa70 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Wed, 4 Jul 2018 15:13:25 +0200 Subject: [PATCH 171/192] Revert: Resize images before upload in web UI to reduce bandwidth Closes: https://git.pleroma.social/pleroma/mastofe/issues/22 (Can also fix an issue with canvas and the Tor Browser) --- .../flavours/glitch/actions/compose.js | 50 +++++++++++++------ app/javascript/mastodon/actions/compose.js | 33 ++++++------ 2 files changed, 53 insertions(+), 30 deletions(-) diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index a24316da21..54216383ad 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -5,7 +5,6 @@ import { search as emojiSearch } from 'flavours/glitch/util/emoji/emoji_mart_sea import { useEmoji } from './emojis'; import { tagHistory } from 'flavours/glitch/util/settings'; import { recoverHashtags } from 'flavours/glitch/util/hashtag'; -import resizeImage from 'flavours/glitch/util/resize_image'; import { updateTimeline } from './timelines'; import { showAlertForError } from './alerts'; @@ -219,21 +218,42 @@ export function uploadCompose(files) { } dispatch(uploadComposeRequest()); - for (const [i, f] of Array.from(files).entries()) { - if (media.size + i > 3) break; - - resizeImage(f).then(file => { - const data = new FormData(); - data.append('file', file); - - return api(getState).post('/api/v1/media', data, { - onUploadProgress: function({ loaded }){ - progress[i] = loaded; - dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); - }, - }).then(({ data }) => dispatch(uploadComposeSuccess(data))); - }).catch(error => dispatch(uploadComposeFail(error))); + for (const [i, file] of Array.from(files).entries()) { + // Looks useless or should reuse uploadLimit + // if (media.size + i > 3) break; + + const data = new FormData(); + data.append('file', file); + + api(getState).post('/api/v1/media', data, { + onUploadProgress: function({ loaded }){ + progress[i] = loaded; + dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); + }, + }).then(function (response) { + dispatch(uploadComposeSuccess(response.data)); + }).catch(function (error) { + dispatch(uploadComposeFail(error)); + }); }; + + /* + * Previous pre-multiple upload code + * + * a372436a8... Revert: Resize images before upload in web UI to reduce bandwidth + * + * let data = new FormData(); + * data.append('file', files[0]); + * api(getState).post('/api/v1/media', data, { + * onUploadProgress: function (e) { + * dispatch(uploadComposeProgress(e.loaded, e.total)); + * }, + * }).then(function (response) { + * dispatch(uploadComposeSuccess(response.data)); + * }).catch(function (error) { + * dispatch(uploadComposeFail(error)); + * }); + */ }; }; diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 0be2a5cd46..07462db8e4 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -4,7 +4,6 @@ import { throttle } from 'lodash'; import { search as emojiSearch } from '../features/emoji/emoji_mart_search_light'; import { tagHistory } from '../settings'; import { useEmoji } from './emojis'; -import resizeImage from '../utils/resize_image'; import { importFetchedAccounts } from './importer'; import { updateTimeline } from './timelines'; import { showAlertForError } from './alerts'; @@ -201,20 +200,24 @@ export function uploadCompose(files) { } dispatch(uploadComposeRequest()); - for (const [i, f] of Array.from(files).entries()) { - if (media.size + i > 3) break; - - resizeImage(f).then(file => { - const data = new FormData(); - data.append('file', file); - - return api(getState).post('/api/v1/media', data, { - onUploadProgress: function({ loaded }){ - progress[i] = loaded; - dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); - }, - }).then(({ data }) => dispatch(uploadComposeSuccess(data))); - }).catch(error => dispatch(uploadComposeFail(error))); + for (const [i, file] of Array.from(files).entries()) { + // Looks useless or should reuse uploadLimit + // if (media.size + i > 3) break; + + let data = new FormData(); + data.append('file', file); + + api(getState).post('/api/v1/media', data, { + onUploadProgress: function(e) { + // progress[i] = loaded; + // dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); + dispatch(uploadComposeProgress(e.loaded, e.total)); + }, + }).then(function (response) { + dispatch(uploadComposeSuccess(response.data)); + }).catch(function (error) { + dispatch(uploadComposeFail(error)); + }); }; }; }; -- GitLab From 9fab20c069f0271f5f3940609dadc463e3d723c8 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Sun, 12 Aug 2018 18:06:18 +0200 Subject: [PATCH 172/192] config/webpack/production.js: Remove caching in OfflinePlugin (introduced in 0692991b5) --- config/webpack/production.js | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/config/webpack/production.js b/config/webpack/production.js index 0e9aa0c1c0..1539dae71f 100644 --- a/config/webpack/production.js +++ b/config/webpack/production.js @@ -58,36 +58,7 @@ module.exports = merge(sharedConfig, { plugins: [ new OfflinePlugin({ publicPath: publicPath, // sw.js must be served from the root to avoid scope issues - caches: { - main: [':rest:'], - additional: [':externals:'], - optional: [ - '**/locale_*.js', // don't fetch every locale; the user only needs one - '**/*_polyfills-*.js', // the user may not need polyfills - '**/*.woff2', // the user may have system-fonts enabled - // images/audio can be cached on-demand - '**/*.png', - '**/*.jpg', - '**/*.jpeg', - '**/*.svg', - '**/*.mp3', - '**/*.ogg', - ], - }, - externals: [ - '/emoji/1f602.svg', // used for emoji picker dropdown - '/emoji/sheet_10.png', // used in emoji-mart - ], - excludes: [ - '**/*.map', - 'stats.json', - 'report.html', - // any browser that supports ServiceWorker will support woff2 - '**/*.eot', - '**/*.ttf', - '**/*-webfont-*.svg', - '**/*.woff', - ], + caches: {}, ServiceWorker: { entry: `imports-loader?ATTACHMENT_HOST=>${encodeURIComponent(JSON.stringify(attachmentHost))}!${encodeURI(path.join(__dirname, '../../app/javascript/mastodon/service_worker/entry.js'))}`, cacheName: 'mastodon', -- GitLab From 10df6a5aa1197ab7d4c5be4941b394ce0d48b096 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Mon, 13 Aug 2018 18:21:51 +0200 Subject: [PATCH 173/192] Change pleroma config endpoint from static to api-based --- app/javascript/mastodon/actions/pleroma.js | 2 +- app/javascript/mastodon/reducers/pleroma.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/actions/pleroma.js b/app/javascript/mastodon/actions/pleroma.js index 7b879acb4b..a4ab8cd801 100644 --- a/app/javascript/mastodon/actions/pleroma.js +++ b/app/javascript/mastodon/actions/pleroma.js @@ -38,7 +38,7 @@ export function fetchPleromaConfig() { return (dispatch, getState) => { dispatch(fetchPleromaConfigRequest()); - api(getState).get('/static/config.json').then(response => { + api(getState).get('/api/statusnet/config.json').then(response => { dispatch(fetchPleromaConfigSuccess(response.data)); }).catch(error => { dispatch(fetchPleromaConfigFail(error)); diff --git a/app/javascript/mastodon/reducers/pleroma.js b/app/javascript/mastodon/reducers/pleroma.js index 4cbf59b0bc..2cd5a1a4aa 100644 --- a/app/javascript/mastodon/reducers/pleroma.js +++ b/app/javascript/mastodon/reducers/pleroma.js @@ -11,7 +11,7 @@ export function custom_panel(state = initialPanel, action) { case PANEL_FETCH_SUCCESS: return state.set('panel', action.panel); break; case PLEROMA_CONFIG_FETCH_SUCCESS: - return state.set('enabled', (action.config || {}).showInstanceSpecificPanel || false); + return state.set('enabled', (action.config || {}).site.pleromafe.showInstanceSpecificPanel || false); } return state; -- GitLab From 025762cde3f986f88b53935803695acfd8850080 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Fri, 14 Sep 2018 03:40:16 +0200 Subject: [PATCH 174/192] [glitch-port] initial_state.js: consistent max_toot_chars --- app/javascript/flavours/glitch/util/initial_state.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/util/initial_state.js b/app/javascript/flavours/glitch/util/initial_state.js index c34a818ff2..90a6dbed62 100644 --- a/app/javascript/flavours/glitch/util/initial_state.js +++ b/app/javascript/flavours/glitch/util/initial_state.js @@ -22,10 +22,13 @@ export const favouriteModal = getMeta('favourite_modal'); export const deleteModal = getMeta('delete_modal'); export const me = getMeta('me'); export const searchEnabled = getMeta('search_enabled'); -export const maxChars = (initialState && initialState.max_toot_chars) || 500; +export const maxChars = getMeta('max_toot_chars') || 500; +//@TODO: Look if possible to reuse for AdminAPI export const invitesEnabled = getMeta('invites_enabled'); +//Should it be set to something? export const version = getMeta('version'); export const mascot = getMeta('mascot'); +//@TODO: Look if possible to reuse for AdminAPI export const isStaff = getMeta('is_staff'); export const deleteOthersNotice = getRight('delete_others_notice'); -- GitLab From 859f855b5f2116a09a39a74dd01b97a1b0c399c1 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Thu, 22 Nov 2018 07:51:34 +0100 Subject: [PATCH 175/192] flavours/glitch/util/backend_links.js: Initial Configuration --- app/javascript/flavours/glitch/util/backend_links.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/javascript/flavours/glitch/util/backend_links.js b/app/javascript/flavours/glitch/util/backend_links.js index 4fc03f9190..07b3951ea9 100644 --- a/app/javascript/flavours/glitch/util/backend_links.js +++ b/app/javascript/flavours/glitch/util/backend_links.js @@ -1,6 +1,6 @@ -export const preferencesLink = '/settings/preferences'; -export const profileLink = '/settings/profile'; +export const preferencesLink = '/settings'; +export const profileLink = '/user-settings'; export const signOutLink = '/auth/sign_out'; export const termsLink = '/terms'; -export const accountAdminLink = (id) => `/admin/accounts/${id}`; -export const statusAdminLink = (account_id, status_id) => `/admin/accounts/${account_id}/statuses/${status_id}`; +export const accountAdminLink = undefined; // = (id) => `/admin/accounts/${id}`; +export const statusAdminLink = undefined; // = (account_id, status_id) => `/admin/accounts/${account_id}/statuses/${status_id}`; -- GitLab From 2e941b80aab0fdb96d83025fd16403e06470a47a Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Fri, 1 Feb 2019 23:21:04 +0100 Subject: [PATCH 176/192] flavours/glitch/components/error_boundary: Add switching to pleroma-fe --- .../flavours/glitch/components/error_boundary.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/components/error_boundary.js b/app/javascript/flavours/glitch/components/error_boundary.js index 142a0c21a1..d84bd857aa 100644 --- a/app/javascript/flavours/glitch/components/error_boundary.js +++ b/app/javascript/flavours/glitch/components/error_boundary.js @@ -55,7 +55,7 @@ export default class ErrorBoundary extends React.PureComponent { <FormattedMessage id='web_app_crash.report_issue' defaultMessage='Report a bug in the {issuetracker}' - values={{ issuetracker: <a href='https://github.com/glitch-soc/mastodon/issues' rel='noopener' target='_blank'><FormattedMessage id='web_app_crash.issue_tracker' defaultMessage='issue tracker' /></a> }} + values={{ issuetracker: <a href='https://git.pleroma.social/pleroma/mastofe/issues' rel='noopener' target='_blank'><FormattedMessage id='web_app_crash.issue_tracker' defaultMessage='issue tracker' /></a> }} /> { debugInfo !== '' && ( <details> @@ -85,6 +85,13 @@ export default class ErrorBoundary extends React.PureComponent { /> </li> )} + <li> + <FormattedMessage + id='web_app_crash.load_pleromafe' + defaultMessage='Load {pleromafe} instead of mastofe' + values={{ pleromafe: <a href='/main/all'><FormattedMessage id='web_app_crash.pleromafe' defaultMessage='Pleroma Frontend' /></a> }} + /> + </li> </ul> </p> </div> -- GitLab From 83328a7cb1ab00cbb965a8e2a69d5700c13574d0 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Fri, 1 Feb 2019 23:34:57 +0100 Subject: [PATCH 177/192] README.md: Update notes --- README.md | 53 +++++++++++------------------------------------------ 1 file changed, 11 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index f22b062f40..0da87f1f91 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ -# Glitch-fe: glitch-soc frontend for pleroma +# Mastodon Frontend, Glitch-soc + Pleroma Edition -Here is a fork of mastodon. We could really just remove all of the code except -for the frontend, but to easily pull the upstream repo we'll just keep -everything. This is my fork for the moment with the idea of making the mastofe -just as polished as the pleromafe. If you want to get access, open an issue or -hit me up at howl@social.zxq.co. +Here is a distribution of the glitch-soc frontend for pleroma. Everything from the upstream repository is kept and rebased on for easy updates, this does screws up on Merge Requests so they’ll be treated as a patchset if done here. # Deployement @@ -16,39 +12,13 @@ This is what you want to do to update the mastofe bundled with pleroma. - ``git commit -m "update mastofe"`` # Development - -I use a combination of the pleroma backend + yarn + nginx to do local -development. I refuse to install Ruby. Here's how to get it running on your own -machine: - -## Install yarn - -Yarn will be needed to set up the mastodon frontend for development. Check out -https://yarnpkg.com/lang/en/docs/install/ . For Debian, it's like this: - -```sh -# import yarn pub key and repo -curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - -echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list -sudo apt-get update -sudo apt-get install yarn -``` - -## Mastodon Frontend Setup - -```sh -# Install dependencies -yarn install -D -npm run dev -# check that http://localhost:3035/packs/common.css works in your browser once -# webpack is done compiling. if css shows up, then it should have worked! -``` +## Tools +- Node.js +- yarn (preferred) or npm +- HTTP proxy (such as nginx) ## nginx setup - -I'll assume that you have already fired up pleroma using the installation guide. -To work on the frontend while still having the backend up, use this nginx -config. +I'll assume that you have already fired up pleroma using the installation guide. To work on the frontend while still having the backend up, use this nginx config. ``` server { @@ -75,9 +45,8 @@ server { } ``` -Change the `server_name` if you like. I personally like to create a new entry -in /etc/hosts and add `127.0.0.1 pleroma.testing`, but you do what suits you. +Change the `server_name` if you like. I personally like to create a new entry in /etc/hosts and add `127.0.0.1 pleroma.testing`, but you do what suits you. -If you have enough luck, navigating to your \<server\_name\>/web should show -you the mastodon frontend, and should also work with all the nice things of -webpack such as hot reloading. Have fun! +## Running +- Getting the node dependencies is done with `yarn install -D` (or `npm install` if you don’t have yarn) +- Launching the frontend is done with `npm run dev`. It should be reachable once it finnishes compiling. -- GitLab From 8e3718cf85c92bc9f35a18dc1f60a13e0aedab3f Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Sun, 3 Feb 2019 11:30:46 +0100 Subject: [PATCH 178/192] mastodon/features/getting_started/index.js: Warn against support of vanilla --- app/javascript/mastodon/features/getting_started/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js index c05e5cb110..02a4e673e1 100644 --- a/app/javascript/mastodon/features/getting_started/index.js +++ b/app/javascript/mastodon/features/getting_started/index.js @@ -204,6 +204,10 @@ class GettingStarted extends ImmutablePureComponent { pleroma: <a href='https://pleroma.social' rel='noopener' target='_blank'>Pleroma</a>, }} /> + <FormattedMessage + id='getting_started.vanilla_support_warning' + defaultMessage='Please be warned that the vanilla flavour isn’t as supported as the glitch one, expect bugs related to the API' + /> </p> </div> </div> -- GitLab From 9f515e806488242f344140a893f2ff78d3541221 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Sun, 3 Feb 2019 13:54:34 +0100 Subject: [PATCH 179/192] Getting-Started: Add button to switch between the two flavours --- .../features/getting_started_misc/index.js | 8 ++++ app/javascript/mastodon/actions/pleroma.js | 40 +++++++++++++++++++ .../features/getting_started/index.js | 12 +++++- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/app/javascript/flavours/glitch/features/getting_started_misc/index.js b/app/javascript/flavours/glitch/features/getting_started_misc/index.js index ee4452472f..d5db4c9ea8 100644 --- a/app/javascript/flavours/glitch/features/getting_started_misc/index.js +++ b/app/javascript/flavours/glitch/features/getting_started_misc/index.js @@ -8,6 +8,7 @@ import ColumnLink from 'flavours/glitch/features/ui/components/column_link'; import ColumnSubheading from 'flavours/glitch/features/ui/components/column_subheading'; import { openModal } from 'flavours/glitch/actions/modal'; import { connect } from 'react-redux'; +import { switchFlavour } from 'mastodon/actions/pleroma'; const messages = defineMessages({ heading: { id: 'column.heading', defaultMessage: 'Misc' }, @@ -22,6 +23,7 @@ const messages = defineMessages({ info: { id: 'navigation_bar.info', defaultMessage: 'Extended information' }, keyboard_shortcuts: { id: 'navigation_bar.keyboard_shortcuts', defaultMessage: 'Keyboard shortcuts' }, featured_users: { id: 'navigation_bar.featured_users', defaultMessage: 'Featured users' }, + switch_to_vanilla: { id: 'navigation_bar.switch_to_vanilla', defaultMessage: 'Switch to Vanilla Flavour' }, }); @connect() @@ -31,6 +33,7 @@ export default class gettingStartedMisc extends ImmutablePureComponent { static propTypes = { intl: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, + switchFlavour: PropTypes.func.isRequired, }; openOnboardingModal = (e) => { @@ -41,6 +44,10 @@ export default class gettingStartedMisc extends ImmutablePureComponent { this.props.dispatch(openModal('PINNED_ACCOUNTS_EDITOR')); } + switch_flavour_vanilla = (e) => { + this.props.dispatch(switchFlavour('vanilla')); + } + render () { const { intl } = this.props; @@ -61,6 +68,7 @@ export default class gettingStartedMisc extends ImmutablePureComponent { <ColumnLink key='{i++}' icon='question' text={intl.formatMessage(messages.keyboard_shortcuts)} to='/keyboard-shortcuts' /> <ColumnLink key='{i++}' icon='book' text={intl.formatMessage(messages.info)} href='/about/more' /> <ColumnLink key='{i++}' icon='hand-o-right' text={intl.formatMessage(messages.show_me_around)} onClick={this.openOnboardingModal} /> + <ColumnLink key='{i++}' icon='exchange' text={intl.formatMessage(messages.switch_to_vanilla)} onClick={this.switch_flavour_vanilla} /> </div> </Column> ); diff --git a/app/javascript/mastodon/actions/pleroma.js b/app/javascript/mastodon/actions/pleroma.js index a4ab8cd801..d64fe52c47 100644 --- a/app/javascript/mastodon/actions/pleroma.js +++ b/app/javascript/mastodon/actions/pleroma.js @@ -3,6 +3,9 @@ import api from '../api'; export const TOS_FETCH_REQUEST = 'TOS_FETCH_REQUEST'; export const TOS_FETCH_SUCCESS = 'TOS_FETCH_SUCCESS'; export const TOS_FETCH_FAIL = 'TOS_FETCH_FAIL'; +export const FLAVOUR_SWITCH_REQUEST = 'FLAVOUR_SWITCH_REQUEST'; +export const FLAVOUR_SWITCH_SUCCESS = 'FLAVOUR_SWITCH_SUCCESS'; +export const FLAVOUR_SWITCH_FAIL = 'FLAVOUR_SWITCH_FAIL'; export const PANEL_FETCH_REQUEST = 'PANEL_FETCH_REQUEST'; export const PANEL_FETCH_SUCCESS = 'PANEL_FETCH_SUCCESS'; export const PANEL_FETCH_FAIL = 'PANEL_FETCH_FAIL'; @@ -10,6 +13,22 @@ export const PLEROMA_CONFIG_FETCH_REQUEST = 'PLEROMA_CONFIG_FETCH_REQUEST'; export const PLEROMA_CONFIG_FETCH_SUCCESS = 'PLEROMA_CONFIG_FETCH_SUCCESS'; export const PLEROMA_CONFIG_FETCH_FAIL = 'PLEROMA_CONFIG_FETCH_FAIL'; +export function switchFlavour(flavour) { + return (dispatch, getState) => { + dispatch(switchFlavourRequest()); + if(flavour === undefined) { + flavour = 'glitch'; + } + + api(getState).post('/api/v1/pleroma/flavour/'+flavour).then(response => { + dispatch(switchFlavourSuccess(response.data)); + location.href = '/web/getting-started'; + }).catch(error => { + dispatch(switchFlavourFail(error)); + }); + }; +}; + export function fetchTOS() { return (dispatch, getState) => { dispatch(fetchTOSRequest()); @@ -66,6 +85,27 @@ export function fetchTOSFail(error) { }; }; +export function switchFlavourRequest() { + return { + type: FLAVOUR_SWITCH_REQUEST, + }; +}; + +export function switchFlavourSuccess(tos) { + return { + type: FLAVOUR_SWITCH_SUCCESS, + tos, + }; +}; + +export function switchFlavourFail(error) { + return { + type: FLAVOUR_SWITCH_FAIL, + error, + }; +}; + + export function fetchPanelRequest() { return { type: PANEL_FETCH_REQUEST, diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js index 02a4e673e1..3676dd60da 100644 --- a/app/javascript/mastodon/features/getting_started/index.js +++ b/app/javascript/mastodon/features/getting_started/index.js @@ -9,7 +9,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { me, invitesEnabled, profile_directory } from '../../initial_state'; import { fetchFollowRequests } from '../../actions/accounts'; -import { fetchPanel, fetchPleromaConfig } from 'mastodon/actions/pleroma'; +import { fetchPanel, fetchPleromaConfig, switchFlavour } from 'mastodon/actions/pleroma'; import { List as ImmutableList } from 'immutable'; import { Link } from 'react-router-dom'; import NavigationBar from '../compose/components/navigation_bar'; @@ -35,6 +35,7 @@ const messages = defineMessages({ security: { id: 'navigation_bar.security', defaultMessage: 'Security' }, menu: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, profile_directory: { id: 'getting_started.directory', defaultMessage: 'Profile directory' }, + switch_to_glitch: { id: 'navigation_bar.switch_to_glitch', defaultMessage: 'Switch to Glitch Flavour' }, }); const mapStateToProps = state => ({ @@ -48,6 +49,7 @@ const mapDispatchToProps = dispatch => ({ fetchFollowRequests: () => dispatch(fetchFollowRequests()), fetchPanel: () => dispatch(fetchPanel()), fetchPleromaConfig: () => dispatch(fetchPleromaConfig()), + switchFlavour: () => dispatch(switchFlavour()), }); const badgeDisplay = (number, limit) => { @@ -72,12 +74,17 @@ class GettingStarted extends ImmutablePureComponent { fetchFollowRequests: PropTypes.func.isRequired, fetchPanel: PropTypes.func.isRequired, fetchPleromaConfig: PropTypes.func.isRequired, + switchFlavour: PropTypes.func.isRequired, unreadFollowRequests: PropTypes.number, unreadNotifications: PropTypes.number, customPanelEnabled: PropTypes.bool, customPanel: PropTypes.string.isRequired, }; + switch_flavour_glitch = (e) => { + this.props.switchFlavour('glitch'); + } + componentDidMount () { const { myAccount, fetchFollowRequests, fetchPleromaConfig, fetchPanel } = this.props; @@ -129,7 +136,8 @@ class GettingStarted extends ImmutablePureComponent { navItems.push( <ColumnLink key={i++} icon='envelope' text={intl.formatMessage(messages.direct)} to='/timelines/direct' />, <ColumnLink key={i++} icon='star' text={intl.formatMessage(messages.favourites)} to='/favourites' />, - <ColumnLink key={i++} icon='list-ul' text={intl.formatMessage(messages.lists)} to='/lists' /> + <ColumnLink key={i++} icon='list-ul' text={intl.formatMessage(messages.lists)} to='/lists' />, + <a key={i++} href='#' onClick={this.switch_flavour_glitch} className='column-link' tabIndex='0'><i className={`fa fa-fw fa-exchange column-link__icon`} />{intl.formatMessage(messages.switch_to_glitch)}</a> ); height += 48*3; -- GitLab From 210a7a578a78210e54fe12d22a10a33197ddefea Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Sun, 10 Feb 2019 19:28:33 +0100 Subject: [PATCH 180/192] README.md: Add notes on branches --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 0da87f1f91..99fb403947 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,11 @@ This is what you want to do to update the mastofe bundled with pleroma. - ``git commit -m "update mastofe"`` # Development +## Branches +- `pleroma` branch which merges from `rebase/glitch-soc` once it is stable +- `rebase/glitch-soc`: branch which rebases from upstream, used for testing +- Development branches are targeting `rebase/glitch-soc` and thus can need a frequent rebase + ## Tools - Node.js - yarn (preferred) or npm -- GitLab From cdf95800dba536a2094b46ed61935d378cab1242 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Thu, 21 Feb 2019 21:52:48 +0100 Subject: [PATCH 181/192] flavours/glitch/reducers/compose.js: Fix toLowerCase TypeError [Error] TypeError: e.toLowerCase is not a function. (In 'e.toLowerCase()', 'e.toLowerCase' is undefined) Some added context: https://queer.hacktivis.me/notice/9g4OfhpIWQLNoZ3mLI --- app/javascript/flavours/glitch/reducers/compose.js | 2 +- app/javascript/mastodon/reducers/compose.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js index 7281cbd61e..0695002538 100644 --- a/app/javascript/flavours/glitch/reducers/compose.js +++ b/app/javascript/flavours/glitch/reducers/compose.js @@ -216,7 +216,7 @@ const updateSuggestionTags = (state, token) => { return state.merge({ suggestions: state.get('tagHistory') - .filter(tag => tag.toLowerCase().startsWith(prefix.toLowerCase())) + .filter(tag => tag && tag.toLowerCase().startsWith(prefix.toLowerCase())) .slice(0, 4) .map(tag => '#' + tag), suggestion_token: token, diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index 1622871b8f..42344c5986 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -133,7 +133,7 @@ const updateSuggestionTags = (state, token) => { return state.merge({ suggestions: state.get('tagHistory') - .filter(tag => tag.toLowerCase().startsWith(prefix.toLowerCase())) + .filter(tag => tag && tag.toLowerCase().startsWith(prefix.toLowerCase())) .slice(0, 4) .map(tag => '#' + tag), suggestion_token: token, -- GitLab From b0fc8b087691da38b1f46333551838e0fa48c51d Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Fri, 1 Mar 2019 05:43:01 +0100 Subject: [PATCH 182/192] build.sh: Do not override TARGET Related: https://git.pleroma.social/pleroma/mastofe/issues/55 --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 9a218c3a2e..27a92cc2b5 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,5 @@ #!/bin/sh -TARGET="../pleroma" # Where pleroma’s repository is sitting +TARGET="${TARGET:-../pleroma}" # Where pleroma’s repository is sitting yarn install -D -- GitLab From dd6198088a7f2a0b9d3e64aba3d74e2c12163600 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Fri, 1 Mar 2019 05:51:13 +0100 Subject: [PATCH 183/192] =?UTF-8?q?build.sh:=20Error=20out=20when=20TARGET?= =?UTF-8?q?=20isn=E2=80=99t=20a=20pleroma=20repository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes: https://git.pleroma.social/pleroma/mastofe/issues/55 --- build.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build.sh b/build.sh index 27a92cc2b5..52c0e0165d 100755 --- a/build.sh +++ b/build.sh @@ -1,6 +1,13 @@ #!/bin/sh TARGET="${TARGET:-../pleroma}" # Where pleroma’s repository is sitting +if [[ ! -d "${TARGET}/priv/static" ]] +then + echo "Error: ${TARGET}/priv/static directory is missing, are you sure TARGET is set to a pleroma repository?" + echo "Info: TARGET=${TARGET}" + exit 1 +fi + yarn install -D rm -rf public/packs public/assets -- GitLab From a8d713dc3d064527608bb191b2e462324d797504 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Fri, 1 Mar 2019 10:11:56 +0100 Subject: [PATCH 184/192] README.md: Add `master` branch usage, try a cleaner way to do MRs --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 99fb403947..4a2ca60ae8 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,12 @@ This is what you want to do to update the mastofe bundled with pleroma. # Development ## Branches - `pleroma` branch which merges from `rebase/glitch-soc` once it is stable +- `master`: Same branch as upstream repository - `rebase/glitch-soc`: branch which rebases from upstream, used for testing -- Development branches are targeting `rebase/glitch-soc` and thus can need a frequent rebase + +For developement/Merge Requests I would suggest to use `master` when you are introducing new modifications that cannot be in the upstream, and when you are changing current modifications prefer `rebase/glitch-soc`. + +Never use `pleroma` as a base for Merge Requests, it is not meant to be modified directly. ## Tools - Node.js -- GitLab From 640c456fdf982eab8f566795f7c9a1ae7a8d024d Mon Sep 17 00:00:00 2001 From: KokaKiwi <kokakiwi@kokakiwi.net> Date: Sun, 17 Feb 2019 23:53:51 +0100 Subject: [PATCH 185/192] Add status content type dropdown to compose box. --- .../flavours/glitch/actions/compose.js | 9 ++++ .../glitch/features/composer/index.js | 11 ++++ .../glitch/features/composer/options/index.js | 51 +++++++++++++++++++ .../flavours/glitch/reducers/compose.js | 6 +++ 4 files changed, 77 insertions(+) diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index 54216383ad..a7ef6860ef 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -45,6 +45,7 @@ export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE'; export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE'; export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE'; export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE'; +export const COMPOSE_CONTENT_TYPE_CHANGE = 'COMPOSE_CONTENT_TYPE_CHANGE'; export const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT'; @@ -132,6 +133,7 @@ export function submitCompose(routerHistory) { } api(getState).post('/api/v1/statuses', { status, + content_type: getState().getIn(['compose', 'content_type']), in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null), media_ids: media.map(item => item.get('id')), sensitive: getState().getIn(['compose', 'sensitive']) || (spoilerText.length > 0 && media.size !== 0), @@ -510,6 +512,13 @@ export function changeComposeVisibility(value) { }; }; +export function changeComposeContentType(value) { + return { + type: COMPOSE_CONTENT_TYPE_CHANGE, + value, + }; +}; + export function insertEmojiCompose(position, emoji) { return { type: COMPOSE_EMOJI_INSERT, diff --git a/app/javascript/flavours/glitch/features/composer/index.js b/app/javascript/flavours/glitch/features/composer/index.js index ec0e405a47..d81ef385c2 100644 --- a/app/javascript/flavours/glitch/features/composer/index.js +++ b/app/javascript/flavours/glitch/features/composer/index.js @@ -15,6 +15,7 @@ import { changeComposeSpoilerText, changeComposeSpoilerness, changeComposeVisibility, + changeComposeContentType, changeUploadCompose, clearComposeSuggestions, fetchComposeSuggestions, @@ -88,6 +89,7 @@ function mapStateToProps (state) { media: state.getIn(['compose', 'media_attachments']), preselectDate: state.getIn(['compose', 'preselectDate']), privacy: state.getIn(['compose', 'privacy']), + contentType: state.getIn(['compose', 'content_type']), progress: state.getIn(['compose', 'progress']), inReplyTo: inReplyTo ? state.getIn(['statuses', inReplyTo]) : null, replyAccount: inReplyTo ? state.getIn(['statuses', inReplyTo, 'account']) : null, @@ -116,6 +118,9 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ onChangeAdvancedOption(option, value) { dispatch(changeComposeAdvancedOption(option, value)); }, + onChangeContentType(value) { + dispatch(changeComposeContentType(value)); + }, onChangeDescription(id, description) { dispatch(changeUploadCompose(id, { description })); }, @@ -388,6 +393,7 @@ class Composer extends React.Component { advancedOptions, amUnlocked, anyMedia, + contentType, intl, isSubmitting, isChangingUpload, @@ -396,6 +402,7 @@ class Composer extends React.Component { media, onCancelReply, onChangeAdvancedOption, + onChangeContentType, onChangeDescription, onChangeSensitivity, onChangeSpoilerness, @@ -478,6 +485,7 @@ class Composer extends React.Component { <ComposerOptions acceptContentTypes={acceptContentTypes} advancedOptions={advancedOptions} + contentType={contentType} disabled={isSubmitting} full={media ? media.size >= 4 || media.some( item => item.get('type') === 'video' @@ -485,6 +493,7 @@ class Composer extends React.Component { hasMedia={media && !!media.size} intl={intl} onChangeAdvancedOption={onChangeAdvancedOption} + onChangeContentType={onChangeContentType} onChangeSensitivity={onChangeSensitivity} onChangeVisibility={onChangeVisibility} onDoodleOpen={onOpenDoodleModal} @@ -529,6 +538,7 @@ Composer.propTypes = { media: ImmutablePropTypes.list, preselectDate: PropTypes.instanceOf(Date), privacy: PropTypes.string, + contentType: PropTypes.string, progress: PropTypes.number, inReplyTo: ImmutablePropTypes.map, resetFileKey: PropTypes.number, @@ -548,6 +558,7 @@ Composer.propTypes = { // Dispatch props. onCancelReply: PropTypes.func, onChangeAdvancedOption: PropTypes.func, + onChangeContentType: PropTypes.func, onChangeDescription: PropTypes.func, onChangeSensitivity: PropTypes.func, onChangeSpoilerText: PropTypes.func, diff --git a/app/javascript/flavours/glitch/features/composer/options/index.js b/app/javascript/flavours/glitch/features/composer/options/index.js index 5b4a7444c0..8e18f38bbb 100644 --- a/app/javascript/flavours/glitch/features/composer/options/index.js +++ b/app/javascript/flavours/glitch/features/composer/options/index.js @@ -34,6 +34,10 @@ const messages = defineMessages({ defaultMessage: 'Adjust status privacy', id: 'privacy.change', }, + content_type: { + defaultMessage: 'Content type', + id: 'content-type.change', + }, direct_long: { defaultMessage: 'Post to mentioned users only', id: 'privacy.direct.long', @@ -46,6 +50,10 @@ const messages = defineMessages({ defaultMessage: 'Draw something', id: 'compose.attach.doodle', }, + html: { + defaultMessage: 'HTML', + id: 'compose.content-type.html', + }, local_only_long: { defaultMessage: 'Do not post to other instances', id: 'advanced_options.local-only.long', @@ -54,6 +62,14 @@ const messages = defineMessages({ defaultMessage: 'Local-only', id: 'advanced_options.local-only.short', }, + markdown: { + defaultMessage: 'Markdown', + id: 'compose.content-type.markdown', + }, + plain: { + defaultMessage: 'Plain text', + id: 'compose.content-type.plain', + }, private_long: { defaultMessage: 'Post to followers only', id: 'privacy.private.long', @@ -159,6 +175,7 @@ export default class ComposerOptions extends React.PureComponent { const { acceptContentTypes, advancedOptions, + contentType, disabled, full, hasMedia, @@ -166,6 +183,7 @@ export default class ComposerOptions extends React.PureComponent { onChangeAdvancedOption, onChangeSensitivity, onChangeVisibility, + onChangeContentType, onModalClose, onModalOpen, onToggleSpoiler, @@ -204,6 +222,24 @@ export default class ComposerOptions extends React.PureComponent { }, }; + const contentTypeItems = { + plain: { + icon: 'file', + name: 'text/plain', + text: <FormattedMessage {...messages.plain} />, + }, + html: { + icon: 'file-text', + name: 'text/html', + text: <FormattedMessage {...messages.html} />, + }, + markdown: { + icon: 'file-text', + name: 'text/markdown', + text: <FormattedMessage {...messages.markdown} />, + }, + }; + // The result. return ( <div className='composer--options'> @@ -286,6 +322,19 @@ export default class ComposerOptions extends React.PureComponent { title={intl.formatMessage(messages.change_privacy)} value={privacy} /> + <Dropdown + icon="code" + items={[ + contentTypeItems.plain, + contentTypeItems.html, + contentTypeItems.markdown, + ]} + onChange={onChangeContentType} + onModalClose={onModalClose} + onModalOpen={onModalOpen} + title={intl.formatMessage(messages.content_type)} + value={contentType} + /> {onToggleSpoiler && ( <TextIconButton active={spoiler} @@ -328,6 +377,7 @@ export default class ComposerOptions extends React.PureComponent { ComposerOptions.propTypes = { acceptContentTypes: PropTypes.string, advancedOptions: ImmutablePropTypes.map, + contentType: PropTypes.string, disabled: PropTypes.bool, full: PropTypes.bool, hasMedia: PropTypes.bool, @@ -335,6 +385,7 @@ ComposerOptions.propTypes = { onChangeAdvancedOption: PropTypes.func, onChangeSensitivity: PropTypes.func, onChangeVisibility: PropTypes.func, + onChangeContentType: PropTypes.func, onDoodleOpen: PropTypes.func, onModalClose: PropTypes.func, onModalOpen: PropTypes.func, diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js index 0695002538..4cb9c121e8 100644 --- a/app/javascript/flavours/glitch/reducers/compose.js +++ b/app/javascript/flavours/glitch/reducers/compose.js @@ -25,6 +25,7 @@ import { COMPOSE_SPOILERNESS_CHANGE, COMPOSE_SPOILER_TEXT_CHANGE, COMPOSE_VISIBILITY_CHANGE, + COMPOSE_CONTENT_TYPE_CHANGE, COMPOSE_EMOJI_INSERT, COMPOSE_UPLOAD_CHANGE_REQUEST, COMPOSE_UPLOAD_CHANGE_SUCCESS, @@ -60,6 +61,7 @@ const initialState = ImmutableMap({ spoiler: false, spoiler_text: '', privacy: null, + content_type: 'text/plain', text: '', focusDate: null, caretPosition: null, @@ -294,6 +296,10 @@ export default function compose(state = initialState, action) { return state .set('privacy', action.value) .set('idempotencyKey', uuid()); + case COMPOSE_CONTENT_TYPE_CHANGE: + return state + .set('content_type', action.value) + .set('idempotencyKey', uuid()); case COMPOSE_CHANGE: return state .set('text', action.text) -- GitLab From 37e72c35d0be969230e18b345a1ff645cf4faa65 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Sun, 1 Apr 2018 23:09:35 +0200 Subject: [PATCH 186/192] Allow status rich-formatting --- .../glitch/styles/components/status.scss | 17 ++++++++++++++++- app/javascript/styles/mastodon/components.scss | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss index 774f91cf6a..3e3792ebfb 100644 --- a/app/javascript/flavours/glitch/styles/components/status.scss +++ b/app/javascript/flavours/glitch/styles/components/status.scss @@ -8,10 +8,25 @@ font-size: 15px; line-height: 20px; word-wrap: break-word; - font-weight: 400; overflow: visible; padding-top: 5px; + em { + font-style: italic; + } + + strong { + font-weight: bold; + } + + ul { list-style: disc inside; } + ol { list-style: decimal inside; } + + blockquote { + margin: .2em 0 .2em 2em; + font-style: italic; + } + &:focus { outline: 0; } diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index ca644c9c0e..0848df009f 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -635,7 +635,6 @@ font-size: 15px; line-height: 20px; word-wrap: break-word; - font-weight: 400; overflow: hidden; text-overflow: ellipsis; padding-top: 2px; @@ -721,6 +720,22 @@ display: block; } } + + em { + font-style: italic; + } + + strong { + font-weight: bold; + } + + ul { list-style: disc inside; } + ol { list-style: decimal inside; } + + blockquote { + margin: .2em 0 .2em 2em; + font-style: italic; + } } .status__content.status__content--collapsed { -- GitLab From bc52654ec74741c600dd9321adf286edc7e2057a Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Fri, 1 Mar 2019 11:45:16 +0100 Subject: [PATCH 187/192] Content-Type Dropdown: use the selected option icon for the menu --- .../flavours/glitch/features/composer/options/index.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/javascript/flavours/glitch/features/composer/options/index.js b/app/javascript/flavours/glitch/features/composer/options/index.js index 8e18f38bbb..7b8d174b5c 100644 --- a/app/javascript/flavours/glitch/features/composer/options/index.js +++ b/app/javascript/flavours/glitch/features/composer/options/index.js @@ -224,17 +224,17 @@ export default class ComposerOptions extends React.PureComponent { const contentTypeItems = { plain: { - icon: 'file', + icon: 'align-left', name: 'text/plain', text: <FormattedMessage {...messages.plain} />, }, html: { - icon: 'file-text', + icon: 'code', name: 'text/html', text: <FormattedMessage {...messages.html} />, }, markdown: { - icon: 'file-text', + icon: 'arrow-circle-down', name: 'text/markdown', text: <FormattedMessage {...messages.markdown} />, }, @@ -323,7 +323,8 @@ export default class ComposerOptions extends React.PureComponent { value={privacy} /> <Dropdown - icon="code" + disabled={disabled} + icon={(contentTypeItems[contentType.split('/')[1]] || {}).icon} items={[ contentTypeItems.plain, contentTypeItems.html, -- GitLab From 0e656e1a58120cbabdec4e661db0ceabd7f3e1aa Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Sun, 3 Mar 2019 10:00:59 +0100 Subject: [PATCH 188/192] Remove unsupported Delete&Redraft --- app/javascript/flavours/glitch/components/status_action_bar.js | 1 - .../flavours/glitch/features/status/components/action_bar.js | 1 - app/javascript/mastodon/components/status_action_bar.js | 1 - 3 files changed, 3 deletions(-) diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js index dda174f66f..bb8d4802c4 100644 --- a/app/javascript/flavours/glitch/components/status_action_bar.js +++ b/app/javascript/flavours/glitch/components/status_action_bar.js @@ -218,7 +218,6 @@ export default class StatusActionBar extends ImmutablePureComponent { } menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); - menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick }); } else { menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick }); menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick }); diff --git a/app/javascript/flavours/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js index 66cc10d787..18e4736b13 100644 --- a/app/javascript/flavours/glitch/features/status/components/action_bar.js +++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js @@ -162,7 +162,6 @@ export default class ActionBar extends React.PureComponent { menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick }); menu.push(null); menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); - menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick }); } else { menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick }); menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick }); diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js index 77e7699d54..644ed538a4 100644 --- a/app/javascript/mastodon/components/status_action_bar.js +++ b/app/javascript/mastodon/components/status_action_bar.js @@ -213,7 +213,6 @@ class StatusActionBar extends ImmutablePureComponent { } menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick }); - menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick }); } else { menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick }); menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick }); -- GitLab From 2e180be76d275e4724c01631841acbc8cc1a80d2 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Sun, 3 Mar 2019 10:03:33 +0100 Subject: [PATCH 189/192] Remove unsupported Local-only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note: It’s still being considered to be added, but in a different way so removing it for now --- .../flavours/glitch/features/composer/options/index.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/javascript/flavours/glitch/features/composer/options/index.js b/app/javascript/flavours/glitch/features/composer/options/index.js index 5b4a7444c0..364810381e 100644 --- a/app/javascript/flavours/glitch/features/composer/options/index.js +++ b/app/javascript/flavours/glitch/features/composer/options/index.js @@ -300,12 +300,6 @@ export default class ComposerOptions extends React.PureComponent { disabled={disabled} icon='ellipsis-h' items={advancedOptions ? [ - { - meta: <FormattedMessage {...messages.local_only_long} />, - name: 'do_not_federate', - on: advancedOptions.get('do_not_federate'), - text: <FormattedMessage {...messages.local_only_short} />, - }, { meta: <FormattedMessage {...messages.threaded_mode_long} />, name: 'threaded_mode', -- GitLab From 1a297466d2bd1b69432bf402f4c984c3570ceac5 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Sun, 3 Mar 2019 12:12:59 +0100 Subject: [PATCH 190/192] Getting-Started: Change endpoint to /api/pleroma/frontend_configurations and key to masto_fe --- app/javascript/flavours/glitch/reducers/pleroma.js | 2 +- app/javascript/mastodon/actions/pleroma.js | 4 ++-- app/javascript/mastodon/reducers/pleroma.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/javascript/flavours/glitch/reducers/pleroma.js b/app/javascript/flavours/glitch/reducers/pleroma.js index 938eb94166..fb3871d787 100644 --- a/app/javascript/flavours/glitch/reducers/pleroma.js +++ b/app/javascript/flavours/glitch/reducers/pleroma.js @@ -11,7 +11,7 @@ export default function custom_panel(state = initialPanel, action) { case PANEL_FETCH_SUCCESS: return state.set('panel', action.panel); break; case PLEROMA_CONFIG_FETCH_SUCCESS: - return state.set('enabled', (action.config || {}).site.pleromafe.showInstanceSpecificPanel || false); + return state.set('enabled', (action.config || {}).showInstanceSpecificPanel); } return state; diff --git a/app/javascript/mastodon/actions/pleroma.js b/app/javascript/mastodon/actions/pleroma.js index d64fe52c47..515b2f2b93 100644 --- a/app/javascript/mastodon/actions/pleroma.js +++ b/app/javascript/mastodon/actions/pleroma.js @@ -57,8 +57,8 @@ export function fetchPleromaConfig() { return (dispatch, getState) => { dispatch(fetchPleromaConfigRequest()); - api(getState).get('/api/statusnet/config.json').then(response => { - dispatch(fetchPleromaConfigSuccess(response.data)); + api(getState).get('/api/pleroma/frontend_configurations').then(response => { + dispatch(fetchPleromaConfigSuccess(response.data.masto_fe)); }).catch(error => { dispatch(fetchPleromaConfigFail(error)); }); diff --git a/app/javascript/mastodon/reducers/pleroma.js b/app/javascript/mastodon/reducers/pleroma.js index 2cd5a1a4aa..4cbf59b0bc 100644 --- a/app/javascript/mastodon/reducers/pleroma.js +++ b/app/javascript/mastodon/reducers/pleroma.js @@ -11,7 +11,7 @@ export function custom_panel(state = initialPanel, action) { case PANEL_FETCH_SUCCESS: return state.set('panel', action.panel); break; case PLEROMA_CONFIG_FETCH_SUCCESS: - return state.set('enabled', (action.config || {}).site.pleromafe.showInstanceSpecificPanel || false); + return state.set('enabled', (action.config || {}).showInstanceSpecificPanel || false); } return state; -- GitLab From 35a8a73bfb744465886edb4c5df475b5b5656d61 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Sun, 3 Mar 2019 12:13:56 +0100 Subject: [PATCH 191/192] =?UTF-8?q?Getting-Started:=20Don=E2=80=99t=20put?= =?UTF-8?q?=20a=20placeholder=20panel=20when=20it=E2=80=99s=20disabled?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../glitch/features/getting_started/index.js | 17 ++--------------- .../mastodon/features/getting_started/index.js | 17 ++--------------- 2 files changed, 4 insertions(+), 30 deletions(-) diff --git a/app/javascript/flavours/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js index ac90863919..93ab5aa414 100644 --- a/app/javascript/flavours/glitch/features/getting_started/index.js +++ b/app/javascript/flavours/glitch/features/getting_started/index.js @@ -161,18 +161,7 @@ export default class GettingStarted extends ImmutablePureComponent { </div>, ]); - const dot = ' • '; - const staticContent = (customPanelEnabled ? <div dangerouslySetInnerHTML={{__html: customPanel}} style={{marginLeft: -12, marginRight: -12}} /> : - <p> - <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/FAQ.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.faq' defaultMessage='FAQ' /></a> - {dot} - <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/User-guide.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.userguide' defaultMessage='User Guide' /></a> - {dot} - <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.appsshort' defaultMessage='Apps' /></a> - {dot} - <a href='https://pleroma.social'><FormattedMessage id='getting_started.pleroma' defaultMessage='Pleroma' /></a> - </p> - ); + const instance_panel = (customPanelEnabled ? <div className='getting-started getting-started__panel scrollable' dangerouslySetInnerHTML={{__html: customPanel}} /> : null); return ( <Column name='getting-started' icon='asterisk' heading={intl.formatMessage(messages.heading)} label={intl.formatMessage(messages.menu)} hideHeadingOnMobile> @@ -187,9 +176,7 @@ export default class GettingStarted extends ImmutablePureComponent { <ColumnLink icon='sign-out' text={intl.formatMessage(messages.sign_out)} href={signOutLink} method='delete' /> </div> - <div className='getting-started getting-started__panel scrollable'> - {staticContent} - </div> + {instance_panel} <div className='getting-started__footer scrollable'> <p> diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js index 3676dd60da..220a0fd8c0 100644 --- a/app/javascript/mastodon/features/getting_started/index.js +++ b/app/javascript/mastodon/features/getting_started/index.js @@ -156,18 +156,7 @@ class GettingStarted extends ImmutablePureComponent { height += 34 + 48; } - const dot = ' • '; - const staticContent = (customPanelEnabled ? <div dangerouslySetInnerHTML={{ __html: customPanel }} style={{ marginLeft: -12, marginRight: -12 }} /> : ( - <p> - <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/FAQ.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.faq' defaultMessage='FAQ' /></a> - {dot} - <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/User-guide.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.userguide' defaultMessage='User Guide' /></a> - {dot} - <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.appsshort' defaultMessage='Apps' /></a> - {dot} - <a href='https://pleroma.social'><FormattedMessage id='getting_started.pleroma' defaultMessage='Pleroma' /></a> - </p> ) - ); + const instance_panel = (customPanelEnabled ? <div className='getting-started getting-started__panel scrollable' dangerouslySetInnerHTML={{__html: customPanel}} /> : null); return ( <Column label={intl.formatMessage(messages.menu)}> @@ -188,9 +177,7 @@ class GettingStarted extends ImmutablePureComponent { {!multiColumn && <div className='flex-spacer' />} - <div className='getting-started getting-started__panel scrollable'> - {staticContent} - </div> + {instance_panel} {!multiColumn && <div className='flex-spacer' />} -- GitLab From 994b0d8563c04edc72e59c8fe8938fa006876051 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Sun, 3 Mar 2019 12:14:47 +0100 Subject: [PATCH 192/192] mastodon/actions/pleroma.js: Remove unused terms-of-service code --- app/javascript/mastodon/actions/pleroma.js | 35 ---------------------- 1 file changed, 35 deletions(-) diff --git a/app/javascript/mastodon/actions/pleroma.js b/app/javascript/mastodon/actions/pleroma.js index 515b2f2b93..ed111effee 100644 --- a/app/javascript/mastodon/actions/pleroma.js +++ b/app/javascript/mastodon/actions/pleroma.js @@ -1,8 +1,5 @@ import api from '../api'; -export const TOS_FETCH_REQUEST = 'TOS_FETCH_REQUEST'; -export const TOS_FETCH_SUCCESS = 'TOS_FETCH_SUCCESS'; -export const TOS_FETCH_FAIL = 'TOS_FETCH_FAIL'; export const FLAVOUR_SWITCH_REQUEST = 'FLAVOUR_SWITCH_REQUEST'; export const FLAVOUR_SWITCH_SUCCESS = 'FLAVOUR_SWITCH_SUCCESS'; export const FLAVOUR_SWITCH_FAIL = 'FLAVOUR_SWITCH_FAIL'; @@ -29,18 +26,6 @@ export function switchFlavour(flavour) { }; }; -export function fetchTOS() { - return (dispatch, getState) => { - dispatch(fetchTOSRequest()); - - api(getState).get('/static/terms-of-service.html').then(response => { - dispatch(fetchTOSSuccess(response.data)); - }).catch(error => { - dispatch(fetchTOSFail(error)); - }); - }; -}; - export function fetchPanel() { return (dispatch, getState) => { dispatch(fetchPanelRequest()); @@ -65,26 +50,6 @@ export function fetchPleromaConfig() { }; }; -export function fetchTOSRequest() { - return { - type: TOS_FETCH_REQUEST, - }; -}; - -export function fetchTOSSuccess(tos) { - return { - type: TOS_FETCH_SUCCESS, - tos, - }; -}; - -export function fetchTOSFail(error) { - return { - type: TOS_FETCH_FAIL, - error, - }; -}; - export function switchFlavourRequest() { return { type: FLAVOUR_SWITCH_REQUEST, -- GitLab