From b0db4dad79dac4d9d339e09c62d5aaae9e56c861 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sat, 9 Dec 2017 08:47:52 +0900 Subject: [PATCH 001/112] Revert fog-aws (ref #5604) (#5934) --- Gemfile | 2 +- Gemfile.lock | 19 +++++++------ config/initializers/paperclip.rb | 47 ++++++++++++++++++-------------- 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/Gemfile b/Gemfile index e43b1a2566..f6acb431a9 100644 --- a/Gemfile +++ b/Gemfile @@ -14,7 +14,7 @@ gem 'pg', '~> 0.20' gem 'pghero', '~> 1.7' gem 'dotenv-rails', '~> 2.2' -gem 'fog-aws', '~> 1.4', require: false +gem 'aws-sdk', '~> 2.10', require: false gem 'fog-core', '~> 1.45' gem 'fog-local', '~> 0.4', require: false gem 'fog-openstack', '~> 0.1', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 5f050d031b..febfb8561e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -57,6 +57,14 @@ GEM encryptor (~> 3.0.0) av (0.9.0) cocaine (~> 0.5.3) + aws-sdk (2.10.100) + aws-sdk-resources (= 2.10.100) + aws-sdk-core (2.10.100) + aws-sigv4 (~> 1.0) + jmespath (~> 1.0) + aws-sdk-resources (2.10.100) + aws-sdk-core (= 2.10.100) + aws-sigv4 (1.0.2) bcrypt (3.1.11) better_errors (2.4.0) coderay (>= 1.0.0) @@ -152,11 +160,6 @@ GEM i18n (~> 0.5) fast_blank (1.0.0) ffi (1.9.18) - fog-aws (1.4.1) - fog-core (~> 1.38) - fog-json (~> 1.0) - fog-xml (~> 0.1) - ipaddress (~> 0.8) fog-core (1.45.0) builder excon (~> 0.58) @@ -170,9 +173,6 @@ GEM fog-core (>= 1.40) fog-json (>= 1.0) ipaddress (>= 0.8) - fog-xml (0.1.3) - fog-core - nokogiri (>= 1.5.11, < 2.0.0) formatador (0.2.5) fuubar (2.2.0) rspec-core (~> 3.0) @@ -228,6 +228,7 @@ GEM idn-ruby (0.1.0) ipaddress (0.8.3) iso-639 (0.2.8) + jmespath (1.3.1) json (2.1.0) json-ld (2.1.7) multi_json (~> 1.12) @@ -544,6 +545,7 @@ DEPENDENCIES active_record_query_trace (~> 1.5) addressable (~> 2.5) annotate (~> 2.7) + aws-sdk (~> 2.10) better_errors (~> 2.4) binding_of_caller (~> 0.7) bootsnap @@ -566,7 +568,6 @@ DEPENDENCIES fabrication (~> 2.18) faker (~> 1.7) fast_blank (~> 1.0) - fog-aws (~> 1.4) fog-core (~> 1.45) fog-local (~> 0.4) fog-openstack (~> 0.1) diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb index 14bd034e68..bd26c533db 100644 --- a/config/initializers/paperclip.rb +++ b/config/initializers/paperclip.rb @@ -14,40 +14,45 @@ Paperclip::Attachment.default_options.merge!( ) if ENV['S3_ENABLED'] == 'true' - require 'fog/aws' + require 'aws-sdk' + Aws.eager_autoload!(services: %w(S3)) - s3_protocol = ENV.fetch('S3_PROTOCOL') { 'https' } - s3_hostname = ENV.fetch('S3_HOSTNAME') { "s3-#{ENV['S3_REGION']}.amazonaws.com" } - aws_signature_version = ENV['S3_SIGNATURE_VERSION'] == 's3' ? 2 : ENV['S3_SIGNATURE_VERSION'].to_i - aws_signature_version = 4 if aws_signature_version.zero? + s3_region = ENV.fetch('S3_REGION') { 'us-east-1' } + s3_protocol = ENV.fetch('S3_PROTOCOL') { 'https' } + s3_hostname = ENV.fetch('S3_HOSTNAME') { "s3-#{s3_region}}.amazonaws.com" } Paperclip::Attachment.default_options.merge!( - fog_credentials: { - provider: 'AWS', - aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'], - aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], - aws_signature_version: aws_signature_version, - region: ENV.fetch('S3_REGION') { 'us-east-1' }, - scheme: s3_protocol, - host: s3_hostname + storage: :s3, + s3_protocol: s3_protocol, + s3_host_name: s3_hostname, + s3_headers: { + 'Cache-Control' => 'max-age=315576000', }, - fog_directory: ENV['S3_BUCKET'], - fog_options: { - acl: ENV.fetch('S3_PERMISSION') { 'public-read' }, - cache_control: 'max-age=315576000', + s3_permissions: ENV.fetch('S3_PERMISSION') { 'public-read' }, + s3_region: s3_region, + s3_credentials: { + bucket: ENV['S3_BUCKET'], + access_key_id: ENV['AWS_ACCESS_KEY_ID'], + secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], + }, + s3_options: { + signature_version: ENV.fetch('S3_SIGNATURE_VERSION') { 'v4' }, } ) if ENV.has_key?('S3_ENDPOINT') - Paperclip::Attachment.default_options[:fog_credentials].merge!( + Paperclip::Attachment.default_options[:s3_options].merge!( endpoint: ENV['S3_ENDPOINT'], - path_style: true + force_path_style: true ) - Paperclip::Attachment.default_options[:fog_host] = "#{s3_protocol}://#{s3_hostname}/#{ENV['S3_BUCKET']}" + Paperclip::Attachment.default_options[:url] = ':s3_path_url' end if ENV.has_key?('S3_CLOUDFRONT_HOST') - Paperclip::Attachment.default_options[:fog_host] = "#{s3_protocol}://#{ENV['S3_CLOUDFRONT_HOST']}" + Paperclip::Attachment.default_options.merge!( + url: ':s3_alias_url', + s3_host_alias: ENV['S3_CLOUDFRONT_HOST'] + ) end elsif ENV['SWIFT_ENABLED'] == 'true' require 'fog/openstack' From 70ce2a20956347b42f0b55cfcde42b6e83aee400 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 9 Dec 2017 00:55:58 +0100 Subject: [PATCH 002/112] Polish video player CSS, add timer on fullscreen/modal/public pages (#5928) --- .../features/ui/components/video_modal.js | 1 + .../mastodon/features/video/index.js | 63 ++++++++++++----- .../styles/mastodon/components.scss | 69 +++++++++++++++---- .../stream_entries/_detailed_status.html.haml | 2 +- 4 files changed, 104 insertions(+), 31 deletions(-) diff --git a/app/javascript/mastodon/features/ui/components/video_modal.js b/app/javascript/mastodon/features/ui/components/video_modal.js index 1437deeb0b..6a883759fe 100644 --- a/app/javascript/mastodon/features/ui/components/video_modal.js +++ b/app/javascript/mastodon/features/ui/components/video_modal.js @@ -23,6 +23,7 @@ export default class VideoModal extends ImmutablePureComponent { src={media.get('url')} startTime={time} onCloseVideo={onClose} + detailed description={media.get('description')} /> diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js index 003bf23a84..0ee8bb6c82 100644 --- a/app/javascript/mastodon/features/video/index.js +++ b/app/javascript/mastodon/features/video/index.js @@ -17,6 +17,18 @@ const messages = defineMessages({ exit_fullscreen: { id: 'video.exit_fullscreen', defaultMessage: 'Exit full screen' }, }); +const formatTime = secondsNum => { + let hours = Math.floor(secondsNum / 3600); + let minutes = Math.floor((secondsNum - (hours * 3600)) / 60); + let seconds = secondsNum - (hours * 3600) - (minutes * 60); + + if (hours < 10) hours = '0' + hours; + if (minutes < 10) minutes = '0' + minutes; + if (seconds < 10) seconds = '0' + seconds; + + return (hours === '00' ? '' : `${hours}:`) + `${minutes}:${seconds}`; +}; + const findElementPosition = el => { let box; @@ -83,11 +95,13 @@ export default class Video extends React.PureComponent { startTime: PropTypes.number, onOpenVideo: PropTypes.func, onCloseVideo: PropTypes.func, + detailed: PropTypes.bool, intl: PropTypes.object.isRequired, }; state = { - progress: 0, + currentTime: 0, + duration: 0, paused: true, dragging: false, fullscreen: false, @@ -117,7 +131,10 @@ export default class Video extends React.PureComponent { } handleTimeUpdate = () => { - this.setState({ progress: 100 * (this.video.currentTime / this.video.duration) }); + this.setState({ + currentTime: Math.floor(this.video.currentTime), + duration: Math.floor(this.video.duration), + }); } handleMouseDown = e => { @@ -143,8 +160,10 @@ export default class Video extends React.PureComponent { handleMouseMove = throttle(e => { const { x } = getPointerPosition(this.seek, e); - this.video.currentTime = this.video.duration * x; - this.setState({ progress: x * 100 }); + const currentTime = Math.floor(this.video.duration * x); + + this.video.currentTime = currentTime; + this.setState({ currentTime }); }, 60); togglePlay = () => { @@ -226,11 +245,12 @@ export default class Video extends React.PureComponent { } render () { - const { preview, src, width, height, startTime, onOpenVideo, onCloseVideo, intl, alt } = this.props; - const { progress, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; + const { preview, src, width, height, startTime, onOpenVideo, onCloseVideo, intl, alt, detailed } = this.props; + const { currentTime, duration, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; + const progress = (currentTime / duration) * 100; return ( -
+
-
- - - {!onCloseVideo && } -
+
+
+ + -
- {(!fullscreen && onOpenVideo) && } - {onCloseVideo && } - + {!onCloseVideo && } + + {(detailed || fullscreen) && + + {formatTime(currentTime)} + / + {formatTime(duration)} + + } +
+ +
+ {(!fullscreen && onOpenVideo) && } + {onCloseVideo && } + +
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 64a77adc7f..dd61dc519e 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3998,6 +3998,7 @@ button.icon-button.active i.fa-retweet { position: relative; background: $base-shadow-color; max-width: 100%; + border-radius: 4px; video { height: 100%; @@ -4032,8 +4033,8 @@ button.icon-button.active i.fa-retweet { left: 0; right: 0; box-sizing: border-box; - background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 60%, transparent); - padding: 0 10px; + background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent); + padding: 0 15px; opacity: 0; transition: opacity .1s ease; @@ -4086,40 +4087,67 @@ button.icon-button.active i.fa-retweet { } } - &__buttons { + &__buttons-bar { + display: flex; + justify-content: space-between; padding-bottom: 10px; + } + + &__buttons { font-size: 16px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; &.left { - float: left; - button { - padding-right: 10px; + padding-left: 0; } } &.right { - float: right; - button { - padding-left: 10px; + padding-right: 0; } } button { background: transparent; - padding: 0; + padding: 2px 10px; + font-size: 16px; border: 0; - color: $white; + color: rgba($white, 0.75); &:active, &:hover, &:focus { - color: $ui-highlight-color; + color: $white; } } } + &__time-sep, + &__time-total, + &__time-current { + font-size: 14px; + font-weight: 500; + } + + &__time-current { + color: $white; + margin-left: 10px; + } + + &__time-sep { + display: inline-block; + margin: 0 6px; + } + + &__time-sep, + &__time-total { + color: $white; + } + &__seek { cursor: pointer; height: 24px; @@ -4129,6 +4157,7 @@ button.icon-button.active i.fa-retweet { content: ""; width: 100%; background: rgba($white, 0.35); + border-radius: 4px; display: block; position: absolute; height: 4px; @@ -4140,8 +4169,9 @@ button.icon-button.active i.fa-retweet { display: block; position: absolute; height: 4px; + border-radius: 4px; top: 10px; - background: $ui-highlight-color; + background: lighten($ui-highlight-color, 8%); } &__buffer { @@ -4158,7 +4188,8 @@ button.icon-button.active i.fa-retweet { top: 6px; margin-left: -6px; transition: opacity .1s ease; - background: $ui-highlight-color; + background: lighten($ui-highlight-color, 8%); + box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2); pointer-events: none; &.active { @@ -4172,6 +4203,16 @@ button.icon-button.active i.fa-retweet { } } } + + &.detailed, + &.fullscreen { + .video-player__buttons { + button { + padding-top: 10px; + padding-bottom: 10px; + } + } + } } .media-spoiler-video { diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml index 3119ebf4b9..94e081c84d 100644 --- a/app/views/stream_entries/_detailed_status.html.haml +++ b/app/views/stream_entries/_detailed_status.html.haml @@ -22,7 +22,7 @@ - if !status.media_attachments.empty? - if status.media_attachments.first.video? - video = status.media_attachments.first - %div{ data: { component: 'Video', props: Oj.dump(src: video.file.url(:original), preview: video.file.url(:small), sensitive: status.sensitive?, width: 670, height: 380) }} + %div{ data: { component: 'Video', props: Oj.dump(src: video.file.url(:original), preview: video.file.url(:small), sensitive: status.sensitive?, width: 670, height: 380, detailed: true) }} - else %div{ data: { component: 'MediaGallery', props: Oj.dump(height: 380, sensitive: status.sensitive?, standalone: true, 'autoPlayGif': current_account&.user&.setting_auto_play_gif, 'reduceMotion': current_account&.user&.setting_reduce_motion, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }) }} - elsif status.preview_cards.first From c36b9cc5a6cf3feacb925213f5530c90dd31fa7a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 9 Dec 2017 00:56:16 +0100 Subject: [PATCH 003/112] Ensure link thumbnails are not stretched to super low quality (#5932) --- .../mastodon/features/status/components/card.js | 10 +++++----- app/javascript/styles/mastodon/components.scss | 7 ++++++- app/models/preview_card.rb | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/javascript/mastodon/features/status/components/card.js b/app/javascript/mastodon/features/status/components/card.js index d3e322c369..f7d980066c 100644 --- a/app/javascript/mastodon/features/status/components/card.js +++ b/app/javascript/mastodon/features/status/components/card.js @@ -59,6 +59,8 @@ export default class Card extends React.PureComponent { renderLink () { const { card, maxDescription } = this.props; + const { width } = this.state; + const horizontal = card.get('width') > card.get('height') && (card.get('width') + 100 >= width); let image = ''; let provider = card.get('provider_name'); @@ -75,17 +77,15 @@ export default class Card extends React.PureComponent { provider = decodeIDNA(getHostname(card.get('url'))); } - const className = classnames('status-card', { - 'horizontal': card.get('width') > card.get('height'), - }); + const className = classnames('status-card', { horizontal }); return ( - + {image}
{card.get('title')} -

{(card.get('description') || '').substring(0, maxDescription)}

+ {!horizontal &&

{(card.get('description') || '').substring(0, maxDescription)}

} {provider}
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index dd61dc519e..f76470da77 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2273,14 +2273,19 @@ button.icon-button.active i.fa-retweet { .status-card__image-image { border-radius: 4px 4px 0 0; } + + .status-card__title { + white-space: inherit; + } } .status-card__image-image { border-radius: 4px 0 0 4px; display: block; - height: auto; margin: 0; width: 100%; + height: 100%; + object-fit: cover; } .load-more { diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb index 5baddba8ab..716b822436 100644 --- a/app/models/preview_card.rb +++ b/app/models/preview_card.rb @@ -33,7 +33,7 @@ class PreviewCard < ApplicationRecord has_and_belongs_to_many :statuses - has_attached_file :image, styles: { original: '280x280>' }, convert_options: { all: '-quality 80 -strip' } + has_attached_file :image, styles: { original: '400x400>' }, convert_options: { all: '-quality 80 -strip' } include Attachmentable include Remotable From 86b4d5439caf717fc549a6036ca50a661badbd55 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 9 Dec 2017 01:24:47 +0100 Subject: [PATCH 004/112] Fix #5926 - Do not downgrade to OStatus once ActivityPub is known (#5929) --- app/services/resolve_remote_account_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/resolve_remote_account_service.rb b/app/services/resolve_remote_account_service.rb index 3293fe40f1..d7d0be2105 100644 --- a/app/services/resolve_remote_account_service.rb +++ b/app/services/resolve_remote_account_service.rb @@ -44,7 +44,7 @@ class ResolveRemoteAccountService < BaseService if lock.acquired? @account = Account.find_remote(@username, @domain) - if activitypub_ready? + if activitypub_ready? || @account&.activitypub? handle_activitypub else handle_ostatus From f08e6e9ab54a72cc20b33b270789c245b5cfde39 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sat, 9 Dec 2017 09:25:00 +0900 Subject: [PATCH 005/112] Audio.prototype.seek is undefined (#5935) --- app/javascript/mastodon/middleware/sounds.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/middleware/sounds.js b/app/javascript/mastodon/middleware/sounds.js index 3d1e3eabaa..9f1bc02b97 100644 --- a/app/javascript/mastodon/middleware/sounds.js +++ b/app/javascript/mastodon/middleware/sounds.js @@ -15,7 +15,7 @@ const play = audio => { if (typeof audio.fastSeek === 'function') { audio.fastSeek(0); } else { - audio.seek(0); + audio.currentTime = 0; } } From 2f4c5f504fa5edc2a826afa9645371f529ae904d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 9 Dec 2017 01:32:29 +0100 Subject: [PATCH 006/112] Limit users to 50 lists, remove pagination from lists API (#5933) --- app/controllers/api/v1/lists_controller.rb | 38 +--------------------- app/models/list.rb | 6 ++++ app/validators/status_pin_validator.rb | 8 ++--- config/locales/en.yml | 5 ++- 4 files changed, 15 insertions(+), 42 deletions(-) diff --git a/app/controllers/api/v1/lists_controller.rb b/app/controllers/api/v1/lists_controller.rb index 9437373bdf..180a91d81b 100644 --- a/app/controllers/api/v1/lists_controller.rb +++ b/app/controllers/api/v1/lists_controller.rb @@ -1,18 +1,14 @@ # frozen_string_literal: true class Api::V1::ListsController < Api::BaseController - LISTS_LIMIT = 50 - before_action -> { doorkeeper_authorize! :read }, only: [:index, :show] before_action -> { doorkeeper_authorize! :write }, except: [:index, :show] before_action :require_user! before_action :set_list, except: [:index, :create] - after_action :insert_pagination_headers, only: :index - def index - @lists = List.where(account: current_account).paginate_by_max_id(limit_param(LISTS_LIMIT), params[:max_id], params[:since_id]) + @lists = List.where(account: current_account).all render json: @lists, each_serializer: REST::ListSerializer end @@ -44,36 +40,4 @@ class Api::V1::ListsController < Api::BaseController def list_params params.permit(:title) end - - def insert_pagination_headers - set_pagination_headers(next_path, prev_path) - end - - def next_path - if records_continue? - api_v1_lists_url pagination_params(max_id: pagination_max_id) - end - end - - def prev_path - unless @lists.empty? - api_v1_lists_url pagination_params(since_id: pagination_since_id) - end - end - - def pagination_max_id - @lists.last.id - end - - def pagination_since_id - @lists.first.id - end - - def records_continue? - @lists.size == limit_param(LISTS_LIMIT) - end - - def pagination_params(core_params) - params.permit(:limit).merge(core_params) - end end diff --git a/app/models/list.rb b/app/models/list.rb index 910864b267..f45e4973d0 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -13,6 +13,8 @@ class List < ApplicationRecord include Paginable + PER_ACCOUNT_LIMIT = 50 + belongs_to :account has_many :list_accounts, inverse_of: :list, dependent: :destroy @@ -20,6 +22,10 @@ class List < ApplicationRecord validates :title, presence: true + validates_each :account_id, on: :create do |record, _attr, value| + record.errors.add(:base, I18n.t('lists.errors.limit')) if List.where(account_id: value).count >= PER_ACCOUNT_LIMIT + end + before_destroy :clean_feed_manager private diff --git a/app/validators/status_pin_validator.rb b/app/validators/status_pin_validator.rb index 9760e1138c..64da041209 100644 --- a/app/validators/status_pin_validator.rb +++ b/app/validators/status_pin_validator.rb @@ -2,9 +2,9 @@ class StatusPinValidator < ActiveModel::Validator def validate(pin) - pin.errors.add(:status, I18n.t('statuses.pin_errors.reblog')) if pin.status.reblog? - pin.errors.add(:status, I18n.t('statuses.pin_errors.ownership')) if pin.account_id != pin.status.account_id - pin.errors.add(:status, I18n.t('statuses.pin_errors.private')) unless %w(public unlisted).include?(pin.status.visibility) - pin.errors.add(:status, I18n.t('statuses.pin_errors.limit')) if pin.account.status_pins.count > 4 + pin.errors.add(:base, I18n.t('statuses.pin_errors.reblog')) if pin.status.reblog? + pin.errors.add(:base, I18n.t('statuses.pin_errors.ownership')) if pin.account_id != pin.status.account_id + pin.errors.add(:base, I18n.t('statuses.pin_errors.private')) unless %w(public unlisted).include?(pin.status.visibility) + pin.errors.add(:base, I18n.t('statuses.pin_errors.limit')) if pin.account.status_pins.count > 4 end end diff --git a/config/locales/en.yml b/config/locales/en.yml index 5b9d43b9f3..14a88d6c80 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -458,6 +458,9 @@ en: title: Invite people landing_strip_html: "%{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse." landing_strip_signup_html: If you don't, you can sign up here. + lists: + errors: + limit: You have reached the maximum amount of lists media_attachments: validations: images_and_video: Cannot attach a video to a status that already contains images @@ -591,7 +594,7 @@ en: open_in_web: Open in web over_character_limit: character limit of %{max} exceeded pin_errors: - limit: Too many toots pinned + limit: You have already pinned the maximum number of toots ownership: Someone else's toot cannot be pinned private: Non-public toot cannot be pinned reblog: A boost cannot be pinned From ec3b449baa122cb881556422f1b3d586ad5a9a6c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 9 Dec 2017 02:22:13 +0100 Subject: [PATCH 007/112] Fix #5630 - Prevent duplicate load of favourites (#5931) --- app/javascript/mastodon/actions/favourites.js | 6 +++++- .../mastodon/features/favourited_statuses/index.js | 10 +++++++--- app/javascript/mastodon/reducers/status_lists.js | 12 ++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/app/javascript/mastodon/actions/favourites.js b/app/javascript/mastodon/actions/favourites.js index 09ce51fceb..93094c5261 100644 --- a/app/javascript/mastodon/actions/favourites.js +++ b/app/javascript/mastodon/actions/favourites.js @@ -10,6 +10,10 @@ export const FAVOURITED_STATUSES_EXPAND_FAIL = 'FAVOURITED_STATUSES_EXPAND_FA export function fetchFavouritedStatuses() { return (dispatch, getState) => { + if (getState().getIn(['status_lists', 'favourites', 'isLoading'])) { + return; + } + dispatch(fetchFavouritedStatusesRequest()); api(getState).get('/api/v1/favourites').then(response => { @@ -46,7 +50,7 @@ export function expandFavouritedStatuses() { return (dispatch, getState) => { const url = getState().getIn(['status_lists', 'favourites', 'next'], null); - if (url === null) { + if (url === null || getState().getIn(['status_lists', 'favourites', 'isLoading'])) { return; } diff --git a/app/javascript/mastodon/features/favourited_statuses/index.js b/app/javascript/mastodon/features/favourited_statuses/index.js index 1e1f5873c2..67b107bc8f 100644 --- a/app/javascript/mastodon/features/favourited_statuses/index.js +++ b/app/javascript/mastodon/features/favourited_statuses/index.js @@ -9,6 +9,7 @@ import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; import StatusList from '../../components/status_list'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; +import { debounce } from 'lodash'; const messages = defineMessages({ heading: { id: 'column.favourites', defaultMessage: 'Favourites' }, @@ -16,6 +17,7 @@ const messages = defineMessages({ const mapStateToProps = state => ({ statusIds: state.getIn(['status_lists', 'favourites', 'items']), + isLoading: state.getIn(['status_lists', 'favourites', 'isLoading'], true), hasMore: !!state.getIn(['status_lists', 'favourites', 'next']), }); @@ -30,6 +32,7 @@ export default class Favourites extends ImmutablePureComponent { columnId: PropTypes.string, multiColumn: PropTypes.bool, hasMore: PropTypes.bool, + isLoading: PropTypes.bool, }; componentWillMount () { @@ -59,12 +62,12 @@ export default class Favourites extends ImmutablePureComponent { this.column = c; } - handleScrollToBottom = () => { + handleScrollToBottom = debounce(() => { this.props.dispatch(expandFavouritedStatuses()); - } + }, 300, { leading: true }) render () { - const { intl, statusIds, columnId, multiColumn, hasMore } = this.props; + const { intl, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props; const pinned = !!columnId; return ( @@ -85,6 +88,7 @@ export default class Favourites extends ImmutablePureComponent { statusIds={statusIds} scrollKey={`favourited_statuses-${columnId}`} hasMore={hasMore} + isLoading={isLoading} onScrollToBottom={this.handleScrollToBottom} /> diff --git a/app/javascript/mastodon/reducers/status_lists.js b/app/javascript/mastodon/reducers/status_lists.js index c4aeb338f4..6c5f335574 100644 --- a/app/javascript/mastodon/reducers/status_lists.js +++ b/app/javascript/mastodon/reducers/status_lists.js @@ -1,6 +1,10 @@ import { + FAVOURITED_STATUSES_FETCH_REQUEST, FAVOURITED_STATUSES_FETCH_SUCCESS, + FAVOURITED_STATUSES_FETCH_FAIL, + FAVOURITED_STATUSES_EXPAND_REQUEST, FAVOURITED_STATUSES_EXPAND_SUCCESS, + FAVOURITED_STATUSES_EXPAND_FAIL, } from '../actions/favourites'; import { PINNED_STATUSES_FETCH_SUCCESS, @@ -30,6 +34,7 @@ const normalizeList = (state, listType, statuses, next) => { return state.update(listType, listMap => listMap.withMutations(map => { map.set('next', next); map.set('loaded', true); + map.set('isLoading', false); map.set('items', ImmutableList(statuses.map(item => item.id))); })); }; @@ -37,6 +42,7 @@ const normalizeList = (state, listType, statuses, next) => { const appendToList = (state, listType, statuses, next) => { return state.update(listType, listMap => listMap.withMutations(map => { map.set('next', next); + map.set('isLoading', false); map.set('items', map.get('items').concat(statuses.map(item => item.id))); })); }; @@ -55,6 +61,12 @@ const removeOneFromList = (state, listType, status) => { export default function statusLists(state = initialState, action) { switch(action.type) { + case FAVOURITED_STATUSES_FETCH_REQUEST: + case FAVOURITED_STATUSES_EXPAND_REQUEST: + return state.setIn(['favourites', 'isLoading'], true); + case FAVOURITED_STATUSES_FETCH_FAIL: + case FAVOURITED_STATUSES_EXPAND_FAIL: + return state.setIn(['favourites', 'isLoading'], false); case FAVOURITED_STATUSES_FETCH_SUCCESS: return normalizeList(state, 'favourites', action.statuses, action.next); case FAVOURITED_STATUSES_EXPAND_SUCCESS: From 99242b92bcc1965b2a72c01216bce7c232322f15 Mon Sep 17 00:00:00 2001 From: abcang Date: Sat, 9 Dec 2017 10:31:37 +0900 Subject: [PATCH 008/112] Keep WebPush settings (#5879) --- .../api/web/push_subscriptions_controller.rb | 2 + .../mastodon/actions/push_notifications.js | 11 ++-- .../mastodon/web_push_subscription.js | 51 +++++++++++++++++-- .../web/push_subscriptions_controller_spec.rb | 17 +++++++ 4 files changed, 74 insertions(+), 7 deletions(-) diff --git a/app/controllers/api/web/push_subscriptions_controller.rb b/app/controllers/api/web/push_subscriptions_controller.rb index d66237feb5..52e250d02d 100644 --- a/app/controllers/api/web/push_subscriptions_controller.rb +++ b/app/controllers/api/web/push_subscriptions_controller.rb @@ -28,6 +28,8 @@ class Api::Web::PushSubscriptionsController < Api::BaseController }, } + data.deep_merge!(params[:data]) if params[:data] + web_subscription = ::Web::PushSubscription.create!( endpoint: params[:subscription][:endpoint], key_p256dh: params[:subscription][:keys][:p256dh], diff --git a/app/javascript/mastodon/actions/push_notifications.js b/app/javascript/mastodon/actions/push_notifications.js index 55661d2b09..cfe4198887 100644 --- a/app/javascript/mastodon/actions/push_notifications.js +++ b/app/javascript/mastodon/actions/push_notifications.js @@ -1,4 +1,5 @@ import axios from 'axios'; +import { setSettingsToLocalStorage } from '../web_push_subscription'; export const SET_BROWSER_SUPPORT = 'PUSH_NOTIFICATIONS_SET_BROWSER_SUPPORT'; export const SET_SUBSCRIPTION = 'PUSH_NOTIFICATIONS_SET_SUBSCRIPTION'; @@ -42,11 +43,15 @@ export function saveSettings() { const state = getState().get('push_notifications'); const subscription = state.get('subscription'); const alerts = state.get('alerts'); + const data = { alerts }; axios.put(`/api/web/push_subscriptions/${subscription.get('id')}`, { - data: { - alerts, - }, + data, + }).then(() => { + const me = getState().getIn(['meta', 'me']); + if (me) { + setSettingsToLocalStorage(me, data); + } }); }; } diff --git a/app/javascript/mastodon/web_push_subscription.js b/app/javascript/mastodon/web_push_subscription.js index 3dbed09ea2..114d9c3b37 100644 --- a/app/javascript/mastodon/web_push_subscription.js +++ b/app/javascript/mastodon/web_push_subscription.js @@ -35,16 +35,35 @@ const subscribe = (registration) => const unsubscribe = ({ registration, subscription }) => subscription ? subscription.unsubscribe().then(() => registration) : registration; -const sendSubscriptionToBackend = (subscription) => - axios.post('/api/web/push_subscriptions', { - subscription, - }).then(response => response.data); +const sendSubscriptionToBackend = (subscription) => { + const params = { subscription }; + + const me = store.getState().getIn(['meta', 'me']); + if (me) { + const data = getSettingsFromLocalStorage(me); + if (data) { + params.data = data; + } + } + + return axios.post('/api/web/push_subscriptions', params).then(response => response.data); +}; // Last one checks for payload support: https://web-push-book.gauntface.com/chapter-06/01-non-standards-browsers/#no-payload const supportsPushNotifications = ('serviceWorker' in navigator && 'PushManager' in window && 'getKey' in PushSubscription.prototype); +const SUBSCRIPTION_DATA_STORAGE_KEY = 'mastodon_push_notification_data'; + export function register () { store.dispatch(setBrowserSupport(supportsPushNotifications)); + const me = store.getState().getIn(['meta', 'me']); + + if (me && !getSettingsFromLocalStorage(me)) { + const alerts = store.getState().getIn(['push_notifications', 'alerts']); + if (alerts) { + setSettingsToLocalStorage(me, { alerts: alerts }); + } + } if (supportsPushNotifications) { if (!getApplicationServerKey()) { @@ -79,6 +98,9 @@ export function register () { // it means that the backend subscription is valid (and was set during hydration) if (!(subscription instanceof PushSubscription)) { store.dispatch(setSubscription(subscription)); + if (me) { + setSettingsToLocalStorage(me, { alerts: subscription.alerts }); + } } }) .catch(error => { @@ -90,6 +112,9 @@ export function register () { // Clear alerts and hide UI settings store.dispatch(clearSubscription()); + if (me) { + removeSettingsFromLocalStorage(me); + } try { getRegistration() @@ -103,3 +128,21 @@ export function register () { console.warn('Your browser does not support Web Push Notifications.'); } } + +export function setSettingsToLocalStorage(id, data) { + try { + localStorage.setItem(`${SUBSCRIPTION_DATA_STORAGE_KEY}_${id}`, JSON.stringify(data)); + } catch (e) {} +} + +export function getSettingsFromLocalStorage(id) { + try { + return JSON.parse(localStorage.getItem(`${SUBSCRIPTION_DATA_STORAGE_KEY}_${id}`)); + } catch (e) {} + + return null; +} + +export function removeSettingsFromLocalStorage(id) { + localStorage.removeItem(`${SUBSCRIPTION_DATA_STORAGE_KEY}_${id}`); +} diff --git a/spec/controllers/api/web/push_subscriptions_controller_spec.rb b/spec/controllers/api/web/push_subscriptions_controller_spec.rb index 7e83b801d1..bbf94c5c66 100644 --- a/spec/controllers/api/web/push_subscriptions_controller_spec.rb +++ b/spec/controllers/api/web/push_subscriptions_controller_spec.rb @@ -48,6 +48,23 @@ describe Api::Web::PushSubscriptionsController do expect(push_subscription['key_p256dh']).to eq(create_payload[:subscription][:keys][:p256dh]) expect(push_subscription['key_auth']).to eq(create_payload[:subscription][:keys][:auth]) end + + context 'with initial data' do + it 'saves alert settings' do + sign_in(user) + + stub_request(:post, create_payload[:subscription][:endpoint]).to_return(status: 200) + + post :create, format: :json, params: create_payload.merge(alerts_payload) + + push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) + + expect(push_subscription.data['follow']).to eq(alerts_payload[:data][:follow]) + expect(push_subscription.data['favourite']).to eq(alerts_payload[:data][:favourite]) + expect(push_subscription.data['reblog']).to eq(alerts_payload[:data][:reblog]) + expect(push_subscription.data['mention']).to eq(alerts_payload[:data][:mention]) + end + end end describe 'PUT #update' do From 2526ef10c29ea4c136ce66b251c105addcf1bf5d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 9 Dec 2017 02:42:59 +0100 Subject: [PATCH 009/112] Bump version to 2.1.0rc3 --- lib/mastodon/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index ac04913e6d..f59ec97cd0 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def pre - 'rc2' + 'rc3' end def flags From 17e26f8afe962cf85f5ee25defb59905ec684eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?THE=20BOSS=20=E2=99=A8?= <30565780+theboss@users.noreply.github.com> Date: Sat, 9 Dec 2017 13:59:59 +0900 Subject: [PATCH 010/112] Fix typo in paperclip.rb (#5936) --- config/initializers/paperclip.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb index bd26c533db..8aa1d1b6ed 100644 --- a/config/initializers/paperclip.rb +++ b/config/initializers/paperclip.rb @@ -19,7 +19,7 @@ if ENV['S3_ENABLED'] == 'true' s3_region = ENV.fetch('S3_REGION') { 'us-east-1' } s3_protocol = ENV.fetch('S3_PROTOCOL') { 'https' } - s3_hostname = ENV.fetch('S3_HOSTNAME') { "s3-#{s3_region}}.amazonaws.com" } + s3_hostname = ENV.fetch('S3_HOSTNAME') { "s3-#{s3_region}.amazonaws.com" } Paperclip::Attachment.default_options.merge!( storage: :s3, From 3a52c90de12b39440264cce2ce218f9c4d7c6ebe Mon Sep 17 00:00:00 2001 From: Quenty31 <33203663+Quenty31@users.noreply.github.com> Date: Sat, 9 Dec 2017 14:17:34 +0100 Subject: [PATCH 011/112] l10n i18n OC update (#5939) * update and corrections * update (invites) * Update oc.yml * Update oc.yml --- app/javascript/mastodon/locales/oc.json | 44 +++++++++++------------ config/locales/oc.yml | 48 +++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 25 deletions(-) diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index ec7202ff60..e3d88ab50b 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -10,9 +10,9 @@ "account.hide_reblogs": "Rescondre los partages de @{name}", "account.media": "Mèdias", "account.mention": "Mencionar @{name}", - "account.moved_to": "{name} a mudat los catons a : ", + "account.moved_to": "{name} a mudat los catons a :", "account.mute": "Rescondre @{name}", - "account.mute_notifications": "Mute notifications from @{name}", + "account.mute_notifications": "Rescondre las notificacions de @{name}", "account.posts": "Estatuts", "account.report": "Senhalar @{name}", "account.requested": "Invitacion mandada. Clicatz per anullar.", @@ -22,10 +22,10 @@ "account.unblock_domain": "Desblocar {domain}", "account.unfollow": "Quitar de sègre", "account.unmute": "Quitar de rescondre @{name}", - "account.unmute_notifications": "Unmute notifications from @{name}", + "account.unmute_notifications": "Mostrar las notificacions de @{name}", "account.view_full_profile": "Veire lo perfil complet", "boost_modal.combo": "Podètz botar {combo} per passar aquò lo còp que ven", - "bundle_column_error.body": "Quicòm a fach meuca pendent lo cargament d’aqueste compausant.", + "bundle_column_error.body": "Quicòm a fach mèuca pendent lo cargament d’aqueste compausant.", "bundle_column_error.retry": "Tornar ensajar", "bundle_column_error.title": "Error de ret", "bundle_modal_error.close": "Tampar", @@ -36,7 +36,7 @@ "column.favourites": "Favorits", "column.follow_requests": "Demandas d’abonament", "column.home": "Acuèlh", - "column.lists": "Lists", + "column.lists": "Listas", "column.mutes": "Personas rescondudas", "column.notifications": "Notificacions", "column.pins": "Tuts penjats", @@ -63,8 +63,8 @@ "confirmations.block.message": "Sètz segur de voler blocar {name} ?", "confirmations.delete.confirm": "Escafar", "confirmations.delete.message": "Sètz segur de voler escafar l’estatut ?", - "confirmations.delete_list.confirm": "Delete", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.delete_list.confirm": "Suprimir", + "confirmations.delete_list.message": "Sètz segur de voler suprimir aquesta lista per totjorn ?", "confirmations.domain_block.confirm": "Amagar tot lo domeni", "confirmations.domain_block.message": "Sètz segur segur de voler blocar completament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.", "confirmations.mute.confirm": "Rescondre", @@ -72,7 +72,7 @@ "confirmations.unfollow.confirm": "Quitar de sègre", "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?", "embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.", - "embed.preview": "Semblarà aquò : ", + "embed.preview": "Semblarà aquò :", "emoji_button.activity": "Activitats", "emoji_button.custom": "Personalizats", "emoji_button.flags": "Drapèus", @@ -84,7 +84,7 @@ "emoji_button.people": "Gents", "emoji_button.recent": "Sovent utilizats", "emoji_button.search": "Cercar…", - "emoji_button.search_results": "Resultat de recèrca", + "emoji_button.search_results": "Resultats de recèrca", "emoji_button.symbols": "Simbòls", "emoji_button.travel": "Viatges & lòcs", "empty_column.community": "Lo flux public local es void. Escrivètz quicòm per lo garnir !", @@ -116,7 +116,7 @@ "keyboard_shortcuts.enter": "per dobrir los estatuts", "keyboard_shortcuts.favourite": "per apondre als favorits", "keyboard_shortcuts.heading": "Acorchis clavièr", - "keyboard_shortcuts.hotkey": "Clau", + "keyboard_shortcuts.hotkey": "Acorchis", "keyboard_shortcuts.legend": "per mostrar aquesta legenda", "keyboard_shortcuts.mention": "per mencionar l’autor", "keyboard_shortcuts.reply": "per respondre", @@ -127,26 +127,26 @@ "lightbox.close": "Tampar", "lightbox.next": "Seguent", "lightbox.previous": "Precedent", - "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 follows", - "lists.subheading": "Your lists", + "lists.account.add": "Ajustar a la lista", + "lists.account.remove": "Levar de la lista", + "lists.delete": "Suprimir la lista", + "lists.edit": "Modificar la lista", + "lists.new.create": "Ajustar una lista", + "lists.new.title_placeholder": "Títol de la nòva lista", + "lists.search": "Cercar demest los seguidors", + "lists.subheading": "Vòstras listas", "loading_indicator.label": "Cargament…", "media_gallery.toggle_visible": "Modificar la visibilitat", "missing_indicator.label": "Pas trobat", - "mute_modal.hide_notifications": "Hide notifications from this user?", + "mute_modal.hide_notifications": "Rescondre las notificacions d’aquesta persona ?", "navigation_bar.blocks": "Personas blocadas", "navigation_bar.community_timeline": "Flux public local", "navigation_bar.edit_profile": "Modificar lo perfil", "navigation_bar.favourites": "Favorits", - "navigation_bar.follow_requests": "Demandas d'abonament", + "navigation_bar.follow_requests": "Demandas d’abonament", "navigation_bar.info": "Mai informacions", "navigation_bar.keyboard_shortcuts": "Acorchis clavièr", - "navigation_bar.lists": "Lists", + "navigation_bar.lists": "Listas", "navigation_bar.logout": "Desconnexion", "navigation_bar.mutes": "Personas rescondudas", "navigation_bar.pins": "Tuts penjats", @@ -209,7 +209,7 @@ "search_popout.search_format": "Format recèrca avançada", "search_popout.tips.hashtag": "etiqueta", "search_popout.tips.status": "estatut", - "search_popout.tips.text": "Tèxt brut tòrna escais, noms d’utilizaire e etiquetas correspondents", + "search_popout.tips.text": "Lo tèxt brut tòrna escais, noms d’utilizaire e etiquetas correspondents", "search_popout.tips.user": "utilizaire", "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}", "standalone.public_title": "Una ulhada dedins…", diff --git a/config/locales/oc.yml b/config/locales/oc.yml index a9bad2d343..a589c195e8 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -49,6 +49,7 @@ oc: reserved_username: Aqueste nom d’utilizaire es reservat roles: admin: Admin + moderator: Mod unfollow: Quitar de sègre admin: account_moderation_notes: @@ -231,6 +232,11 @@ oc: search: Cercar title: Instàncias conegudas invites: + filter: + all: Totes + available: Disponibles + expired: Expirats + title: Filtre title: Covits reports: action_taken_by: Mesura menada per @@ -268,8 +274,11 @@ oc: desc_html: Afichat sus las pagina d’acuèlh quand las inscripcions son tampadas.
Podètz utilizar de balisas HTML title: Messatge de barradura de las inscripcions deletion: - desc_html: Autorizar al monde a suprimir lor compte + desc_html: Autorizar lo monde a suprimir lor compte title: Possibilitat de suprimir lo compte + min_invite_role: + disabled: Degun + title: Autorizat amb invitacions open: desc_html: Autorizar lo monde a se marcar title: Inscripcions @@ -306,7 +315,7 @@ oc: show: Mostrar mèdia title: Mèdia no_media: Cap mèdia - title: Estatuts del compteAccount statuses + title: Estatuts del compte with_media: Amb mèdia subscriptions: callback_url: URL de rapèl @@ -343,6 +352,8 @@ oc: invalid_reset_password_token: Lo geton de reïnicializacion es invalid o acabat. Tornatz demandar un geton se vos plai. login: Se connectar logout: Se desconnectar + migrate_account: Mudar endacòm mai + migrate_account_html: Se volètz mandar los visitors d’aqueste compte a un autre, podètz o configurar aquí. register: Se marcar resend_confirmation: Tornar mandar las instruccions de confirmacion reset_password: Reïnicializar lo senhal @@ -503,12 +514,42 @@ oc: muting: Lista de mond que volètz pas legir upload: Importar in_memoriam_html: En Memòria. + invites: + delete: Desactivar + expired: Expirat + expires_in: + '1800': 30 minutas + '21600': 6 oras + '3600': 1 ora + '43200': 12 oras + '86400': 1 jorn + expires_in_prompt: Jamai + generate: Generar + max_uses: + one: 1 persona + other: "%{count} personas" + max_uses_prompt: Cap limit + prompt: Generatz e partejatz los ligams per donar accès a aquesta instància + table: + expires_at: Expirats + uses: Usatges + title: Covidar de monde landing_strip_html: "%{name} utiliza %{link_to_root_path}. Podètz lo/la sègre o interagir amb el o ela s’avètz un compte ont que siasque sul fediverse." landing_strip_signup_html: S’es pas lo cas, podètz vos marcar aquí. + lists: + errors: + limit: Avètz atengut lo maximum de listas media_attachments: validations: images_and_video: Se pòt pas ajustar una vidèo a un estatut que ten ja d’imatges too_many: Se pòt pas ajustar mai de 4 fichièrs + migrations: + acct: nomutilizaire@domeni del nòu compte + currently_redirecting: 'Vòstre perfil es parametrat per mandar a :' + proceed: Enregistrar + updated_msg: Vòstre paramètre de migracion es ben estat mes a jorn ! + moderation: + title: Moderation notification_mailer: digest: body: 'Trobatz aquí un resumit de çò qu’avètz mancat dempuèi vòstra darrièra visita lo %{since}:' @@ -621,6 +662,7 @@ oc: export: Export donadas followers: Seguidors autorizats import: Importar + migrate: Migracion de compte notifications: Notificacions preferences: Preferéncias settings: Paramètres @@ -630,7 +672,7 @@ oc: open_in_web: Dobrir sul web over_character_limit: limit de %{max} caractèrs passat pin_errors: - limit: Tròp de tuts penjats + limit: Avètz ja lo maximum de tuts penjats ownership: Se pòt pas penjar lo tut de qualqu’un mai private: Se pòt pas penjar los tuts pas publics reblog: Se pòt pas penjar un tut partejat From cdae7e4c8b24bfa6f5e7650887b142d7b1a56a7b Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sat, 9 Dec 2017 22:18:45 +0900 Subject: [PATCH 012/112] Move push notifications settings (regression from #5879) (#5941) * Move push notifications settings * fix typo `setf` -> `set` --- .../mastodon/actions/push_notifications.js | 4 +- app/javascript/mastodon/settings.js | 46 +++++++++++++++++++ .../mastodon/web_push_subscription.js | 31 +++---------- 3 files changed, 54 insertions(+), 27 deletions(-) create mode 100644 app/javascript/mastodon/settings.js diff --git a/app/javascript/mastodon/actions/push_notifications.js b/app/javascript/mastodon/actions/push_notifications.js index cfe4198887..de06385f94 100644 --- a/app/javascript/mastodon/actions/push_notifications.js +++ b/app/javascript/mastodon/actions/push_notifications.js @@ -1,5 +1,5 @@ import axios from 'axios'; -import { setSettingsToLocalStorage } from '../web_push_subscription'; +import { pushNotificationsSetting } from '../settings'; export const SET_BROWSER_SUPPORT = 'PUSH_NOTIFICATIONS_SET_BROWSER_SUPPORT'; export const SET_SUBSCRIPTION = 'PUSH_NOTIFICATIONS_SET_SUBSCRIPTION'; @@ -50,7 +50,7 @@ export function saveSettings() { }).then(() => { const me = getState().getIn(['meta', 'me']); if (me) { - setSettingsToLocalStorage(me, data); + pushNotificationsSetting.set(me, data); } }); }; diff --git a/app/javascript/mastodon/settings.js b/app/javascript/mastodon/settings.js new file mode 100644 index 0000000000..dbd969cb1b --- /dev/null +++ b/app/javascript/mastodon/settings.js @@ -0,0 +1,46 @@ +export default class Settings { + + constructor(keyBase = null) { + this.keyBase = keyBase; + } + + generateKey(id) { + return this.keyBase ? [this.keyBase, `id${id}`].join('.') : id; + } + + set(id, data) { + const key = this.generateKey(id); + try { + const encodedData = JSON.stringify(data); + localStorage.setItem(key, encodedData); + return data; + } catch (e) { + return null; + } + } + + get(id) { + const key = this.generateKey(id); + try { + const rawData = localStorage.getItem(key); + return JSON.parse(rawData); + } catch (e) { + return null; + } + } + + remove(id) { + const data = this.get(id); + if (data) { + const key = this.generateKey(id); + try { + localStorage.removeItem(key); + } catch (e) { + } + } + return data; + } + +} + +export const pushNotificationsSetting = new Settings('mastodon_push_notification_data'); diff --git a/app/javascript/mastodon/web_push_subscription.js b/app/javascript/mastodon/web_push_subscription.js index 114d9c3b37..17aca4060e 100644 --- a/app/javascript/mastodon/web_push_subscription.js +++ b/app/javascript/mastodon/web_push_subscription.js @@ -1,6 +1,7 @@ import axios from 'axios'; import { store } from './containers/mastodon'; import { setBrowserSupport, setSubscription, clearSubscription } from './actions/push_notifications'; +import { pushNotificationsSetting } from './settings'; // Taken from https://www.npmjs.com/package/web-push const urlBase64ToUint8Array = (base64String) => { @@ -40,7 +41,7 @@ const sendSubscriptionToBackend = (subscription) => { const me = store.getState().getIn(['meta', 'me']); if (me) { - const data = getSettingsFromLocalStorage(me); + const data = pushNotificationsSetting.get(me); if (data) { params.data = data; } @@ -52,16 +53,14 @@ const sendSubscriptionToBackend = (subscription) => { // Last one checks for payload support: https://web-push-book.gauntface.com/chapter-06/01-non-standards-browsers/#no-payload const supportsPushNotifications = ('serviceWorker' in navigator && 'PushManager' in window && 'getKey' in PushSubscription.prototype); -const SUBSCRIPTION_DATA_STORAGE_KEY = 'mastodon_push_notification_data'; - export function register () { store.dispatch(setBrowserSupport(supportsPushNotifications)); const me = store.getState().getIn(['meta', 'me']); - if (me && !getSettingsFromLocalStorage(me)) { + if (me && !pushNotificationsSetting.get(me)) { const alerts = store.getState().getIn(['push_notifications', 'alerts']); if (alerts) { - setSettingsToLocalStorage(me, { alerts: alerts }); + pushNotificationsSetting.set(me, { alerts: alerts }); } } @@ -99,7 +98,7 @@ export function register () { if (!(subscription instanceof PushSubscription)) { store.dispatch(setSubscription(subscription)); if (me) { - setSettingsToLocalStorage(me, { alerts: subscription.alerts }); + pushNotificationsSetting.set(me, { alerts: subscription.alerts }); } } }) @@ -113,7 +112,7 @@ export function register () { // Clear alerts and hide UI settings store.dispatch(clearSubscription()); if (me) { - removeSettingsFromLocalStorage(me); + pushNotificationsSetting.remove(me); } try { @@ -128,21 +127,3 @@ export function register () { console.warn('Your browser does not support Web Push Notifications.'); } } - -export function setSettingsToLocalStorage(id, data) { - try { - localStorage.setItem(`${SUBSCRIPTION_DATA_STORAGE_KEY}_${id}`, JSON.stringify(data)); - } catch (e) {} -} - -export function getSettingsFromLocalStorage(id) { - try { - return JSON.parse(localStorage.getItem(`${SUBSCRIPTION_DATA_STORAGE_KEY}_${id}`)); - } catch (e) {} - - return null; -} - -export function removeSettingsFromLocalStorage(id) { - localStorage.removeItem(`${SUBSCRIPTION_DATA_STORAGE_KEY}_${id}`); -} From 931e66e57263f7dcc4e5ee0688a0384f42f17c73 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sat, 9 Dec 2017 22:19:07 +0900 Subject: [PATCH 013/112] Back to Web UI from tag page when signed in (#5943) --- app/views/tags/show.html.haml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/views/tags/show.html.haml b/app/views/tags/show.html.haml index ea8b0faa33..e4c16555da 100644 --- a/app/views/tags/show.html.haml +++ b/app/views/tags/show.html.haml @@ -20,8 +20,11 @@ %p= t 'about.about_hashtag_html', hashtag: @tag.name .cta - = link_to t('auth.login'), new_user_session_path, class: 'button button-secondary' - = link_to t('about.learn_more'), root_url, class: 'button button-alternative' + - if user_signed_in? + = link_to t('settings.back'), root_path, class: 'button button-secondary' + - else + = link_to t('auth.login'), new_user_session_path, class: 'button button-secondary' + = link_to t('about.learn_more'), about_path, class: 'button button-alternative' .features-list .features-list__row From 84cebad49d388a807bfc1f09cad825c6b9469883 Mon Sep 17 00:00:00 2001 From: SerCom_KC Date: Sat, 9 Dec 2017 21:19:45 +0800 Subject: [PATCH 014/112] Update Chinese (Simplified) translations (#5937) * i18n: (zh-CN) Improve translations for email notifications * i18n: (zh-CN) Improve translations * i18n: (zh-CN) Fix subject * i18n: (zh-CN) Update translations for #5933 --- config/locales/zh-CN.yml | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index cd087c3e89..3ede5c4d56 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -325,13 +325,13 @@ zh-CN: title: 管理 admin_mailer: new_report: - body: "%{reporter} 举报了 %{target}" - subject: 来自 %{instance} 的新举报(#%{id}) + body: "%{reporter} 举报了用户 %{target}。" + subject: 来自 %{instance} 的用户举报(#%{id}) application_mailer: - salutation: "%{name}," - settings: 更改电子邮件首选项:%{link} - signature: 来自 %{instance} 的 Mastodon 通知 - view: 查看: + salutation: "%{name}:" + settings: 使用此链接更改你的电子邮件首选项:%{link} + signature: 这是一封来自 %{instance} 的 Mastodon 电子邮件通知。 + view: 点此链接查看详情: applications: created: 应用创建成功 destroyed: 应用删除成功 @@ -399,7 +399,7 @@ zh-CN: '500': content: 抱歉,我们这里出错了。 title: 这个页面不正确 - noscript_html: 请启用 JavaScript 以便使用 Mastodon 网页版应用。你也可以选择适用于你的平台的 Mastodon 应用。 + noscript_html: 使用 Mastodon 网页版应用需要启用 JavaScript。你也可以选择适用于你的平台的 Mastodon 应用。 exports: blocks: 屏蔽的用户 csv: CSV @@ -445,13 +445,16 @@ zh-CN: generate: 生成邀请链接 max_uses: "%{count} 次" max_uses_prompt: 无限制 - prompt: 生成可供分享的链接以便邀请他人在本实例注册 + prompt: 生成分享链接,邀请他人在本实例注册 table: expires_at: 失效时间 uses: 已使用次数 title: 邀请用户 landing_strip_html: "%{name} 是一位来自 %{link_to_root_path} 的用户。如果你想关注他们或者与他们互动,你需要在任意一个 Mastodon 实例或与其兼容的网站上拥有一个帐户。" landing_strip_signup_html: 还没有这种帐户?你可以在本站注册一个。 + lists: + errors: + limit: 你所建立的列表数量已经达到上限 media_attachments: validations: images_and_video: 无法在嘟文中同时插入视频和图片 @@ -478,8 +481,8 @@ zh-CN: body: "%{name} 关注了你!" subject: "%{name} 关注了你" follow_request: - body: "%{name} 请求关注你" - subject: 待审核的关注者:%{name} + body: "%{name} 向你发送了关注请求!" + subject: 来自 %{name} 的关注请求 mention: body: "%{name} 在嘟文中提到了你:" subject: "%{name} 提到了你" @@ -583,7 +586,7 @@ zh-CN: open_in_web: 在站内打开 over_character_limit: 超过了 %{max} 字的限制 pin_errors: - limit: 置顶的嘟文条数超出限制 + limit: 你所置顶的嘟文数量已经达到上限 ownership: 不能置顶他人的嘟文 private: 不能置顶非公开的嘟文 reblog: 不能置顶转嘟 @@ -674,7 +677,7 @@ zh-CN: formats: default: "%Y年%-m月%d日 %H:%M" two_factor_authentication: - code_hint: 输入你的认证器生成的代码以确认 + code_hint: 输入认证器生成的代码以确认操作 description_html: 启用双重认证后,你需要输入手机认证器生成的代码才能登录 disable: 停用 enable: 启用 @@ -688,7 +691,7 @@ zh-CN: recovery_codes_regenerated: 恢复代码重新生成成功 recovery_instructions_html: 如果你的手机无法使用,你可以使用下列任意一个恢复代码来重新获得对帐户的访问权。请妥善保管好你的恢复代码(例如,你可以将它们打印出来,然后和其他重要的文件放在一起)。 setup: 设置 - wrong_code: 输入的认证码无效!请检查你设备上显示的时间是否正确,如果正确,你可能需要联系管理员以检查服务器的时间是否正确。 + wrong_code: 输入的认证码无效!请核对一下你的设备显示的时间,如果正确,你可能需要联系一下实例的管理员,让他们校准服务器的时间。 users: invalid_email: 输入的电子邮件地址无效 invalid_otp_token: 输入的双重认证代码无效 From a865b62efc0f7025f789f4413a03ccacd57db7bb Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 9 Dec 2017 14:20:02 +0100 Subject: [PATCH 015/112] Rate limit by user instead of IP when API user is authenticated (#5923) * Fix #668 - Rate limit by user instead of IP when API user is authenticated * Fix code style issue * Use request decorator provided by Doorkeeper --- .../concerns/rate_limit_headers.rb | 3 +- config/initializers/rack_attack.rb | 55 ++++++++++++++----- .../concerns/rate_limit_headers_spec.rb | 2 +- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/app/controllers/concerns/rate_limit_headers.rb b/app/controllers/concerns/rate_limit_headers.rb index 36cb910753..ac9b58f5df 100644 --- a/app/controllers/concerns/rate_limit_headers.rb +++ b/app/controllers/concerns/rate_limit_headers.rb @@ -44,7 +44,8 @@ module RateLimitHeaders end def api_throttle_data - request.env['rack.attack.throttle_data']['api'] + request.env['rack.attack.throttle_data']['throttle_authenticated_api'] || + request.env['rack.attack.throttle_data']['throttle_unauthenticated_api'] end def request_time diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb index 53cb106cac..fddcbc52c3 100644 --- a/config/initializers/rack_attack.rb +++ b/config/initializers/rack_attack.rb @@ -1,6 +1,41 @@ # frozen_string_literal: true class Rack::Attack + class Request + def authenticated_token + return @token if defined?(@token) + + @token = Doorkeeper::OAuth::Token.authenticate( + Doorkeeper::Grape::AuthorizationDecorator.new(self), + *Doorkeeper.configuration.access_token_methods + ) + end + + def authenticated_user_id + authenticated_token&.resource_owner_id + end + + def unauthenticated? + !authenticated_user_id + end + + def api_request? + path.start_with?('/api') + end + + def web_request? + !api_request? + end + end + + PROTECTED_PATHS = %w( + /auth/sign_in + /auth + /auth/password + ).freeze + + PROTECTED_PATHS_REGEX = Regexp.union(PROTECTED_PATHS.map { |path| /\A#{Regexp.escape(path)}/ }) + # Always allow requests from localhost # (blocklist & throttles are skipped) Rack::Attack.safelist('allow from localhost') do |req| @@ -8,24 +43,16 @@ class Rack::Attack '127.0.0.1' == req.ip || '::1' == req.ip end - # Rate limits for the API - throttle('api', limit: 300, period: 5.minutes) do |req| - req.ip if req.path =~ /\A\/api\/v/ + throttle('throttle_authenticated_api', limit: 300, period: 5.minutes) do |req| + req.api_request? && req.authenticated_user_id end - # Rate limit logins - throttle('login', limit: 5, period: 5.minutes) do |req| - req.ip if req.path == '/auth/sign_in' && req.post? + throttle('throttle_unauthenticated_api', limit: 300, period: 5.minutes) do |req| + req.ip if req.api_request? && req.unauthenticated? end - # Rate limit sign-ups - throttle('register', limit: 5, period: 5.minutes) do |req| - req.ip if req.path == '/auth' && req.post? - end - - # Rate limit forgotten passwords - throttle('reminder', limit: 5, period: 5.minutes) do |req| - req.ip if req.path == '/auth/password' && req.post? + throttle('protected_paths', limit: 5, period: 5.minutes) do |req| + req.ip if req.post? && req.path =~ PROTECTED_PATHS_REGEX end self.throttled_response = lambda do |env| diff --git a/spec/controllers/concerns/rate_limit_headers_spec.rb b/spec/controllers/concerns/rate_limit_headers_spec.rb index 719978dc23..00a9a2080d 100644 --- a/spec/controllers/concerns/rate_limit_headers_spec.rb +++ b/spec/controllers/concerns/rate_limit_headers_spec.rb @@ -34,7 +34,7 @@ describe ApplicationController do let(:start_time) { DateTime.new(2017, 1, 1, 12, 0, 0).utc } before do - request.env['rack.attack.throttle_data'] = { 'api' => { limit: 100, count: 20, period: 10 } } + request.env['rack.attack.throttle_data'] = { 'throttle_authenticated_api' => { limit: 100, count: 20, period: 10 } } travel_to start_time do get 'show' end From 4bce376fdc7f5c5c6e2a2e33974e3712425d5874 Mon Sep 17 00:00:00 2001 From: Naoki Kosaka Date: Sat, 9 Dec 2017 23:12:10 +0900 Subject: [PATCH 016/112] Missing require 'authorization_decorator'. (#5947) --- config/initializers/rack_attack.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb index fddcbc52c3..41db769293 100644 --- a/config/initializers/rack_attack.rb +++ b/config/initializers/rack_attack.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require 'doorkeeper/grape/authorization_decorator' + class Rack::Attack class Request def authenticated_token From a72d03f43c1ffade898677851205ce20f422b8b0 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 9 Dec 2017 15:35:22 +0100 Subject: [PATCH 017/112] Weblate translations (#5946) * Translated using Weblate (German) Currently translated at 84.2% (439 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/ * Translated using Weblate (English) Currently translated at 99.8% (520 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/en/ * Translated using Weblate (German) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/de/ * Translated using Weblate (English) Currently translated at 99.8% (520 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/en/ * Translated using Weblate (German) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/de/ * Translated using Weblate (French) Currently translated at 84.6% (441 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (German) Currently translated at 86.9% (453 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/ * Translated using Weblate (Korean) Currently translated at 86.3% (450 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ko/ * Translated using Weblate (French) Currently translated at 84.8% (442 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (French) Currently translated at 84.8% (442 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (French) Currently translated at 84.8% (442 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (Portuguese) Currently translated at 36.2% (189 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt/ * Translated using Weblate (Hebrew) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/he/ * Translated using Weblate (Hebrew) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/he/ * Translated using Weblate (Hebrew) Currently translated at 53.1% (277 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/he/ * Translated using Weblate (Hebrew) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/he/ * Translated using Weblate (Hebrew) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/he/ * Translated using Weblate (Hebrew) Currently translated at 100.0% (43 of 43 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/he/ * Translated using Weblate (Hebrew) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/he/ * Translated using Weblate (Spanish) Currently translated at 75.6% (394 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/es/ * Translated using Weblate (French) Currently translated at 86.3% (450 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (Portuguese) Currently translated at 98.2% (55 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/pt/ * Translated using Weblate (Portuguese) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/pt/ * Translated using Weblate (Dutch) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/nl/ * Translated using Weblate (Dutch) Currently translated at 84.6% (441 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/ * Translated using Weblate (German) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/de/ * Translated using Weblate (Catalan) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ca/ * Translated using Weblate (Dutch) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/nl/ * Translated using Weblate (Catalan) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/ca/ * Translated using Weblate (German) Currently translated at 88.2% (460 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/ * Translated using Weblate (Dutch) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 90.2% (470 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/ * Translated using Weblate (French) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 90.2% (470 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (French) Currently translated at 87.3% (455 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (Hebrew) Currently translated at 61.8% (322 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/he/ * Translated using Weblate (French) Currently translated at 87.3% (455 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (French) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fr/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 92.3% (481 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/ * Translated using Weblate (Catalan) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ca/ * Translated using Weblate (French) Currently translated at 87.3% (455 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (French) Currently translated at 87.5% (456 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (French) Currently translated at 87.7% (457 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (Catalan) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/ca/ * Translated using Weblate (Portuguese) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt/ * Translated using Weblate (Catalan) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ca/ * Translated using Weblate (Portuguese) Currently translated at 42.4% (221 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt/ * Translated using Weblate (Portuguese) Currently translated at 97.3% (73 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/pt/ * Translated using Weblate (Catalan) Currently translated at 99.8% (520 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/ * Translated using Weblate (Dutch) Currently translated at 100.0% (2 of 2 strings) Translation: Mastodon/Activerecord Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/nl/ * Translated using Weblate (Dutch) Currently translated at 100.0% (43 of 43 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/nl/ * Translated using Weblate (Dutch) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/nl/ * Translated using Weblate (Dutch) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/ * Translated using Weblate (Portuguese) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/pt/ * Translated using Weblate (German) Currently translated at 90.5% (472 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/ * Translated using Weblate (German) Currently translated at 90.7% (473 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/ * Translated using Weblate (German) Currently translated at 90.9% (474 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/ * Translated using Weblate (German) Currently translated at 91.1% (475 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/ * Translated using Weblate (Dutch) Currently translated at 90.4% (471 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/ * Translated using Weblate (German) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/de/ * Translated using Weblate (German) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/de/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 92.3% (481 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/ * Translated using Weblate (German) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/de/ * Translated using Weblate (German) Currently translated at 100.0% (2 of 2 strings) Translation: Mastodon/Activerecord Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/de/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/pt_BR/ * Translated using Weblate (Dutch) Currently translated at 90.5% (472 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Arabic) Currently translated at 44.1% (19 of 43 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/ar/ * Translated using Weblate (Norwegian (old code)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/no/ * Translated using Weblate (Arabic) Currently translated at 85.7% (48 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/ * Translated using Weblate (Arabic) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ar/ * Translated using Weblate (Arabic) Currently translated at 92.0% (69 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/ar/ * Translated using Weblate (Portuguese) Currently translated at 47.7% (249 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt/ * Translated using Weblate (Arabic) Currently translated at 29.9% (156 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ar/ * Translated using Weblate (Spanish) Currently translated at 99.8% (520 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/es/ * Translated using Weblate (Polish) Currently translated at 99.8% (520 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pl/ * Translated using Weblate (French) Currently translated at 99.6% (519 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (Spanish) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/es/ * Translated using Weblate (French) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/fr/ * Translated using Weblate (Spanish) Currently translated at 99.8% (520 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/es/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.2% (517 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Added translation using Weblate (Galician) * Translated using Weblate (Japanese) Currently translated at 99.6% (519 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/ * Translated using Weblate (Japanese) Currently translated at 92.8% (52 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ja/ * Translated using Weblate (Japanese) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/ja/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.4% (518 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/ * Translated using Weblate (Japanese) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/ * Translated using Weblate (Galician) Currently translated at 43.6% (107 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/ * Translated using Weblate (Japanese) Currently translated at 100.0% (43 of 43 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/ja/ * Translated using Weblate (Arabic) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/ar/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.4% (518 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/ * Translated using Weblate (Arabic) Currently translated at 96.4% (54 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/ * Translated using Weblate (Arabic) Currently translated at 31.2% (163 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ar/ * Translated using Weblate (Dutch) Currently translated at 91.5% (477 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/ * Translated using Weblate (French) Currently translated at 99.8% (520 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (Dutch) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/ * Translated using Weblate (Arabic) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/ar/ * Translated using Weblate (Arabic) Currently translated at 98.2% (55 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/ * Translated using Weblate (Dutch) Currently translated at 100.0% (521 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/ * Translated using Weblate (Dutch) Currently translated at 100.0% (521 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/ * Translated using Weblate (French) Currently translated at 99.8% (520 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (Norwegian (old code)) Currently translated at 50.6% (264 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/no/ * Translated using Weblate (Dutch) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/ * Translated using Weblate (Galician) Currently translated at 64.0% (157 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/ * Translated using Weblate (Dutch) Currently translated at 100.0% (2 of 2 strings) Translation: Mastodon/Activerecord Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/nl/ * Translated using Weblate (Dutch) Currently translated at 100.0% (43 of 43 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/nl/ * Translated using Weblate (Dutch) Currently translated at 100.0% (75 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/nl/ * Translated using Weblate (Norwegian (old code)) Currently translated at 100.0% (43 of 43 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/no/ * Translated using Weblate (Norwegian (old code)) Currently translated at 97.3% (73 of 75 strings) Translation: Mastodon/Doorkeeper Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/no/ * Translated using Weblate (Dutch) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/nl/ * Translated using Weblate (Norwegian (old code)) Currently translated at 96.4% (54 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/no/ * Translated using Weblate (Galician) Currently translated at 100.0% (245 of 245 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/ * Translated using Weblate (German) Currently translated at 95.2% (496 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/ * Translated using Weblate (German) Currently translated at 95.2% (496 of 521 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/ * i18n-tasks normalize && yarn manage:translations * Fix things --- app/javascript/mastodon/locales/ar.json | 2 +- app/javascript/mastodon/locales/bg.json | 2 +- app/javascript/mastodon/locales/ca.json | 2 +- app/javascript/mastodon/locales/de.json | 2 +- app/javascript/mastodon/locales/en.json | 2 +- app/javascript/mastodon/locales/eo.json | 2 +- app/javascript/mastodon/locales/es.json | 2 +- 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 | 259 ++++++++++++++++++ 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/id.json | 2 +- app/javascript/mastodon/locales/io.json | 2 +- app/javascript/mastodon/locales/it.json | 2 +- app/javascript/mastodon/locales/ja.json | 2 +- app/javascript/mastodon/locales/ko.json | 2 +- app/javascript/mastodon/locales/nl.json | 23 +- app/javascript/mastodon/locales/no.json | 2 +- app/javascript/mastodon/locales/pt-BR.json | 32 +-- app/javascript/mastodon/locales/pt.json | 2 +- app/javascript/mastodon/locales/ru.json | 2 +- app/javascript/mastodon/locales/sv.json | 2 +- app/javascript/mastodon/locales/th.json | 2 +- app/javascript/mastodon/locales/tr.json | 2 +- app/javascript/mastodon/locales/uk.json | 2 +- .../mastodon/locales/whitelist_gl.json | 2 + app/javascript/mastodon/locales/zh-HK.json | 2 +- app/javascript/mastodon/locales/zh-TW.json | 2 +- config/locales/ar.yml | 18 +- config/locales/de.yml | 31 ++- config/locales/devise.ja.yml | 10 +- config/locales/devise.no.yml | 6 +- config/locales/doorkeeper.ar.yml | 10 +- config/locales/doorkeeper.ja.yml | 16 +- config/locales/doorkeeper.nl.yml | 4 +- config/locales/doorkeeper.no.yml | 8 +- config/locales/fr.yml | 2 +- config/locales/ja.yml | 20 +- config/locales/nl.yml | 117 ++++++-- config/locales/no.yml | 36 ++- config/locales/pt-BR.yml | 77 +++++- config/locales/simple_form.ar.yml | 9 +- config/locales/simple_form.ja.yml | 10 +- config/locales/simple_form.nl.yml | 24 +- 47 files changed, 604 insertions(+), 164 deletions(-) create mode 100644 app/javascript/mastodon/locales/gl.json create mode 100644 app/javascript/mastodon/locales/whitelist_gl.json diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index a984b38d20..ec66a0027e 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "تحميل ...", "media_gallery.toggle_visible": "عرض / إخفاء", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index d20120b11e..1c04b3bfa3 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Зареждане...", "media_gallery.toggle_visible": "Toggle visibility", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index bfa931fc0f..f705937fd0 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Carregant...", "media_gallery.toggle_visible": "Alternar visibilitat", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index b6d9e27a77..6354f18b6d 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Wird geladen …", "media_gallery.toggle_visible": "Sichtbarkeit umschalten", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 538124904a..3633025b8b 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Loading...", "media_gallery.toggle_visible": "Toggle visibility", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 619c7320ac..9e66c379fc 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Ŝarganta…", "media_gallery.toggle_visible": "Baskuli videblecon", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 4116157448..6122a79abd 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Cargando…", "media_gallery.toggle_visible": "Cambiar visibilidad", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index aa5c21feb4..75057a7dd8 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "بارگیری...", "media_gallery.toggle_visible": "تغییر پیدایی", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index db9319e2ea..4ddc1cca74 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Ladataan...", "media_gallery.toggle_visible": "Toggle visibility", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 9b9469bc27..3db19c4706 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Chargement…", "media_gallery.toggle_visible": "Modifier la visibilité", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json new file mode 100644 index 0000000000..bb0b1a9fd8 --- /dev/null +++ b/app/javascript/mastodon/locales/gl.json @@ -0,0 +1,259 @@ +{ + "account.block": "Bloquear @{name}", + "account.block_domain": "Ocultar calquer contido de {domain}", + "account.disclaimer_full": "A información inferior podería mostrar un perfil incompleto da usuaria.", + "account.edit_profile": "Editar perfil", + "account.follow": "Seguir", + "account.followers": "Seguidoras", + "account.follows": "Seguindo", + "account.follows_you": "Séguena", + "account.hide_reblogs": "Ocultar repeticións de @{name}", + "account.media": "Medios", + "account.mention": "Mencionar @{name}", + "account.moved_to": "{name} marchou a:", + "account.mute": "Acalar @{name}", + "account.mute_notifications": "Acalar as notificacións de @{name}", + "account.posts": "Publicacións", + "account.report": "Informar sobre @{name}", + "account.requested": "Agardando aceptación. Pulse para cancelar a solicitude de seguimento", + "account.share": "Compartir o perfil de @{name}", + "account.show_reblogs": "Mostrar repeticións de @{name}", + "account.unblock": "Desbloquear @{name}", + "account.unblock_domain": "Non ocultar {domain}", + "account.unfollow": "Non seguir", + "account.unmute": "Non acalar @{name}", + "account.unmute_notifications": "Desbloquear as notificacións de @{name}", + "account.view_full_profile": "Ver o perfil completo", + "boost_modal.combo": "Pulse {combo} para saltar esto a próxima vez", + "bundle_column_error.body": "Houbo un fallo mentras se cargaba este compoñente.", + "bundle_column_error.retry": "Inténteo de novo", + "bundle_column_error.title": "Fallo na rede", + "bundle_modal_error.close": "Pechar", + "bundle_modal_error.message": "Algo fallou mentras se cargaba este compoñente.", + "bundle_modal_error.retry": "Inténteo de novo", + "column.blocks": "Usuarias bloqueadas", + "column.community": "Liña temporal local", + "column.favourites": "Favoritas", + "column.follow_requests": "Peticións de seguimento", + "column.home": "Inicio", + "column.lists": "Lists", + "column.mutes": "Usuarias acaladas", + "column.notifications": "Notificacións", + "column.pins": "Mensaxes fixadas", + "column.public": "Liña temporal federada", + "column_back_button.label": "Atrás", + "column_header.hide_settings": "Agochar axustes", + "column_header.moveLeft_settings": "Mover a columna hacia a esquerda", + "column_header.moveRight_settings": "Mover a columna hacia a dereita", + "column_header.pin": "Fixar", + "column_header.show_settings": "Mostras axustes", + "column_header.unpin": "Soltar", + "column_subheading.navigation": "Navegación", + "column_subheading.settings": "Axustes", + "compose_form.lock_disclaimer": "A súa conta non está {locked}. Calquera pode seguila para ver as súas mensaxes só-para-seguidoras.", + "compose_form.lock_disclaimer.lock": "bloqueado", + "compose_form.placeholder": "A qué andas?", + "compose_form.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive": "Marcar medios como sensibles", + "compose_form.spoiler": "Agochar texto detrás de un aviso", + "compose_form.spoiler_placeholder": "Escriba o aviso aquí", + "confirmation_modal.cancel": "Cancelar", + "confirmations.block.confirm": "Bloquear", + "confirmations.block.message": "Está segura de querer bloquear a {name}?", + "confirmations.delete.confirm": "Borrar", + "confirmations.delete.message": "Está segura de que quere eliminar este estado?", + "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.domain_block.confirm": "Agochar un dominio completo", + "confirmations.domain_block.message": "Realmente está segura de que quere bloquear por completo o dominio {domain}? Normalmente é suficiente, e preferible, bloquear de xeito selectivo varios elementos.", + "confirmations.mute.confirm": "Acalar", + "confirmations.mute.message": "Está segura de que quere acalar a {name}?", + "confirmations.unfollow.confirm": "Deixar de seguir", + "confirmations.unfollow.message": "Quere deixar de seguir a {name}?", + "embed.instructions": "Copie o código inferior para incrustar no seu sitio web este estado.", + "embed.preview": "Así será mostrado:", + "emoji_button.activity": "Actividade", + "emoji_button.custom": "Personalizado", + "emoji_button.flags": "Marcas", + "emoji_button.food": "Comida e Bebida", + "emoji_button.label": "Insertar emoji", + "emoji_button.nature": "Natureza", + "emoji_button.not_found": "Sen emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Obxetos", + "emoji_button.people": "Xente", + "emoji_button.recent": "Utilizadas con frecuencia", + "emoji_button.search": "Buscar...", + "emoji_button.search_results": "Resultados da busca", + "emoji_button.symbols": "Símbolos", + "emoji_button.travel": "Viaxes e Lugares", + "empty_column.community": "A liña temporal local está baldeira. Escriba algo de xeito público para que rule!", + "empty_column.hashtag": "Aínda non hai nada con esta etiqueta.", + "empty_column.home": "A súa liña temporal de inicio está baldeira! Visite {public} ou utilice a busca para atopar outras usuarias.", + "empty_column.home.public_timeline": "a liña temporal pública", + "empty_column.list": "Aínda non hai nada en esta lista.", + "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", + "follow_request.authorize": "Autorizar", + "follow_request.reject": "Rexeitar", + "getting_started.appsshort": "Aplicacións", + "getting_started.faq": "PMF", + "getting_started.heading": "Comezando", + "getting_started.open_source_notice": "Mastodon é software de código aberto. Pode contribuír ou informar de fallos en GitHub en {github}.", + "getting_started.userguide": "Guía de usuaria", + "home.column_settings.advanced": "Avanzado", + "home.column_settings.basic": "Básico", + "home.column_settings.filter_regex": "Filtrar expresións regulares", + "home.column_settings.show_reblogs": "Mostrar repeticións", + "home.column_settings.show_replies": "Mostrar respostas", + "home.settings": "Axustes da columna", + "keyboard_shortcuts.back": "voltar atrás", + "keyboard_shortcuts.boost": "repetir", + "keyboard_shortcuts.column": "destacar un estado en unha das columnas", + "keyboard_shortcuts.compose": "Foco no área de escritura", + "keyboard_shortcuts.description": "Descrición", + "keyboard_shortcuts.down": "ir hacia abaixo na lista", + "keyboard_shortcuts.enter": "abrir estado", + "keyboard_shortcuts.favourite": "marcar como favorito", + "keyboard_shortcuts.heading": "Atallos do teclado", + "keyboard_shortcuts.hotkey": "Tecla de acceso directo", + "keyboard_shortcuts.legend": "para mostrar esta lenda", + "keyboard_shortcuts.mention": "para mencionar o autor", + "keyboard_shortcuts.reply": "para responder", + "keyboard_shortcuts.search": "para centrar a busca", + "keyboard_shortcuts.toot": "escribir un toot novo", + "keyboard_shortcuts.unfocus": "quitar o foco do área de escritura/busca", + "keyboard_shortcuts.up": "ir hacia arriba na lista", + "lightbox.close": "Fechar", + "lightbox.next": "Seguinte", + "lightbox.previous": "Anterior", + "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": "Cargando...", + "media_gallery.toggle_visible": "Dar visibilidade", + "missing_indicator.label": "Non atopado", + "mute_modal.hide_notifications": "Esconder notificacións deste usuario?", + "navigation_bar.blocks": "Usuarios bloqueados", + "navigation_bar.community_timeline": "Liña temporal local", + "navigation_bar.edit_profile": "Editar perfil", + "navigation_bar.favourites": "Favoritas", + "navigation_bar.follow_requests": "Peticións de seguimento", + "navigation_bar.info": "Sobre esta instancia", + "navigation_bar.keyboard_shortcuts": "Atallos do teclado", + "navigation_bar.lists": "Lists", + "navigation_bar.logout": "Sair", + "navigation_bar.mutes": "Usuarias acaladas", + "navigation_bar.pins": "Mensaxes fixadas", + "navigation_bar.preferences": "Preferencias", + "navigation_bar.public_timeline": "Liña temporal federada", + "notification.favourite": "{name} marcou como favorito o seu estado", + "notification.follow": "{name} está a seguila", + "notification.mention": "{name} mencionoute", + "notification.reblog": "{name} promocionou o seu estado", + "notifications.clear": "Limpar notificacións", + "notifications.clear_confirmation": "Estás seguro de que queres limpar permanentemente todas as túas notificacións?", + "notifications.column_settings.alert": "Notificacións de escritorio", + "notifications.column_settings.favourite": "Favoritas:", + "notifications.column_settings.follow": "Novos seguidores:", + "notifications.column_settings.mention": "Mencións:", + "notifications.column_settings.push": "Enviar notificacións", + "notifications.column_settings.push_meta": "Este aparello", + "notifications.column_settings.reblog": "Promocións:", + "notifications.column_settings.show": "Mostrar en columna", + "notifications.column_settings.sound": "Reproducir son", + "onboarding.done": "Feito", + "onboarding.next": "Seguinte", + "onboarding.page_five.public_timelines": "A liña de tempo local mostra as publicacións públicas de todos en {domain}. A liña de tempo federada mostra as publicacións públicas de todos os que as persoas en {domain} seguen. Estas son as Liñas de tempo públicas, unha boa forma de descubrir novas persoas.", + "onboarding.page_four.home": "A liña de tempo local mostra as publicacións das persoas que segues.", + "onboarding.page_four.notifications": "A columna de notificacións mostra cando alguén interactúa contigo.", + "onboarding.page_one.federation": "Mastodon é unha rede de servidores independentes que se unen para facer unha rede social máis grande. Chamamos instancias a estes servidores.", + "onboarding.page_one.handle": "Estás en {domain}, polo que o teu nome de usuario completo é {handle}", + "onboarding.page_one.welcome": "Benvido a Mastodon!", + "onboarding.page_six.admin": "O administrador da túa instancia é {admin}.", + "onboarding.page_six.almost_done": "Case feito...", + "onboarding.page_six.appetoot": "Que tootes ben!", + "onboarding.page_six.apps_available": "Hai {apps} dispoñíbeis para iOS, Android e outras plataformas.", + "onboarding.page_six.github": "Mastodon é un software gratuito e de código aberto. Pode informar de erros, solicitar novas funcionalidades ou contribuír ao código en {github}.", + "onboarding.page_six.guidelines": "directrices da comunidade", + "onboarding.page_six.read_guidelines": "Por favor, le as {guidelines} do {domain}!", + "onboarding.page_six.various_app": "aplicacións móbiles", + "onboarding.page_three.profile": "Edita o teu perfil para cambiar o teu avatar, bio e nome. Alí, tamén atoparás outras preferencias.", + "onboarding.page_three.search": "Utilice a barra de busca para atopar xente e descubrir etiquetas, como {illustration} e {introductions}. Para atopar unha usuaria que non está en esta instancia utilice o seu enderezo completo.", + "onboarding.page_two.compose": "Escriba mensaxes desde a columna de composición. Pode subir imaxes, mudar as opcións de intimidade e engadir avisos sobre o contido coas iconas inferiores.", + "onboarding.skip": "Saltar", + "privacy.change": "Axustar a intimidade do estado", + "privacy.direct.long": "Enviar exclusivamente as usuarias mencionadas", + "privacy.direct.short": "Directa", + "privacy.private.long": "Enviar só as seguidoras", + "privacy.private.short": "Só-seguidoras", + "privacy.public.long": "Publicar na liña temporal pública", + "privacy.public.short": "Pública", + "privacy.unlisted.long": "Non publicar en liñas temporais públicas", + "privacy.unlisted.short": "Non listada", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}h", + "relative_time.just_now": "agora", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Cancelar", + "report.placeholder": "Comentarios adicionais", + "report.submit": "Enviar", + "report.target": "Informar {target}", + "search.placeholder": "Buscar", + "search_popout.search_format": "Formato de busca avanzada", + "search_popout.tips.hashtag": "etiqueta", + "search_popout.tips.status": "estado", + "search_popout.tips.text": "Texto simple devolve coincidencias con nomes públicos, nomes de usuaria e etiquetas", + "search_popout.tips.user": "usuaria", + "search_results.total": "{count, number} {count,plural,one {result} outros {results}}", + "standalone.public_title": "Ollada dentro...", + "status.cannot_reblog": "Esta mensaxe non pode ser promocionada", + "status.delete": "Eliminar", + "status.embed": "Incrustar", + "status.favourite": "Favorita", + "status.load_more": "Cargar máis", + "status.media_hidden": "Medios ocultos", + "status.mention": "Mencionar @{name}", + "status.more": "Máis", + "status.mute_conversation": "Acalar conversa", + "status.open": "Expandir este estado", + "status.pin": "Fixar no perfil", + "status.reblog": "Promocionar", + "status.reblogged_by": "{name} promocionado", + "status.reply": "Resposta", + "status.replyAll": "Resposta a conversa", + "status.report": "Informar @{name}", + "status.sensitive_toggle": "Pulse para ver", + "status.sensitive_warning": "Contido sensible", + "status.share": "Compartir", + "status.show_less": "Mostrar menos", + "status.show_more": "Mostrar máis", + "status.unmute_conversation": "Non acalar a conversa", + "status.unpin": "Despegar do perfil", + "tabs_bar.compose": "Compoñer", + "tabs_bar.federated_timeline": "Federado", + "tabs_bar.home": "Inicio", + "tabs_bar.local_timeline": "Local", + "tabs_bar.notifications": "Notificacións", + "ui.beforeunload": "O borrador perderase se sae de Mastodon.", + "upload_area.title": "Arrastre e solte para subir", + "upload_button.label": "Engadir medios", + "upload_form.description": "Describa para deficientes visuais", + "upload_form.undo": "Desfacer", + "upload_progress.label": "Subindo...", + "video.close": "Pechar video", + "video.exit_fullscreen": "Saír da pantalla completa", + "video.expand": "Expandir vídeo", + "video.fullscreen": "Pantalla completa", + "video.hide": "Agochar vídeo", + "video.mute": "Acalar son", + "video.pause": "Pausar", + "video.play": "Reproducir", + "video.unmute": "Permitir son" +} diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index ec1e30dd58..5444c8e34f 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "טוען...", "media_gallery.toggle_visible": "נראה\\בלתי נראה", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index c214826704..f70c66223c 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Učitavam...", "media_gallery.toggle_visible": "Preklopi vidljivost", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 71dd810b6f..7cb816fe93 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Betöltés...", "media_gallery.toggle_visible": "Toggle visibility", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 744423e78e..429b771826 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Tunggu sebentar...", "media_gallery.toggle_visible": "Tampil/Sembunyikan", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index b1523e6262..3e5c8edb9b 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Kargante...", "media_gallery.toggle_visible": "Chanjar videbleso", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 9a2d320fd9..e2ad1632a6 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Carico...", "media_gallery.toggle_visible": "Imposta visibilità", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index e015c41c22..652257aa18 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -24,7 +24,7 @@ "account.unmute": "ミュート解除", "account.unmute_notifications": "@{name}さんからの通知を受け取らない", "account.view_full_profile": "全ての情報を見る", - "boost_modal.combo": "次からは{combo}を押せば、これをスキップできます。", + "boost_modal.combo": "次からは{combo}を押せば、これをスキップできます", "bundle_column_error.body": "コンポーネントの読み込み中に問題が発生しました。", "bundle_column_error.retry": "再試行", "bundle_column_error.title": "ネットワークエラー", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 3f47baa763..472a52a99a 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "불러오는 중...", "media_gallery.toggle_visible": "표시 전환", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 26e86308dc..87261d7cde 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -7,6 +7,7 @@ "account.followers": "Volgers", "account.follows": "Volgt", "account.follows_you": "Volgt jou", + "account.hide_reblogs": "Verberg boosts van @{name}", "account.media": "Media", "account.mention": "Vermeld @{name}", @@ -107,22 +108,22 @@ "home.column_settings.show_reblogs": "Boosts tonen", "home.column_settings.show_replies": "Reacties tonen", "home.settings": "Kolom-instellingen", - "keyboard_shortcuts.back": "om terug te navigeren", + "keyboard_shortcuts.back": "om terug te gaan", "keyboard_shortcuts.boost": "om te boosten", - "keyboard_shortcuts.column": "om te focussen op een status in één van de kolommen", - "keyboard_shortcuts.compose": "om te focussen op het toot tekstvak", - "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.column": "om op een toot te focussen in één van de kolommen", + "keyboard_shortcuts.compose": "om het tekstvak voor toots te focussen", + "keyboard_shortcuts.description": "Omschrijving", "keyboard_shortcuts.down": "om naar beneden door de lijst te bewegen", "keyboard_shortcuts.enter": "to open status", - "keyboard_shortcuts.favourite": "om het te markeren als favoriet", - "keyboard_shortcuts.heading": "Keyboard Shortcuts", + "keyboard_shortcuts.favourite": "om als favoriet te markeren", + "keyboard_shortcuts.heading": "Sneltoetsen", "keyboard_shortcuts.hotkey": "Sneltoets", "keyboard_shortcuts.legend": "om deze legenda weer te geven", "keyboard_shortcuts.mention": "om de auteur te vermelden", - "keyboard_shortcuts.reply": "om te antwoorden", - "keyboard_shortcuts.search": "om te focussen op zoeken", + "keyboard_shortcuts.reply": "om te reageren", + "keyboard_shortcuts.search": "om het zoekvak te focussen", "keyboard_shortcuts.toot": "om een nieuwe toot te starten", - "keyboard_shortcuts.unfocus": "om te ontfocussen van het toot tekstvak/zoeken", + "keyboard_shortcuts.unfocus": "om het tekst- en zoekvak te ontfocussen", "keyboard_shortcuts.up": "om omhoog te bewegen in de lijst", "lightbox.close": "Sluiten", "lightbox.next": "Volgende", @@ -133,7 +134,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Laden…", "media_gallery.toggle_visible": "Media wel/niet tonen", @@ -204,7 +205,7 @@ "reply_indicator.cancel": "Annuleren", "report.placeholder": "Extra opmerkingen", "report.submit": "Verzenden", - "report.target": "Rapporteren van", + "report.target": "Rapporteer {target}", "search.placeholder": "Zoeken", "search_popout.search_format": "Geavanceerd zoeken", "search_popout.tips.hashtag": "hashtag", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 233b6c9461..bf2b6259a0 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Laster...", "media_gallery.toggle_visible": "Veksle synlighet", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 1df27d536b..6bac65865e 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -109,21 +109,21 @@ "home.settings": "Configurações de colunas", "keyboard_shortcuts.back": "para navegar de volta", "keyboard_shortcuts.boost": "para compartilhar", - "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.column": "Focar um status em uma das colunas", "keyboard_shortcuts.compose": "to focus the compose textarea", "keyboard_shortcuts.description": "Description", - "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.down": "para mover para baixo na lista", "keyboard_shortcuts.enter": "to open status", - "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.favourite": "para adicionar aos favoritos", "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.hotkey": "Hotkey", - "keyboard_shortcuts.legend": "to display this legend", - "keyboard_shortcuts.mention": "to mention author", - "keyboard_shortcuts.reply": "to reply", - "keyboard_shortcuts.search": "to focus search", - "keyboard_shortcuts.toot": "to start a brand new toot", - "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", - "keyboard_shortcuts.up": "to move up in the list", + "keyboard_shortcuts.hotkey": "Atalho", + "keyboard_shortcuts.legend": "para mostrar essa legenda", + "keyboard_shortcuts.mention": "para mencionar o autor", + "keyboard_shortcuts.reply": "para responder", + "keyboard_shortcuts.search": "para focar a pesquisa", + "keyboard_shortcuts.toot": "para compor um novo toot", + "keyboard_shortcuts.unfocus": "para remover o foco da área de composição/pesquisa", + "keyboard_shortcuts.up": "para mover para cima na lista", "lightbox.close": "Fechar", "lightbox.next": "Próximo", "lightbox.previous": "Anterior", @@ -133,19 +133,19 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Carregando...", "media_gallery.toggle_visible": "Esconder/Mostrar", "missing_indicator.label": "Não encontrado", - "mute_modal.hide_notifications": "Hide notifications from this user?", + "mute_modal.hide_notifications": "Esconder notificações deste usuário?", "navigation_bar.blocks": "Usuários bloqueados", "navigation_bar.community_timeline": "Local", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favoritos", "navigation_bar.follow_requests": "Seguidores pendentes", "navigation_bar.info": "Mais informações", - "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", + "navigation_bar.keyboard_shortcuts": "Atalhos de teclado", "navigation_bar.lists": "Lists", "navigation_bar.logout": "Sair", "navigation_bar.mutes": "Usuários silenciados", @@ -220,7 +220,7 @@ "status.load_more": "Carregar mais", "status.media_hidden": "Mídia escondida", "status.mention": "Mencionar @{name}", - "status.more": "More", + "status.more": "Mais", "status.mute_conversation": "Silenciar conversa", "status.open": "Expandir", "status.pin": "Fixar no perfil", @@ -241,7 +241,7 @@ "tabs_bar.home": "Página inicial", "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notificações", - "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", + "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", "upload_form.description": "Descreva a imagem para deficientes visuais", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json index 3d3e195714..728fb3a10e 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "A carregar...", "media_gallery.toggle_visible": "Esconder/Mostrar", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 0aef2d9df2..e9925b675b 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Загрузка...", "media_gallery.toggle_visible": "Показать/скрыть", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 53090452f3..9d9646509f 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Laddar...", "media_gallery.toggle_visible": "Växla synlighet", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 2f064a1931..cc18a60962 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Loading...", "media_gallery.toggle_visible": "Toggle visibility", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index be8103d1c6..c51f3e4177 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Yükleniyor...", "media_gallery.toggle_visible": "Görünürlüğü değiştir", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 2736614628..86c0ce76d7 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "Завантаження...", "media_gallery.toggle_visible": "Показати/приховати", diff --git a/app/javascript/mastodon/locales/whitelist_gl.json b/app/javascript/mastodon/locales/whitelist_gl.json new file mode 100644 index 0000000000..0d4f101c7a --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_gl.json @@ -0,0 +1,2 @@ +[ +] diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index dbb9584c6f..15a68c915b 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "載入中...", "media_gallery.toggle_visible": "打開或關上", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 0b05a83cd8..1bdc883a88 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -133,7 +133,7 @@ "lists.edit": "Edit list", "lists.new.create": "Add list", "lists.new.title_placeholder": "New list title", - "lists.search": "Search among follows", + "lists.search": "Search among people you follow", "lists.subheading": "Your lists", "loading_indicator.label": "讀取中...", "media_gallery.toggle_visible": "切換可見性", diff --git a/config/locales/ar.yml b/config/locales/ar.yml index a96b353c18..cc95941791 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -57,6 +57,19 @@ ar: order: title: الترتيب profile_url: رابط الملف الشخصي + custom_emojis: + delete: حذف + email_domain_blocks: + delete: حذف + reports: + delete: حذف + settings: + registrations: + deletion: + desc_html: السماح لأي مستخدم إغلاق حسابه + statuses: + batch: + delete: حذف application_mailer: settings: 'تغيير تفضيلات البريد الإلكتروني : %{link}' signature: إشعارات ماستدون من %{instance} @@ -65,6 +78,7 @@ ar: invalid_url: إن الرابط المقدم غير صالح auth: change_password: الهوية + delete_account: حذف حساب didnt_get_confirmation: لم تتلق تعليمات التأكيد ؟ forgot_password: نسيت كلمة المرور ؟ login: تسجيل الدخول @@ -91,6 +105,8 @@ ar: x_minutes: "%{count}د" x_months: "%{count} شه" x_seconds: "%{count}ث" + deletes: + proceed: حذف حساب exports: blocks: قمت بحظر csv: CSV @@ -197,7 +213,7 @@ ar: recovery_codes: النسخ الإحتياطي لرموز الإسترجاع recovery_codes_regenerated: تم إعادة توليد رموز الإسترجاع الإحتياطية بنجاح setup: تنشيط - wrong_code: الرمز الذي أدخلته غير صالح. تحقق من صحة الوقت على الخادم و الجهاز. + wrong_code: الرمز الذي أدخلته غير صالح ! تحقق من صحة الوقت على الخادم و الجهاز ؟ users: invalid_email: عنوان البريد الإلكتروني غير صالح invalid_otp_token: الرمز الثنائي غير صالح diff --git a/config/locales/de.yml b/config/locales/de.yml index 470395767c..39867e3737 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -49,7 +49,7 @@ de: reserved_username: Dieser Profilname ist belegt roles: admin: Admin - moderator: Mod + moderator: Moderator unfollow: Entfolgen admin: account_moderation_notes: @@ -174,6 +174,7 @@ de: shortcode: Shortcode shortcode_hint: Mindestens 2 Zeichen, nur Buchstaben, Ziffern und Unterstriche title: Eigene Emojis + updated_msg: Emoji erfolgreich aktualisiert! upload: Hochladen domain_blocks: add_new: Neu hinzufügen @@ -223,6 +224,13 @@ de: reset: Zurücksetzen search: Suchen title: Bekannte Instanzen + invites: + filter: + all: Alle + available: Verfügbar + expired: Ausgelaufen + title: Filter + title: Einladungen reports: action_taken_by: Maßnahme ergriffen durch are_you_sure: Bist du dir sicher? @@ -261,6 +269,8 @@ de: deletion: desc_html: Allen erlauben, ihr Konto eigenmächtig zu löschen title: Kontolöschung erlauben + min_invite_role: + disabled: Niemand open: desc_html: Allen erlauben, ein Konto zu erstellen title: Registrierung öffnen @@ -412,12 +422,31 @@ de: following: Folgeliste muting: Stummschaltungsliste upload: Hochladen + invites: + delete: Deaktivieren + expires_in: + '1800': 30 Minuten + '21600': 6 Stunden + '3600': 1 Stunde + '43200': 12 Stunden + '86400': 1 Tag + expires_in_prompt: Nie + generate: Generieren + max_uses: + one: 1 mal verwendet + other: "%{count} mal verwendet" + max_uses_prompt: Kein Limit landing_strip_html: "%{name} hat ein Profil auf %{link_to_root_path}. Du kannst folgen oder interagieren, sofern du ein Konto irgendwo im Fediversum hast." landing_strip_signup_html: Wenn nicht, kannst du dich hier anmelden. media_attachments: validations: images_and_video: Es kann kein Video an einen Beitrag, der bereits Bilder enthält, angehängt werden too_many: Es können nicht mehr als 4 Bilder angehängt werden + migrations: + acct: benutzername@domain des neuen Accounts + proceed: Speichern + moderation: + title: Moderation notification_mailer: digest: body: 'Hier ist eine kurze Zusammenfasung dessen, was du auf %{instance} seit deinem letzten Besuch am %{since} verpasst hast:' diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml index aa333920e9..2cd20732f5 100644 --- a/config/locales/devise.ja.yml +++ b/config/locales/devise.ja.yml @@ -51,11 +51,11 @@ ja: unlocked: アカウントロックは正常に解除されました。続行するにはログインしてください。 errors: messages: - already_confirmed: は確認されました。ログインを試してください。 - confirmation_period_expired: "%{period}以内に確認が必要です。再度試してください。" - expired: は期限切れです。再度試してください。 - not_found: 見つかりません。 - not_locked: ロックされていません。 + already_confirmed: は確認されました。ログインを試してください + confirmation_period_expired: "%{period}以内に確認が必要です。再度試してください" + expired: は期限切れです。再度試してください + not_found: 見つかりません + not_locked: ロックされていません not_saved: one: エラーが発生したため、%{resource}の保存に失敗しました。 other: "%{count}個のエラーが発生したため、保存に失敗しました。 %{resource}" diff --git a/config/locales/devise.no.yml b/config/locales/devise.no.yml index 1bb14d265c..5d3e714950 100644 --- a/config/locales/devise.no.yml +++ b/config/locales/devise.no.yml @@ -34,7 +34,7 @@ updated: Passordet ditt er endret. Du er nå logget inn. updated_not_active: Passordet ditt er endret. registrations: - destroyed: Adjø! Kontoen din er slettet. På gjensyn! + destroyed: Adjø! Kontoen din er slettet. På gjensyn. signed_up: Velkommen! Registreringen var vellykket. signed_up_but_inactive: Registreringen var vellykket. Vi kunne dessverre ikke logge deg inn fordi kontoen din ennå ikke har blitt aktivert. signed_up_but_locked: Registreringen var vellykket. Vi kunne dessverre ikke logge deg inn fordi kontoen din har blitt låst. @@ -51,8 +51,8 @@ unlocked: Kontoen din ble åpnet uten problemer. Logg på for å fortsette. errors: messages: - already_confirmed: har allerede blitt bekreftet, prøv å logge på istedet. - confirmation_period_expired: må bekreftes innen %{period}. Spør om en ny e-mail for bekreftelse istedet. + already_confirmed: har allerede blitt bekreftet, prøv å logge på istedet + confirmation_period_expired: må bekreftes innen %{period}. Spør om en ny e-post for bekreftelse istedet expired: har utløpt, spør om en ny en istedet not_found: ikke funnet not_locked: var ikke låst diff --git a/config/locales/doorkeeper.ar.yml b/config/locales/doorkeeper.ar.yml index 1925d5a653..1076778378 100644 --- a/config/locales/doorkeeper.ar.yml +++ b/config/locales/doorkeeper.ar.yml @@ -5,6 +5,8 @@ ar: doorkeeper/application: name: التسمية redirect_uri: Redirect URI + scopes: المجالات + website: تطبيق الويب errors: models: doorkeeper/application: @@ -33,9 +35,13 @@ ar: redirect_uri: إستخدم خطا واحدا لكل رابط scopes: Separate scopes with spaces. Leave blank to use the default scopes. index: + application: تطبيق callback_url: رابط رد النداء + delete: حذف name: التسمية new: تطبيق جديد + scopes: المجالات + show: عرض title: تطبيقاتك new: title: تطبيق جديد @@ -43,7 +49,7 @@ ar: actions: Actions application_id: معرف التطبيق callback_urls: روابط رد النداء - scopes: Scopes + scopes: المجالات secret: السر title: 'تطبيق : %{name}' authorizations: @@ -67,7 +73,7 @@ ar: application: التطبيق created_at: صُرّح له في date_format: "%d-%m-%Y %H:%M:%S" - scopes: Scopes + scopes: المجالات title: تطبيقاتك المرخص لها errors: messages: diff --git a/config/locales/doorkeeper.ja.yml b/config/locales/doorkeeper.ja.yml index 1f145eaa3e..96956c60f9 100644 --- a/config/locales/doorkeeper.ja.yml +++ b/config/locales/doorkeeper.ja.yml @@ -29,10 +29,10 @@ ja: edit: title: アプリの編集 form: - error: フォームにエラーが無いか確認してください。 + error: フォームにエラーが無いか確認してください help: native_redirect_uri: ローカルテストに %{native_redirect_uri} を使用 - redirect_uri: 一行に一つのURLを入力してください。 + redirect_uri: 一行に一つのURLを入力してください scopes: アクセス権は半角スペースで区切ることができます。 空白のままにするとデフォルトを使用します。 index: application: アプリ @@ -57,11 +57,11 @@ ja: authorize: 承認 deny: 拒否 error: - title: エラーが発生しました。 + title: エラーが発生しました new: able_to: このアプリは以下のことができます - prompt: アプリ %{client_name} があなたのアカウントへのアクセスを要求しています。 - title: 認証が必要です。 + prompt: アプリ %{client_name} があなたのアカウントへのアクセスを要求しています + title: 認証が必要です show: title: 認証コードをコピーしてアプリに貼り付けて下さい。 authorized_applications: @@ -83,12 +83,12 @@ ja: invalid_grant: 指定された認証許可は無効であるか、期限切れ、取り消されている、リダイレクトURIの不一致、または別のクライアントに発行されています。 invalid_redirect_uri: 無効なリダイレクトURIが含まれています。 invalid_request: リクエストに必要なパラメータが欠けているか、サポートされていないパラメータが含まれている、または不正なフォーマットです。 - invalid_resource_owner: 指定されたリソース所有者のクレデンシャルが無効であるか、リソース所有者が見つかりません。 + invalid_resource_owner: 指定されたリソース所有者のクレデンシャルが無効であるか、リソース所有者が見つかりません invalid_scope: 要求されたアクセス権は無効であるか、不明、または不正なフォーマットです。 invalid_token: expired: アクセストークンの有効期限が切れています - revoked: アクセストークンは取り消されています。 - unknown: アクセストークンが無効です。 + revoked: アクセストークンは取り消されています + unknown: アクセストークンが無効です resource_owner_authenticator_not_configured: Doorkeeper.configure.resource_owner_authenticator が設定されていないため、リソース所有者の検索に失敗しました。 server_error: 認証サーバーに予期せぬ例外が発生したため、リクエストを実行できなくなりました。 temporarily_unavailable: 現在、認証サーバーに一時的な過負荷が掛かっているか、またはメンテナンス中のため、リクエストを処理できません。 diff --git a/config/locales/doorkeeper.nl.yml b/config/locales/doorkeeper.nl.yml index 3dd0a7d264..5c9c9047f2 100644 --- a/config/locales/doorkeeper.nl.yml +++ b/config/locales/doorkeeper.nl.yml @@ -60,10 +60,10 @@ nl: title: Er is een fout opgetreden new: able_to: Deze toepassing zal in staat zijn om - prompt: "%{client_name} autoriseren om je account te gebruiken" + prompt: "%{client_name} autoriseren om jouw account te gebruiken" title: Autorisatie vereist show: - title: Kopieer deze autorisatiecode en plak het in de applicatie. + title: Kopieer deze autorisatiecode en plak het in de toepassing. authorized_applications: buttons: revoke: Intrekken diff --git a/config/locales/doorkeeper.no.yml b/config/locales/doorkeeper.no.yml index ba061e0cac..5b4dc9d6cd 100644 --- a/config/locales/doorkeeper.no.yml +++ b/config/locales/doorkeeper.no.yml @@ -5,6 +5,7 @@ doorkeeper/application: name: Navn redirect_uri: Omdirigerings-URI + website: Applikasjonsnettside errors: models: doorkeeper/application: @@ -33,9 +34,12 @@ redirect_uri: Bruk én linje per URI scopes: Adskill omfang med mellomrom. La det være blankt for å bruke standard omfang. index: + application: Applikasjon callback_url: Callback-URL + delete: Fjern name: Navn new: Ny applikasjon + show: Vis title: Dine applikasjoner new: title: Nye applikasjoner @@ -57,7 +61,7 @@ prompt: Applikasjon %{client_name} spør om tilgang til din konto title: Autorisasjon påkrevd show: - title: Copy this authorization code and paste it to the application. + title: Kopier denne koden og lim den inn i programmet. authorized_applications: buttons: revoke: Opphev @@ -77,7 +81,7 @@ invalid_grant: Autoriseringen er ugyldig, utløpt, opphevet, stemmer ikke overens med omdirigerings-URIen eller var utstedt til en annen klient. invalid_redirect_uri: Den inkluderte omdirigerings-URLen er ikke gyldig. invalid_request: Forespørslen mangler en eller flere parametere, inkluderte en parameter som ikke støttes eller har feil struktur. - invalid_resource_owner: Ressurseierens detaljer er ikke gyldige, eller så kan ikke eieren finnes. + invalid_resource_owner: Ressurseierens detaljer er ikke gyldige, eller så er det ikke mulig å finne eieren invalid_scope: Det etterspurte omfanget er ugyldig, ukjent eller har feil struktur. invalid_token: expired: Tilgangsbeviset har utløpt diff --git a/config/locales/fr.yml b/config/locales/fr.yml index cd97f59673..278cb053d9 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -454,7 +454,7 @@ fr: table: expires_at: Expire uses: Utilise - title: Personnes invitées + title: Inviter des gens landing_strip_html: %{name} utilise %{link_to_root_path}. Vous pouvez læ suivre et interagir si vous possédez un compte quelque part dans le "fediverse". landing_strip_signup_html: Si ce n’est pas le cas, vous pouvez en créer un ici. media_attachments: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 38f5da5a9d..193be00f7c 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -24,7 +24,7 @@ ja: within_reach_body: デベロッパーフレンドリーな API により実現された、iOS や Android、その他様々なプラットフォームのためのアプリでどこでも友人とやりとりできます。 within_reach_title: いつでも身近に find_another_instance: 他のインスタンスを探す - generic_description: "%{domain} は、Mastodon インスタンスの一つです。" + generic_description: "%{domain} は、Mastodon インスタンスの一つです" hosted_on: Mastodon hosted on %{domain} learn_more: もっと詳しく other_instances: 他のインスタンス @@ -40,13 +40,13 @@ ja: following: フォロー中 media: メディア moved_html: "%{name} さんは引っ越しました %{new_profile_link}:" - nothing_here: 何もありません + nothing_here: 何もありません! people_followed_by: "%{name} さんがフォロー中のアカウント" people_who_follow: "%{name} さんをフォロー中のアカウント" posts: トゥート posts_with_replies: トゥートと返信 remote_follow: リモートフォロー - reserved_username: このユーザー名は予約されています。 + reserved_username: このユーザー名は予約されています roles: admin: Admin moderator: Mod @@ -56,9 +56,9 @@ ja: account: モデレータ create: 書き込む created_at: 日付 - created_msg: モデレーションメモを書き込みました + created_msg: モデレーションメモを書き込みました! delete: 削除 - destroyed_msg: モデレーションメモを削除しました + destroyed_msg: モデレーションメモを削除しました! accounts: are_you_sure: 本当に実行しますか? by_domain: ドメイン @@ -163,25 +163,25 @@ ja: copied_msg: 絵文字のコピーをローカルに作成しました copy: コピー copy_failed_msg: 絵文字のコピーをローカルに作成できませんでした - created_msg: 絵文字の追加に成功しました + created_msg: 絵文字の追加に成功しました! delete: 削除 - destroyed_msg: 絵文字の削除に成功しました + destroyed_msg: 絵文字の削除に成功しました! disable: 無効化 disabled_msg: 絵文字を無効化しました emoji: 絵文字 enable: 有効化 enabled_msg: 絵文字を有効化しました - image_hint: 50KBまでのPNG画像を利用できます。 + image_hint: 50KBまでのPNG画像を利用できます listed: 収載 new: title: 新規カスタム絵文字の追加 overwrite: 上書き shortcode: ショートコード - shortcode_hint: 2文字以上の半角英数字とアンダーバーのみ利用できます。 + shortcode_hint: 2文字以上の半角英数字とアンダーバーのみ利用できます title: カスタム絵文字 unlisted: 未収載 update_failed_msg: 絵文字を更新できませんでした - updated_msg: 絵文字の更新に成功しました + updated_msg: 絵文字の更新に成功しました! upload: アップロード domain_blocks: add_new: 新規追加 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 2410c11125..c72b092a39 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -85,9 +85,9 @@ nl: local: Lokaal remote: Extern title: Locatie - login_status: Aanmeld status - media_attachments: Media-bijlagen - memorialize: Verander in memoriam + login_status: Aanmeldstatus + media_attachments: Mediabijlagen + memorialize: Verander naar in memoriam moderation: all: Alles silenced: Genegeerd @@ -115,8 +115,8 @@ nl: role: Permissies roles: admin: Beheerder - moderator: Moderateur - user: Persoon + moderator: Moderator + user: Gebruiker salmon_url: Salmon-URL search: Zoeken shared_inbox_url: Gedeelde inbox-URL @@ -135,22 +135,30 @@ nl: web: Webapp action_logs: actions: - confirm_user: "%{name} bevestigd e-mailadres van persoon %{target}" - create_custom_emoji: "%{name} heeft de nieuwe emoji %{target} geupload" - create_domain_block: "%{name} heeft domein %{target} geblokkeerd" - create_email_domain_block: "%{name} heeft e-maildomein %{target} geblacklist" - demote_user: "%{name} heeft persoon %{target} gedegradeerd" - destroy_domain_block: "%{name} heeft domein %{target} vrijgegeven" - destroy_email_domain_block: "%{name} heeft e-maildomein %{target} gewhitelist" - destroy_status: "%{name} heeft status van %{target} verwijderd" - disable_2fa_user: "%{name} heeft tweefactor voorwaarden van persoon %{target} uitgeschakeld" - disable_custom_emoji: "%{name} heeft emoji %{target} uitgeschakeld" - disable_user: "%{name} heeft de login van persoon %{target} uitgeschakeld" - enable_custom_emoji: "%{name} heeft emoji %{target} ingeschakeld" - enable_user: "%{name} heeft de login voor persoon %{target} ingeschakeld" - memorialize_account: "%{name} heeft %{target}'s account gewijzigd in een memoriam pagina" - promote_user: "%{name} heeft persoon %{target} gepromoveerd" - reset_password_user: "%{name} heeft het wachtwoord van gebruiker %{target} opnieuw ingesteld" + confirm_user: E-mailadres van gebruiker %{target} is door %{name} bevestigd + create_custom_emoji: Nieuwe emoji %{target} is door %{name} geüpload + create_domain_block: Domein %{target} is door %{name} geblokkeerd + create_email_domain_block: E-maildomein %{target} is door %{name} op de zwarte lijst geplaatst + demote_user: Gebruiker %{target} is door %{name} gedegradeerd + destroy_domain_block: Domein %{target} is door %{name} gedeblokkeerd + destroy_email_domain_block: E-maildomein %{target} is door %{name} op de whitelist geplaatst + destroy_status: Toot van %{target} is door %{name} verwijderd + disable_2fa_user: Vereisten tweestapsverificatie van %{target} zijn door %{name} uitgeschakeld + disable_custom_emoji: Emoji %{target} is door %{name} uitgeschakeld + disable_user: Inloggen voor %{target} is door %{name} uitgeschakeld + enable_custom_emoji: Emoji %{target} is door %{name} ingeschakeld + enable_user: Inloggen voor %{target} is door %{name} ingeschakeld + memorialize_account: Account %{target} is door %{name} in een in-memoriampagina veranderd + promote_user: Gebruiker %{target} is door %{name} gepromoveerd + reset_password_user: Wachtwoord van gebruiker %{target} is door %{name} opnieuw ingesteld + resolve_report: Gerapporteerde toots van %{target} zijn door %{name} verworpen + silence_account: Account %{target} is door %{name} genegeerd + suspend_account: Account %{target} is door %{name} opgeschort + unsilence_account: Negeren van account %{target} is door %{name} opgeheven + unsuspend_account: Opschorten van account %{target} is door %{name} opgeheven + update_custom_emoji: Emoji %{target} is door %{name} bijgewerkt + update_status: De toots van %{target} zijn door %{name} bijgewerkt + title: Auditlog custom_emojis: copied_msg: Lokale kopie van emoji maken geslaagd copy: Kopiëren @@ -164,11 +172,16 @@ nl: enable: Inschakelen enabled_msg: Inschakelen van deze emoji geslaagd image_hint: PNG van max. 50KB + listed: Weergegeven new: title: Lokale emoji toevoegen + overwrite: Overschrijven shortcode: Shortcode shortcode_hint: Tenminste 2 tekens (alleen alfanumeriek en underscores) title: Lokale emoji’s + unlisted: Niet weergegeven + update_failed_msg: Deze emoji kon niet worden bijgewerkt + updated_msg: Bijwerken van emoji is geslaagd! upload: Uploaden domain_blocks: add_new: Nieuwe toevoegen @@ -185,7 +198,7 @@ nl: suspend: Opschorten title: Nieuwe domeinblokkade reject_media: Mediabestanden verwerpen - reject_media_hint: Verwijderd lokaal opgeslagen mediabestanden en weigert deze in de toekomst te downloaden. Irrelevant voor opgeschorte domeinen. + reject_media_hint: Verwijderd lokaal opgeslagen mediabestanden en weigert deze in de toekomst te downloaden. Irrelevant voor opgeschorte domeinen severities: noop: Geen silence: Negeren @@ -197,7 +210,7 @@ nl: other: "%{count} accounts in de database aangepast" retroactive: silence: Alle genegeerde accounts van dit domein niet meer negeren - suspend: Alle opgeschorste accounts van dit domein niet meer opschorten + suspend: Alle opgeschorte accounts van dit domein niet meer opschorten title: Domeinblokkade voor %{domain} ongedaan maken undo: Ongedaan maken title: Domeinblokkades @@ -218,6 +231,13 @@ nl: reset: Opnieuw search: Zoeken title: Bekende servers + invites: + filter: + all: Alles + available: Beschikbaar + expired: Verlopen + title: Filter + title: Uitnodigingen reports: action_taken_by: Actie uitgevoerd door are_you_sure: Weet je het zeker? @@ -256,21 +276,27 @@ nl: deletion: desc_html: Toestaan dat iedereen hun eigen account kan verwijderen title: Verwijderen account toestaan + min_invite_role: + disabled: Niemand + title: Uitnodigingen toestaan door open: desc_html: Toestaan dat iedereen een account kan registereren title: Open registratie + show_staff_badge: + desc_html: Medewerkersbadge op profielpagina tonen + title: Medewerkersbadge tonen site_description: - desc_html: Dit wordt als een alinea op de voorpagina getoond en gebruikt als meta-tag in de paginabron.
Je kan HTML gebruiken, zoals <a> en <em>. + desc_html: Dit wordt als een alinea op de voorpagina getoond en gebruikt als meta-tag in de paginabron.
Je kan HTML gebruiken, zoals <a> en <em>. title: Omschrijving Mastodon-server site_description_extended: desc_html: Wordt op de uitgebreide informatiepagina weergegeven
Je kan ook hier HTML gebruiken title: Uitgebreide omschrijving Mastodon-server site_terms: - desc_html: Je kan hier jouw eigen privacybeleid, gebruikersvoorwaarden en ander juridisch jargon kwijt. Je kan HTML gebruiken. + desc_html: Je kan hier jouw eigen privacybeleid, gebruikersvoorwaarden en ander juridisch jargon kwijt. Je kan HTML gebruiken title: Aangepaste gebruikersvoorwaarden site_title: Naam Mastodon-server thumbnail: - desc_html: Gebruikt als voorvertoning voor OpenGraph en de API. 1200x630px aanbevolen. + desc_html: Gebruikt als voorvertoning voor OpenGraph en de API. 1200x630px aanbevolen title: Thumbnail Mastodon-server timeline_preview: desc_html: Toon de openbare tijdlijn op de startpagina @@ -326,6 +352,8 @@ nl: invalid_reset_password_token: De code om jouw wachtwoord opnieuw in te stellen is verlopen. Vraag een nieuwe aan. login: Aanmelden logout: Afmelden + migrate_account: Naar een andere account verhuizen + migrate_account_html: Wanneer je dit account naar een ander account wilt doorverwijzen, kun je dit hier instellen. register: Registreren resend_confirmation: Verstuur de bevestigingsinstructies nogmaals reset_password: Wachtwoord opnieuw instellen @@ -369,7 +397,7 @@ nl: '422': content: Veiligheidsverificatie mislukt. Blokkeer je toevallig cookies? title: Veiligheidsverificatie mislukt - '429': Te veel verbindingsaanvragen. + '429': Te veel verbindingsaanvragen '500': content: Het spijt ons, er is aan onze kant iets fout gegaan. title: Er is iets mis @@ -407,12 +435,40 @@ nl: following: Volglijst muting: Negeerlijst upload: Uploaden + in_memoriam_html: In memoriam. + invites: + delete: Deactiveren + expired: Verlopen + expires_in: + '1800': 30 minuten + '21600': 6 uur + '3600': 1 uur + '43200': 12 uur + '86400': 1 dag + expires_in_prompt: Nooit + generate: Genereren + max_uses: + one: 1 keer + other: "%{count} keer" + max_uses_prompt: Onbeperkt + prompt: Genereer en deel speciale links om mensen toegang tot deze Mastodon-server te geven + table: + expires_at: Verloopt op + uses: Aantal keer te gebruiken + title: Mensen uitnodigen landing_strip_html: "%{name} is een gebruiker op %{link_to_root_path}. Je kunt deze volgen en ermee communiceren als je op Mastodon (of ergens anders in de fediverse) een account hebt." landing_strip_signup_html: Als je dat niet hebt, kun je je hier registreren. media_attachments: validations: images_and_video: Een video kan niet aan een toot met afbeeldingen worden gekoppeld too_many: Er kunnen niet meer dan 4 afbeeldingen toegevoegd worden + migrations: + acct: gebruikersnaam@domein van het nieuwe account + currently_redirecting: 'Jouw profiel wordt nu doorverwezen naar:' + proceed: Opslaan + updated_msg: Jouw accountmigratie-instelling is succesvol bijgewerkt! + moderation: + title: Moderatie notification_mailer: digest: body: 'Hier is een korte samenvatting van wat je hebt gemist op %{instance} sinds jouw laatste bezoek op %{since}:' @@ -448,7 +504,7 @@ nl: quadrillion: Q thousand: K trillion: T - unit: '' + unit: " " pagination: next: Volgende prev: Vorige @@ -525,6 +581,7 @@ nl: export: Exporteren followers: Geautoriseerde volgers import: Importeren + migrate: Accountmigratie notifications: Meldingen preferences: Voorkeuren settings: Instellingen @@ -621,6 +678,8 @@ nl:

Originally adapted from the Discourse privacy policy.

title: "%{instance} Terms of Service and Privacy Policy" + themes: + default: Mastodon time: formats: default: "%d %B %Y om %H:%M" @@ -637,7 +696,7 @@ nl: manual_instructions: Hieronder vind je de geheime code in platte tekst. Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren. 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. Zorg ervoor dat je de herstelcodes op een veilige plek bewaard. (Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren.) + 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. Zorg ervoor dat je de herstelcodes op een veilige plek bewaard. Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren. setup: Instellen wrong_code: De ingevoerde code is ongeldig! Klopt de systeemtijd van de server en die van jouw apparaat? users: diff --git a/config/locales/no.yml b/config/locales/no.yml index 207f86afcd..57f8547fcb 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1,13 +1,23 @@ --- 'no': about: + about_hashtag_html: Dette er offentlige toots merket med #%{hashtag}. Du kan interagere med dem om du har en konto et sted i fediverset. about_mastodon_html: Mastodon er et sosialt nettverk laget med fri programvare. Et desentralisert alternativ til kommersielle plattformer. Slik kan det unngå risikoene ved å ha et enkelt selskap som monopoliserer din kommunikasjon. Velg en tjener du stoler på — uansett hvilken du velger så kan du kommunisere med alle andre. Alle kan kjøre sin egen Mastodon og delta sømløst i det sosiale nettverket. about_this: Om denne instansen closed_registrations: Registreringer er for øyeblikket lukket på denne instansen. contact: Kontakt + contact_missing: Ikke innstilt + contact_unavailable: Ikke tilgjengelig description_headline: Hva er %{domain}? domain_count_after: andre instanser domain_count_before: Koblet til + extended_description_html: | +

En god plassering for regler

+

En utvidet beskrivelse er ikke satt opp ennå.

+ features: + humane_approach_title: En mer menneskelig tilnærming + not_a_product_body: Mastodon er ikke et kommerst nettverk. Ingen reklame, ingen datainnsamling, ingen innhegnede hager. Det finnes ingen sentral myndighet. + not_a_product_title: Du er en person, ikke et produkt other_instances: Andre instanser source_code: Kildekode status_count_after: statuser @@ -29,7 +39,7 @@ are_you_sure: Er du sikker? confirm: Bekreft confirmed: Bekreftet - disable_two_factor_authentication: Disable 2FA + disable_two_factor_authentication: Skru av 2FA display_name: Visningsnavn domain: Domene edit: Redigér @@ -81,12 +91,12 @@ create: Lag blokkering hint: Domeneblokkeringen vil ikke hindre opprettelse av kontooppføringer i databasen, men vil retroaktivt og automatisk benytte spesifikke moderasjonsmetoder på de kontoene. severity: - desc_html: "Målbind vil gjøre kontoens poster usynlige for alle som ikke følger den. Utvis fjerner alt innhold, media og profildata fra kontoen." + desc_html: "Målbind gjør kontoens poster usynlige for alle som ikke følger den. Utvis fjerner alt innhold, media og profildata fra kontoen. Bruk Ingen hvis du bare vil fjerne mediafiler." silence: Målbind suspend: Utvis title: Ny domeneblokkering reject_media: Avvis mediefiler - reject_media_hint: Fjerner lokalt lagrede mediefiler og nekter å laste dem ned i fremtiden. Irrelevant for utvisninger. + reject_media_hint: Fjerner lokalt lagrede mediefiler og nekter å laste dem ned i fremtiden. Irrelevant for utvisninger severities: silence: Målbind suspend: Utvis @@ -136,7 +146,7 @@ open: title: Åpen registrering site_description: - desc_html: Vises som et avsnitt på forsiden og brukes som en meta-tagg.
Du kan bruke HTML-tagger, spesielt <a> og <em>. + desc_html: Vises som et avsnitt på forsiden og brukes som en meta-tagg. Du kan bruke HTML-tagger, spesielt <a> og <em>. title: Nettstedsbeskrivelse site_description_extended: desc_html: Vises på side for utvidet informasjon.
Du kan bruke HTML-tagger @@ -168,7 +178,7 @@ reset_password: Nullstill passord set_new_password: Sett nytt passord authorize_follow: - error: Uheldigvis så skjedde det en feil da vi prøvde å få tak i en bruker fra en annen instans. + error: Uheldigvis skjedde det en feil da vi prøvde å få tak i en bruker fra en annen instans follow: Følg title: Følg %{acct} datetime: @@ -191,8 +201,8 @@ '410': Siden du leter etter finnes ikke lenger. '422': content: Sikkerhetsverifisering feilet. Blokkerer du informasjonskapsler? - title: Sikkerhetsverifisering feilet. - '429': Throttled + title: Sikkerhetsverifisering feilet + '429': Overfyllt exports: blocks: Du blokkerer csv: CSV @@ -208,7 +218,7 @@ success: one: I ferd med å mykblokkere følgere fra ett domene... other: I ferd med å mykblokkere følgere fra %{count} domener... - true_privacy_html: Vennligst forstå at virkelig privatliv kun kan oppnås med ende-til-ende-kryptering. + true_privacy_html: Merk deg at virkelig privatliv kun kan oppnås med ende-til-ende-kryptering. unlocked_warning_html: Alle kan følge deg for å umiddelbart se dine private statuser. %{lock_link} for å kunne se over og avvise følgere. unlocked_warning_title: Din konto er ikke låst generic: @@ -220,7 +230,7 @@ other: Noe er ikke helt riktig ennå. Det er ennå %{count} feil å rette på imports: preface: Du kan importere data om brukere du følger eller blokkerer til kontoen din på denne instansen med eksportfiler fra andre instanser. - success: Din data ble mottatt og vil bli behandlet så fort som mulig. + success: Dine data ble mottatt og vil bli behandlet så fort som mulig types: blocking: Blokkeringsliste following: Følgeliste @@ -243,8 +253,8 @@ one: "1 ny hendelse siden ditt siste besøk \U0001F418" other: "%{count} nye hendelser siden ditt siste besøk \U0001F418" favourite: - body: Din status ble likt av %{name} - subject: "%{name} likte din status." + body: 'Statusen din ble likt av %{name}:' + subject: "%{name} likte statusen din" follow: body: "%{name} følger deg!" subject: "%{name} følger deg" @@ -382,11 +392,11 @@ enable: Skru på enabled_success: Aktivering av tofaktorautentisering vellykket generate_recovery_codes: Generér gjenopprettingskoder - instructions_html: "Scan denne QR-koden i Google Authenticator eller en lignende app på telefonen din. Fra nå av vil denne applikasjonen generere koder for deg som skal brukes under innlogging" + instructions_html: "Scan denne QR-koden med Google Authenticator eller en lignende app på telefonen din. Fra nå av vil denne applikasjonen generere koder for deg som skal brukes under innlogging." lost_recovery_codes: Gjenopprettingskoder lar deg gjenoppnå tilgang til din konto hvis du mister din telefon. Hvis du har mistet gjenopprettingskodene, kan du regenerere dem her. Dine gamle gjenopprettingskoder vil bli ugyldige. manual_instructions: 'Hvis du ikke får scannet QR-koden må du skrive inn følgende kode manuelt:' recovery_codes_regenerated: Generering av gjenopprettingskoder vellykket - recovery_instructions_html: Hvis du skulle miste tilgang til telefonen din, kan du bruke en av gjenopprettingskodene nedenfor til å gjenopprette tilgang til din konto. Oppbevar gjenopprettingskodene sikkert, for eksempel ved å skrive dem ut og lagre dem sammen med andre viktige dokumenter. + recovery_instructions_html: Hvis du skulle miste tilgang til telefonen din, kan du bruke en av gjenopprettingskodene nedenfor til å gjenopprette tilgang til din konto. Oppbevar gjenopprettingskodene sikkert, for eksempel ved å skrive dem ut og gjemme dem på et lurt sted bare du vet om. setup: Sett opp wrong_code: Den angitte koden var ugyldig! Stemmer instansens tid overalt med enhetens tid? users: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 760bb69a25..5b35676162 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -67,7 +67,7 @@ pt-BR: demote: Rebaixar disable: Desativar disable_two_factor_authentication: Desativar 2FA - disabled: Desativado + disabled: Desativada display_name: Nome de exibição domain: Domínio edit: Editar @@ -121,14 +121,14 @@ pt-BR: search: Pesquisar shared_inbox_url: URL da Inbox Compartilhada show: - created_reports: Relatórios criados por esta conta + created_reports: Denúncias criadas por esta conta report: relatórios - targeted_reports: Relatórios feitos sobre esta conta + targeted_reports: Denúncias feitas sobre esta conta silence: Silêncio statuses: Postagens subscribe: Inscrever-se title: Contas - undo_silenced: Retirar silêncio + undo_silenced: Desativar silêncio undo_suspension: Retirar suspensão unsubscribe: Desinscrever-se username: Nome de usuário @@ -151,9 +151,14 @@ pt-BR: memorialize_account: "%{name} transformou a conta de %{target} em um memorial" promote_user: "%{name} promoveu o usuário %{target}" reset_password_user: "%{name} redefiniu a senha do usuário %{target}" - resolve_report: "%{name} dispensou o relatório %{target}" + resolve_report: "%{name} dispensou a denúncia %{target}" silence_account: "%{name} silenciou a conta de %{target}" suspend_account: "%{name} suspendeu a conta de %{target}" + unsilence_account: "%{name} desativou o silêncio de %{target}" + unsuspend_account: "%{name} desativou a suspensão de %{target}" + update_custom_emoji: "%{name} atualizou o emoji %{target}" + update_status: "%{name} atualizou o estado de %{target}" + title: Auditar relatório custom_emojis: copied_msg: Cópia local do emoji criada com sucesso copy: Copiar @@ -204,7 +209,7 @@ pt-BR: one: Uma conta no banco de dados foi afetada other: "%{count} contas no banco de dados foram afetadas" retroactive: - silence: Retirar silêncio de todas as contas existentes neste domínio + silence: Desativar silêncio de todas as contas existentes desse domínio suspend: Retirar suspensão de todas as contas neste domínio title: Retirar bloqueio de domínio de %{domain} undo: Retirar @@ -217,7 +222,7 @@ pt-BR: destroyed_msg: Bloqueio de domínio de e-mail excluído com sucesso domain: Domínio new: - create: Criar bloqueio + create: Adicionar domínio title: Novo bloqueio de domínio de e-mail title: Bloqueio de Domínio de E-mail instances: @@ -226,6 +231,13 @@ pt-BR: reset: Resetar search: Buscar title: Instâncias conhecidas + invites: + filter: + all: Todos + available: Disponíveis + expired: Expirados + title: Filtro + title: Convites reports: action_taken_by: Ação realizada por are_you_sure: Você tem certeza? @@ -238,10 +250,10 @@ pt-BR: nsfw: 'false': Mostrar mídias anexadas 'true': Esconder mídias anexadas - report: 'Reportar #%{id}' + report: 'Denúncia #%{id}' report_contents: Conteúdos - reported_account: Conta reportada - reported_by: Reportada por + reported_account: Conta denunciada + reported_by: Denunciada por resolved: Resolvido silence_account: Silenciar conta status: Status @@ -264,6 +276,9 @@ pt-BR: deletion: desc_html: Permitir que qualquer um delete a sua conta title: Exclusão aberta de contas + min_invite_role: + disabled: Ninguém + title: Permitir convites de open: desc_html: Permitir que qualquer um crie uma conta title: Cadastro aberto @@ -279,7 +294,7 @@ pt-BR: site_title: Nome da instância thumbnail: desc_html: Usada para prévias via OpenGraph e API. Recomenda-se 1200x630px - title: Thumbnail da instância + title: Miniatura da instância timeline_preview: desc_html: Exibir a timeline pública na página inicial title: Prévia da timeline @@ -309,7 +324,7 @@ pt-BR: title: Administração admin_mailer: new_report: - body: "%{reporter} reportou %{target}" + body: "%{reporter} denunciou %{target}" subject: Nova denúncia sobre %{instance} (#%{id}) application_mailer: salutation: "%{name}," @@ -334,9 +349,11 @@ pt-BR: invalid_reset_password_token: Token de modificação de senha é inválido ou expirou. Por favor, requisite um novo. login: Entrar logout: Sair + migrate_account: Mudar para uma conta diferente + migrate_account_html: Se você quer redirecionar essa conta para uma outra você pode configura isso aqui. register: Cadastrar-se resend_confirmation: Reenviar instruções de confirmação - reset_password: Modificar senha + reset_password: Redefinir senha set_new_password: Definir uma nova senha authorize_follow: error: Infelizmente, ocorreu um erro ao buscar a conta remota @@ -376,7 +393,7 @@ pt-BR: '410': A página pela qual você está procurando não existe mais. '422': content: A verificação de segurança falhou. Você desativou o uso de cookies? - title: Falha na verificação de segurança + title: Verificação de segurança falhou '429': Muitas requisições '500': content: Desculpe, algo deu errado. @@ -416,12 +433,39 @@ pt-BR: muting: Lista de silêncio upload: Enviar in_memoriam_html: Em memória. + invites: + delete: Desativar + expired: Expirados + expires_in: + '1800': 30 minutos + '21600': 6 horas + '3600': 1 hora + '43200': 12 horas + '86400': 1 dia + expires_in_prompt: Nunca + generate: Gerar + max_uses: + one: 1 uso + other: "%{count} usos" + max_uses_prompt: Sem limite + prompt: Gerar e compartilha links com outras pessoas para permitir acesso a essa instância + table: + expires_at: Expira em + uses: Usos + title: Convidar pessoas landing_strip_html: "%{name} é um usuário no %{link_to_root_path}. Você pode segui-lo ou interagir com ele se você tiver uma conta em qualquer lugar no fediverso." landing_strip_signup_html: Se não, você pode se cadastrar aqui. media_attachments: validations: images_and_video: Não é possível anexar um vídeo a uma postagem que já contém imagens too_many: Não é possível anexar mais de 4 imagens + migrations: + acct: username@domain da nova conta + currently_redirecting: 'Seu perfil está configurado para redirecionar para:' + proceed: Salvar + updated_msg: As configurações de migração da sua conta foram atualizadas com sucesso! + moderation: + title: Moderação notification_mailer: digest: body: 'Aqui está um resumo do que você perdeu no %{instance} desde o seu último acesso em %{since}:' @@ -498,7 +542,7 @@ pt-BR: generic: Navegador desconhecido ie: Internet Explorer micro_messenger: MicroMessenger - nokia: Nokia S40 Ovi Browser + nokia: Navegador Nokia S40 Ovi opera: Opera phantom_js: PhantomJS qq: QQ Browser @@ -534,6 +578,7 @@ pt-BR: export: Exportar dados followers: Seguidores autorizados import: Importar + migrate: Migração de conta notifications: Notificações preferences: Preferências settings: Configurações @@ -630,6 +675,8 @@ pt-BR:

Originalmente adaptado da política de privacidade do Discourse.

title: "%{instance} Termos de Serviço e Política de Privacidade" + themes: + default: Mastodon time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 932b166d75..e4c6694e9d 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -4,10 +4,14 @@ ar: hints: defaults: avatar: PNG, GIF أو JPG. على الأكثر 2 ميغابيت . سوف يتم تصغيرها إلى 120x120px - display_name: %{count} أحرف متبقية + digest: يُرسَل بعد مضيّ مدة طويلة من خمول نشاطك يحوي على تلخيص للتبويقات التي ذُكر حسابك فيها أثناء غيابك + display_name: + one: 1 حرف متبقي header: PNG, GIF or JPG. على الأكثر 2 ميغابيت . سوف يتم تصغيرها إلى 700x335px locked: يتطلب منك الموافقة يدويا على كل طلب للإشتراك بحسابك و منشوراتك تعرض لمتابعيك فقط دون غيرهم note: %{count} أحرف متبقية + setting_noindex: تمس ملفك العمومي الخاص بك وصفحات الحالة + setting_theme: تغير المظهر الذي يبدو عليه ماستدون عندما تقوم بتسجيل دخولك على أي جهاز. imports: data: ملف CSV تم تصديره من خادوم مثيل آخر لماستدون sessions: @@ -24,6 +28,7 @@ ar: header: رأس الصفحة locale: اللغة locked: إجعل حسابك خاصًا + max_uses: العدد الأقصى للإستخدام new_password: كلمة مرور جديدة note: السيرة الذاتية otp_attempt: الرمز الثنائي @@ -31,6 +36,8 @@ ar: setting_auto_play_gif: تشغيل صور جيف المتحركة تلقائي setting_boost_modal: إظهار مربع حوار التأكيد قبل القيام بالترقية setting_default_privacy: خصوصية المنشور + setting_default_sensitive: دائما تحديد الوسائط كحساسة + setting_noindex: منع محركات البحث من فهرسة ملفي الشخصي severity: الشدة type: نوع الإستيراد username: اسم المستخدم diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index bdeefa7e52..2e5f969573 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -3,20 +3,20 @@ ja: simple_form: hints: defaults: - avatar: 2MBまでのPNGやGIF、JPGが利用可能です。120x120pxまで縮小されます。 - digest: 長期間ログインしなかった際、その期間に受け取った返信の要約を受け取ることができます。 + avatar: 2MBまでのPNGやGIF、JPGが利用可能です。120x120pxまで縮小されます + digest: 長期間ログインしなかった際、その期間に受け取った返信の要約を受け取ることができます display_name: あと%{count}文字入力できます。 - header: 2MBまでのPNGやGIF、JPGが利用可能です。 700x335pxまで縮小されます。 + header: 2MBまでのPNGやGIF、JPGが利用可能です。 700x335pxまで縮小されます locked: フォロワーを手動で承認する必要があります note: あと%{count}文字入力できます。 setting_noindex: 公開プロフィールおよび各投稿ページに影響します setting_theme: ログインしている全てのデバイスで適用されるデザインです。 imports: - data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい。 + data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい sessions: otp: 携帯電話に表示された2段階認証コードを入力するか、生成したリカバリーコードを使用してください。 user: - filtered_languages: 選択した言語があなたの公開タイムラインから取り除かれます。 + filtered_languages: 選択した言語があなたの公開タイムラインから取り除かれます labels: defaults: avatar: アイコン diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index f2847e7ca3..17b9647a45 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -14,7 +14,7 @@ nl: one: 1 teken over other: %{count} tekens over setting_noindex: Heeft invloed op jouw openbare profiel en toots - setting_theme: Heeft invloed op hoe Mastodon eruitziet op elk apparaat waarmee je inlogt. + setting_theme: Heeft invloed op hoe de webapp van Mastodon eruitziet (op elk apparaat waarmee je inlogt). imports: data: CSV-bestand dat op een andere Mastodon-server werd geëxporteerd sessions: @@ -48,22 +48,22 @@ nl: setting_noindex: Jouw toots niet door zoekmachines laten indexeren setting_reduce_motion: Langzamere animaties setting_system_font_ui: Standaardlettertype van jouw systeem gebruiken - setting_theme: Site thema + setting_theme: Thema website setting_unfollow_modal: Vraag voor het ontvolgen van iemand een bevestiging - severity: Strengheid + severity: Zwaarte type: Importtype username: gebruikersnaam interactions: - must_be_follower: Blokkeer meldingen van mensen die jou niet volgen - must_be_following: Blokkeer meldingen van mensen die jij niet volgt - must_be_following_dm: Blokkeer directe berichten van mensen die jij niet volgt + must_be_follower: Meldingen van mensen die jou niet volgen blokkeren + must_be_following: Meldingen van mensen die jij niet volgt blokkeren + must_be_following_dm: Directe berichten van mensen die jij niet volgt blokkeren notification_emails: - digest: Verstuur periodiek e-mails met een samenvatting - favourite: Verstuur een e-mail wanneer iemand jouw toot als favoriet markeert - follow: Verstuur een e-mail wanneer iemand jou volgt - follow_request: Verstuur een e-mail wanneer iemand jou wilt volgen - mention: Verstuur een e-mail wanneer iemand jou vermeld - reblog: Verstuur een e-mail wanneer iemand jouw toot heeft geboost + digest: Periodiek e-mails met een samenvatting versturen + favourite: Een e-mail versturen wanneer iemand jouw toot als favoriet markeert + follow: Een e-mail versturen wanneer iemand jou volgt + follow_request: Een e-mail versturen wanneer iemand jou wilt volgen + mention: Een e-mail versturen wanneer iemand jou vermeld + reblog: Een e-mail versturen wanneer iemand jouw toot heeft geboost 'no': Nee required: mark: "*" From e7d55df38d8c18819e79646bb7d1365c5eab54f3 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sun, 10 Dec 2017 00:53:40 +0900 Subject: [PATCH 018/112] Ignore HEAD method if does not support (#5949) --- app/services/fetch_link_card_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index cec96d9277..7f4518ea7f 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -38,7 +38,7 @@ class FetchLinkCardService < BaseService @card ||= PreviewCard.new(url: @url) res = Request.new(:head, @url).perform - return if res.code != 200 || res.mime_type != 'text/html' + return if res.code != 405 && (res.code != 200 || res.mime_type != 'text/html') attempt_oembed || attempt_opengraph end From abe95b614b6355e61dd2955e09115ac473417c84 Mon Sep 17 00:00:00 2001 From: cwm Date: Sat, 9 Dec 2017 10:26:22 -0600 Subject: [PATCH 019/112] add initial components based off of tootsuite pr #1507 --- .../settings/preferences_controller.rb | 1 + .../flavours/glitch/components/status.js | 5 +- .../glitch/containers/status_container.js | 16 +++- .../features/status/components/action_bar.js | 4 +- .../flavours/glitch/features/status/index.js | 16 +++- .../features/ui/components/favourite_modal.js | 84 +++++++++++++++++++ .../features/ui/components/modal_root.js | 4 +- .../glitch/styles/components/index.scss | 11 ++- .../flavours/glitch/util/initial_state.js | 1 + app/models/user.rb | 2 +- app/views/settings/preferences/show.html.haml | 1 + config/locales/simple_form.en.yml | 1 + config/settings.yml | 1 + 13 files changed, 130 insertions(+), 17 deletions(-) create mode 100644 app/javascript/flavours/glitch/features/ui/components/favourite_modal.js diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 277f0f6573..9177d37da6 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -33,6 +33,7 @@ class Settings::PreferencesController < Settings::BaseController :setting_default_sensitive, :setting_unfollow_modal, :setting_boost_modal, + :setting_favourite_modal, :setting_delete_modal, :setting_auto_play_gif, :setting_reduce_motion, diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index b0d9e37576..6cfd05735d 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -58,6 +58,7 @@ export default class Status extends ImmutablePureComponent { 'settings', 'prepend', 'boostModal', + 'favouriteModal', 'muted', 'collapse', 'notification', @@ -204,8 +205,8 @@ export default class Status extends ImmutablePureComponent { this.props.onReply(this.props.status, this.context.router.history); } - handleHotkeyFavourite = () => { - this.props.onFavourite(this.props.status); + handleHotkeyFavourite = e => { + this.props.onFavourite(this.props.status, e); } handleHotkeyBoost = e => { diff --git a/app/javascript/flavours/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js index b753de7b3a..8bf33c70f4 100644 --- a/app/javascript/flavours/glitch/containers/status_container.js +++ b/app/javascript/flavours/glitch/containers/status_container.js @@ -20,7 +20,7 @@ import { initMuteModal } from 'flavours/glitch/actions/mutes'; import { initReport } from 'flavours/glitch/actions/reports'; import { openModal } from 'flavours/glitch/actions/modal'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import { boostModal, deleteModal } from 'flavours/glitch/util/initial_state'; +import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, @@ -78,14 +78,22 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ } }, - onFavourite (status) { + onModalFavourite (status) { + dispatch(favourite(status)); + }, + + onFavourite (status, e) { if (status.get('favourited')) { dispatch(unfavourite(status)); } else { - dispatch(favourite(status)); + if (e.shiftKey || !favouriteModal) { + this.onModalFavourite(status); + } else { + dispatch(openModal('FAVOURITE', { status, onFavourite: this.onModalFavourite })); + } } }, - + onPin (status) { if (status.get('pinned')) { dispatch(unpin(status)); 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 4d660ee3c0..3190fd0be1 100644 --- a/app/javascript/flavours/glitch/features/status/components/action_bar.js +++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js @@ -48,8 +48,8 @@ export default class ActionBar extends React.PureComponent { this.props.onReblog(this.props.status, e); } - handleFavouriteClick = () => { - this.props.onFavourite(this.props.status); + handleFavouriteClick = (e) => { + this.props.onFavourite(this.props.status, e); } handleDeleteClick = () => { diff --git a/app/javascript/flavours/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js index 93b0fe9d98..8b81caa9a3 100644 --- a/app/javascript/flavours/glitch/features/status/index.js +++ b/app/javascript/flavours/glitch/features/status/index.js @@ -30,7 +30,7 @@ import { openModal } from 'flavours/glitch/actions/modal'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { HotKeys } from 'react-hotkeys'; -import { boostModal, deleteModal } from 'flavours/glitch/util/initial_state'; +import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/util/initial_state'; import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'flavours/glitch/util/fullscreen'; const messages = defineMessages({ @@ -95,11 +95,19 @@ export default class Status extends ImmutablePureComponent { } }; - handleFavouriteClick = (status) => { + handleModalFavourite = (status) => { + this.props.dispatch(favourite(status)); + } + + handleFavouriteClick = (status, e) => { if (status.get('favourited')) { this.props.dispatch(unfavourite(status)); } else { - this.props.dispatch(favourite(status)); + if (e.shiftKey || !favoriteModal) { + this.handleModalFavourite(status); + } else { + this.props.dispatch(openModal('FAVOURITE', { status, onFavourite: this.handleModalFavourite })); + } } } @@ -118,7 +126,7 @@ export default class Status extends ImmutablePureComponent { handleModalReblog = (status) => { this.props.dispatch(reblog(status)); } - + handleReblogClick = (status, e) => { if (status.get('reblogged')) { this.props.dispatch(unreblog(status)); diff --git a/app/javascript/flavours/glitch/features/ui/components/favourite_modal.js b/app/javascript/flavours/glitch/features/ui/components/favourite_modal.js new file mode 100644 index 0000000000..a2322d0b89 --- /dev/null +++ b/app/javascript/flavours/glitch/features/ui/components/favourite_modal.js @@ -0,0 +1,84 @@ +import React from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import PropTypes from 'prop-types'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import Button from 'flavours/glitch/components/button'; +import StatusContent from 'flavours/glitch/components/status_content'; +import Avatar from 'flavours/glitch/components/avatar'; +import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp'; +import DisplayName from 'flavours/glitch/components/display_name'; +import ImmutablePureComponent from 'react-immutable-pure-component'; + +const messages = defineMessages({ + reblog: { id: 'status.favourite', defaultMessage: 'Favourite' }, +}); + +@injectIntl +export default class BoostModal extends ImmutablePureComponent { + + static contextTypes = { + router: PropTypes.object, + }; + + static propTypes = { + status: ImmutablePropTypes.map.isRequired, + onReblog: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, + intl: PropTypes.object.isRequired, + }; + + componentDidMount() { + this.button.focus(); + } + + handleFavourite = () => { + this.props.onFavourite(this.props.status); + this.props.onClose(); + } + + handleAccountClick = (e) => { + if (e.button === 0) { + e.preventDefault(); + this.props.onClose(); + this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`); + } + } + + setRef = (c) => { + this.button = c; + } + + render () { + const { status, intl } = this.props; + + return ( +
+
+
+
+
+ +
+ + +
+ +
+ + +
+
+ + +
+
+ +
+
Shift + }} />
+
+
+ ); + } + +} diff --git a/app/javascript/flavours/glitch/features/ui/components/modal_root.js b/app/javascript/flavours/glitch/features/ui/components/modal_root.js index 61b2392839..66acae68e7 100644 --- a/app/javascript/flavours/glitch/features/ui/components/modal_root.js +++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.js @@ -7,6 +7,7 @@ import ActionsModal from './actions_modal'; import MediaModal from './media_modal'; import VideoModal from './video_modal'; import BoostModal from './boost_modal'; +import FavouriteModal from './favourite_modal'; import DoodleModal from './doodle_modal'; import ConfirmationModal from './confirmation_modal'; import { @@ -22,6 +23,7 @@ const MODAL_COMPONENTS = { 'ONBOARDING': OnboardingModal, 'VIDEO': () => Promise.resolve({ default: VideoModal }), 'BOOST': () => Promise.resolve({ default: BoostModal }), + 'FAVOURITE': () => Promise.resolve({ default: FavouriteModal }), 'DOODLE': () => Promise.resolve({ default: DoodleModal }), 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }), 'MUTE': MuteModal, @@ -90,7 +92,7 @@ export default class ModalRoot extends React.PureComponent { } renderLoading = modalId => () => { - return ['MEDIA', 'VIDEO', 'BOOST', 'DOODLE', 'CONFIRM', 'ACTIONS'].indexOf(modalId) === -1 ? : null; + return ['MEDIA', 'VIDEO', 'BOOST', 'FAVOURITE', 'DOODLE', 'CONFIRM', 'ACTIONS'].indexOf(modalId) === -1 ? : null; } renderError = (props) => { diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss index 7aeab0a6af..eb8d8245f4 100644 --- a/app/javascript/flavours/glitch/styles/components/index.scss +++ b/app/javascript/flavours/glitch/styles/components/index.scss @@ -3901,6 +3901,7 @@ button.icon-button.active i.fa-retweet { } .boost-modal, +.favourite-modal, .confirmation-modal, .report-modal, .actions-modal, @@ -3932,7 +3933,8 @@ button.icon-button.active i.fa-retweet { } } -.boost-modal__container { +.boost-modal__container, +.favourite-modal__container{ overflow-x: scroll; padding: 10px; @@ -3943,6 +3945,7 @@ button.icon-button.active i.fa-retweet { } .boost-modal__action-bar, +.favourite-modal__action-bar, .confirmation-modal__action-bar, .mute-modal__action-bar, .report-modal__action-bar { @@ -3964,11 +3967,13 @@ button.icon-button.active i.fa-retweet { } } -.boost-modal__status-header { +.boost-modal__status-header, +.favourite-modal__status-header { font-size: 15px; } -.boost-modal__status-time { +.boost-modal__status-time, +.favourite-modal__status-time { float: right; font-size: 14px; } diff --git a/app/javascript/flavours/glitch/util/initial_state.js b/app/javascript/flavours/glitch/util/initial_state.js index ef5d8b0efc..607d6b9b04 100644 --- a/app/javascript/flavours/glitch/util/initial_state.js +++ b/app/javascript/flavours/glitch/util/initial_state.js @@ -15,6 +15,7 @@ export const reduceMotion = getMeta('reduce_motion'); export const autoPlayGif = getMeta('auto_play_gif'); export const unfollowModal = getMeta('unfollow_modal'); export const boostModal = getMeta('boost_modal'); +export const favouriteModal = getMeta('favourite_modal'); export const deleteModal = getMeta('delete_modal'); export const me = getMeta('me'); diff --git a/app/models/user.rb b/app/models/user.rb index 29bdcbd671..47bf22e177 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -75,7 +75,7 @@ class User < ApplicationRecord has_many :session_activations, dependent: :destroy - delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :delete_modal, + delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :favourite_modal, :delete_modal, :reduce_motion, :system_font_ui, :noindex, :flavour, :skin, to: :settings, prefix: :setting, allow_nil: false diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 9564c03991..9e72e57349 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -32,6 +32,7 @@ = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label = f.input :setting_boost_modal, as: :boolean, wrapper: :with_label + = f.input :setting_favourite_modal, as: :boolean, wrapper: :with_label = f.input :setting_delete_modal, as: :boolean, wrapper: :with_label .fields-group diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 756f6b1190..599df9e28e 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -43,6 +43,7 @@ en: password: Password setting_auto_play_gif: Auto-play animated GIFs setting_boost_modal: Show confirmation dialog before boosting + setting_favourite_modal: Show confirmation dialog before favouriting setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot diff --git a/config/settings.yml b/config/settings.yml index 5aad45da22..dbc5f6a265 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -22,6 +22,7 @@ defaults: &defaults default_sensitive: false unfollow_modal: false boost_modal: false + favourite_modal: false delete_modal: true auto_play_gif: false reduce_motion: false From a489e5d5cd33f52e4af38e6977a284b367f2f95e Mon Sep 17 00:00:00 2001 From: cwm Date: Sat, 9 Dec 2017 11:21:41 -0600 Subject: [PATCH 020/112] added a few more things --- .../features/ui/components/actions_modal.js | 18 +++++++++++++++++- .../mastodon/locales/defaultMessages.json | 15 ++++++++++++++- app/javascript/mastodon/locales/en.json | 2 ++ app/lib/user_settings_decorator.rb | 5 +++++ app/serializers/initial_state_serializer.rb | 1 + 5 files changed, 39 insertions(+), 2 deletions(-) diff --git a/app/javascript/flavours/glitch/features/ui/components/actions_modal.js b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js index 0873c282fa..1eb0e026e3 100644 --- a/app/javascript/flavours/glitch/features/ui/components/actions_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js @@ -55,9 +55,25 @@ export default class ActionsModal extends ImmutablePureComponent { + + - + ); return ( diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index bb82cf5f58..65e20c17ae 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -1293,6 +1293,19 @@ ], "path": "app/javascript/mastodon/features/ui/components/boost_modal.json" }, + { + "descriptors": [ + { + "defaultMessage": "Favourite", + "id": "status.favourite" + }, + { + "defaultMessage": "You can press {combo} to skip this next time", + "id": "favourite_modal.combo" + } + ], + "path": "app/javascript/mastodon/features/ui/components/favourite_modal.json" + }, { "descriptors": [ { @@ -1601,4 +1614,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 538124904a..5efd29b815 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -25,6 +25,7 @@ "account.unmute_notifications": "Unmute notifications from @{name}", "account.view_full_profile": "View full profile", "boost_modal.combo": "You can press {combo} to skip this next time", + "favourite_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", @@ -109,6 +110,7 @@ "home.settings": "Column settings", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.favourite": "to favourite", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", "keyboard_shortcuts.description": "Description", diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb index 8af384a2d2..d69181b5d7 100644 --- a/app/lib/user_settings_decorator.rb +++ b/app/lib/user_settings_decorator.rb @@ -21,6 +21,7 @@ class UserSettingsDecorator user.settings['default_sensitive'] = default_sensitive_preference if change?('setting_default_sensitive') user.settings['unfollow_modal'] = unfollow_modal_preference if change?('setting_unfollow_modal') user.settings['boost_modal'] = boost_modal_preference if change?('setting_boost_modal') + user.settings['favourite_modal'] = boost_modal_preference if change?('setting_boost_modal') user.settings['delete_modal'] = delete_modal_preference if change?('setting_delete_modal') user.settings['auto_play_gif'] = auto_play_gif_preference if change?('setting_auto_play_gif') user.settings['reduce_motion'] = reduce_motion_preference if change?('setting_reduce_motion') @@ -53,6 +54,10 @@ class UserSettingsDecorator def boost_modal_preference boolean_cast_setting 'setting_boost_modal' end + + def favourite_modal_preference + boolean_cast_setting 'setting_favourite_modal' + end def delete_modal_preference boolean_cast_setting 'setting_delete_modal' diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index 9dfa019f59..904daa804d 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -28,6 +28,7 @@ class InitialStateSerializer < ActiveModel::Serializer store[:me] = object.current_account.id.to_s store[:unfollow_modal] = object.current_account.user.setting_unfollow_modal store[:boost_modal] = object.current_account.user.setting_boost_modal + store[:favourite_modal] = object.current_account.user.setting_favourite_modal store[:delete_modal] = object.current_account.user.setting_delete_modal store[:auto_play_gif] = object.current_account.user.setting_auto_play_gif store[:reduce_motion] = object.current_account.user.setting_reduce_motion From 22cdbca82c06cced9568f0bd9361593a2c0eba81 Mon Sep 17 00:00:00 2001 From: cwm Date: Sat, 9 Dec 2017 12:06:00 -0600 Subject: [PATCH 021/112] fixes, functioning now --- app/javascript/flavours/glitch/components/status.js | 2 +- .../flavours/glitch/components/status_action_bar.js | 4 ++-- app/javascript/flavours/glitch/features/status/index.js | 2 +- .../glitch/features/ui/components/favourite_modal.js | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index 6cfd05735d..b8a0fd1803 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -205,7 +205,7 @@ export default class Status extends ImmutablePureComponent { this.props.onReply(this.props.status, this.context.router.history); } - handleHotkeyFavourite = e => { + handleHotkeyFavourite = (e) => { this.props.onFavourite(this.props.status, e); } diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js index 5a06782bec..cb663e7738 100644 --- a/app/javascript/flavours/glitch/components/status_action_bar.js +++ b/app/javascript/flavours/glitch/components/status_action_bar.js @@ -71,8 +71,8 @@ export default class StatusActionBar extends ImmutablePureComponent { }); } - handleFavouriteClick = () => { - this.props.onFavourite(this.props.status); + handleFavouriteClick = (e) => { + this.props.onFavourite(this.props.status, e); } handleReblogClick = (e) => { diff --git a/app/javascript/flavours/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js index 8b81caa9a3..4a019ce200 100644 --- a/app/javascript/flavours/glitch/features/status/index.js +++ b/app/javascript/flavours/glitch/features/status/index.js @@ -103,7 +103,7 @@ export default class Status extends ImmutablePureComponent { if (status.get('favourited')) { this.props.dispatch(unfavourite(status)); } else { - if (e.shiftKey || !favoriteModal) { + if (e.shiftKey || !favouriteModal) { this.handleModalFavourite(status); } else { this.props.dispatch(openModal('FAVOURITE', { status, onFavourite: this.handleModalFavourite })); diff --git a/app/javascript/flavours/glitch/features/ui/components/favourite_modal.js b/app/javascript/flavours/glitch/features/ui/components/favourite_modal.js index a2322d0b89..70722411d2 100644 --- a/app/javascript/flavours/glitch/features/ui/components/favourite_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/favourite_modal.js @@ -10,11 +10,11 @@ import DisplayName from 'flavours/glitch/components/display_name'; import ImmutablePureComponent from 'react-immutable-pure-component'; const messages = defineMessages({ - reblog: { id: 'status.favourite', defaultMessage: 'Favourite' }, + favourite: { id: 'status.favourite', defaultMessage: 'Favourite' }, }); @injectIntl -export default class BoostModal extends ImmutablePureComponent { +export default class FavouriteModal extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, @@ -22,7 +22,7 @@ export default class BoostModal extends ImmutablePureComponent { static propTypes = { status: ImmutablePropTypes.map.isRequired, - onReblog: PropTypes.func.isRequired, + onFavourite: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, }; @@ -75,7 +75,7 @@ export default class BoostModal extends ImmutablePureComponent {
Shift + }} />
-
); From 7284e36fbdd4d6084aa85e8b1eeb56247c3cab3d Mon Sep 17 00:00:00 2001 From: cwm Date: Sat, 9 Dec 2017 12:17:20 -0600 Subject: [PATCH 022/112] fixed fav setting change --- app/lib/user_settings_decorator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb index d69181b5d7..5f0176f270 100644 --- a/app/lib/user_settings_decorator.rb +++ b/app/lib/user_settings_decorator.rb @@ -21,7 +21,7 @@ class UserSettingsDecorator user.settings['default_sensitive'] = default_sensitive_preference if change?('setting_default_sensitive') user.settings['unfollow_modal'] = unfollow_modal_preference if change?('setting_unfollow_modal') user.settings['boost_modal'] = boost_modal_preference if change?('setting_boost_modal') - user.settings['favourite_modal'] = boost_modal_preference if change?('setting_boost_modal') + user.settings['favourite_modal'] = favourite_modal_preference if change?('setting_favourite_modal') user.settings['delete_modal'] = delete_modal_preference if change?('setting_delete_modal') user.settings['auto_play_gif'] = auto_play_gif_preference if change?('setting_auto_play_gif') user.settings['reduce_motion'] = reduce_motion_preference if change?('setting_reduce_motion') From c5a688d70e4bea57ac87c71577fd6c7b9e5fa163 Mon Sep 17 00:00:00 2001 From: cwm Date: Sat, 9 Dec 2017 12:41:24 -0600 Subject: [PATCH 023/112] remove trailing spaces --- app/javascript/flavours/glitch/containers/status_container.js | 2 +- app/javascript/flavours/glitch/features/status/index.js | 2 +- .../flavours/glitch/features/ui/components/actions_modal.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/javascript/flavours/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js index 8bf33c70f4..c0b9b58002 100644 --- a/app/javascript/flavours/glitch/containers/status_container.js +++ b/app/javascript/flavours/glitch/containers/status_container.js @@ -93,7 +93,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ } } }, - + onPin (status) { if (status.get('pinned')) { dispatch(unpin(status)); diff --git a/app/javascript/flavours/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js index 4a019ce200..40ae380ab6 100644 --- a/app/javascript/flavours/glitch/features/status/index.js +++ b/app/javascript/flavours/glitch/features/status/index.js @@ -126,7 +126,7 @@ export default class Status extends ImmutablePureComponent { handleModalReblog = (status) => { this.props.dispatch(reblog(status)); } - + handleReblogClick = (status, e) => { if (status.get('reblogged')) { this.props.dispatch(unreblog(status)); diff --git a/app/javascript/flavours/glitch/features/ui/components/actions_modal.js b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js index 1eb0e026e3..87a1498072 100644 --- a/app/javascript/flavours/glitch/features/ui/components/actions_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js @@ -55,7 +55,7 @@ export default class ActionsModal extends ImmutablePureComponent { - + + ); return ( From fbd2a0127cb537e91508032a87bc82675f88d271 Mon Sep 17 00:00:00 2001 From: cwm Date: Sat, 9 Dec 2017 13:00:07 -0600 Subject: [PATCH 024/112] ran i18n-tasks normalize for simple_form.en.yml --- config/locales/simple_form.en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 599df9e28e..1722eea7bd 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -43,10 +43,10 @@ en: password: Password setting_auto_play_gif: Auto-play animated GIFs setting_boost_modal: Show confirmation dialog before boosting - setting_favourite_modal: Show confirmation dialog before favouriting setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot + setting_favourite_modal: Show confirmation dialog before favouriting setting_flavour: Flavour setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations From 8606e5338476cb7de21cb611d015e966f1cf48cc Mon Sep 17 00:00:00 2001 From: cwm Date: Sat, 9 Dec 2017 15:15:11 -0600 Subject: [PATCH 025/112] moved locales to glitch, created add settings entry --- .../glitch/features/local_settings/page/index.js | 9 +++++++++ app/javascript/flavours/glitch/features/ui/index.js | 2 ++ .../flavours/glitch/reducers/local_settings.js | 1 + app/javascript/glitch/locales/en.json | 2 ++ app/javascript/mastodon/locales/en.json | 2 -- 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/javascript/flavours/glitch/features/local_settings/page/index.js b/app/javascript/flavours/glitch/features/local_settings/page/index.js index 62bf410c69..b9b00b050b 100644 --- a/app/javascript/flavours/glitch/features/local_settings/page/index.js +++ b/app/javascript/flavours/glitch/features/local_settings/page/index.js @@ -59,6 +59,15 @@ export default class LocalSettingsPage extends React.PureComponent { > + + + +

({ layout: state.getIn(['local_settings', 'layout']), isWide: state.getIn(['local_settings', 'stretch']), navbarUnder: state.getIn(['local_settings', 'navbar_under']), + favouriteModal: state.getIn(['local_settings', 'favourite_modal']), }); const keyMap = { @@ -103,6 +104,7 @@ export default class UI extends React.Component { isWide: PropTypes.bool, systemFontUi: PropTypes.bool, navbarUnder: PropTypes.bool, + favouriteModal: PropTypes.bool, isComposing: PropTypes.bool, hasComposingText: PropTypes.bool, location: PropTypes.object, diff --git a/app/javascript/flavours/glitch/reducers/local_settings.js b/app/javascript/flavours/glitch/reducers/local_settings.js index 69d98741b6..e4cdc49eeb 100644 --- a/app/javascript/flavours/glitch/reducers/local_settings.js +++ b/app/javascript/flavours/glitch/reducers/local_settings.js @@ -9,6 +9,7 @@ const initialState = ImmutableMap({ layout : 'auto', stretch : true, navbar_under : false, + favourite_modal : false, side_arm : 'none', collapsed : ImmutableMap({ enabled : true, diff --git a/app/javascript/glitch/locales/en.json b/app/javascript/glitch/locales/en.json index 0276cb8370..94011ffbe7 100644 --- a/app/javascript/glitch/locales/en.json +++ b/app/javascript/glitch/locales/en.json @@ -32,6 +32,8 @@ "status.collapse": "Collapse", "status.uncollapse": "Uncollapse", + "favourite_modal.combo": "You can press {combo} to skip this next time", + "home.column_settings.show_direct": "Show DMs", "notification.markForDeletion": "Mark for deletion", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 5efd29b815..538124904a 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -25,7 +25,6 @@ "account.unmute_notifications": "Unmute notifications from @{name}", "account.view_full_profile": "View full profile", "boost_modal.combo": "You can press {combo} to skip this next time", - "favourite_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", @@ -110,7 +109,6 @@ "home.settings": "Column settings", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.boost": "to boost", - "keyboard_shortcuts.favourite": "to favourite", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", "keyboard_shortcuts.description": "Description", From 0f8140d26a031f299742e1a4269fa72c7fe991e6 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Sat, 9 Dec 2017 23:37:18 +0100 Subject: [PATCH 026/112] Create activerecord.ar.yml (#5951) --- config/locales/activerecord.ar.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 config/locales/activerecord.ar.yml diff --git a/config/locales/activerecord.ar.yml b/config/locales/activerecord.ar.yml new file mode 100644 index 0000000000..d5d44aaa6f --- /dev/null +++ b/config/locales/activerecord.ar.yml @@ -0,0 +1,13 @@ +--- +ar: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: فقط حروف و أرقام و تسطير سفلي + status: + attributes: + reblog: + taken: المنشور موجود From fcc0795a4013db355c629da071d909ceda1f37b1 Mon Sep 17 00:00:00 2001 From: abcang Date: Sun, 10 Dec 2017 07:37:31 +0900 Subject: [PATCH 027/112] Remove unused function (#5950) --- app/controllers/api/base_controller.rb | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index 7cfe8fe71c..5983c0fbe4 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -72,19 +72,4 @@ class Api::BaseController < ApplicationController def render_empty render json: {}, status: 200 end - - def set_maps(statuses) # rubocop:disable Style/AccessorMethodName - if current_account.nil? - @reblogs_map = {} - @favourites_map = {} - @mutes_map = {} - return - end - - status_ids = statuses.compact.flat_map { |s| [s.id, s.reblog_of_id] }.uniq - conversation_ids = statuses.compact.map(&:conversation_id).compact.uniq - @reblogs_map = Status.reblogs_map(status_ids, current_account) - @favourites_map = Status.favourites_map(status_ids, current_account) - @mutes_map = Status.mutes_map(conversation_ids, current_account) - end end From a4710f9af817a2bbec44d3dd987d29fc0418eb40 Mon Sep 17 00:00:00 2001 From: Olivier Humbert Date: Sun, 10 Dec 2017 01:47:59 +0100 Subject: [PATCH 028/112] French translation update (#5954) * Update French translation * fix --- app/javascript/mastodon/locales/fr.json | 40 ++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 3db19c4706..a7a8876d0e 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -63,8 +63,8 @@ "confirmations.block.message": "Confirmez-vous le blocage de {name} ?", "confirmations.delete.confirm": "Supprimer", "confirmations.delete.message": "Confirmez-vous la suppression de ce pouet ?", - "confirmations.delete_list.confirm": "Delete", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.delete_list.confirm": "Supprimer", + "confirmations.delete_list.message": "Êtes-vous sûr 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.", "confirmations.mute.confirm": "Masquer", @@ -114,27 +114,27 @@ "keyboard_shortcuts.description": "Description", "keyboard_shortcuts.down": "descendre dans la liste", "keyboard_shortcuts.enter": "to open status", - "keyboard_shortcuts.favourite": "to favourite", - "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.hotkey": "Hotkey", - "keyboard_shortcuts.legend": "to display this legend", - "keyboard_shortcuts.mention": "to mention author", - "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.favourite": "vers les favoris", + "keyboard_shortcuts.heading": "Raccourcis clavier", + "keyboard_shortcuts.hotkey": "Raccourci", + "keyboard_shortcuts.legend": "pour afficher cette légende", + "keyboard_shortcuts.mention": "pour mentionner l'auteur", + "keyboard_shortcuts.reply": "pour répondre", "keyboard_shortcuts.search": "to focus search", - "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.toot": "pour démarrer un tout nouveau pouet", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "to move up in the list", "lightbox.close": "Fermer", "lightbox.next": "Suivant", "lightbox.previous": "Précédent", - "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", + "lists.account.add": "Ajouter à la liste", + "lists.account.remove": "Supprimer de la liste", + "lists.delete": "Effacer la liste", + "lists.edit": "Éditer la liste", + "lists.new.create": "Ajouter une liste", + "lists.new.title_placeholder": "Titre de la nouvelle liste", + "lists.search": "Rechercher parmi les gens que vous suivez", + "lists.subheading": "Vos listes", "loading_indicator.label": "Chargement…", "media_gallery.toggle_visible": "Modifier la visibilité", "missing_indicator.label": "Non trouvé", @@ -145,8 +145,8 @@ "navigation_bar.favourites": "Favoris", "navigation_bar.follow_requests": "Demandes de suivi", "navigation_bar.info": "Plus d’informations", - "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", - "navigation_bar.lists": "Lists", + "navigation_bar.keyboard_shortcuts": "Raccourcis clavier", + "navigation_bar.lists": "Listes", "navigation_bar.logout": "Déconnexion", "navigation_bar.mutes": "Comptes masqués", "navigation_bar.pins": "Pouets épinglés", @@ -241,7 +241,7 @@ "tabs_bar.home": "Accueil", "tabs_bar.local_timeline": "Fil public local", "tabs_bar.notifications": "Notifications", - "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", + "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", "upload_form.description": "Décrire pour les malvoyants", From 6e3f176b8e9f3fd2528b602ab49d68827acb675f Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sun, 10 Dec 2017 12:19:07 +0900 Subject: [PATCH 029/112] Add Galician language support (#5955) --- app/helpers/settings_helper.rb | 1 + app/javascript/mastodon/locales/nl.json | 1 - config/application.rb | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index abce858123..1d4cb8a573 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -10,6 +10,7 @@ module SettingsHelper eo: 'Esperanto', es: 'Español', fa: 'فارسی', + gl: 'Galego', fi: 'Suomi', fr: 'Français', he: 'עברית', diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 87261d7cde..c290ed7673 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -7,7 +7,6 @@ "account.followers": "Volgers", "account.follows": "Volgt", "account.follows_you": "Volgt jou", - "account.hide_reblogs": "Verberg boosts van @{name}", "account.media": "Media", "account.mention": "Vermeld @{name}", diff --git a/config/application.rb b/config/application.rb index 0879d3c6ac..1a53ab6e9f 100644 --- a/config/application.rb +++ b/config/application.rb @@ -39,6 +39,7 @@ module Mastodon :fa, :fi, :fr, + :gl, :he, :hr, :hu, From 0e567977923f2e7827192da0990d529859033f1a Mon Sep 17 00:00:00 2001 From: ncls7615 Date: Sun, 10 Dec 2017 17:33:22 +0900 Subject: [PATCH 030/112] add and fix --- app/javascript/glitch/locales/ja.json | 15 +++++++++------ app/javascript/mastodon/locales/en.json | 3 +++ app/javascript/mastodon/locales/ja.json | 3 +++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/app/javascript/glitch/locales/ja.json b/app/javascript/glitch/locales/ja.json index 70091268ff..a84b4cbe96 100644 --- a/app/javascript/glitch/locales/ja.json +++ b/app/javascript/glitch/locales/ja.json @@ -1,11 +1,11 @@ { "getting_started.open_source_notice": "Glitchsocは{Mastodon}によるフリーなオープンソースソフトウェアです。誰でもGitHub({github})から開発に參加したり、問題を報告したりできます。", "layout.auto": "自動", - "layout.current_is": "あなたの現在のレイアウト:", - "layout.desktop": "デスクトップ", - "layout.mobile": "モバイル", + "layout.current_is": "あなたの現在のレイアウト:", + "layout.desktop": "Desktop", + "layout.mobile": "Mobile", "navigation_bar.app_settings": "アプリ設定", - "getting_started.onboarding": "解説", + "getting_started.onboarding": "解説を表示", "onboarding.page_one.federation": "{domain}はMastodonのインスタンスです。Mastodonとは、独立したサーバが連携して作るソーシャルネットワークです。これらのサーバーをインスタンスと呼びます。", "onboarding.page_one.welcome": "{domain}へようこそ!", "onboarding.page_six.github": "{domain}はGlitchsocを使用しています。Glitchsocは{Mastodon}のフレンドリーな{fork}で、どんなMastodonアプリやインスタンスとも互換性があります。Glitchsocは完全に無料で、オープンソースです。{github}でバグ報告や機能要望あるいは貢獻をすることが可能です。", @@ -27,8 +27,11 @@ "settings.media_letterbox": "メディアをレターボックス式で表示", "settings.media_fullwidth": "全幅メディアプリビュー", "settings.preferences": "ユーザー設定", - "settings.wide_view": "ワイドビュー(デスクトップレイアウトのみ)", - "settings.navbar_under": "ナビを画面下部に移動させる(モバイルレイアウトのみ)", + "settings.wide_view": "ワイドビュー(Desktopレイアウトのみ)", + "settings.navbar_under": "ナビを画面下部に移動させる(Mobileレイアウトのみ)", + "settings.compose_box_opts": "コンポーズボックス設定", + "settings.side_arm": "セカンダリートゥートボタン", + "settings.layout": "レイアウト", "status.collapse": "折りたたむ", "status.uncollapse": "折りたたみを解除", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 538124904a..f5154634cd 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -33,6 +33,7 @@ "bundle_modal_error.retry": "Try again", "column.blocks": "Blocked users", "column.community": "Local timeline", + "column.direct": "Direct messages", "column.favourites": "Favourites", "column.follow_requests": "Follow requests", "column.home": "Home", @@ -88,6 +89,7 @@ "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", "empty_column.home.public_timeline": "the public timeline", @@ -141,6 +143,7 @@ "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.direct": "Direct messages", "navigation_bar.edit_profile": "Edit profile", "navigation_bar.favourites": "Favourites", "navigation_bar.follow_requests": "Follow requests", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index e015c41c22..125618bf22 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -33,6 +33,7 @@ "bundle_modal_error.retry": "再試行", "column.blocks": "ブロックしたユーザー", "column.community": "ローカルタイムライン", + "column.direct": "ダイレクトメッセージ", "column.favourites": "お気に入り", "column.follow_requests": "フォローリクエスト", "column.home": "ホーム", @@ -88,6 +89,7 @@ "emoji_button.symbols": "記号", "emoji_button.travel": "旅行と場所", "empty_column.community": "ローカルタイムラインはまだ使われていません。何か書いてみましょう!", + "empty_column.direct": "あなたはまだダイレクトメッセージを受け取っていません。あなたが送ったり受け取ったりすると、ここに表示されます。", "empty_column.hashtag": "このハッシュタグはまだ使われていません。", "empty_column.home": "まだ誰もフォローしていません。{public}を見に行くか、検索を使って他のユーザーを見つけましょう。", "empty_column.home.public_timeline": "連合タイムライン", @@ -141,6 +143,7 @@ "mute_modal.hide_notifications": "このユーザーからの通知を隠しますか?", "navigation_bar.blocks": "ブロックしたユーザー", "navigation_bar.community_timeline": "ローカルタイムライン", + "navigation_bar.direct": "ダイレクトメッセージ", "navigation_bar.edit_profile": "プロフィールを編集", "navigation_bar.favourites": "お気に入り", "navigation_bar.follow_requests": "フォローリクエスト", From 7d4ebeecbd783769cce040a00e7fb384185a9f3c Mon Sep 17 00:00:00 2001 From: Quenty31 <33203663+Quenty31@users.noreply.github.com> Date: Sun, 10 Dec 2017 16:07:24 +0100 Subject: [PATCH 031/112] l10n i18n OC: corrections (#5962) * filling missing strings * Small changes Better way of saying + removed 2 finals dots * Corrections * Corrections Now with final point or without, just like the EN file * Update oc.json --- app/javascript/mastodon/locales/oc.json | 18 +++++++++--------- config/locales/doorkeeper.oc.yml | 6 +++--- config/locales/oc.yml | 8 ++++---- config/locales/simple_form.oc.yml | 6 +++++- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index e3d88ab50b..f8b4751d6f 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -15,7 +15,7 @@ "account.mute_notifications": "Rescondre las notificacions de @{name}", "account.posts": "Estatuts", "account.report": "Senhalar @{name}", - "account.requested": "Invitacion mandada. Clicatz per anullar.", + "account.requested": "Invitacion mandada. Clicatz per anullar", "account.share": "Partejar lo perfil a @{name}", "account.show_reblogs": "Mostrar los partages de @{name}", "account.unblock": "Desblocar @{name}", @@ -88,12 +88,12 @@ "emoji_button.symbols": "Simbòls", "emoji_button.travel": "Viatges & lòcs", "empty_column.community": "Lo flux public local es void. Escrivètz quicòm per lo garnir !", - "empty_column.hashtag": "I a pas encara de contengut ligat a aqueste hashtag", + "empty_column.hashtag": "I a pas encara de contengut ligat a aquesta etiqueta.", "empty_column.home": "Vòstre flux d’acuèlh es void. Visitatz {public} o utilizatz la recèrca per vos connectar a d’autras personas.", "empty_column.home.public_timeline": "lo flux public", "empty_column.list": "I a pas res dins la lista pel moment.", "empty_column.notifications": "Avètz pas encara de notificacions. Respondètz a qualqu’un per començar una conversacion.", - "empty_column.public": "I a pas res aquí ! Escrivètz quicòm de public, o seguètz de personas d’autras instàncias per garnir lo flux public.", + "empty_column.public": "I a pas res aquí ! Escrivètz quicòm de public, o seguètz de personas d’autras instàncias per garnir lo flux public", "follow_request.authorize": "Autorizar", "follow_request.reject": "Regetar", "getting_started.appsshort": "Apps", @@ -133,7 +133,7 @@ "lists.edit": "Modificar la lista", "lists.new.create": "Ajustar una lista", "lists.new.title_placeholder": "Títol de la nòva lista", - "lists.search": "Cercar demest los seguidors", + "lists.search": "Cercar demest lo monde que seguètz", "lists.subheading": "Vòstras listas", "loading_indicator.label": "Cargament…", "media_gallery.toggle_visible": "Modificar la visibilitat", @@ -152,10 +152,10 @@ "navigation_bar.pins": "Tuts penjats", "navigation_bar.preferences": "Preferéncias", "navigation_bar.public_timeline": "Flux public global", - "notification.favourite": "{name} a ajustat a sos favorits :", + "notification.favourite": "{name} a ajustat a sos favorits", "notification.follow": "{name} vos sèc", - "notification.mention": "{name} vos a mencionat :", - "notification.reblog": "{name} a partejat vòstre estatut :", + "notification.mention": "{name} vos a mencionat", + "notification.reblog": "{name} a partejat vòstre estatut", "notifications.clear": "Escafar", "notifications.clear_confirmation": "Volètz vertadièrament escafar totas vòstras las notificacions ?", "notifications.column_settings.alert": "Notificacions localas", @@ -171,7 +171,7 @@ "onboarding.next": "Seguent", "onboarding.page_five.public_timelines": "Lo flux local mòstra los estatuts publics del monde de vòstra instància, aquí {domain}. Lo flux federat mòstra los estatuts publics de la gent que los de {domain} sègon. Son los fluxes publics, un bon biais de trobar de mond.", "onboarding.page_four.home": "Lo flux d’acuèlh mòstra los estatuts del mond que seguètz.", - "onboarding.page_four.notifications": "La colomna de notificacions vos fa veire quand qualqu’un interagís amb vos", + "onboarding.page_four.notifications": "La colomna de notificacions vos fa veire quand qualqu’un interagís amb vos.", "onboarding.page_one.federation": "Mastodon es un malhum de servidors independents que comunican per construire un malhum mai larg. Òm los apèla instàncias.", "onboarding.page_one.handle": "Sètz sus {domain}, doncas vòstre identificant complet es {handle}", "onboarding.page_one.welcome": "Benvengut a Mastodon !", @@ -225,7 +225,7 @@ "status.open": "Desplegar aqueste estatut", "status.pin": "Penjar al perfil", "status.reblog": "Partejar", - "status.reblogged_by": "{name} a partejat :", + "status.reblogged_by": "{name} a partejat", "status.reply": "Respondre", "status.replyAll": "Respondre a la conversacion", "status.report": "Senhalar @{name}", diff --git a/config/locales/doorkeeper.oc.yml b/config/locales/doorkeeper.oc.yml index 1ec1b69e82..d83d07438d 100644 --- a/config/locales/doorkeeper.oc.yml +++ b/config/locales/doorkeeper.oc.yml @@ -60,7 +60,7 @@ oc: title: I a agut un error new: able_to: Aquesta aplicacion poirà - prompt: L’aplicacion %{client_name} demanda l’accès al vòstre compte. + prompt: L’aplicacion %{client_name} demanda l’accès al vòstre compte title: Cal l’autorizacion show: title: Copiatz lo còdi d’autorizacion e pegatz-lo dins l’aplicacion. @@ -83,8 +83,8 @@ oc: invalid_grant: L’acòrdi d’autorizacion donadat es pas valid, expirat, revocat, una redireccion URI utilizat en la demanda d’autorizacion no correspond, o a estat desliurat a un altre client. invalid_redirect_uri: L’URL de redireccion es pas valida. invalid_request: La demanda a un paramètre que li manca, a una valor qu’es pas suportada, o quicòm mal format. - invalid_resource_owner: La qualificacion del proprietari de la ressorça donada es pas valid, o lo proprietari de la ressorça se pòt pas trobar. - invalid_scope: L’encastre demandat es pas valid, o mal format. + invalid_resource_owner: La qualificacion del proprietari de la ressorça donada es pas valida, o lo proprietari de la ressorça es pas trobable + invalid_scope: L’encastre demandat es pas valid, o d’un marrit format. invalid_token: expired: Lo geton d’accès a expirat revoked: Lo geton d’accès a estat revocat diff --git a/config/locales/oc.yml b/config/locales/oc.yml index a589c195e8..878df32b51 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -286,7 +286,7 @@ oc: desc_html: Mostrar lo badge Personal sus la pagina de perfil title: Mostrar lo badge personal site_description: - desc_html: Afichada jos la forma de paragraf sus la pagina d’acuèlh e utilizada coma balisa meta.
Podètz utilizar de balisas HTML, coma <a> e <em>. + desc_html: Afichada jos la forma de paragraf sus la pagina d’acuèlh e utilizada coma balisa meta. Podètz utilizar de balisas HTML, en particular <a> e <em>. title: Descripcion del site site_description_extended: desc_html: Afichada sus la pagina d’informacion complementària del site
Podètz utilizar de balisas HTML @@ -296,7 +296,7 @@ oc: title: Politica de confidencialitat del site site_title: Títol del site thumbnail: - desc_html: Servís pels apercebuts via OpenGraph e las API. Talha de 1200x630px recomandada. + desc_html: Servís pels apercebuts via OpenGraph e las API. Talha de 1200x630px recomandada title: Miniatura de l’instància timeline_preview: desc_html: Mostrar lo flux public sus la pagina d’acuèlh @@ -555,7 +555,7 @@ oc: body: 'Trobatz aquí un resumit de çò qu’avètz mancat dempuèi vòstra darrièra visita lo %{since}:' mention: "%{name} vos a mencionat dins :" new_followers_summary: - one: Avètz un nòu seguidor ! Ouà   + one: Avètz un nòu seguidor ! Ouà ! other: Avètz %{count} nòus seguidors ! Qué crane ! subject: one: "Una nòva notificacion dempuèi vòstra darrièra visita \U0001F418" @@ -781,4 +781,4 @@ oc: users: invalid_email: L’adreça de corrièl es invalida invalid_otp_token: Còdi d’autentificacion en dos temps invalid - signed_in_as: Session a + signed_in_as: 'Session a :' diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index f178d1857a..06c23ace2c 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -4,6 +4,7 @@ oc: hints: defaults: avatar: PNG, GIF o JPG. Maximum 2 Mo. Serà retalhat en 120x120px + digest: Enviat aprèp un long moment d’inactivitat amb un resumit de las mencions qu’avètz recebudas pendent vòstra abséncia display_name: one: Demòra encara 1 caractèr other: Demòran encara %{count} caractèrs @@ -29,10 +30,12 @@ oc: data: Data display_name: Escais email: Corrièl + expires_in: Expira aprèp filtered_languages: Lengas filtradas header: Bandièra locale: Lenga locked: Far venir lo compte privat + max_uses: Limit d’utilizacion new_password: Nòu senhal note: Bio otp_attempt: Còdi Two-factor @@ -44,7 +47,7 @@ oc: setting_delete_modal: Afichar una fenèstra de confirmacion abans de suprimir un estatut setting_noindex: Èsser pas indexat pels motors de recèrca setting_reduce_motion: Reduire la velocitat de las animacions - setting_system_font_ui: Utilizar la policia Font del sisèma + setting_system_font_ui: Utilizar la polissa del sisèma setting_theme: Tèma del site setting_unfollow_modal: Afichar una confirmacion abans de quitar de sègre qualqu’un severity: Severitat @@ -53,6 +56,7 @@ oc: interactions: must_be_follower: Blocar las notificacions del mond que vos sègon pas must_be_following: Blocar las notificacions del mond que seguètz pas + must_be_following_dm: Blocar los messatges del monde que seguètz pas notification_emails: digest: Enviar un corrièl recapitulatiu favourite: Enviar un corrièl quand qualqu’un plaça vòstre estatut en favorit From 7a8711ccacafd675d27c5fbd07ce77a5c0dd3259 Mon Sep 17 00:00:00 2001 From: cwm Date: Sun, 10 Dec 2017 09:10:47 -0600 Subject: [PATCH 032/112] removed app settings additions --- app/javascript/flavours/glitch/features/ui/index.js | 2 -- app/javascript/flavours/glitch/reducers/local_settings.js | 1 - 2 files changed, 3 deletions(-) diff --git a/app/javascript/flavours/glitch/features/ui/index.js b/app/javascript/flavours/glitch/features/ui/index.js index 1e8de033c2..4a19829164 100644 --- a/app/javascript/flavours/glitch/features/ui/index.js +++ b/app/javascript/flavours/glitch/features/ui/index.js @@ -57,7 +57,6 @@ const mapStateToProps = state => ({ layout: state.getIn(['local_settings', 'layout']), isWide: state.getIn(['local_settings', 'stretch']), navbarUnder: state.getIn(['local_settings', 'navbar_under']), - favouriteModal: state.getIn(['local_settings', 'favourite_modal']), }); const keyMap = { @@ -104,7 +103,6 @@ export default class UI extends React.Component { isWide: PropTypes.bool, systemFontUi: PropTypes.bool, navbarUnder: PropTypes.bool, - favouriteModal: PropTypes.bool, isComposing: PropTypes.bool, hasComposingText: PropTypes.bool, location: PropTypes.object, diff --git a/app/javascript/flavours/glitch/reducers/local_settings.js b/app/javascript/flavours/glitch/reducers/local_settings.js index e4cdc49eeb..69d98741b6 100644 --- a/app/javascript/flavours/glitch/reducers/local_settings.js +++ b/app/javascript/flavours/glitch/reducers/local_settings.js @@ -9,7 +9,6 @@ const initialState = ImmutableMap({ layout : 'auto', stretch : true, navbar_under : false, - favourite_modal : false, side_arm : 'none', collapsed : ImmutableMap({ enabled : true, From 2950de86c6cc8712a01d6b579cc0a8ebed6b1a26 Mon Sep 17 00:00:00 2001 From: goofy-bz Date: Sun, 10 Dec 2017 16:24:29 +0100 Subject: [PATCH 033/112] Update devise.fr.yml (#5963) ludicrously tiny but necessary typofix (wrong accent) --- config/locales/devise.fr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml index cb4d5d5f6a..a9817044d8 100644 --- a/config/locales/devise.fr.yml +++ b/config/locales/devise.fr.yml @@ -19,7 +19,7 @@ fr: confirmation_instructions: subject: Merci de confirmer votre inscription sur %{instance} password_change: - subject: Votre mot de passe a été modifié avec succés. + subject: Votre mot de passe a été modifié avec succès. reset_password_instructions: subject: Instructions pour changer votre mot de passe unlock_instructions: From 066458a6593cbb708db9b46dbda787ba440273b1 Mon Sep 17 00:00:00 2001 From: cwm Date: Sun, 10 Dec 2017 09:25:44 -0600 Subject: [PATCH 034/112] removed one last app settings addition --- .../glitch/features/local_settings/page/index.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/javascript/flavours/glitch/features/local_settings/page/index.js b/app/javascript/flavours/glitch/features/local_settings/page/index.js index b9b00b050b..62bf410c69 100644 --- a/app/javascript/flavours/glitch/features/local_settings/page/index.js +++ b/app/javascript/flavours/glitch/features/local_settings/page/index.js @@ -59,15 +59,6 @@ export default class LocalSettingsPage extends React.PureComponent { >
- - - -

Date: Mon, 11 Dec 2017 00:33:52 +0900 Subject: [PATCH 035/112] Save media outside transaction (#5959) --- app/lib/activitypub/activity/create.rb | 22 +++++++++++++++++++--- app/lib/ostatus/activity/creation.rb | 21 +++++++++++++++++---- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 31e0abe39c..3a985c19b6 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -20,11 +20,13 @@ class ActivityPub::Activity::Create < ActivityPub::Activity private def process_status + media_attachments = process_attachments + ApplicationRecord.transaction do @status = Status.create!(status_params) process_tags(@status) - process_attachments(@status) + attach_media(@status, media_attachments) end resolve_thread(@status) @@ -105,22 +107,36 @@ class ActivityPub::Activity::Create < ActivityPub::Activity emoji.save end - def process_attachments(status) + def process_attachments return if @object['attachment'].nil? + media_attachments = [] + as_array(@object['attachment']).each do |attachment| next if unsupported_media_type?(attachment['mediaType']) || attachment['url'].blank? href = Addressable::URI.parse(attachment['url']).normalize.to_s - media_attachment = MediaAttachment.create(status: status, account: status.account, remote_url: href, description: attachment['name'].presence) + media_attachment = MediaAttachment.create(account: @account, remote_url: href, description: attachment['name'].presence) + media_attachments << media_attachment next if skip_download? media_attachment.file_remote_url = href media_attachment.save end + + media_attachments rescue Addressable::URI::InvalidURIError => e Rails.logger.debug e + + media_attachments + end + + def attach_media(status, media_attachments) + return if media_attachments.blank? + + media = MediaAttachment.where(status_id: nil, id: media_attachments.take(4).map(&:id)) + media.update(status_id: status.id) end def resolve_thread(status) diff --git a/app/lib/ostatus/activity/creation.rb b/app/lib/ostatus/activity/creation.rb index 3418e24205..f210e134ab 100644 --- a/app/lib/ostatus/activity/creation.rb +++ b/app/lib/ostatus/activity/creation.rb @@ -26,6 +26,8 @@ class OStatus::Activity::Creation < OStatus::Activity::Base cached_reblog = reblog status = nil + media_attachments = save_media + ApplicationRecord.transaction do status = Status.create!( uri: id, @@ -44,7 +46,7 @@ class OStatus::Activity::Creation < OStatus::Activity::Base save_mentions(status) save_hashtags(status) - save_media(status) + attach_media(status, media_attachments) save_emojis(status) end @@ -126,18 +128,20 @@ class OStatus::Activity::Creation < OStatus::Activity::Base ProcessHashtagsService.new.call(parent, tags) end - def save_media(parent) - do_not_download = DomainBlock.find_by(domain: parent.account.domain)&.reject_media? + def save_media + do_not_download = DomainBlock.find_by(domain: @account.domain)&.reject_media? + media_attachments = [] @xml.xpath('./xmlns:link[@rel="enclosure"]', xmlns: OStatus::TagManager::XMLNS).each do |link| next unless link['href'] - media = MediaAttachment.where(status: parent, remote_url: link['href']).first_or_initialize(account: parent.account, status: parent, remote_url: link['href']) + media = MediaAttachment.where(status: nil, remote_url: link['href']).first_or_initialize(account: @account, status: nil, remote_url: link['href']) parsed_url = Addressable::URI.parse(link['href']).normalize next if !%w(http https).include?(parsed_url.scheme) || parsed_url.host.empty? media.save + media_attachments << media next if do_not_download @@ -148,6 +152,15 @@ class OStatus::Activity::Creation < OStatus::Activity::Base next end end + + media_attachments + end + + def attach_media(parent, media_attachments) + return if media_attachments.blank? + + media = MediaAttachment.where(status_id: nil, id: media_attachments.take(4).map(&:id)) + media.update(status_id: parent.id) end def save_emojis(parent) From 98aa96b8d6800f049e6b185b15a6c215042b8f08 Mon Sep 17 00:00:00 2001 From: Lynx Kotoura Date: Mon, 11 Dec 2017 01:56:05 +0900 Subject: [PATCH 036/112] Refix extraspace for emojis (#5964) Fix misalignment between emoji sizes --- 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 f76470da77..def149e243 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -803,7 +803,7 @@ .emojione { width: 24px; height: 24px; - margin: -3px 0 0; + margin: -1px 0 0; } } From 6a82939adb823c9a65829c23dc7109a96480befe Mon Sep 17 00:00:00 2001 From: Andrea Scarpino Date: Sun, 10 Dec 2017 19:35:46 +0100 Subject: [PATCH 037/112] Fix account and tag searches with leading/trailing spaces (#5965) * Strip leading & trailing spaces from account query * Strip leading & trailing spaces from tag search --- app/models/tag.rb | 2 +- app/services/account_search_service.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/tag.rb b/app/models/tag.rb index 0fa08e157c..dc2c8d1290 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -23,7 +23,7 @@ class Tag < ApplicationRecord class << self def search_for(term, limit = 5) - pattern = sanitize_sql_like(term) + '%' + pattern = sanitize_sql_like(term.strip) + '%' Tag.where('lower(name) like lower(?)', pattern).order(:name).limit(limit) end end diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb index a289ceac4f..3be1106654 100644 --- a/app/services/account_search_service.rb +++ b/app/services/account_search_service.rb @@ -4,7 +4,7 @@ class AccountSearchService < BaseService attr_reader :query, :limit, :options, :account def call(query, limit, account = nil, options = {}) - @query = query + @query = query.strip @limit = limit @options = options @account = account From d08d0f9f3335b2edbacf1febd4584eed9a7d1a11 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Thu, 7 Dec 2017 14:42:21 -0800 Subject: [PATCH 038/112] Ruby intl8n for themes --- app/javascript/flavours/glitch/names.yml | 6 ++++++ app/javascript/flavours/vanilla/names.yml | 6 ++++++ .../skins/vanilla/{win95.scss => win95/common.scss} | 0 app/javascript/skins/vanilla/win95/names.yml | 4 ++++ app/views/settings/preferences/show.html.haml | 4 ++-- config/initializers/locale.rb | 6 ++++++ 6 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 app/javascript/flavours/glitch/names.yml create mode 100644 app/javascript/flavours/vanilla/names.yml rename app/javascript/skins/vanilla/{win95.scss => win95/common.scss} (100%) create mode 100644 app/javascript/skins/vanilla/win95/names.yml create mode 100644 config/initializers/locale.rb diff --git a/app/javascript/flavours/glitch/names.yml b/app/javascript/flavours/glitch/names.yml new file mode 100644 index 0000000000..b3d579cb27 --- /dev/null +++ b/app/javascript/flavours/glitch/names.yml @@ -0,0 +1,6 @@ +en: + flavours: + glitch: Glitch Edition + skins: + glitch: + default: Default diff --git a/app/javascript/flavours/vanilla/names.yml b/app/javascript/flavours/vanilla/names.yml new file mode 100644 index 0000000000..8816fcb3ab --- /dev/null +++ b/app/javascript/flavours/vanilla/names.yml @@ -0,0 +1,6 @@ +en: + flavours: + vanilla: Vanilla Mastodon + skins: + vanilla: + default: Default diff --git a/app/javascript/skins/vanilla/win95.scss b/app/javascript/skins/vanilla/win95/common.scss similarity index 100% rename from app/javascript/skins/vanilla/win95.scss rename to app/javascript/skins/vanilla/win95/common.scss diff --git a/app/javascript/skins/vanilla/win95/names.yml b/app/javascript/skins/vanilla/win95/names.yml new file mode 100644 index 0000000000..2083084a27 --- /dev/null +++ b/app/javascript/skins/vanilla/win95/names.yml @@ -0,0 +1,4 @@ +en: + skins: + vanilla: + win95: Masto95 diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 9564c03991..e2e48a6998 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -27,8 +27,8 @@ .fields-group - if Themes.instance.flavours.size > 1 - = f.input :setting_flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("themes.#{flavour}", default: flavour) }, wrapper: :with_label, include_blank: false - = f.input :setting_skin, collection: Themes.instance.skins_for(current_flavour), label_method: lambda { |skin| I18n.t("themes.#{current_flavour}.skins.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false + = f.input :setting_flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("flavours.#{flavour}", default: flavour) }, wrapper: :with_label, include_blank: false + = f.input :setting_skin, collection: Themes.instance.skins_for(current_flavour), label_method: lambda { |skin| I18n.t("skins.#{current_flavour}.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label = f.input :setting_boost_modal, as: :boolean, wrapper: :with_label diff --git a/config/initializers/locale.rb b/config/initializers/locale.rb new file mode 100644 index 0000000000..04ed316465 --- /dev/null +++ b/config/initializers/locale.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +I18n.load_path += Dir[Rails.root.join('app', 'javascript', 'flavours', '*', 'names.{rb,yml}').to_s] +I18n.load_path += Dir[Rails.root.join('app', 'javascript', 'flavours', '*', 'names', '*.{rb,yml}').to_s] +I18n.load_path += Dir[Rails.root.join('app', 'javascript', 'skins', '*', '*', 'names.{rb,yml}').to_s] +I18n.load_path += Dir[Rails.root.join('app', 'javascript', 'skins', '*', '*', 'names', '*.{rb,yml}').to_s] From 83944300815cda2cd67c93ec7ca7f3d981b561fa Mon Sep 17 00:00:00 2001 From: kibigo! Date: Thu, 7 Dec 2017 14:57:49 -0800 Subject: [PATCH 039/112] Removed unused theme localization key --- config/locales/en.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 0ca320e1ac..c8acc237ac 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -687,8 +687,6 @@ en:

Originally adapted from the Discourse privacy policy.

title: "%{instance} Terms of Service and Privacy Policy" - themes: - default: Mastodon time: formats: default: "%b %d, %Y, %H:%M" From b28cd6769c77190160e4ffefde78b324c7aad269 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Thu, 7 Dec 2017 19:07:47 -0800 Subject: [PATCH 040/112] Javascript intl8n flavour support --- app/controllers/application_controller.rb | 2 + app/javascript/flavours/glitch/locales/ar.js | 7 ++ app/javascript/flavours/glitch/locales/bg.js | 7 ++ app/javascript/flavours/glitch/locales/ca.js | 7 ++ app/javascript/flavours/glitch/locales/de.js | 7 ++ .../en.json => flavours/glitch/locales/en.js} | 10 +- app/javascript/flavours/glitch/locales/eo.js | 7 ++ app/javascript/flavours/glitch/locales/es.js | 7 ++ app/javascript/flavours/glitch/locales/fa.js | 7 ++ app/javascript/flavours/glitch/locales/fi.js | 7 ++ app/javascript/flavours/glitch/locales/fr.js | 7 ++ app/javascript/flavours/glitch/locales/he.js | 7 ++ app/javascript/flavours/glitch/locales/hr.js | 7 ++ app/javascript/flavours/glitch/locales/hu.js | 7 ++ app/javascript/flavours/glitch/locales/id.js | 7 ++ app/javascript/flavours/glitch/locales/io.js | 7 ++ app/javascript/flavours/glitch/locales/it.js | 7 ++ app/javascript/flavours/glitch/locales/ja.js | 7 ++ app/javascript/flavours/glitch/locales/ko.js | 7 ++ app/javascript/flavours/glitch/locales/nl.js | 7 ++ app/javascript/flavours/glitch/locales/no.js | 7 ++ app/javascript/flavours/glitch/locales/oc.js | 7 ++ .../pl.json => flavours/glitch/locales/pl.js} | 8 +- .../flavours/glitch/locales/pt-BR.js | 7 ++ app/javascript/flavours/glitch/locales/pt.js | 7 ++ app/javascript/flavours/glitch/locales/ru.js | 7 ++ app/javascript/flavours/glitch/locales/sv.js | 7 ++ app/javascript/flavours/glitch/locales/th.js | 7 ++ app/javascript/flavours/glitch/locales/tr.js | 7 ++ app/javascript/flavours/glitch/locales/uk.js | 7 ++ .../flavours/glitch/locales/zh-CN.js | 7 ++ .../flavours/glitch/locales/zh-HK.js | 7 ++ .../flavours/glitch/locales/zh-TW.js | 7 ++ app/javascript/flavours/glitch/theme.yml | 6 + app/javascript/flavours/vanilla/theme.yml | 10 +- .../locales/locale-data/README.md | 0 .../{mastodon => }/locales/locale-data/oc.js | 0 app/lib/themes.rb | 8 ++ app/views/layouts/application.html.haml | 5 +- config/webpack/configuration.js | 5 +- config/webpack/generateLocalePacks.js | 108 +++++++++--------- config/webpack/shared.js | 8 +- 42 files changed, 308 insertions(+), 72 deletions(-) create mode 100644 app/javascript/flavours/glitch/locales/ar.js create mode 100644 app/javascript/flavours/glitch/locales/bg.js create mode 100644 app/javascript/flavours/glitch/locales/ca.js create mode 100644 app/javascript/flavours/glitch/locales/de.js rename app/javascript/{glitch/locales/en.json => flavours/glitch/locales/en.js} (93%) create mode 100644 app/javascript/flavours/glitch/locales/eo.js create mode 100644 app/javascript/flavours/glitch/locales/es.js create mode 100644 app/javascript/flavours/glitch/locales/fa.js create mode 100644 app/javascript/flavours/glitch/locales/fi.js create mode 100644 app/javascript/flavours/glitch/locales/fr.js create mode 100644 app/javascript/flavours/glitch/locales/he.js create mode 100644 app/javascript/flavours/glitch/locales/hr.js create mode 100644 app/javascript/flavours/glitch/locales/hu.js create mode 100644 app/javascript/flavours/glitch/locales/id.js create mode 100644 app/javascript/flavours/glitch/locales/io.js create mode 100644 app/javascript/flavours/glitch/locales/it.js create mode 100644 app/javascript/flavours/glitch/locales/ja.js create mode 100644 app/javascript/flavours/glitch/locales/ko.js create mode 100644 app/javascript/flavours/glitch/locales/nl.js create mode 100644 app/javascript/flavours/glitch/locales/no.js create mode 100644 app/javascript/flavours/glitch/locales/oc.js rename app/javascript/{glitch/locales/pl.json => flavours/glitch/locales/pl.js} (95%) create mode 100644 app/javascript/flavours/glitch/locales/pt-BR.js create mode 100644 app/javascript/flavours/glitch/locales/pt.js create mode 100644 app/javascript/flavours/glitch/locales/ru.js create mode 100644 app/javascript/flavours/glitch/locales/sv.js create mode 100644 app/javascript/flavours/glitch/locales/th.js create mode 100644 app/javascript/flavours/glitch/locales/tr.js create mode 100644 app/javascript/flavours/glitch/locales/uk.js create mode 100644 app/javascript/flavours/glitch/locales/zh-CN.js create mode 100644 app/javascript/flavours/glitch/locales/zh-HK.js create mode 100644 app/javascript/flavours/glitch/locales/zh-TW.js rename app/javascript/{mastodon => }/locales/locale-data/README.md (100%) rename app/javascript/{mastodon => }/locales/locale-data/oc.js (100%) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index c6d148c8c8..3b2070f39d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -62,6 +62,7 @@ class ApplicationController < ActionController::Base pack: pack_name, preload: nil, skin: nil, + supported_locales: data['locales'], } if data['pack'][pack_name].is_a?(Hash) pack_data[:common] = nil if data['pack'][pack_name]['use_common'] == false @@ -93,6 +94,7 @@ class ApplicationController < ActionController::Base pack: nil, preload: nil, skin: nil, + supported_locales: data['locales'], } end diff --git a/app/javascript/flavours/glitch/locales/ar.js b/app/javascript/flavours/glitch/locales/ar.js new file mode 100644 index 0000000000..1081147d5a --- /dev/null +++ b/app/javascript/flavours/glitch/locales/ar.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/ar.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/bg.js b/app/javascript/flavours/glitch/locales/bg.js new file mode 100644 index 0000000000..979039376f --- /dev/null +++ b/app/javascript/flavours/glitch/locales/bg.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/bg.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/ca.js b/app/javascript/flavours/glitch/locales/ca.js new file mode 100644 index 0000000000..baf76bd6f7 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/ca.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/ca.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/de.js b/app/javascript/flavours/glitch/locales/de.js new file mode 100644 index 0000000000..ce64536235 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/de.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/de.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/glitch/locales/en.json b/app/javascript/flavours/glitch/locales/en.js similarity index 93% rename from app/javascript/glitch/locales/en.json rename to app/javascript/flavours/glitch/locales/en.js index 0276cb8370..96182196eb 100644 --- a/app/javascript/glitch/locales/en.json +++ b/app/javascript/flavours/glitch/locales/en.js @@ -1,4 +1,6 @@ -{ +import inherited from 'mastodon/locales/en.json'; + +const messages = { "getting_started.open_source_notice": "Glitchsoc is free open source software forked from {Mastodon}. You can contribute or report issues on GitHub at {github}.", "layout.auto": "Auto", "layout.current_is": "Your current layout is:", @@ -42,5 +44,7 @@ "notification_purge.btn_all": "Select\nall", "notification_purge.btn_none": "Select\nnone", "notification_purge.btn_invert": "Invert\nselection", - "notification_purge.btn_apply": "Clear\nselected" -} + "notification_purge.btn_apply": "Clear\nselected", +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/eo.js b/app/javascript/flavours/glitch/locales/eo.js new file mode 100644 index 0000000000..04192f5064 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/eo.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/eo.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/es.js b/app/javascript/flavours/glitch/locales/es.js new file mode 100644 index 0000000000..456df3c47e --- /dev/null +++ b/app/javascript/flavours/glitch/locales/es.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/es.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/fa.js b/app/javascript/flavours/glitch/locales/fa.js new file mode 100644 index 0000000000..d82461a1a2 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/fa.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/fa.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/fi.js b/app/javascript/flavours/glitch/locales/fi.js new file mode 100644 index 0000000000..11c3cd082f --- /dev/null +++ b/app/javascript/flavours/glitch/locales/fi.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/fi.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/fr.js b/app/javascript/flavours/glitch/locales/fr.js new file mode 100644 index 0000000000..8562f55944 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/fr.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/fr.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/he.js b/app/javascript/flavours/glitch/locales/he.js new file mode 100644 index 0000000000..99516ee0cf --- /dev/null +++ b/app/javascript/flavours/glitch/locales/he.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/he.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/hr.js b/app/javascript/flavours/glitch/locales/hr.js new file mode 100644 index 0000000000..dbf9b4b9fb --- /dev/null +++ b/app/javascript/flavours/glitch/locales/hr.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/hr.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/hu.js b/app/javascript/flavours/glitch/locales/hu.js new file mode 100644 index 0000000000..1f0849af3c --- /dev/null +++ b/app/javascript/flavours/glitch/locales/hu.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/hu.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/id.js b/app/javascript/flavours/glitch/locales/id.js new file mode 100644 index 0000000000..07e5f7e56a --- /dev/null +++ b/app/javascript/flavours/glitch/locales/id.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/id.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/io.js b/app/javascript/flavours/glitch/locales/io.js new file mode 100644 index 0000000000..74ea6fae6c --- /dev/null +++ b/app/javascript/flavours/glitch/locales/io.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/io.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/it.js b/app/javascript/flavours/glitch/locales/it.js new file mode 100644 index 0000000000..90f5430932 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/it.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/it.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/ja.js b/app/javascript/flavours/glitch/locales/ja.js new file mode 100644 index 0000000000..cc7143443a --- /dev/null +++ b/app/javascript/flavours/glitch/locales/ja.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/ja.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/ko.js b/app/javascript/flavours/glitch/locales/ko.js new file mode 100644 index 0000000000..3b55f89b93 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/ko.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/ko.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/nl.js b/app/javascript/flavours/glitch/locales/nl.js new file mode 100644 index 0000000000..17c371c58f --- /dev/null +++ b/app/javascript/flavours/glitch/locales/nl.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/nl.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/no.js b/app/javascript/flavours/glitch/locales/no.js new file mode 100644 index 0000000000..794b1da25a --- /dev/null +++ b/app/javascript/flavours/glitch/locales/no.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/no.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/oc.js b/app/javascript/flavours/glitch/locales/oc.js new file mode 100644 index 0000000000..8f161fd8c1 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/oc.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/oc.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/glitch/locales/pl.json b/app/javascript/flavours/glitch/locales/pl.js similarity index 95% rename from app/javascript/glitch/locales/pl.json rename to app/javascript/flavours/glitch/locales/pl.js index 1481b6a2ab..ab96dec60c 100644 --- a/app/javascript/glitch/locales/pl.json +++ b/app/javascript/flavours/glitch/locales/pl.js @@ -1,4 +1,6 @@ -{ +import inherited from 'mastodon/locales/pl.json'; + +const messages = { "getting_started.open_source_notice": "Glitchsoc jest wolnym i otwartoźródłowym forkiem oprogramowania {Mastodon}. Możesz współtworzyć projekt lub zgłaszać błędy na GitHubie pod adresem {github}.", "layout.auto": "Automatyczny", "layout.current_is": "Twój obecny układ to:", @@ -41,4 +43,6 @@ "notification_purge.btn_none": "Odznacz\nwszystkie", "notification_purge.btn_invert": "Odwróć\nzaznaczenie", "notification_purge.btn_apply": "Usuń\nzaznaczone" -} +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/pt-BR.js b/app/javascript/flavours/glitch/locales/pt-BR.js new file mode 100644 index 0000000000..6fed635f8f --- /dev/null +++ b/app/javascript/flavours/glitch/locales/pt-BR.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/pt-BR.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/pt.js b/app/javascript/flavours/glitch/locales/pt.js new file mode 100644 index 0000000000..0156f55ff2 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/pt.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/pt.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/ru.js b/app/javascript/flavours/glitch/locales/ru.js new file mode 100644 index 0000000000..0e9f1de717 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/ru.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/ru.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/sv.js b/app/javascript/flavours/glitch/locales/sv.js new file mode 100644 index 0000000000..b62c353fe4 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/sv.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/sv.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/th.js b/app/javascript/flavours/glitch/locales/th.js new file mode 100644 index 0000000000..e939f86312 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/th.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/th.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/tr.js b/app/javascript/flavours/glitch/locales/tr.js new file mode 100644 index 0000000000..c2b740617a --- /dev/null +++ b/app/javascript/flavours/glitch/locales/tr.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/tr.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/uk.js b/app/javascript/flavours/glitch/locales/uk.js new file mode 100644 index 0000000000..ab6d9a7dc7 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/uk.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/uk.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/zh-CN.js b/app/javascript/flavours/glitch/locales/zh-CN.js new file mode 100644 index 0000000000..944588e023 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/zh-CN.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/zh-CN.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/zh-HK.js b/app/javascript/flavours/glitch/locales/zh-HK.js new file mode 100644 index 0000000000..b71c81f2b3 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/zh-HK.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/zh-HK.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/zh-TW.js b/app/javascript/flavours/glitch/locales/zh-TW.js new file mode 100644 index 0000000000..de2b7769c9 --- /dev/null +++ b/app/javascript/flavours/glitch/locales/zh-TW.js @@ -0,0 +1,7 @@ +import inherited from 'mastodon/locales/zh-TW.json'; + +const messages = { + // No translations available. +}; + +export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/theme.yml b/app/javascript/flavours/glitch/theme.yml index fe09fa1055..9437e2c045 100644 --- a/app/javascript/flavours/glitch/theme.yml +++ b/app/javascript/flavours/glitch/theme.yml @@ -20,6 +20,12 @@ pack: settings: share: packs/share.js +# (OPTIONAL) The directory which contains localization files for +# the flavour, relative to this directory. The contents of this +# directory must be `.js` or `.json` files whose names correspond to +# language tags and whose default exports are a messages object. +locales: locales + # (OPTIONAL) The directory which contains the pack files. # Defaults to the theme directory (`app/javascript/themes/[theme]`), # which should be sufficient for like 99% of use-cases lol. diff --git a/app/javascript/flavours/vanilla/theme.yml b/app/javascript/flavours/vanilla/theme.yml index 67fd9723e8..491ea173b0 100644 --- a/app/javascript/flavours/vanilla/theme.yml +++ b/app/javascript/flavours/vanilla/theme.yml @@ -20,13 +20,17 @@ pack: settings: share: share.js +# (OPTIONAL) The directory which contains localization files for +# the flavour, relative to this directory. +locales: ../../mastodon/locales + # (OPTIONAL) The directory which contains the pack files. -# Defaults to the theme directory (`app/javascript/themes/[theme]`), -# but in the case of the vanilla Mastodon theme the pack files are +# Defaults to this directory (`app/javascript/flavour/[flavour]`), +# but in the case of the vanilla Mastodon flavour the pack files are # somewhere else. pack_directory: app/javascript/packs -# (OPTIONAL) By default the theme will fallback to the default theme +# (OPTIONAL) By default the theme will fallback to the default flavour # if a particular pack is not provided. You can specify different # fallbacks here, or disable fallback behaviours altogether by # specifying a `null` value. diff --git a/app/javascript/mastodon/locales/locale-data/README.md b/app/javascript/locales/locale-data/README.md similarity index 100% rename from app/javascript/mastodon/locales/locale-data/README.md rename to app/javascript/locales/locale-data/README.md diff --git a/app/javascript/mastodon/locales/locale-data/oc.js b/app/javascript/locales/locale-data/oc.js similarity index 100% rename from app/javascript/mastodon/locales/locale-data/oc.js rename to app/javascript/locales/locale-data/oc.js diff --git a/app/lib/themes.rb b/app/lib/themes.rb index 863326e2d5..49e9ebbc38 100644 --- a/app/lib/themes.rb +++ b/app/lib/themes.rb @@ -15,6 +15,14 @@ class Themes Dir.glob(Rails.root.join('app', 'javascript', 'flavours', '*', 'theme.yml')) do |path| data = YAML.load_file(path) name = File.basename(File.dirname(path)) + if data['locales'] + locales = [] + Dir.glob(File.join(File.dirname(path), data['locales'], '*.{js,json}')) do |locale| + localeName = File.basename(locale, File.extname(locale)) + locales.push(localeName) unless localeName.match(/defaultMessages|whitelist|index/) + end + data['locales'] = locales + end if data['pack'] data['name'] = name data['skin'] = { 'default' => [] } diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 99ae7d90d6..4d32c50353 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -19,7 +19,10 @@ = title = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous' - = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous' + - if @theme[:supported_locales].include? I18n.locale.to_s + = javascript_pack_tag "locales/#{@theme[:flavour]}/#{I18n.locale}", integrity: true, crossorigin: 'anonymous' + - elsif @theme[:supported_locales].include? 'en' + = javascript_pack_tag "locales/#{@theme[:flavour]}/en", integrity: true, crossorigin: 'anonymous' = csrf_meta_tags = yield :header_tags diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js index 9cdd6f9345..852185eb98 100644 --- a/config/webpack/configuration.js +++ b/config/webpack/configuration.js @@ -30,6 +30,9 @@ for (let i = 0; i < flavourFiles.length; i++) { if (!data.pack_directory) { data.pack_directory = dirname(flavourFile); } + if (data.locales) { + data.locales = join(dirname(flavourFile), data.locales); + } if (data.pack && typeof data.pack === 'object') { flavours[data.name] = data; } @@ -45,7 +48,7 @@ for (let i = 0; i < skinFiles.length; i++) { const data = flavours[name].skin; if (lstatSync(skinFile).isDirectory()) { data[skin] = {}; - const skinPacks = glob.sync(resolve(skinFile, '*.{css,scss}')); + const skinPacks = glob.sync(join(skinFile, '*.{css,scss}')); for (let j = 0; j < skinPacks.length; j++) { const pack = skinPacks[i]; data[skin][basename(pack, extname(pack))] = pack; diff --git a/config/webpack/generateLocalePacks.js b/config/webpack/generateLocalePacks.js index a943589f74..09fba4a18c 100644 --- a/config/webpack/generateLocalePacks.js +++ b/config/webpack/generateLocalePacks.js @@ -1,70 +1,66 @@ +// A message from upstream: +// ======================== // To avoid adding a lot of boilerplate, locale packs are // automatically generated here. These are written into the tmp/ // directory and then used to generate locale_en.js, locale_fr.js, etc. -const fs = require('fs'); -const path = require('path'); +// Glitch note: +// ============ +// This code has been entirely rewritten to support glitch flavours. +// However, the underlying process is exactly the same. + +const { existsSync, readdirSync, writeFileSync } = require('fs'); +const { join, resolve } = require('path'); const rimraf = require('rimraf'); const mkdirp = require('mkdirp'); +const { flavours } = require('./configuration.js'); -const localesJsonPath = path.join(__dirname, '../../app/javascript/mastodon/locales'); -const locales = fs.readdirSync(localesJsonPath).filter(filename => { - return /\.json$/.test(filename) && - !/defaultMessages/.test(filename) && - !/whitelist/.test(filename); -}).map(filename => filename.replace(/\.json$/, '')); - -const outPath = path.join(__dirname, '../../tmp/packs'); - -rimraf.sync(outPath); -mkdirp.sync(outPath); - -const outPaths = []; - -locales.forEach(locale => { - const localePath = path.join(outPath, `locale_${locale}.js`); - const baseLocale = locale.split('-')[0]; // e.g. 'zh-TW' -> 'zh' - const localeDataPath = [ - // first try react-intl - `../../node_modules/react-intl/locale-data/${baseLocale}.js`, - // then check locales/locale-data - `../../app/javascript/mastodon/locales/locale-data/${baseLocale}.js`, - // fall back to English (this is what react-intl does anyway) - '../../node_modules/react-intl/locale-data/en.js', - ].filter(filename => fs.existsSync(path.join(outPath, filename))) - .map(filename => filename.replace(/..\/..\/node_modules\//, ''))[0]; - - let glitchInject = ` -const mergedMessages = messages; -`; - - const glitchPath = `../../app/javascript/glitch/locales/${locale}.json`; - if (fs.existsSync(path.join(outPath, glitchPath))) { - glitchInject = ` -import glitchMessages from ${JSON.stringify(glitchPath)}; - -let mergedMessages = messages; -Object.keys(glitchMessages).forEach(function (key) { - mergedMessages[key] = glitchMessages[key]; -}); - -`; +module.exports = Object.keys(flavours).reduce(function (map, entry) { + const flavour = flavours[entry]; + if (!flavour.locales) { + return map; } + const locales = readdirSync(flavour.locales).filter( + filename => /\.js(?:on)?$/.test(filename) && !/defaultMessages|whitelist|index/.test(filename) + ); + const outPath = resolve('tmp', 'locales', entry); - const localeContent = `// -// locale_${locale}.js + rimraf.sync(outPath); + mkdirp.sync(outPath); + + locales.forEach(function (locale) { + const localeName = locale.replace(/\.js(?:on)?$/, ''); + const localePath = join(outPath, `${localeName}.js`); + const baseLocale = localeName.split('-')[0]; // e.g. 'zh-TW' -> 'zh' + const localeDataPath = [ + // first try react-intl + `node_modules/react-intl/locale-data/${baseLocale}.js`, + // then check locales/locale-data + `app/javascript/locales/locale-data/${baseLocale}.js`, + // fall back to English (this is what react-intl does anyway) + 'node_modules/react-intl/locale-data/en.js', + ].filter( + filename => existsSync(filename) + ).map( + filename => filename.replace(/(?:node_modules|app\/javascript)\//, '') + )[0]; + const localeContent = `// +// locales/${entry}/${localeName}.js // automatically generated by generateLocalePacks.js // -import messages from '../../app/javascript/mastodon/locales/${locale}.json'; -import localeData from ${JSON.stringify(localeDataPath)}; + +import messages from '../../../${flavour.locales}/${locale.replace(/\.js$/, '')}'; +import localeData from '${localeDataPath}'; import { setLocale } from 'locales'; -${glitchInject} -setLocale({messages: mergedMessages, localeData: localeData}); -`; - fs.writeFileSync(localePath, localeContent, 'utf8'); - outPaths.push(localePath); + +setLocale({ + localeData, + messages, }); +`; + writeFileSync(localePath, localeContent, 'utf8'); + map[`locales/${entry}/${localeName}`] = localePath; + }); -module.exports = outPaths; - - + return map; +}, {}); diff --git a/config/webpack/shared.js b/config/webpack/shared.js index e4b057ffbd..62d96c3a27 100644 --- a/config/webpack/shared.js +++ b/config/webpack/shared.js @@ -7,7 +7,7 @@ const ExtractTextPlugin = require('extract-text-webpack-plugin'); const ManifestPlugin = require('webpack-manifest-plugin'); const extname = require('path-complete-extname'); const { env, settings, core, flavours, output, loadersDir } = require('./configuration.js'); -const localePackPaths = require('./generateLocalePacks'); +const localePacks = require('./generateLocalePacks'); function reducePacks (data, into = {}) { if (!data.pack) { @@ -48,11 +48,7 @@ function reducePacks (data, into = {}) { module.exports = { entry: Object.assign( { locales: resolve('app', 'javascript', 'locales') }, - localePackPaths.reduce((map, entry) => { - const localMap = map; - localMap[basename(entry, extname(entry, extname(entry)))] = resolve(entry); - return localMap; - }, {}), + localePacks, reducePacks(core), Object.keys(flavours).reduce((map, entry) => reducePacks(flavours[entry], map), {}) ), From 1c728df92e46bda2d6823052d2cd7a019246b329 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Thu, 7 Dec 2017 19:41:57 -0800 Subject: [PATCH 041/112] Only localize js when there's a theme --- app/views/layouts/application.html.haml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 4d32c50353..20603678b4 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -19,10 +19,11 @@ = title = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous' - - if @theme[:supported_locales].include? I18n.locale.to_s - = javascript_pack_tag "locales/#{@theme[:flavour]}/#{I18n.locale}", integrity: true, crossorigin: 'anonymous' - - elsif @theme[:supported_locales].include? 'en' - = javascript_pack_tag "locales/#{@theme[:flavour]}/en", integrity: true, crossorigin: 'anonymous' + - if @theme + - if @theme[:supported_locales].include? I18n.locale.to_s + = javascript_pack_tag "locales/#{@theme[:flavour]}/#{I18n.locale}", integrity: true, crossorigin: 'anonymous' + - elsif @theme[:supported_locales].include? 'en' + = javascript_pack_tag "locales/#{@theme[:flavour]}/en", integrity: true, crossorigin: 'anonymous' = csrf_meta_tags = yield :header_tags From 6b7085a33e509e0619a67fa8b6721eb89b785773 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Thu, 7 Dec 2017 19:59:31 -0800 Subject: [PATCH 042/112] Linting fixes --- app/javascript/flavours/glitch/locales/en.js | 82 ++++++++++---------- app/javascript/flavours/glitch/locales/pl.js | 80 +++++++++---------- config/webpack/shared.js | 3 +- 3 files changed, 82 insertions(+), 83 deletions(-) diff --git a/app/javascript/flavours/glitch/locales/en.js b/app/javascript/flavours/glitch/locales/en.js index 96182196eb..1d2e0ecf41 100644 --- a/app/javascript/flavours/glitch/locales/en.js +++ b/app/javascript/flavours/glitch/locales/en.js @@ -1,50 +1,50 @@ import inherited from 'mastodon/locales/en.json'; const messages = { - "getting_started.open_source_notice": "Glitchsoc is free open source software forked from {Mastodon}. You can contribute or report issues on GitHub at {github}.", - "layout.auto": "Auto", - "layout.current_is": "Your current layout is:", - "layout.desktop": "Desktop", - "layout.mobile": "Mobile", - "navigation_bar.app_settings": "App settings", - "getting_started.onboarding": "Show me around", - "onboarding.page_one.federation": "{domain} is an 'instance' of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", - "onboarding.page_one.welcome": "Welcome to {domain}!", - "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}, and is compatible with any Mastodon instance or app. Glitchsoc is entirely free and open-source. You can report bugs, request features, or contribute to the code on {github}.", - "settings.auto_collapse": "Automatic collapsing", - "settings.auto_collapse_all": "Everything", - "settings.auto_collapse_lengthy": "Lengthy toots", - "settings.auto_collapse_media": "Toots with media", - "settings.auto_collapse_notifications": "Notifications", - "settings.auto_collapse_reblogs": "Boosts", - "settings.auto_collapse_replies": "Replies", - "settings.close": "Close", - "settings.collapsed_statuses": "Collapsed toots", - "settings.enable_collapsed": "Enable collapsed toots", - "settings.general": "General", - "settings.image_backgrounds": "Image backgrounds", - "settings.image_backgrounds_media": "Preview collapsed toot media", - "settings.image_backgrounds_users": "Give collapsed toots an image background", - "settings.media": "Media", - "settings.media_letterbox": "Letterbox media", - "settings.media_fullwidth": "Full-width media previews", - "settings.preferences": "User preferences", - "settings.wide_view": "Wide view (Desktop mode only)", - "settings.navbar_under": "Navbar at the bottom (Mobile only)", - "status.collapse": "Collapse", - "status.uncollapse": "Uncollapse", + 'getting_started.open_source_notice': 'Glitchsoc is free open source software forked from {Mastodon}. You can contribute or report issues on GitHub at {github}.', + 'layout.auto': 'Auto', + 'layout.current_is': 'Your current layout is:', + 'layout.desktop': 'Desktop', + 'layout.mobile': 'Mobile', + 'navigation_bar.app_settings': 'App settings', + 'getting_started.onboarding': 'Show me around', + 'onboarding.page_one.federation': '{domain} is an \'instance\' of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.', + 'onboarding.page_one.welcome': 'Welcome to {domain}!', + 'onboarding.page_six.github': '{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}, and is compatible with any Mastodon instance or app. Glitchsoc is entirely free and open-source. You can report bugs, request features, or contribute to the code on {github}.', + 'settings.auto_collapse': 'Automatic collapsing', + 'settings.auto_collapse_all': 'Everything', + 'settings.auto_collapse_lengthy': 'Lengthy toots', + 'settings.auto_collapse_media': 'Toots with media', + 'settings.auto_collapse_notifications': 'Notifications', + 'settings.auto_collapse_reblogs': 'Boosts', + 'settings.auto_collapse_replies': 'Replies', + 'settings.close': 'Close', + 'settings.collapsed_statuses': 'Collapsed toots', + 'settings.enable_collapsed': 'Enable collapsed toots', + 'settings.general': 'General', + 'settings.image_backgrounds': 'Image backgrounds', + 'settings.image_backgrounds_media': 'Preview collapsed toot media', + 'settings.image_backgrounds_users': 'Give collapsed toots an image background', + 'settings.media': 'Media', + 'settings.media_letterbox': 'Letterbox media', + 'settings.media_fullwidth': 'Full-width media previews', + 'settings.preferences': 'User preferences', + 'settings.wide_view': 'Wide view (Desktop mode only)', + 'settings.navbar_under': 'Navbar at the bottom (Mobile only)', + 'status.collapse': 'Collapse', + 'status.uncollapse': 'Uncollapse', - "home.column_settings.show_direct": "Show DMs", + 'home.column_settings.show_direct': 'Show DMs', - "notification.markForDeletion": "Mark for deletion", - "notifications.clear": "Clear all my notifications", - "notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?", - "notifications.marked_clear": "Clear selected notifications", + 'notification.markForDeletion': 'Mark for deletion', + 'notifications.clear': 'Clear all my notifications', + 'notifications.marked_clear_confirmation': 'Are you sure you want to permanently clear all selected notifications?', + 'notifications.marked_clear': 'Clear selected notifications', - "notification_purge.btn_all": "Select\nall", - "notification_purge.btn_none": "Select\nnone", - "notification_purge.btn_invert": "Invert\nselection", - "notification_purge.btn_apply": "Clear\nselected", + 'notification_purge.btn_all': 'Select\nall', + 'notification_purge.btn_none': 'Select\nnone', + 'notification_purge.btn_invert': 'Invert\nselection', + 'notification_purge.btn_apply': 'Clear\nselected', }; export default Object.assign({}, inherited, messages); diff --git a/app/javascript/flavours/glitch/locales/pl.js b/app/javascript/flavours/glitch/locales/pl.js index ab96dec60c..818436710a 100644 --- a/app/javascript/flavours/glitch/locales/pl.js +++ b/app/javascript/flavours/glitch/locales/pl.js @@ -1,48 +1,48 @@ import inherited from 'mastodon/locales/pl.json'; const messages = { - "getting_started.open_source_notice": "Glitchsoc jest wolnym i otwartoźródłowym forkiem oprogramowania {Mastodon}. Możesz współtworzyć projekt lub zgłaszać błędy na GitHubie pod adresem {github}.", - "layout.auto": "Automatyczny", - "layout.current_is": "Twój obecny układ to:", - "layout.desktop": "Desktopowy", - "layout.mobile": "Mobilny", - "navigation_bar.app_settings": "Ustawienia aplikacji", - "getting_started.onboarding": "Rozejrzyj się", - "onboarding.page_one.federation": "{domain} jest 'instancją' Mastodona. Mastodon to sieć działających niezależnie serwerów tworzących jedną sieć społecznościową. Te serwery nazywane są instancjami.", - "onboarding.page_one.welcome": "Witamy na {domain}!", - "onboarding.page_six.github": "{domain} jest oparty na Glitchsoc. Glitchsoc jest {forkiem} {Mastodon}a kompatybilnym z każdym klientem i aplikacją Mastodona. Glitchsoc jest całkowicie wolnym i otwartoźródłowym oprogramowaniem. Możesz zgłaszać błędy i sugestie funkcji oraz współtworzyć projekt na {github}.", - "settings.auto_collapse": "Automatyczne zwijanie", - "settings.auto_collapse_all": "Wszystko", - "settings.auto_collapse_lengthy": "Długie wpisy", - "settings.auto_collapse_media": "Wpisy z zawartością multimedialną", - "settings.auto_collapse_notifications": "Powiadomienia", - "settings.auto_collapse_reblogs": "Podbicia", - "settings.auto_collapse_replies": "Odpowiedzi", - "settings.close": "Zamknij", - "settings.collapsed_statuses": "Zwijanie wpisów", - "settings.enable_collapsed": "Włącz zwijanie wpisów", - "settings.general": "Ogólne", - "settings.image_backgrounds": "Obrazy w tle", - "settings.image_backgrounds_media": "Wyświetlaj zawartość multimedialną zwiniętych wpisów", - "settings.image_backgrounds_users": "Nadaj tło zwiniętym wpisom", - "settings.media": "Zawartość multimedialna", - "settings.media_letterbox": "Letterbox media", - "settings.media_fullwidth": "Podgląd zawartości multimedialnej o pełnej szerokości", - "settings.preferences": "Preferencje użyytkownika", - "settings.wide_view": "Szeroki widok (tylko w trybie desktopowym)", - "settings.navbar_under": "Pasek nawigacji na dole (tylko w trybie mobilnym)", - "status.collapse": "Zwiń", - "status.uncollapse": "Rozwiń", + 'getting_started.open_source_notice': 'Glitchsoc jest wolnym i otwartoźródłowym forkiem oprogramowania {Mastodon}. Możesz współtworzyć projekt lub zgłaszać błędy na GitHubie pod adresem {github}.', + 'layout.auto': 'Automatyczny', + 'layout.current_is': 'Twój obecny układ to:', + 'layout.desktop': 'Desktopowy', + 'layout.mobile': 'Mobilny', + 'navigation_bar.app_settings': 'Ustawienia aplikacji', + 'getting_started.onboarding': 'Rozejrzyj się', + 'onboarding.page_one.federation': '{domain} jest \'instancją\' Mastodona. Mastodon to sieć działających niezależnie serwerów tworzących jedną sieć społecznościową. Te serwery nazywane są instancjami.', + 'onboarding.page_one.welcome': 'Witamy na {domain}!', + 'onboarding.page_six.github': '{domain} jest oparty na Glitchsoc. Glitchsoc jest {forkiem} {Mastodon}a kompatybilnym z każdym klientem i aplikacją Mastodona. Glitchsoc jest całkowicie wolnym i otwartoźródłowym oprogramowaniem. Możesz zgłaszać błędy i sugestie funkcji oraz współtworzyć projekt na {github}.', + 'settings.auto_collapse': 'Automatyczne zwijanie', + 'settings.auto_collapse_all': 'Wszystko', + 'settings.auto_collapse_lengthy': 'Długie wpisy', + 'settings.auto_collapse_media': 'Wpisy z zawartością multimedialną', + 'settings.auto_collapse_notifications': 'Powiadomienia', + 'settings.auto_collapse_reblogs': 'Podbicia', + 'settings.auto_collapse_replies': 'Odpowiedzi', + 'settings.close': 'Zamknij', + 'settings.collapsed_statuses': 'Zwijanie wpisów', + 'settings.enable_collapsed': 'Włącz zwijanie wpisów', + 'settings.general': 'Ogólne', + 'settings.image_backgrounds': 'Obrazy w tle', + 'settings.image_backgrounds_media': 'Wyświetlaj zawartość multimedialną zwiniętych wpisów', + 'settings.image_backgrounds_users': 'Nadaj tło zwiniętym wpisom', + 'settings.media': 'Zawartość multimedialna', + 'settings.media_letterbox': 'Letterbox media', + 'settings.media_fullwidth': 'Podgląd zawartości multimedialnej o pełnej szerokości', + 'settings.preferences': 'Preferencje użyytkownika', + 'settings.wide_view': 'Szeroki widok (tylko w trybie desktopowym)', + 'settings.navbar_under': 'Pasek nawigacji na dole (tylko w trybie mobilnym)', + 'status.collapse': 'Zwiń', + 'status.uncollapse': 'Rozwiń', - "notification.markForDeletion": "Oznacz do usunięcia", - "notifications.clear": "Wyczyść wszystkie powiadomienia", - "notifications.marked_clear_confirmation": "Czy na pewno chcesz bezpowrtonie usunąć wszystkie powiadomienia?", - "notifications.marked_clear": "Usuń zaznaczone powiadomienia", + 'notification.markForDeletion': 'Oznacz do usunięcia', + 'notifications.clear': 'Wyczyść wszystkie powiadomienia', + 'notifications.marked_clear_confirmation': 'Czy na pewno chcesz bezpowrtonie usunąć wszystkie powiadomienia?', + 'notifications.marked_clear': 'Usuń zaznaczone powiadomienia', - "notification_purge.btn_all": "Zaznacz\nwszystkie", - "notification_purge.btn_none": "Odznacz\nwszystkie", - "notification_purge.btn_invert": "Odwróć\nzaznaczenie", - "notification_purge.btn_apply": "Usuń\nzaznaczone" + 'notification_purge.btn_all': 'Zaznacz\nwszystkie', + 'notification_purge.btn_none': 'Odznacz\nwszystkie', + 'notification_purge.btn_invert': 'Odwróć\nzaznaczenie', + 'notification_purge.btn_apply': 'Usuń\nzaznaczone', }; export default Object.assign({}, inherited, messages); diff --git a/config/webpack/shared.js b/config/webpack/shared.js index 62d96c3a27..35b9bbd1cd 100644 --- a/config/webpack/shared.js +++ b/config/webpack/shared.js @@ -1,11 +1,10 @@ // Note: You must restart bin/webpack-dev-server for changes to take effect const webpack = require('webpack'); -const { basename, join, resolve } = require('path'); +const { join, resolve } = require('path'); const { sync } = require('glob'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const ManifestPlugin = require('webpack-manifest-plugin'); -const extname = require('path-complete-extname'); const { env, settings, core, flavours, output, loadersDir } = require('./configuration.js'); const localePacks = require('./generateLocalePacks'); From cd107e92cb179b875b119ab869e106e22afb2e77 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sun, 10 Dec 2017 11:09:59 -0800 Subject: [PATCH 043/112] Move ja localization to new locaiton --- app/javascript/flavours/glitch/locales/ja.js | 43 ++++++++++++++++++- app/javascript/glitch/locales/ja.json | 44 -------------------- 2 files changed, 42 insertions(+), 45 deletions(-) delete mode 100644 app/javascript/glitch/locales/ja.json diff --git a/app/javascript/flavours/glitch/locales/ja.js b/app/javascript/flavours/glitch/locales/ja.js index cc7143443a..2b55da1da8 100644 --- a/app/javascript/flavours/glitch/locales/ja.js +++ b/app/javascript/flavours/glitch/locales/ja.js @@ -1,7 +1,48 @@ import inherited from 'mastodon/locales/ja.json'; const messages = { - // No translations available. + 'getting_started.open_source_notice': 'Glitchsocは{Mastodon}によるフリーなオープンソースソフトウェアです。誰でもGitHub({github})から開発に參加したり、問題を報告したりできます。', + 'layout.auto': '自動', + 'layout.current_is': 'あなたの現在のレイアウト:', + 'layout.desktop': 'デスクトップ', + 'layout.mobile': 'モバイル', + 'navigation_bar.app_settings': 'アプリ設定', + 'getting_started.onboarding': '解説', + 'onboarding.page_one.federation': '{domain}はMastodonのインスタンスです。Mastodonとは、独立したサーバが連携して作るソーシャルネットワークです。これらのサーバーをインスタンスと呼びます。', + 'onboarding.page_one.welcome': '{domain}へようこそ!', + 'onboarding.page_six.github': '{domain}はGlitchsocを使用しています。Glitchsocは{Mastodon}のフレンドリーな{fork}で、どんなMastodonアプリやインスタンスとも互換性があります。Glitchsocは完全に無料で、オープンソースです。{github}でバグ報告や機能要望あるいは貢獻をすることが可能です。', + 'settings.auto_collapse': '自動折りたたみ', + 'settings.auto_collapse_all': 'すべて', + 'settings.auto_collapse_lengthy': '長いトゥート', + 'settings.auto_collapse_media': 'メディア付きトゥート', + 'settings.auto_collapse_notifications': '通知', + 'settings.auto_collapse_reblogs': 'ブースト', + 'settings.auto_collapse_replies': '返信', + 'settings.close': '閉じる', + 'settings.collapsed_statuses': 'トゥート', + 'settings.enable_collapsed': 'トゥート折りたたみを有効にする', + 'settings.general': '一般', + 'settings.image_backgrounds': '画像背景', + 'settings.image_backgrounds_media': '折りたまれたメディア付きテゥートをプレビュー', + 'settings.image_backgrounds_users': '折りたまれたトゥートの背景を変更する', + 'settings.media': 'メディア', + 'settings.media_letterbox': 'メディアをレターボックス式で表示', + 'settings.media_fullwidth': '全幅メディアプリビュー', + 'settings.preferences': 'ユーザー設定', + 'settings.wide_view': 'ワイドビュー(デスクトップレイアウトのみ)', + 'settings.navbar_under': 'ナビを画面下部に移動させる(モバイルレイアウトのみ)', + 'status.collapse': '折りたたむ', + 'status.uncollapse': '折りたたみを解除', + + 'notification.markForDeletion': '選択', + 'notifications.clear': '通知を全てクリアする', + 'notifications.marked_clear_confirmation': '削除した全ての通知を完全に削除してもよろしいですか?', + 'notifications.marked_clear': '選択した通知を削除する', + + 'notification_purge.btn_all': 'すべて\n選択', + 'notification_purge.btn_none': '選択\n解除', + 'notification_purge.btn_invert': '選択を\n反転', + 'notification_purge.btn_apply': '選択したものを\n削除', }; export default Object.assign({}, inherited, messages); diff --git a/app/javascript/glitch/locales/ja.json b/app/javascript/glitch/locales/ja.json deleted file mode 100644 index 70091268ff..0000000000 --- a/app/javascript/glitch/locales/ja.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "getting_started.open_source_notice": "Glitchsocは{Mastodon}によるフリーなオープンソースソフトウェアです。誰でもGitHub({github})から開発に參加したり、問題を報告したりできます。", - "layout.auto": "自動", - "layout.current_is": "あなたの現在のレイアウト:", - "layout.desktop": "デスクトップ", - "layout.mobile": "モバイル", - "navigation_bar.app_settings": "アプリ設定", - "getting_started.onboarding": "解説", - "onboarding.page_one.federation": "{domain}はMastodonのインスタンスです。Mastodonとは、独立したサーバが連携して作るソーシャルネットワークです。これらのサーバーをインスタンスと呼びます。", - "onboarding.page_one.welcome": "{domain}へようこそ!", - "onboarding.page_six.github": "{domain}はGlitchsocを使用しています。Glitchsocは{Mastodon}のフレンドリーな{fork}で、どんなMastodonアプリやインスタンスとも互換性があります。Glitchsocは完全に無料で、オープンソースです。{github}でバグ報告や機能要望あるいは貢獻をすることが可能です。", - "settings.auto_collapse": "自動折りたたみ", - "settings.auto_collapse_all": "すべて", - "settings.auto_collapse_lengthy": "長いトゥート", - "settings.auto_collapse_media": "メディア付きトゥート", - "settings.auto_collapse_notifications": "通知", - "settings.auto_collapse_reblogs": "ブースト", - "settings.auto_collapse_replies": "返信", - "settings.close": "閉じる", - "settings.collapsed_statuses": "トゥート", - "settings.enable_collapsed": "トゥート折りたたみを有効にする", - "settings.general": "一般", - "settings.image_backgrounds": "画像背景", - "settings.image_backgrounds_media": "折りたまれたメディア付きテゥートをプレビュー", - "settings.image_backgrounds_users": "折りたまれたトゥートの背景を変更する", - "settings.media": "メディア", - "settings.media_letterbox": "メディアをレターボックス式で表示", - "settings.media_fullwidth": "全幅メディアプリビュー", - "settings.preferences": "ユーザー設定", - "settings.wide_view": "ワイドビュー(デスクトップレイアウトのみ)", - "settings.navbar_under": "ナビを画面下部に移動させる(モバイルレイアウトのみ)", - "status.collapse": "折りたたむ", - "status.uncollapse": "折りたたみを解除", - - "notification.markForDeletion": "選択", - "notifications.clear": "通知を全てクリアする", - "notifications.marked_clear_confirmation": "削除した全ての通知を完全に削除してもよろしいですか?", - "notifications.marked_clear": "選択した通知を削除する", - - "notification_purge.btn_all": "すべて\n選択", - "notification_purge.btn_none": "選択\n解除", - "notification_purge.btn_invert": "選択を\n反転", - "notification_purge.btn_apply": "選択したものを\n削除" -} From 64b839b76907e87c57d71762a81a9a8660f1df83 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sun, 10 Dec 2017 11:38:30 -0800 Subject: [PATCH 044/112] Removed MORE theme localizns --- config/locales/ca.yml | 2 -- config/locales/es.yml | 2 -- config/locales/fr.yml | 2 -- config/locales/pl.yml | 2 -- 4 files changed, 8 deletions(-) diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 357e39e315..05c08c01a8 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -678,8 +678,6 @@ ca:

Originalment adaptat a la política de privadesa del Discurs.

title: "%{instance} Condicions del servei i política de privadesa" - themes: - default: Mastodont time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/locales/es.yml b/config/locales/es.yml index 18b93b08e1..d9084787dc 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -678,8 +678,6 @@ es:

Adaptado originalmente del discurso de las políticas de privacidad.

title: Términos del Servicio y Políticas de Privacidad de %{instance} - themes: - default: Mastodon time: formats: default: "%d de %b del %Y, %H:%M" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index cd97f59673..45243d07e5 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -677,8 +677,6 @@ fr:

Originellement adapté à partir de la politique de confidentialité de Discourse.

title: "%{instance} Conditions d’utilisations et politique de confidentialité" - themes: - default: Mastodon time: formats: default: "%d %b %Y, %H:%M" diff --git a/config/locales/pl.yml b/config/locales/pl.yml index baa26f1dc6..582a2cd03a 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -693,8 +693,6 @@ pl:

Tekst bazuje na polityce prywatności Discourse.

title: Zasady korzystania i polityka prywatności %{instance} - themes: - default: Mastodon time: formats: default: "%b %d, %Y, %H:%M" From eec5d350fdb94fa44c6938ca059166ff3e3e67b3 Mon Sep 17 00:00:00 2001 From: cwm Date: Sun, 10 Dec 2017 15:14:56 -0600 Subject: [PATCH 045/112] removed unneeded actions_modal div --- .../features/ui/components/actions_modal.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/app/javascript/flavours/glitch/features/ui/components/actions_modal.js b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js index 87a1498072..0873c282fa 100644 --- a/app/javascript/flavours/glitch/features/ui/components/actions_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js @@ -56,22 +56,6 @@ export default class ActionsModal extends ImmutablePureComponent { - - ); From 0466aa8d08796a227b01b1f698911856a198c2ee Mon Sep 17 00:00:00 2001 From: cwm Date: Sun, 10 Dec 2017 15:39:23 -0600 Subject: [PATCH 046/112] use single quotes in locale entry --- app/javascript/flavours/glitch/locales/en.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/locales/en.js b/app/javascript/flavours/glitch/locales/en.js index 07d77e0e11..0681d27d8c 100644 --- a/app/javascript/flavours/glitch/locales/en.js +++ b/app/javascript/flavours/glitch/locales/en.js @@ -34,7 +34,7 @@ const messages = { 'status.collapse': 'Collapse', 'status.uncollapse': 'Uncollapse', - "favourite_modal.combo": "You can press {combo} to skip this next time", + 'favourite_modal.combo': 'You can press {combo} to skip this next time', 'home.column_settings.show_direct': 'Show DMs', From 279231c5ddd1d176fdc98ebd403cf10efdf01c50 Mon Sep 17 00:00:00 2001 From: ncls7615 Date: Mon, 11 Dec 2017 09:46:17 +0900 Subject: [PATCH 047/112] " => ' --- app/javascript/flavours/glitch/locales/ja.js | 86 ++++++++++---------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/app/javascript/flavours/glitch/locales/ja.js b/app/javascript/flavours/glitch/locales/ja.js index 98b6a696f0..0acc93f50f 100644 --- a/app/javascript/flavours/glitch/locales/ja.js +++ b/app/javascript/flavours/glitch/locales/ja.js @@ -1,51 +1,51 @@ import inherited from 'mastodon/locales/ja.json'; const messages = { - "getting_started.open_source_notice": "Glitchsocは{Mastodon}によるフリーなオープンソースソフトウェアです。誰でもGitHub({github})から開発に參加したり、問題を報告したりできます。", - "layout.auto": "自動", - "layout.current_is": "あなたの現在のレイアウト:", - "layout.desktop": "Desktop", - "layout.mobile": "Mobile", - "navigation_bar.app_settings": "アプリ設定", - "getting_started.onboarding": "解説を表示", - "onboarding.page_one.federation": "{domain}はMastodonのインスタンスです。Mastodonとは、独立したサーバが連携して作るソーシャルネットワークです。これらのサーバーをインスタンスと呼びます。", - "onboarding.page_one.welcome": "{domain}へようこそ!", - "onboarding.page_six.github": "{domain}はGlitchsocを使用しています。Glitchsocは{Mastodon}のフレンドリーな{fork}で、どんなMastodonアプリやインスタンスとも互換性があります。Glitchsocは完全に無料で、オープンソースです。{github}でバグ報告や機能要望あるいは貢獻をすることが可能です。", - "settings.auto_collapse": "自動折りたたみ", - "settings.auto_collapse_all": "すべて", - "settings.auto_collapse_lengthy": "長いトゥート", - "settings.auto_collapse_media": "メディア付きトゥート", - "settings.auto_collapse_notifications": "通知", - "settings.auto_collapse_reblogs": "ブースト", - "settings.auto_collapse_replies": "返信", - "settings.close": "閉じる", - "settings.collapsed_statuses": "トゥート", - "settings.enable_collapsed": "トゥート折りたたみを有効にする", - "settings.general": "一般", - "settings.image_backgrounds": "画像背景", - "settings.image_backgrounds_media": "折りたまれたメディア付きテゥートをプレビュー", - "settings.image_backgrounds_users": "折りたまれたトゥートの背景を変更する", - "settings.media": "メディア", - "settings.media_letterbox": "メディアをレターボックス式で表示", - "settings.media_fullwidth": "全幅メディアプリビュー", - "settings.preferences": "ユーザー設定", - "settings.wide_view": "ワイドビュー(Desktopレイアウトのみ)", - "settings.navbar_under": "ナビを画面下部に移動させる(Mobileレイアウトのみ)", - "settings.compose_box_opts": "コンポーズボックス設定", - "settings.side_arm": "セカンダリートゥートボタン", - "settings.layout": "レイアウト", - "status.collapse": "折りたたむ", - "status.uncollapse": "折りたたみを解除", + 'getting_started.open_source_notice': 'Glitchsocは{Mastodon}によるフリーなオープンソースソフトウェアです。誰でもGitHub({github})から開発に參加したり、問題を報告したりできます。', + 'layout.auto': '自動', + 'layout.current_is': 'あなたの現在のレイアウト:', + 'layout.desktop': 'Desktop', + 'layout.mobile': 'Mobile', + 'navigation_bar.app_settings': 'アプリ設定', + 'getting_started.onboarding': '解説を表示', + 'onboarding.page_one.federation': '{domain}はMastodonのインスタンスです。Mastodonとは、独立したサーバが連携して作るソーシャルネットワークです。これらのサーバーをインスタンスと呼びます。', + 'onboarding.page_one.welcome': '{domain}へようこそ!', + 'onboarding.page_six.github': '{domain}はGlitchsocを使用しています。Glitchsocは{Mastodon}のフレンドリーな{fork}で、どんなMastodonアプリやインスタンスとも互換性があります。Glitchsocは完全に無料で、オープンソースです。{github}でバグ報告や機能要望あるいは貢獻をすることが可能です。', + 'settings.auto_collapse': '自動折りたたみ', + 'settings.auto_collapse_all': 'すべて', + 'settings.auto_collapse_lengthy': '長いトゥート', + 'settings.auto_collapse_media': 'メディア付きトゥート', + 'settings.auto_collapse_notifications': '通知', + 'settings.auto_collapse_reblogs': 'ブースト', + 'settings.auto_collapse_replies': '返信', + 'settings.close': '閉じる', + 'settings.collapsed_statuses': 'トゥート', + 'settings.enable_collapsed': 'トゥート折りたたみを有効にする', + 'settings.general': '一般', + 'settings.image_backgrounds': '画像背景', + 'settings.image_backgrounds_media': '折りたまれたメディア付きテゥートをプレビュー', + 'settings.image_backgrounds_users': '折りたまれたトゥートの背景を変更する', + 'settings.media': 'メディア', + 'settings.media_letterbox': 'メディアをレターボックス式で表示', + 'settings.media_fullwidth': '全幅メディアプリビュー', + 'settings.preferences': 'ユーザー設定', + 'settings.wide_view': 'ワイドビュー(Desktopレイアウトのみ)', + 'settings.navbar_under': 'ナビを画面下部に移動させる(Mobileレイアウトのみ)', + 'settings.compose_box_opts': 'コンポーズボックス設定', + 'settings.side_arm': 'セカンダリートゥートボタン', + 'settings.layout': 'レイアウト', + 'status.collapse': '折りたたむ', + 'status.uncollapse': '折りたたみを解除', - "notification.markForDeletion": "選択", - "notifications.clear": "通知を全てクリアする", - "notifications.marked_clear_confirmation": "削除した全ての通知を完全に削除してもよろしいですか?", - "notifications.marked_clear": "選択した通知を削除する", + 'notification.markForDeletion': '選択', + 'notifications.clear': '通知を全てクリアする', + 'notifications.marked_clear_confirmation': '削除した全ての通知を完全に削除してもよろしいですか?', + 'notifications.marked_clear': '選択した通知を削除する', - "notification_purge.btn_all": "すべて\n選択", - "notification_purge.btn_none": "選択\n解除", - "notification_purge.btn_invert": "選択を\n反転", - "notification_purge.btn_apply": "選択したものを\n削除" + 'notification_purge.btn_all': 'すべて\n選択', + 'notification_purge.btn_none': '選択\n解除', + 'notification_purge.btn_invert': '選択を\n反転', + 'notification_purge.btn_apply': '選択したものを\n削除' }; export default Object.assign({}, inherited, messages); From d420e2f0472315caf71f98eb59c68dfff2d1c2a7 Mon Sep 17 00:00:00 2001 From: ncls7615 Date: Mon, 11 Dec 2017 09:50:52 +0900 Subject: [PATCH 048/112] add comma --- app/javascript/flavours/glitch/locales/ja.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/locales/ja.js b/app/javascript/flavours/glitch/locales/ja.js index 0acc93f50f..39dc3b81db 100644 --- a/app/javascript/flavours/glitch/locales/ja.js +++ b/app/javascript/flavours/glitch/locales/ja.js @@ -45,7 +45,7 @@ const messages = { 'notification_purge.btn_all': 'すべて\n選択', 'notification_purge.btn_none': '選択\n解除', 'notification_purge.btn_invert': '選択を\n反転', - 'notification_purge.btn_apply': '選択したものを\n削除' + 'notification_purge.btn_apply': '選択したものを\n削除', }; export default Object.assign({}, inherited, messages); From 84d5bfb35edfa2126e15e94d519c32d1b27e27eb Mon Sep 17 00:00:00 2001 From: Sylvhem Date: Mon, 11 Dec 2017 02:30:43 +0100 Subject: [PATCH 049/112] Change the disclaimer under the sign up form (#5817) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Change the disclaimer below the sign up form Change the disclaimer below the sign up form on the home page. The current text is linking to the /about/more page under "our terms of service" and to the /terms page under "privacy policy". This change intend to make the message more coherent. Change l’avertissement en-dessous du formulaire d’inscription sur la page d’accueil. Le texte actuel redirige vers /about/more sous un lien intitulé "nos conditions d’utilisation" et vers /terms via "notre politique de confidentialité". Ce changement vise à rendre le message plus cohérent. * Second take on the disclaimer A new version of the disclaimer, based on feedback. Une nouvelle version de l’avertissement, basé sur les premiers retours. --- config/locales/en.yml | 2 +- config/locales/fr.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 14a88d6c80..d42fb64275 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -343,7 +343,7 @@ en: warning: Be very careful with this data. Never share it with anyone! your_token: Your access token auth: - agreement_html: By signing up you agree to our terms of service and privacy policy. + agreement_html: By signing up you agree to follow the rules of the instance and our terms of service. change_password: Security delete_account: Delete account delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 278cb053d9..a26b675469 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -342,7 +342,7 @@ fr: warning: Soyez prudent⋅e avec ces données. Ne les partagez pas ! your_token: Votre jeton d’accès auth: - agreement_html: En vous inscrivant, vous souscrivez à nos conditions d’utilisation ainsi qu’à notre politique de confidentialité. + agreement_html: En vous inscrivant, vous souscrivez aux règles de l’instance et à nos conditions d’utilisation. change_password: Sécurité delete_account: Supprimer le compte delete_account_html: Si vous désirez supprimer votre compte, vous pouvez cliquer ici. Il vous sera demandé de confirmer cette action. From dabf66e676c693e7e26a6035e0c6296e6804e776 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sun, 10 Dec 2017 17:56:17 -0800 Subject: [PATCH 050/112] Moved flavour UI into own prefs tab --- .../settings/flavours_controller.rb | 35 +++++++++++++++++++ .../settings/preferences_controller.rb | 2 -- app/javascript/core/settings.js | 4 --- app/javascript/flavours/glitch/names.yml | 4 ++- app/javascript/flavours/vanilla/names.yml | 4 ++- app/views/settings/flavours/show.html.haml | 16 +++++++++ app/views/settings/preferences/show.html.haml | 4 --- config/locales/en.yml | 2 ++ config/locales/simple_form.en.yml | 2 -- config/navigation.rb | 6 ++++ config/routes.rb | 4 ++- 11 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 app/controllers/settings/flavours_controller.rb create mode 100644 app/views/settings/flavours/show.html.haml diff --git a/app/controllers/settings/flavours_controller.rb b/app/controllers/settings/flavours_controller.rb new file mode 100644 index 0000000000..865d5a4792 --- /dev/null +++ b/app/controllers/settings/flavours_controller.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +class Settings::FlavoursController < Settings::BaseController + + def index + redirect_to action: 'show', flavour: current_flavour + end + + def show + unless Themes.instance.flavours.include?(params[:flavour]) or params[:flavour] == current_flavour + redirect_to action: 'show', flavour: current_flavour + end + + @listing = Themes.instance.flavours + @selected = params[:flavour] + end + + def update + user_settings.update(user_settings_params(params[:flavour]).to_h) + redirect_to action: 'show', flavour: params[:flavour] + end + + private + + def user_settings + UserSettingsDecorator.new(current_user) + end + + def user_settings_params(flavour) + params.require(:user).merge({ setting_flavour: flavour }).permit( + :setting_flavour, + :setting_skin + ) + end +end diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 9177d37da6..7cd1abe0c9 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -39,8 +39,6 @@ class Settings::PreferencesController < Settings::BaseController :setting_reduce_motion, :setting_system_font_ui, :setting_noindex, - :setting_flavour, - :setting_skin, notification_emails: %i(follow follow_request reblog favourite mention digest), interactions: %i(must_be_follower must_be_following) ) diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index ada5fba2b1..c9edcf197c 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -37,7 +37,3 @@ delegate(document, '#account_header', 'change', ({ target }) => { header.style.backgroundImage = `url(${url})`; }); - -delegate(document, '#user_setting_flavour, #user_setting_skin', 'change', ({ target }) => { - target.form.submit(); -}); diff --git a/app/javascript/flavours/glitch/names.yml b/app/javascript/flavours/glitch/names.yml index b3d579cb27..ef82abed2f 100644 --- a/app/javascript/flavours/glitch/names.yml +++ b/app/javascript/flavours/glitch/names.yml @@ -1,6 +1,8 @@ en: flavours: - glitch: Glitch Edition + glitch: + description: The default flavour for GlitchSoc instances. + name: Glitch Edition skins: glitch: default: Default diff --git a/app/javascript/flavours/vanilla/names.yml b/app/javascript/flavours/vanilla/names.yml index 8816fcb3ab..94326f6ee3 100644 --- a/app/javascript/flavours/vanilla/names.yml +++ b/app/javascript/flavours/vanilla/names.yml @@ -1,6 +1,8 @@ en: flavours: - vanilla: Vanilla Mastodon + vanilla: + description: The theme used by vanilla Mastodon instances. This theme might not support all of the features of GlitchSoc. + name: Vanilla Mastodon skins: vanilla: default: Default diff --git a/app/views/settings/flavours/show.html.haml b/app/views/settings/flavours/show.html.haml new file mode 100644 index 0000000000..488fd2d153 --- /dev/null +++ b/app/views/settings/flavours/show.html.haml @@ -0,0 +1,16 @@ +- content_for :page_title do + = t "flavours.#{@selected}.name", default: @selected + += simple_form_for current_user, url: settings_flavour_path(@selected), html: { method: :put } do |f| + = render 'shared/error_messages', object: current_user + + .flavour-description + = t "flavours.#{@selected}.description", default: '' + + %hr/ + + .fields-group + = f.input :setting_skin, collection: Themes.instance.skins_for(@selected), label_method: lambda { |skin| I18n.t("skins.#{@selected}.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false + + .actions + = f.button :button, t('generic.use_this'), type: :submit diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 45a3b2eb07..d1459d93ca 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -26,10 +26,6 @@ %h4= t 'preferences.web' .fields-group - - if Themes.instance.flavours.size > 1 - = f.input :setting_flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("flavours.#{flavour}", default: flavour) }, wrapper: :with_label, include_blank: false - = f.input :setting_skin, collection: Themes.instance.skins_for(current_flavour), label_method: lambda { |skin| I18n.t("skins.#{current_flavour}.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false - = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label = f.input :setting_boost_modal, as: :boolean, wrapper: :with_label = f.input :setting_favourite_modal, as: :boolean, wrapper: :with_label diff --git a/config/locales/en.yml b/config/locales/en.yml index c8acc237ac..804f9b199a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -424,6 +424,7 @@ en: changes_saved_msg: Changes successfully saved! powered_by: powered by %{link} save_changes: Save changes + use_this: Use this validation_errors: one: Something isn't quite right yet! Please review the error below other: Something isn't quite right yet! Please review %{count} errors below @@ -587,6 +588,7 @@ en: development: Development edit_profile: Edit profile export: Data export + flavours: Flavours followers: Authorized followers import: Import keyword_mutes: Muted keywords diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 1722eea7bd..aa6940e916 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -13,7 +13,6 @@ en: note: one: 1 character left other: %{count} characters left - setting_flavour: Affects how Mastodon looks when you're logged in from any device setting_noindex: Affects your public profile and status pages setting_skin: Reskins the selected Mastodon flavour imports: @@ -47,7 +46,6 @@ en: setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot setting_favourite_modal: Show confirmation dialog before favouriting - setting_flavour: Flavour setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations setting_skin: Skin diff --git a/config/navigation.rb b/config/navigation.rb index 3f4c00dfa9..b08b1769de 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -17,6 +17,12 @@ SimpleNavigation::Configuration.run do |navigation| settings.item :follower_domains, safe_join([fa_icon('users fw'), t('settings.followers')]), settings_follower_domains_url end + primary.item :flavours, safe_join([fa_icon('paint-brush fw'), t('settings.flavours')]), settings_flavours_url do |flavours| + Themes.instance.flavours.each do |flavour| + flavours.item flavour.to_sym, safe_join([fa_icon('star fw'), t("flavours.#{flavour}.name", default: flavour)]), settings_flavour_url(flavour) + end + end + primary.item :invites, safe_join([fa_icon('user-plus fw'), t('invites.title')]), invites_path, if: proc { Setting.min_invite_role == 'user' } primary.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_url do |development| diff --git a/config/routes.rb b/config/routes.rb index a41e76c2cc..75b9c2d58f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -102,6 +102,8 @@ Rails.application.routes.draw do end end + resources :flavours, only: [:index, :show, :update], param: :flavour + resource :delete, only: [:show, :destroy] resource :migration, only: [:show, :update] @@ -240,7 +242,7 @@ Rails.application.routes.draw do resources :media, only: [:create, :update] resources :blocks, only: [:index] resources :mutes, only: [:index] do - collection do + collection do get 'details' end end From bdca1614d574a4b34633a19776446d2d8cf2d2e6 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sun, 10 Dec 2017 20:15:09 -0800 Subject: [PATCH 051/112] Screenshot support for themes --- .../flavours/glitch/images/glitch-preview.jpg | Bin 0 -> 197277 bytes .../flavours/glitch/packs/common.js | 3 +++ app/javascript/flavours/glitch/theme.yml | 6 ++++++ app/javascript/flavours/vanilla/theme.yml | 6 ++++++ app/javascript/images/screenshot.jpg | Bin 0 -> 239221 bytes app/lib/themes.rb | 18 ++++++++++++++---- app/views/settings/flavours/show.html.haml | 3 +++ 7 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 app/javascript/flavours/glitch/images/glitch-preview.jpg create mode 100644 app/javascript/images/screenshot.jpg diff --git a/app/javascript/flavours/glitch/images/glitch-preview.jpg b/app/javascript/flavours/glitch/images/glitch-preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc5c4204359659e32ec8d758855891e297f5093c GIT binary patch literal 197277 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

9Id-}pI`0iNuML!V!Vb6`;+lNJUw^-<$CS-yTZ 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 KIoqB2DEv269CTIy literal 0 HcmV?d00001 diff --git a/app/javascript/flavours/glitch/packs/common.js b/app/javascript/flavours/glitch/packs/common.js index 07445d2b3f..8dd4372bc4 100644 --- a/app/javascript/flavours/glitch/packs/common.js +++ b/app/javascript/flavours/glitch/packs/common.js @@ -1 +1,4 @@ import 'flavours/glitch/styles/index.scss'; + +// This ensures that webpack compiles our images. +require.context('../images', true); diff --git a/app/javascript/flavours/glitch/theme.yml b/app/javascript/flavours/glitch/theme.yml index 9437e2c045..435fa23293 100644 --- a/app/javascript/flavours/glitch/theme.yml +++ b/app/javascript/flavours/glitch/theme.yml @@ -26,6 +26,12 @@ pack: # language tags and whose default exports are a messages object. locales: locales +# (OPTIONAL) A file to use as the preview screenshot for the flavour, +# or an array thereof. These filenames must be unique across all +# images (regardless of path), so it's a good idea to namespace them +# to your theme. It's up to you to let webpack know to compile them. +screenshot: glitch-preview.jpg + # (OPTIONAL) The directory which contains the pack files. # Defaults to the theme directory (`app/javascript/themes/[theme]`), # which should be sufficient for like 99% of use-cases lol. diff --git a/app/javascript/flavours/vanilla/theme.yml b/app/javascript/flavours/vanilla/theme.yml index 491ea173b0..0b27c31bb1 100644 --- a/app/javascript/flavours/vanilla/theme.yml +++ b/app/javascript/flavours/vanilla/theme.yml @@ -24,6 +24,12 @@ pack: # the flavour, relative to this directory. locales: ../../mastodon/locales +# (OPTIONAL) A file to use as the preview screenshot for the flavour, +# or an array thereof. These filenames must be unique across all +# images (regardless of path), so it's a good idea to namespace them +# to your theme. It's up to you to let webpack know to compile them. +screenshot: screenshot.jpg + # (OPTIONAL) The directory which contains the pack files. # Defaults to this directory (`app/javascript/flavour/[flavour]`), # but in the case of the vanilla Mastodon flavour the pack files are diff --git a/app/javascript/images/screenshot.jpg b/app/javascript/images/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45b270fbb0a6621e29c75da1702226c69dc0ac3e GIT binary patch literal 239221 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 [] } result[name] = data end diff --git a/app/views/settings/flavours/show.html.haml b/app/views/settings/flavours/show.html.haml index 488fd2d153..8214f1b3d9 100644 --- a/app/views/settings/flavours/show.html.haml +++ b/app/views/settings/flavours/show.html.haml @@ -4,6 +4,9 @@ = simple_form_for current_user, url: settings_flavour_path(@selected), html: { method: :put } do |f| = render 'shared/error_messages', object: current_user + - Themes.instance.flavour(@selected)['screenshot'].each do |screen| + %img.flavour-screen{ width: 700, src: asset_pack_path(screen) } + .flavour-description = t "flavours.#{@selected}.description", default: '' From ed7231947c618b7c7c471699a05da85c59afa824 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sun, 10 Dec 2017 20:24:11 -0800 Subject: [PATCH 052/112] Added styling --- app/javascript/flavours/glitch/styles/admin.scss | 16 ++++++++++++++++ app/views/settings/flavours/show.html.haml | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss index 87bc710af6..7c50322175 100644 --- a/app/javascript/flavours/glitch/styles/admin.scss +++ b/app/javascript/flavours/glitch/styles/admin.scss @@ -246,6 +246,22 @@ } } +.flavour-screen { + display: block; + margin: 10px auto; + max-width: 100%; +} + +.flavour-description { + display: block; + font-size: 16px; + margin: 10px 0; + + & > p { + margin: 10px 0; + } +} + .report-accounts { display: flex; flex-wrap: wrap; diff --git a/app/views/settings/flavours/show.html.haml b/app/views/settings/flavours/show.html.haml index 8214f1b3d9..43c0377370 100644 --- a/app/views/settings/flavours/show.html.haml +++ b/app/views/settings/flavours/show.html.haml @@ -5,7 +5,7 @@ = render 'shared/error_messages', object: current_user - Themes.instance.flavour(@selected)['screenshot'].each do |screen| - %img.flavour-screen{ width: 700, src: asset_pack_path(screen) } + %img.flavour-screen{ src: asset_pack_path(screen) } .flavour-description = t "flavours.#{@selected}.description", default: '' From 9d5ecdbf414b2224f7f7216cbdd966a162968b39 Mon Sep 17 00:00:00 2001 From: ncls7615 Date: Mon, 11 Dec 2017 13:52:17 +0900 Subject: [PATCH 053/112] remove picture --- app/javascript/flavours/glitch/styles/components/index.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss index 0c36373b7c..8f98863d88 100644 --- a/app/javascript/flavours/glitch/styles/components/index.scss +++ b/app/javascript/flavours/glitch/styles/components/index.scss @@ -2286,7 +2286,6 @@ .getting-started { box-sizing: border-box; padding-bottom: 235px; - background: url('~images/mastodon-getting-started.png') no-repeat 0 100%; flex: 1 0 auto; p { From 204688e803f76acdfbee833c4d1c0c0a9cc07560 Mon Sep 17 00:00:00 2001 From: David Yip Date: Mon, 11 Dec 2017 00:17:30 -0600 Subject: [PATCH 054/112] Add missing set_pack def/filter in OAuth::AuthorizedApplicationsController. --- 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 395fbc51bc..f95d672ecd 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_pack include Localized @@ -13,4 +14,8 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio def store_current_location store_location_for(:user, request.url) end + + def set_pack + use_pack 'settings' + end end From e56323a4dd3048fa6f46590052bcba75d82b3317 Mon Sep 17 00:00:00 2001 From: Akihiko Odaki Date: Mon, 11 Dec 2017 22:22:08 +0900 Subject: [PATCH 055/112] Remove preview_card fabricator (#5975) preview_card fabricator has a removed attribute, status, and is no longer functional. --- spec/fabricators/preview_card_fabricator.rb | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 spec/fabricators/preview_card_fabricator.rb diff --git a/spec/fabricators/preview_card_fabricator.rb b/spec/fabricators/preview_card_fabricator.rb deleted file mode 100644 index 15b33815c6..0000000000 --- a/spec/fabricators/preview_card_fabricator.rb +++ /dev/null @@ -1,4 +0,0 @@ -Fabricator(:preview_card) do - status - url 'http://example.com' -end From feed07227ba9feb8def161dc127033016c749ac5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 11 Dec 2017 15:32:29 +0100 Subject: [PATCH 056/112] Apply a 25x rate limit by IP even to authenticated requests (#5948) --- app/controllers/concerns/rate_limit_headers.rb | 4 ++-- config/initializers/rack_attack.rb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/concerns/rate_limit_headers.rb b/app/controllers/concerns/rate_limit_headers.rb index ac9b58f5df..b79c558d81 100644 --- a/app/controllers/concerns/rate_limit_headers.rb +++ b/app/controllers/concerns/rate_limit_headers.rb @@ -44,8 +44,8 @@ module RateLimitHeaders end def api_throttle_data - request.env['rack.attack.throttle_data']['throttle_authenticated_api'] || - request.env['rack.attack.throttle_data']['throttle_unauthenticated_api'] + most_limited_type, = request.env['rack.attack.throttle_data'].min_by { |_, v| v[:limit] } + request.env['rack.attack.throttle_data'][most_limited_type] end def request_time diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb index 41db769293..b38fb302b2 100644 --- a/config/initializers/rack_attack.rb +++ b/config/initializers/rack_attack.rb @@ -49,8 +49,8 @@ class Rack::Attack req.api_request? && req.authenticated_user_id end - throttle('throttle_unauthenticated_api', limit: 300, period: 5.minutes) do |req| - req.ip if req.api_request? && req.unauthenticated? + throttle('throttle_unauthenticated_api', limit: 7_500, period: 5.minutes) do |req| + req.ip if req.api_request? end throttle('protected_paths', limit: 5, period: 5.minutes) do |req| From d8206d1931800c262319564396f9cd97dea32b30 Mon Sep 17 00:00:00 2001 From: ncls7615 Date: Tue, 12 Dec 2017 00:28:33 +0900 Subject: [PATCH 057/112] add ja --- config/locales/ja.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 3097fb22bc..a8c3c90574 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -424,6 +424,7 @@ ja: changes_saved_msg: 正常に変更されました powered_by: powered by %{link} save_changes: 変更を保存 + use_this: これを使う validation_errors: one: エラーが発生しました。以下のエラーを確認してください。 other: エラーが発生しました。以下の%{count}個のエラーを確認してください。 @@ -587,6 +588,7 @@ ja: development: 開発 edit_profile: プロフィールを編集 export: データのエクスポート + flavours: フレーバー followers: 信頼済みのインスタンス import: データのインポート migrate: アカウントの引っ越し From 8aa527434c1f022199b4de576bbb2e31a123782f Mon Sep 17 00:00:00 2001 From: kibigo! Date: Mon, 11 Dec 2017 10:45:21 -0800 Subject: [PATCH 058/112] Fixed index in webpack config --- config/webpack/configuration.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js index 852185eb98..a38d9d11de 100644 --- a/config/webpack/configuration.js +++ b/config/webpack/configuration.js @@ -50,7 +50,7 @@ for (let i = 0; i < skinFiles.length; i++) { data[skin] = {}; const skinPacks = glob.sync(join(skinFile, '*.{css,scss}')); for (let j = 0; j < skinPacks.length; j++) { - const pack = skinPacks[i]; + const pack = skinPacks[j]; data[skin][basename(pack, extname(pack))] = pack; } } else if ((skin = skin.match(/^(.*)\.s?css$/i))) { From c588fcf4bce63fa74a4232952a1d5dfe76a9b160 Mon Sep 17 00:00:00 2001 From: Quenty31 <33203663+Quenty31@users.noreply.github.com> Date: Mon, 11 Dec 2017 20:53:29 +0100 Subject: [PATCH 059/112] Tiny little change (#5981) --- config/locales/oc.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 878df32b51..0167e92716 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -237,7 +237,7 @@ oc: available: Disponibles expired: Expirats title: Filtre - title: Covits + title: Convits reports: action_taken_by: Mesura menada per are_you_sure: Es segur ? @@ -533,7 +533,7 @@ oc: table: expires_at: Expirats uses: Usatges - title: Covidar de monde + title: Convidar de monde landing_strip_html: "%{name} utiliza %{link_to_root_path}. Podètz lo/la sègre o interagir amb el o ela s’avètz un compte ont que siasque sul fediverse." landing_strip_signup_html: S’es pas lo cas, podètz vos marcar aquí. lists: From 44992df257e537afe0b91682934d5eeed5575439 Mon Sep 17 00:00:00 2001 From: cwm Date: Mon, 11 Dec 2017 17:54:40 -0600 Subject: [PATCH 060/112] load pack --- app/controllers/oauth/authorizations_controller.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb index e9cdf9fa8a..987f20c414 100644 --- a/app/controllers/oauth/authorizations_controller.rb +++ b/app/controllers/oauth/authorizations_controller.rb @@ -5,6 +5,7 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController before_action :store_current_location before_action :authenticate_resource_owner! + before_action :set_pack include Localized @@ -13,4 +14,8 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController def store_current_location store_location_for(:user, request.url) end + + def set_pack + use_pack 'settings' + end end From 0a52e376484500279edded7121e3b23953d37b1b Mon Sep 17 00:00:00 2001 From: cwm Date: Mon, 11 Dec 2017 18:14:41 -0600 Subject: [PATCH 061/112] change pack to 'auth' --- app/controllers/oauth/authorizations_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb index 987f20c414..eb977510b3 100644 --- a/app/controllers/oauth/authorizations_controller.rb +++ b/app/controllers/oauth/authorizations_controller.rb @@ -16,6 +16,6 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController end def set_pack - use_pack 'settings' + use_pack 'auth' end end From 481fac7c8401a47af52043cd4db05b6dd984d8a9 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 12 Dec 2017 02:14:33 +0100 Subject: [PATCH 062/112] Exclude moved accounts from search results (#5984) --- app/models/account.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/models/account.rb b/app/models/account.rb index e8a8c65608..686e740440 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -285,6 +285,7 @@ class Account < ApplicationRecord FROM accounts WHERE #{query} @@ #{textsearch} AND accounts.suspended = false + AND accounts.moved_to_account_id IS NULL ORDER BY rank DESC LIMIT ? SQL @@ -310,6 +311,7 @@ class Account < ApplicationRecord WHERE accounts.id IN (SELECT * FROM first_degree) AND #{query} @@ #{textsearch} AND accounts.suspended = false + AND accounts.moved_to_account_id IS NULL GROUP BY accounts.id ORDER BY rank DESC LIMIT ? @@ -325,6 +327,7 @@ class Account < ApplicationRecord LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) OR (accounts.id = f.target_account_id AND f.account_id = ?) WHERE #{query} @@ #{textsearch} AND accounts.suspended = false + AND accounts.moved_to_account_id IS NULL GROUP BY accounts.id ORDER BY rank DESC LIMIT ? From 1356ed72cd4f595e93a5fa23fd8d7459fc8f81b3 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 12 Dec 2017 03:55:39 +0100 Subject: [PATCH 063/112] Fix #5953 - Add GET /api/v1/accounts/:id/lists (#5983) --- .../api/v1/accounts/lists_controller.rb | 20 ++++++++++++++++ config/routes.rb | 1 + .../api/v1/accounts/lists_controller_spec.rb | 23 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 app/controllers/api/v1/accounts/lists_controller.rb create mode 100644 spec/controllers/api/v1/accounts/lists_controller_spec.rb diff --git a/app/controllers/api/v1/accounts/lists_controller.rb b/app/controllers/api/v1/accounts/lists_controller.rb new file mode 100644 index 0000000000..a7ba89ce29 --- /dev/null +++ b/app/controllers/api/v1/accounts/lists_controller.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +class Api::V1::Accounts::ListsController < Api::BaseController + before_action -> { doorkeeper_authorize! :read } + before_action :require_user! + before_action :set_account + + respond_to :json + + def index + @lists = @account.lists.where(account: current_account) + render json: @lists, each_serializer: REST::ListSerializer + end + + private + + def set_account + @account = Account.find(params[:account_id]) + end +end diff --git a/config/routes.rb b/config/routes.rb index 6313a355de..467849c03d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -269,6 +269,7 @@ Rails.application.routes.draw do resources :statuses, only: :index, controller: 'accounts/statuses' resources :followers, only: :index, controller: 'accounts/follower_accounts' resources :following, only: :index, controller: 'accounts/following_accounts' + resources :lists, only: :index, controller: 'accounts/lists' member do post :follow diff --git a/spec/controllers/api/v1/accounts/lists_controller_spec.rb b/spec/controllers/api/v1/accounts/lists_controller_spec.rb new file mode 100644 index 0000000000..0a372f65b7 --- /dev/null +++ b/spec/controllers/api/v1/accounts/lists_controller_spec.rb @@ -0,0 +1,23 @@ +require 'rails_helper' + +describe Api::V1::Accounts::ListsController do + render_views + + let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read') } + let(:account) { Fabricate(:account) } + let(:list) { Fabricate(:list, account: user.account) } + + before do + allow(controller).to receive(:doorkeeper_token) { token } + user.account.follow!(account) + list.accounts << account + end + + describe 'GET #index' do + it 'returns http success' do + get :index, params: { account_id: account.id } + expect(response).to have_http_status(:success) + end + end +end From 30d2ea03b05ed3efb4ad8f21cab343108d3699ac Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 12 Dec 2017 03:56:30 +0100 Subject: [PATCH 064/112] Improve public status page title (#5985) --- app/views/stream_entries/show.html.haml | 3 +++ config/locales/en.yml | 1 + 2 files changed, 4 insertions(+) diff --git a/app/views/stream_entries/show.html.haml b/app/views/stream_entries/show.html.haml index 895a612470..b52334a289 100644 --- a/app/views/stream_entries/show.html.haml +++ b/app/views/stream_entries/show.html.haml @@ -1,3 +1,6 @@ +- content_for :page_title do + = t('statuses.title', name: display_name(@account), quote: truncate(@stream_entry.activity.text, length: 50, omission: '…')) + - content_for :header_tags do - if @account.user&.setting_noindex %meta{ name: 'robots', content: 'noindex' }/ diff --git a/config/locales/en.yml b/config/locales/en.yml index d42fb64275..ce6d7ee411 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -599,6 +599,7 @@ en: private: Non-public toot cannot be pinned reblog: A boost cannot be pinned show_more: Show more + title: '%{name}: "%{quote}"' visibilities: private: Followers-only private_long: Only show to followers From 14c4a33cd9bfc1212cb362897272e5ea7d1529e5 Mon Sep 17 00:00:00 2001 From: Akihiko Odaki Date: Tue, 12 Dec 2017 12:11:17 +0900 Subject: [PATCH 065/112] Change account_id non-nullable in lists (#5979) --- app/models/list.rb | 2 +- ...0171201000000_change_account_id_nonnullable_in_lists.rb | 7 +++++++ db/schema.rb | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb diff --git a/app/models/list.rb b/app/models/list.rb index f45e4973d0..be85c3b878 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -4,7 +4,7 @@ # Table name: lists # # id :integer not null, primary key -# account_id :integer +# account_id :integer not null # title :string default(""), not null # created_at :datetime not null # updated_at :datetime not null diff --git a/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb b/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb new file mode 100644 index 0000000000..120f744026 --- /dev/null +++ b/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb @@ -0,0 +1,7 @@ +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class ChangeAccountIdNonnullableInLists < ActiveRecord::Migration[5.1] + def change + change_column_null :lists, :account_id, false + end +end diff --git a/db/schema.rb b/db/schema.rb index cf0deb8268..7887f26a2e 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: 20171130000000) do +ActiveRecord::Schema.define(version: 20171201000000) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -209,7 +209,7 @@ ActiveRecord::Schema.define(version: 20171130000000) do end create_table "lists", force: :cascade do |t| - t.bigint "account_id" + t.bigint "account_id", null: false t.string "title", default: "", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false From c95af71da59513b34548b2bc8334be2035b46fe1 Mon Sep 17 00:00:00 2001 From: ncls7615 Date: Tue, 12 Dec 2017 12:29:09 +0900 Subject: [PATCH 066/112] optimize paperclip --- Gemfile | 1 + Gemfile.lock | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Gemfile b/Gemfile index e43b1a2566..9edfb12677 100644 --- a/Gemfile +++ b/Gemfile @@ -20,6 +20,7 @@ gem 'fog-local', '~> 0.4', require: false gem 'fog-openstack', '~> 0.1', require: false gem 'paperclip', '~> 5.1' gem 'paperclip-av-transcoder', '~> 0.6' +gem 'posix-spawn' gem 'active_model_serializers', '~> 0.10' gem 'addressable', '~> 2.5' diff --git a/Gemfile.lock b/Gemfile.lock index 5f050d031b..f839c19ad9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -324,6 +324,7 @@ GEM pghero (1.7.0) activerecord pkg-config (1.2.8) + posix-spawn (0.3.13) powerpack (0.1.1) pry (0.11.3) coderay (~> 1.1.0) @@ -601,6 +602,7 @@ DEPENDENCIES pg (~> 0.20) pghero (~> 1.7) pkg-config (~> 1.2) + posix-spawn pry-rails (~> 0.3) puma (~> 3.10) pundit (~> 1.1) From c0c4526283c524a3b3430df53c1fb83ffd5067eb Mon Sep 17 00:00:00 2001 From: ncls7615 Date: Tue, 12 Dec 2017 13:05:48 +0900 Subject: [PATCH 067/112] add ja for fav conf --- config/locales/simple_form.ja.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index bdeefa7e52..ab75406212 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -41,6 +41,7 @@ ja: setting_default_privacy: 投稿の公開範囲 setting_default_sensitive: メディアを常に閲覧注意としてマークする setting_delete_modal: トゥートを削除する前に確認ダイアログを表示する + setting_favourite_modal: お気に入りをする前に確認ダイアログを表示する setting_noindex: 検索エンジンによるインデックスを拒否する setting_reduce_motion: アニメーションの動きを減らす setting_system_font_ui: システムのデフォルトフォントを使う From b93ad3d0e8553be73fd7e6a39e2e436dc8d348fc Mon Sep 17 00:00:00 2001 From: ncls7615 Date: Tue, 12 Dec 2017 13:13:54 +0900 Subject: [PATCH 068/112] add ja --- app/javascript/flavours/glitch/locales/ja.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/flavours/glitch/locales/ja.js b/app/javascript/flavours/glitch/locales/ja.js index 39dc3b81db..480bbd25bd 100644 --- a/app/javascript/flavours/glitch/locales/ja.js +++ b/app/javascript/flavours/glitch/locales/ja.js @@ -37,6 +37,10 @@ const messages = { 'status.collapse': '折りたたむ', 'status.uncollapse': '折りたたみを解除', + 'favourite_modal.combo': '次からは {combo} を押せば、これをスキップできます。', + + 'home.column_settings.show_direct': 'DMを表示', + 'notification.markForDeletion': '選択', 'notifications.clear': '通知を全てクリアする', 'notifications.marked_clear_confirmation': '削除した全ての通知を完全に削除してもよろしいですか?', From be332472355dc5c55fb0beef6c818856527c7118 Mon Sep 17 00:00:00 2001 From: David Yip Date: Tue, 12 Dec 2017 03:28:15 -0600 Subject: [PATCH 069/112] Remove themes.default from nl and pt-BR locales. This translation has been supplanted by the flavours-related translations. --- config/locales/nl.yml | 2 -- config/locales/pt-BR.yml | 2 -- 2 files changed, 4 deletions(-) diff --git a/config/locales/nl.yml b/config/locales/nl.yml index c72b092a39..91c788ae6c 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -678,8 +678,6 @@ nl:

Originally adapted from the Discourse privacy policy.

title: "%{instance} Terms of Service and Privacy Policy" - themes: - default: Mastodon time: formats: default: "%d %B %Y om %H:%M" diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 5b35676162..597de9e4a3 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -675,8 +675,6 @@ pt-BR:

Originalmente adaptado da política de privacidade do Discourse.

title: "%{instance} Termos de Serviço e Política de Privacidade" - themes: - default: Mastodon time: formats: default: "%b %d, %Y, %H:%M" From 1486fd64cc73d1efb713ad3801cb8ae7acc0de1f Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Tue, 12 Dec 2017 23:10:12 +0900 Subject: [PATCH 070/112] Move files for GitHub to .github directory (#5989) --- CODEOWNERS => .github/CODEOWNERS | 0 ISSUE_TEMPLATE.md => .github/ISSUE_TEMPLATE.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename CODEOWNERS => .github/CODEOWNERS (100%) rename ISSUE_TEMPLATE.md => .github/ISSUE_TEMPLATE.md (100%) diff --git a/CODEOWNERS b/.github/CODEOWNERS similarity index 100% rename from CODEOWNERS rename to .github/CODEOWNERS diff --git a/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md similarity index 100% rename from ISSUE_TEMPLATE.md rename to .github/ISSUE_TEMPLATE.md From fe180f18ff38a01007842ccff293a84a63336aae Mon Sep 17 00:00:00 2001 From: "Renato \"Lond\" Cerqueira" Date: Tue, 12 Dec 2017 15:11:13 +0100 Subject: [PATCH 071/112] Change conditional to avoid nil into string error in sidekiq (#5987) * Change conditional to avoid nil into string error in sidekiq When obtaining information about users with mastodon in a different subdomain, sidekiq was giving out a 'no implicit conversion of nil into String' * Use presence instead of blank? with ternary. Following suggestion on PR --- app/services/fetch_remote_status_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/fetch_remote_status_service.rb b/app/services/fetch_remote_status_service.rb index 9c009335b6..9c3008035d 100644 --- a/app/services/fetch_remote_status_service.rb +++ b/app/services/fetch_remote_status_service.rb @@ -40,6 +40,6 @@ class FetchRemoteStatusService < BaseService end def confirmed_domain?(domain, account) - account.domain.nil? || domain.casecmp(account.domain).zero? || domain.casecmp(Addressable::URI.parse(account.remote_url || account.uri).normalized_host).zero? + account.domain.nil? || domain.casecmp(account.domain).zero? || domain.casecmp(Addressable::URI.parse(account.remote_url.presence || account.uri).normalized_host).zero? end end From 19257d91bf1e613b48a7ac9de7ce6933405c9657 Mon Sep 17 00:00:00 2001 From: "Renato \"Lond\" Cerqueira" Date: Tue, 12 Dec 2017 15:12:09 +0100 Subject: [PATCH 072/112] Return false if object does not respond to url (#5988) Avoid error when the service returns a mostly valid oembed, but has no url in it, causing a MethodError: undefined method `url' for # --- app/services/fetch_link_card_service.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index 7f4518ea7f..9f0c738582 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -87,6 +87,7 @@ class FetchLinkCardService < BaseService when 'link' @card.image = URI.parse(response.thumbnail_url) if response.respond_to?(:thumbnail_url) when 'photo' + return false unless response.respond_to?(:url) @card.embed_url = response.url @card.width = response.width.presence || 0 @card.height = response.height.presence || 0 From cfea28216ffaec9c28ba2f57de868ada482c1779 Mon Sep 17 00:00:00 2001 From: nullkal Date: Tue, 12 Dec 2017 23:13:24 +0900 Subject: [PATCH 073/112] make it possible to stream public timelines without authorization (#5977) * make it possible to stream public timelines without authorization * Fix * Make eslint allow `value == null` * Remove redundant line * Improve style and revert .eslintrc.yml * Fix streamWsEnd * Show IP address instead of (anonymous user) * Add missing semicolon --- streaming/index.js | 99 +++++++++++++++++++++++++++++++++------------- 1 file changed, 71 insertions(+), 28 deletions(-) diff --git a/streaming/index.js b/streaming/index.js index c79a58671d..31c597cf0c 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -97,6 +97,8 @@ const startWorker = (workerId) => { }; const app = express(); + app.set('trusted proxy', process.env.TRUSTED_PROXY_IP || 'loopback,uniquelocal'); + const pgPool = new pg.Pool(Object.assign(pgConfigs[env], dbUrlToConfig(process.env.DATABASE_URL))); const server = http.createServer(app); const redisNamespace = process.env.REDIS_NAMESPACE || null; @@ -177,6 +179,12 @@ const startWorker = (workerId) => { next(); }; + const setRemoteAddress = (req, res, next) => { + req.remoteAddress = req.connection.remoteAddress; + + next(); + }; + const accountFromToken = (token, req, next) => { pgPool.connect((err, client, done) => { if (err) { @@ -208,17 +216,22 @@ const startWorker = (workerId) => { }); }; - const accountFromRequest = (req, next) => { + const accountFromRequest = (req, next, required = true) => { const authorization = req.headers.authorization; const location = url.parse(req.url, true); const accessToken = location.query.access_token; if (!authorization && !accessToken) { - const err = new Error('Missing access token'); - err.statusCode = 401; + if (required) { + const err = new Error('Missing access token'); + err.statusCode = 401; - next(err); - return; + next(err); + return; + } else { + next(); + return; + } } const token = authorization ? authorization.replace(/^Bearer /, '') : accessToken; @@ -226,7 +239,17 @@ const startWorker = (workerId) => { accountFromToken(token, req, next); }; + const PUBLIC_STREAMS = [ + 'public', + 'public:local', + 'hashtag', + 'hashtag:local', + ]; + const wsVerifyClient = (info, cb) => { + const location = url.parse(info.req.url, true); + const authRequired = !PUBLIC_STREAMS.some(stream => stream === location.query.stream); + accountFromRequest(info.req, err => { if (!err) { cb(true, undefined, undefined); @@ -234,16 +257,24 @@ const startWorker = (workerId) => { log.error(info.req.requestId, err.toString()); cb(false, 401, 'Unauthorized'); } - }); + }, authRequired); }; + const PUBLIC_ENDPOINTS = [ + '/api/v1/streaming/public', + '/api/v1/streaming/public/local', + '/api/v1/streaming/hashtag', + '/api/v1/streaming/hashtag/local', + ]; + const authenticationMiddleware = (req, res, next) => { if (req.method === 'OPTIONS') { next(); return; } - accountFromRequest(req, next); + const authRequired = !PUBLIC_ENDPOINTS.some(endpoint => endpoint === req.path); + accountFromRequest(req, next, authRequired); }; const errorMiddleware = (err, req, res, {}) => { @@ -275,8 +306,10 @@ const startWorker = (workerId) => { }; const streamFrom = (id, req, output, attachCloseHandler, needsFiltering = false, notificationOnly = false) => { + const accountId = req.accountId || req.remoteAddress; + const streamType = notificationOnly ? ' (notification)' : ''; - log.verbose(req.requestId, `Starting stream from ${id} for ${req.accountId}${streamType}`); + log.verbose(req.requestId, `Starting stream from ${id} for ${accountId}${streamType}`); const listener = message => { const { event, payload, queued_at } = JSON.parse(message); @@ -286,7 +319,7 @@ const startWorker = (workerId) => { const delta = now - queued_at; const encodedPayload = typeof payload === 'object' ? JSON.stringify(payload) : payload; - log.silly(req.requestId, `Transmitting for ${req.accountId}: ${event} ${encodedPayload} Delay: ${delta}ms`); + log.silly(req.requestId, `Transmitting for ${accountId}: ${event} ${encodedPayload} Delay: ${delta}ms`); output(event, encodedPayload); }; @@ -313,26 +346,30 @@ const startWorker = (workerId) => { return; } - const queries = [ - client.query(`SELECT 1 FROM blocks WHERE (account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})) OR (account_id = $2 AND target_account_id = $1) UNION SELECT 1 FROM mutes WHERE account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})`, [req.accountId, unpackedPayload.account.id].concat(targetAccountIds)), - ]; + if (!req.accountId) { + const queries = [ + client.query(`SELECT 1 FROM blocks WHERE (account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})) OR (account_id = $2 AND target_account_id = $1) UNION SELECT 1 FROM mutes WHERE account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})`, [req.accountId, unpackedPayload.account.id].concat(targetAccountIds)), + ]; - if (accountDomain) { - queries.push(client.query('SELECT 1 FROM account_domain_blocks WHERE account_id = $1 AND domain = $2', [req.accountId, accountDomain])); - } - - Promise.all(queries).then(values => { - done(); - - if (values[0].rows.length > 0 || (values.length > 1 && values[1].rows.length > 0)) { - return; + if (accountDomain) { + queries.push(client.query('SELECT 1 FROM account_domain_blocks WHERE account_id = $1 AND domain = $2', [req.accountId, accountDomain])); } + Promise.all(queries).then(values => { + done(); + + if (values[0].rows.length > 0 || (values.length > 1 && values[1].rows.length > 0)) { + return; + } + + transmit(); + }).catch(err => { + done(); + log.error(err); + }); + } else { transmit(); - }).catch(err => { - done(); - log.error(err); - }); + } }); } else { transmit(); @@ -345,13 +382,15 @@ const startWorker = (workerId) => { // Setup stream output to HTTP const streamToHttp = (req, res) => { + const accountId = req.accountId || req.remoteAddress; + res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Transfer-Encoding', 'chunked'); const heartbeat = setInterval(() => res.write(':thump\n'), 15000); req.on('close', () => { - log.verbose(req.requestId, `Ending stream for ${req.accountId}`); + log.verbose(req.requestId, `Ending stream for ${accountId}`); clearInterval(heartbeat); }); @@ -383,8 +422,10 @@ const startWorker = (workerId) => { // Setup stream end for WebSockets const streamWsEnd = (req, ws, closeHandler = false) => (id, listener) => { + const accountId = req.accountId || req.remoteAddress; + ws.on('close', () => { - log.verbose(req.requestId, `Ending stream for ${req.accountId}`); + log.verbose(req.requestId, `Ending stream for ${accountId}`); unsubscribe(id, listener); if (closeHandler) { closeHandler(); @@ -392,7 +433,7 @@ const startWorker = (workerId) => { }); ws.on('error', () => { - log.verbose(req.requestId, `Ending stream for ${req.accountId}`); + log.verbose(req.requestId, `Ending stream for ${accountId}`); unsubscribe(id, listener); if (closeHandler) { closeHandler(); @@ -401,6 +442,7 @@ const startWorker = (workerId) => { }; app.use(setRequestId); + app.use(setRemoteAddress); app.use(allowCrossDomain); app.use(authenticationMiddleware); app.use(errorMiddleware); @@ -451,6 +493,7 @@ const startWorker = (workerId) => { const req = ws.upgradeReq; const location = url.parse(req.url, true); req.requestId = uuid.v4(); + req.remoteAddress = ws._socket.remoteAddress; ws.isAlive = true; From 2a61b9f000039a7d02315cdf6bca58138861a71c Mon Sep 17 00:00:00 2001 From: SerCom_KC Date: Tue, 12 Dec 2017 22:13:47 +0800 Subject: [PATCH 074/112] Update Chinese (Simplified) translations (#5991) * i18n: (zh-CN) Update translations for #5817 * i18n: (zh-CN) Add translation for #5985 * i18n: (zh-CN) Normalization --- config/locales/zh-CN.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 3ede5c4d56..0d0cac1b35 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -341,7 +341,7 @@ zh-CN: warning: 一定小心,千万不要把它分享给任何人! your_token: 你的访问令牌 auth: - agreement_html: 注册即表示你同意我们的使用条款隐私权政策。 + agreement_html: 注册即表示你同意遵守本实例的相关规定我们的使用条款。 change_password: 帐户安全 delete_account: 删除帐户 delete_account_html: 如果你想删除你的帐户,请点击这里继续。你需要确认你的操作。 @@ -591,6 +591,7 @@ zh-CN: private: 不能置顶非公开的嘟文 reblog: 不能置顶转嘟 show_more: 显示更多 + title: "%{name}:“%{quote}”" visibilities: private: 仅关注者 private_long: 只有关注你的用户能看到 From f9f6918148ab2471292bcc89e14be8471b42c992 Mon Sep 17 00:00:00 2001 From: Akihiko Odaki Date: Tue, 12 Dec 2017 23:54:38 +0900 Subject: [PATCH 075/112] Store preview image for embedded photo in preview cards (#5986) The preview image would be useful to embed in timeline. --- app/services/fetch_link_card_service.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index 9f0c738582..09534d0ff0 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -89,6 +89,7 @@ class FetchLinkCardService < BaseService when 'photo' return false unless response.respond_to?(:url) @card.embed_url = response.url + @card.image = URI.parse(response.url) @card.width = response.width.presence || 0 @card.height = response.height.presence || 0 when 'video' From cfa3f55221733664004deb14f70764be4752b7bb Mon Sep 17 00:00:00 2001 From: abcang Date: Wed, 13 Dec 2017 01:38:42 +0900 Subject: [PATCH 076/112] Remove duplicate indexes in lists (#5990) --- .../20171212195226_remove_duplicate_indexes_in_lists.rb | 6 ++++++ db/schema.rb | 4 +--- 2 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20171212195226_remove_duplicate_indexes_in_lists.rb diff --git a/db/migrate/20171212195226_remove_duplicate_indexes_in_lists.rb b/db/migrate/20171212195226_remove_duplicate_indexes_in_lists.rb new file mode 100644 index 0000000000..03f2591a88 --- /dev/null +++ b/db/migrate/20171212195226_remove_duplicate_indexes_in_lists.rb @@ -0,0 +1,6 @@ +class RemoveDuplicateIndexesInLists < ActiveRecord::Migration[5.1] + def change + remove_index :list_accounts, name: "index_list_accounts_on_account_id" + remove_index :list_accounts, name: "index_list_accounts_on_list_id" + end +end diff --git a/db/schema.rb b/db/schema.rb index 7887f26a2e..c55020fa40 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: 20171201000000) do +ActiveRecord::Schema.define(version: 20171212195226) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -202,10 +202,8 @@ ActiveRecord::Schema.define(version: 20171201000000) do t.bigint "account_id", null: false t.bigint "follow_id", null: false t.index ["account_id", "list_id"], name: "index_list_accounts_on_account_id_and_list_id", unique: true - t.index ["account_id"], name: "index_list_accounts_on_account_id" t.index ["follow_id"], name: "index_list_accounts_on_follow_id" t.index ["list_id", "account_id"], name: "index_list_accounts_on_list_id_and_account_id" - t.index ["list_id"], name: "index_list_accounts_on_list_id" end create_table "lists", force: :cascade do |t| From 0c8b1eb577f11d33c27f28afdfdac807b7e27845 Mon Sep 17 00:00:00 2001 From: Neetshin Date: Tue, 12 Dec 2017 18:57:22 +0000 Subject: [PATCH 077/112] Make detect empty string before assign image description (#5994) * Add aria-autocomplete='list' in Textaria ref: https://www.w3.org/TR/wai-aria-1.1/#aria-autocomplete * Make detect empty string brefore assign upload description --- app/javascript/mastodon/features/compose/components/upload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/compose/components/upload.js b/app/javascript/mastodon/features/compose/components/upload.js index 6ab76492a9..3a3d177100 100644 --- a/app/javascript/mastodon/features/compose/components/upload.js +++ b/app/javascript/mastodon/features/compose/components/upload.js @@ -62,7 +62,7 @@ export default class Upload extends ImmutablePureComponent { render () { const { intl, media } = this.props; const active = this.state.hovered || this.state.focused; - const description = this.state.dirtyDescription || media.get('description') || ''; + const description = this.state.dirtyDescription || (this.state.dirtyDescription !== '' && media.get('description')) || ''; return (
From c986218c3a98564e38d68689150b33a6aa6c4b3a Mon Sep 17 00:00:00 2001 From: erin Date: Tue, 12 Dec 2017 13:19:33 -0600 Subject: [PATCH 078/112] Improve error handling in streaming/index.js (#5968) On an unhandled worker exception, we should log the exception and exit with nonzero status, instead of letting workers silently fail and restarting them in an endless loop. Note: we previously tried to handle the `'error'` signal. That's not a signal Node fires; my patch traps `'uncaughtException'`, which is what the code was _trying_ to do. --- streaming/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/streaming/index.js b/streaming/index.js index 31c597cf0c..198eac1ae4 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -563,12 +563,14 @@ const startWorker = (workerId) => { const onError = (err) => { log.error(err); + server.close(); + process.exit(0); }; process.on('SIGINT', onExit); process.on('SIGTERM', onExit); process.on('exit', onExit); - process.on('error', onError); + process.on('uncaughtException', onError); }; throng({ From 0370ba7b0a18d41f688269370d0eb089261047a9 Mon Sep 17 00:00:00 2001 From: Quenty31 <33203663+Quenty31@users.noreply.github.com> Date: Tue, 12 Dec 2017 20:48:26 +0100 Subject: [PATCH 079/112] Update: #5985 and #5817 (#5996) --- config/locales/oc.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 0167e92716..60c9e0671e 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -343,7 +343,7 @@ oc: warning: Mèfi ! Agachatz de partejar aquela donada amb degun ! your_token: Vòstre geton d’accès auth: - agreement_html: En vos marcar acceptatz nòstres tèrmes de servici e politica de confidencialitat. + agreement_html: En vos marcar acceptatz las règlas de l’instància e politica de confidencialitat. change_password: Seguretat delete_account: Suprimir lo compte delete_account_html: Se volètz suprimir vòstre compte, podètz o far aquí. Vos demandarem que confirmetz. @@ -677,6 +677,7 @@ oc: private: Se pòt pas penjar los tuts pas publics reblog: Se pòt pas penjar un tut partejat show_more: Ne veire mai + title: '%{name} : "%{quote}"' visibilities: private: Seguidors solament private_long: Mostrar pas qu’als seguidors From 0128b86d3098042cdbc3a1629f74b70f665f8dfb Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 13 Dec 2017 02:12:41 +0100 Subject: [PATCH 080/112] Use streaming API for standalone timelines on /about and /tag pages (#5998) --- .../features/standalone/hashtag_timeline/index.js | 12 +++++------- .../features/standalone/public_timeline/index.js | 12 +++++------- app/javascript/mastodon/stream.js | 8 +++++++- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/app/javascript/mastodon/features/standalone/hashtag_timeline/index.js b/app/javascript/mastodon/features/standalone/hashtag_timeline/index.js index f15fbb2f40..f14be2aafb 100644 --- a/app/javascript/mastodon/features/standalone/hashtag_timeline/index.js +++ b/app/javascript/mastodon/features/standalone/hashtag_timeline/index.js @@ -8,6 +8,7 @@ import { } from '../../../actions/timelines'; import Column from '../../../components/column'; import ColumnHeader from '../../../components/column_header'; +import { connectHashtagStream } from '../../../actions/streaming'; @connect() export default class HashtagTimeline extends React.PureComponent { @@ -29,16 +30,13 @@ export default class HashtagTimeline extends React.PureComponent { const { dispatch, hashtag } = this.props; dispatch(refreshHashtagTimeline(hashtag)); - - this.polling = setInterval(() => { - dispatch(refreshHashtagTimeline(hashtag)); - }, 10000); + this.disconnect = dispatch(connectHashtagStream(hashtag)); } componentWillUnmount () { - if (typeof this.polling !== 'undefined') { - clearInterval(this.polling); - this.polling = null; + if (this.disconnect) { + this.disconnect(); + this.disconnect = null; } } diff --git a/app/javascript/mastodon/features/standalone/public_timeline/index.js b/app/javascript/mastodon/features/standalone/public_timeline/index.js index de4b5320a5..5805d1a105 100644 --- a/app/javascript/mastodon/features/standalone/public_timeline/index.js +++ b/app/javascript/mastodon/features/standalone/public_timeline/index.js @@ -9,6 +9,7 @@ import { import Column from '../../../components/column'; import ColumnHeader from '../../../components/column_header'; import { defineMessages, injectIntl } from 'react-intl'; +import { connectPublicStream } from '../../../actions/streaming'; const messages = defineMessages({ title: { id: 'standalone.public_title', defaultMessage: 'A look inside...' }, @@ -35,16 +36,13 @@ export default class PublicTimeline extends React.PureComponent { const { dispatch } = this.props; dispatch(refreshPublicTimeline()); - - this.polling = setInterval(() => { - dispatch(refreshPublicTimeline()); - }, 3000); + this.disconnect = dispatch(connectPublicStream()); } componentWillUnmount () { - if (typeof this.polling !== 'undefined') { - clearInterval(this.polling); - this.polling = null; + if (this.disconnect) { + this.disconnect(); + this.disconnect = null; } } diff --git a/app/javascript/mastodon/stream.js b/app/javascript/mastodon/stream.js index 36c68ffc5b..9a6f4f26d1 100644 --- a/app/javascript/mastodon/stream.js +++ b/app/javascript/mastodon/stream.js @@ -62,7 +62,13 @@ export function connectStream(path, pollingRefresh = null, callbacks = () => ({ export default function getStream(streamingAPIBaseURL, accessToken, stream, { connected, received, disconnected, reconnected }) { - const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?access_token=${accessToken}&stream=${stream}`); + const params = [ `stream=${stream}` ]; + + if (accessToken !== null) { + params.push(`access_token=${accessToken}`); + } + + const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?${params.join('&')}`); ws.onopen = connected; ws.onmessage = e => received(JSON.parse(e.data)); From 71965cbef2696e66be284c8ed11711ec46925603 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 13 Dec 2017 02:40:32 +0100 Subject: [PATCH 081/112] Adjust empty list timeline message (#5997) --- app/javascript/mastodon/features/list_timeline/index.js | 2 +- app/javascript/mastodon/locales/en.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/list_timeline/index.js b/app/javascript/mastodon/features/list_timeline/index.js index 1dcd4de144..ae136e48f9 100644 --- a/app/javascript/mastodon/features/list_timeline/index.js +++ b/app/javascript/mastodon/features/list_timeline/index.js @@ -161,7 +161,7 @@ export default class ListTimeline extends React.PureComponent { scrollKey={`list_timeline-${columnId}`} timelineId={`list:${id}`} loadMore={this.handleLoadMore} - emptyMessage={} + emptyMessage={} /> ); diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 3633025b8b..5c39bd682d 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -91,7 +91,7 @@ "empty_column.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", "empty_column.home.public_timeline": "the public timeline", - "empty_column.list": "There is nothing in this list yet.", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", "follow_request.authorize": "Authorize", From 5706fe18c2803a33c5cd0beceb6a07ba4da0b5ba Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 13 Dec 2017 04:12:38 +0100 Subject: [PATCH 082/112] Fix #5952 - NameError (regression from #5762) (#5999) * Fix #5952 - NameError (regression from #5762) * Fix --- app/services/follow_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb index 20579ca63a..ac0207a0ab 100644 --- a/app/services/follow_service.rb +++ b/app/services/follow_service.rb @@ -22,7 +22,7 @@ class FollowService < BaseService elsif source_account.requested?(target_account) # This isn't managed by a method in AccountInteractions, so we modify it # ourselves if necessary. - req = follow_requests.find_by(target_account: other_account) + req = source_account.follow_requests.find_by(target_account: target_account) req.update!(show_reblogs: reblogs) return end From 81923f88bac7d9df1ee92603d3d4d0838aeb740f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 13 Dec 2017 07:42:22 +0100 Subject: [PATCH 083/112] Shorten English title for 2FA to avoid line-break (#6001) --- config/locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index ce6d7ee411..44c021bd5a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -588,7 +588,7 @@ en: notifications: Notifications preferences: Preferences settings: Settings - two_factor_authentication: Two-factor Authentication + two_factor_authentication: Two-factor Auth your_apps: Your applications statuses: open_in_web: Open in web From 155e211dd035992432623a33b809578f8315395f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 13 Dec 2017 12:14:03 +0100 Subject: [PATCH 084/112] Fix GIF avatars not autoplaying when GIF autoplay is enabled (#6000) --- app/javascript/mastodon/components/avatar.js | 5 +++-- .../mastodon/components/avatar_overlay.js | 13 ++++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/javascript/mastodon/components/avatar.js b/app/javascript/mastodon/components/avatar.js index f7c484ee3a..570505833f 100644 --- a/app/javascript/mastodon/components/avatar.js +++ b/app/javascript/mastodon/components/avatar.js @@ -1,6 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; +import { autoPlayGif } from '../initial_state'; export default class Avatar extends React.PureComponent { @@ -8,12 +9,12 @@ export default class Avatar extends React.PureComponent { account: ImmutablePropTypes.map.isRequired, size: PropTypes.number.isRequired, style: PropTypes.object, - animate: PropTypes.bool, inline: PropTypes.bool, + animate: PropTypes.bool, }; static defaultProps = { - animate: false, + animate: autoPlayGif, size: 20, inline: false, }; diff --git a/app/javascript/mastodon/components/avatar_overlay.js b/app/javascript/mastodon/components/avatar_overlay.js index f5d67b34e8..3ec1d77304 100644 --- a/app/javascript/mastodon/components/avatar_overlay.js +++ b/app/javascript/mastodon/components/avatar_overlay.js @@ -1,22 +1,29 @@ import React from 'react'; +import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; +import { autoPlayGif } from '../initial_state'; export default class AvatarOverlay extends React.PureComponent { static propTypes = { account: ImmutablePropTypes.map.isRequired, friend: ImmutablePropTypes.map.isRequired, + animate: PropTypes.bool, + }; + + static defaultProps = { + animate: autoPlayGif, }; render() { - const { account, friend } = this.props; + const { account, friend, animate } = this.props; const baseStyle = { - backgroundImage: `url(${account.get('avatar_static')})`, + backgroundImage: `url(${account.get(animate ? 'avatar' : 'avatar_static')})`, }; const overlayStyle = { - backgroundImage: `url(${friend.get('avatar_static')})`, + backgroundImage: `url(${friend.get(animate ? 'avatar' : 'avatar_static')})`, }; return ( From 20a6584d2dd9d5ecaa19a45a0c0c5ffec5a100ff Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 13 Dec 2017 12:15:10 +0100 Subject: [PATCH 085/112] Clean up admin UI for accounts (#6004) * Add staff filter to admin UI for accounts, remove obsolete columns * Only display OStatus section in admin UI for accounts when OStatus data --- app/controllers/admin/accounts_controller.rb | 3 ++- app/helpers/admin/filter_helper.rb | 2 +- app/models/account_filter.rb | 2 ++ app/views/admin/accounts/_account.html.haml | 17 +++-------------- app/views/admin/accounts/index.html.haml | 9 ++++++--- app/views/admin/accounts/show.html.haml | 3 ++- config/locales/en.yml | 1 + 7 files changed, 17 insertions(+), 20 deletions(-) diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index e9a512e70c..7428c3f229 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -89,7 +89,8 @@ module Admin :username, :display_name, :email, - :ip + :ip, + :staff ) end end diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb index 9443934b30..7fe3def987 100644 --- a/app/helpers/admin/filter_helper.rb +++ b/app/helpers/admin/filter_helper.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module Admin::FilterHelper - ACCOUNT_FILTERS = %i(local remote by_domain silenced suspended recent username display_name email ip).freeze + ACCOUNT_FILTERS = %i(local remote by_domain silenced suspended recent username display_name email ip staff).freeze REPORT_FILTERS = %i(resolved account_id target_account_id).freeze INVITE_FILTER = %i(available expired).freeze diff --git a/app/models/account_filter.rb b/app/models/account_filter.rb index 1898723682..dc7a03039f 100644 --- a/app/models/account_filter.rb +++ b/app/models/account_filter.rb @@ -45,6 +45,8 @@ class AccountFilter else Account.default_scoped end + when 'staff' + accounts_with_users.merge User.staff else raise "Unknown filter: #{key}" end diff --git a/app/views/admin/accounts/_account.html.haml b/app/views/admin/accounts/_account.html.haml index 5265d77f66..598f6cddd0 100644 --- a/app/views/admin/accounts/_account.html.haml +++ b/app/views/admin/accounts/_account.html.haml @@ -4,22 +4,11 @@ %td.domain - unless account.local? = link_to account.domain, admin_accounts_path(by_domain: account.domain) - %td.protocol - - unless account.local? - = account.protocol.humanize - %td.confirmed + %td - if account.local? - - if account.user_confirmed? - %i.fa.fa-check - - else - %i.fa.fa-times - %td.subscribed - - if account.local? - = t('admin.accounts.location.local') - - elsif account.subscribed? - %i.fa.fa-check + = t("admin.accounts.roles.#{account.user&.role}") - else - %i.fa.fa-times + = account.protocol.humanize %td = table_link_to 'circle', t('admin.accounts.web'), web_path("accounts/#{account.id}") = table_link_to 'globe', t('admin.accounts.public'), TagManager.instance.url_for(account) diff --git a/app/views/admin/accounts/index.html.haml b/app/views/admin/accounts/index.html.haml index 27a0682d8b..6aa39a80a0 100644 --- a/app/views/admin/accounts/index.html.haml +++ b/app/views/admin/accounts/index.html.haml @@ -30,6 +30,11 @@ = filter_link_to t('admin.accounts.moderation.suspended'), {suspended: nil}, {suspended: '1'} - else = filter_link_to t('admin.accounts.moderation.suspended'), suspended: '1' + .filter-subset + %strong= t('admin.accounts.role') + %ul + %li= filter_link_to t('admin.accounts.moderation.all'), staff: nil + %li= filter_link_to t('admin.accounts.roles.staff'), staff: '1' .filter-subset %strong= t('admin.accounts.order.title') %ul @@ -56,9 +61,7 @@ %tr %th= t('admin.accounts.username') %th= t('admin.accounts.domain') - %th= t('admin.accounts.protocol') - %th= t('admin.accounts.confirmed') - %th= fa_icon 'paper-plane-o' + %th %th %tbody = render @accounts diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml index ddb1cf15d9..5f5d0995cd 100644 --- a/app/views/admin/accounts/show.html.haml +++ b/app/views/admin/accounts/show.html.haml @@ -104,7 +104,7 @@ - else = link_to t('admin.accounts.perform_full_suspension'), admin_account_suspension_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button' if can?(:suspend, @account) -- unless @account.local? +- if !@account.local? && @account.hub_url.present? %hr %h3 OStatus @@ -132,6 +132,7 @@ - if @account.subscribed? = link_to t('admin.accounts.unsubscribe'), unsubscribe_admin_account_path(@account.id), method: :post, class: 'button negative' if can?(:unsubscribe, @account) +- if !@account.local? && @account.inbox_url.present? %hr %h3 ActivityPub diff --git a/config/locales/en.yml b/config/locales/en.yml index 44c021bd5a..cc22d02ac9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -116,6 +116,7 @@ en: roles: admin: Administrator moderator: Moderator + staff: Staff user: User salmon_url: Salmon URL search: Search From a8deb6648bc348e64469cc3451040b46ea057b77 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 13 Dec 2017 12:15:28 +0100 Subject: [PATCH 086/112] Fix redundant HTTP request in FetchLinkCardService (#6002) --- app/lib/provider_discovery.rb | 19 ++++++-- app/services/fetch_link_card_service.rb | 58 ++++++++++++------------- 2 files changed, 45 insertions(+), 32 deletions(-) diff --git a/app/lib/provider_discovery.rb b/app/lib/provider_discovery.rb index bcc4ed500e..04ba381010 100644 --- a/app/lib/provider_discovery.rb +++ b/app/lib/provider_discovery.rb @@ -2,13 +2,26 @@ class ProviderDiscovery < OEmbed::ProviderDiscovery class << self + def get(url, **options) + provider = discover_provider(url, options) + + options.delete(:html) + + provider.get(url, options) + end + def discover_provider(url, **options) - res = Request.new(:get, url).perform format = options[:format] - raise OEmbed::NotFound, url if res.code != 200 || res.mime_type != 'text/html' + if options[:html] + html = Nokogiri::HTML(options[:html]) + else + res = Request.new(:get, url).perform - html = Nokogiri::HTML(res.to_s) + raise OEmbed::NotFound, url if res.code != 200 || res.mime_type != 'text/html' + + html = Nokogiri::HTML(res.to_s) + end if format.nil? || format == :json provider_endpoint ||= html.at_xpath('//link[@type="application/json+oembed"]')&.attribute('href')&.value diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index 09534d0ff0..d0472a1d7f 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -40,6 +40,12 @@ class FetchLinkCardService < BaseService return if res.code != 405 && (res.code != 200 || res.mime_type != 'text/html') + @response = Request.new(:get, @url).perform + + return if @response.code != 200 || @response.mime_type != 'text/html' + + @html = @response.to_s + attempt_oembed || attempt_opengraph end @@ -70,32 +76,32 @@ class FetchLinkCardService < BaseService end def attempt_oembed - response = OEmbed::Providers.get(@url) + embed = OEmbed::Providers.get(@url, html: @html) - return false unless response.respond_to?(:type) + return false unless embed.respond_to?(:type) - @card.type = response.type - @card.title = response.respond_to?(:title) ? response.title : '' - @card.author_name = response.respond_to?(:author_name) ? response.author_name : '' - @card.author_url = response.respond_to?(:author_url) ? response.author_url : '' - @card.provider_name = response.respond_to?(:provider_name) ? response.provider_name : '' - @card.provider_url = response.respond_to?(:provider_url) ? response.provider_url : '' + @card.type = embed.type + @card.title = embed.respond_to?(:title) ? embed.title : '' + @card.author_name = embed.respond_to?(:author_name) ? embed.author_name : '' + @card.author_url = embed.respond_to?(:author_url) ? embed.author_url : '' + @card.provider_name = embed.respond_to?(:provider_name) ? embed.provider_name : '' + @card.provider_url = embed.respond_to?(:provider_url) ? embed.provider_url : '' @card.width = 0 @card.height = 0 case @card.type when 'link' - @card.image = URI.parse(response.thumbnail_url) if response.respond_to?(:thumbnail_url) + @card.image = URI.parse(embed.thumbnail_url) if embed.respond_to?(:thumbnail_url) when 'photo' - return false unless response.respond_to?(:url) - @card.embed_url = response.url - @card.image = URI.parse(response.url) - @card.width = response.width.presence || 0 - @card.height = response.height.presence || 0 + return false unless embed.respond_to?(:url) + @card.embed_url = embed.url + @card.image = URI.parse(embed.url) + @card.width = embed.width.presence || 0 + @card.height = embed.height.presence || 0 when 'video' - @card.width = response.width.presence || 0 - @card.height = response.height.presence || 0 - @card.html = Formatter.instance.sanitize(response.html, Sanitize::Config::MASTODON_OEMBED) + @card.width = embed.width.presence || 0 + @card.height = embed.height.presence || 0 + @card.html = Formatter.instance.sanitize(embed.html, Sanitize::Config::MASTODON_OEMBED) when 'rich' # Most providers rely on