diff options
author | Starfall <us@starfall.systems> | 2022-06-06 13:35:20 -0500 |
---|---|---|
committer | Starfall <us@starfall.systems> | 2022-06-06 13:35:20 -0500 |
commit | 78266a002b4735caaef07098ba66419fd71f47c1 (patch) | |
tree | 4ba2bc330d5ed4b6a3a926ab9a03a89f56bc8843 /app | |
parent | e9b2e11520056d0ec822ac0862923d00c6a1289c (diff) | |
parent | 434b08e95b1a440bf9ae563b72600d1590106260 (diff) |
Merge remote-tracking branch 'glitch/main'
Diffstat (limited to 'app')
263 files changed, 5560 insertions, 2317 deletions
diff --git a/app/chewy/accounts_index.rb b/app/chewy/accounts_index.rb index 6f9ea76e9..e38e14a10 100644 --- a/app/chewy/accounts_index.rb +++ b/app/chewy/accounts_index.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class AccountsIndex < Chewy::Index - settings index: { refresh_interval: '5m' }, analysis: { + settings index: { refresh_interval: '30s' }, analysis: { analyzer: { content: { tokenizer: 'whitespace', @@ -23,7 +23,7 @@ class AccountsIndex < Chewy::Index }, } - index_scope ::Account.searchable.includes(:account_stat), delete_if: ->(account) { account.destroyed? || !account.searchable? } + index_scope ::Account.searchable.includes(:account_stat) root date_detection: false do field :id, type: 'long' @@ -36,8 +36,8 @@ class AccountsIndex < Chewy::Index field :edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'content' end - field :following_count, type: 'long', value: ->(account) { account.following.local.count } - field :followers_count, type: 'long', value: ->(account) { account.followers.local.count } + field :following_count, type: 'long', value: ->(account) { account.following_count } + field :followers_count, type: 'long', value: ->(account) { account.followers_count } field :last_status_at, type: 'date', value: ->(account) { account.last_status_at || account.created_at } end end diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb index 1304aeedb..6dd4fb18b 100644 --- a/app/chewy/statuses_index.rb +++ b/app/chewy/statuses_index.rb @@ -3,7 +3,7 @@ class StatusesIndex < Chewy::Index include FormattingHelper - settings index: { refresh_interval: '15m' }, analysis: { + settings index: { refresh_interval: '30s' }, analysis: { filter: { english_stop: { type: 'stop', @@ -33,6 +33,8 @@ class StatusesIndex < Chewy::Index }, } + # We do not use delete_if option here because it would call a method that we + # expect to be called with crutches without crutches, causing n+1 queries index_scope ::Status.unscoped.kept.without_reblogs.includes(:media_attachments, :preloadable_poll) crutch :mentions do |collection| diff --git a/app/chewy/tags_index.rb b/app/chewy/tags_index.rb index f9db2b03a..df3d9e4cc 100644 --- a/app/chewy/tags_index.rb +++ b/app/chewy/tags_index.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class TagsIndex < Chewy::Index - settings index: { refresh_interval: '15m' }, analysis: { + settings index: { refresh_interval: '30s' }, analysis: { analyzer: { content: { tokenizer: 'keyword', @@ -23,7 +23,11 @@ class TagsIndex < Chewy::Index }, } - index_scope ::Tag.listable, delete_if: ->(tag) { tag.destroyed? || !tag.listable? } + index_scope ::Tag.listable + + crutch :time_period do + 7.days.ago.to_date..0.days.ago.to_date + end root date_detection: false do field :name, type: 'text', analyzer: 'content' do @@ -31,7 +35,7 @@ class TagsIndex < Chewy::Index end field :reviewed, type: 'boolean', value: ->(tag) { tag.reviewed? } - field :usage, type: 'long', value: ->(tag) { tag.history.reduce(0) { |total, day| total + day.accounts } } + field :usage, type: 'long', value: ->(tag, crutches) { tag.history.aggregate(crutches.time_period).accounts } field :last_status_at, type: 'date', value: ->(tag) { tag.last_status_at || tag.created_at } end end diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 03c07c50b..9949206cb 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -45,7 +45,6 @@ class AccountsController < ApplicationController limit = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE @statuses = filtered_statuses.without_reblogs.limit(limit) @statuses = cache_collection(@statuses, Status) - render xml: RSS::AccountSerializer.render(@account, @statuses, params[:tag]) end format.json do diff --git a/app/controllers/activitypub/base_controller.rb b/app/controllers/activitypub/base_controller.rb index 196d85a32..b8a7e0ab9 100644 --- a/app/controllers/activitypub/base_controller.rb +++ b/app/controllers/activitypub/base_controller.rb @@ -2,6 +2,7 @@ class ActivityPub::BaseController < Api::BaseController skip_before_action :require_authenticated_user! + skip_before_action :require_not_suspended! skip_around_action :set_locale private diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb index 16defc1ea..48e9781d6 100644 --- a/app/controllers/admin/domain_blocks_controller.rb +++ b/app/controllers/admin/domain_blocks_controller.rb @@ -4,6 +4,17 @@ module Admin class DomainBlocksController < BaseController before_action :set_domain_block, only: [:show, :destroy, :edit, :update] + def batch + @form = Form::DomainBlockBatch.new(form_domain_block_batch_params.merge(current_account: current_account, action: action_from_button)) + @form.save + rescue ActionController::ParameterMissing + flash[:alert] = I18n.t('admin.email_domain_blocks.no_domain_block_selected') + rescue Mastodon::NotPermittedError + flash[:alert] = I18n.t('admin.domain_blocks.created_msg') + else + redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg') + end + def new authorize :domain_block, :create? @domain_block = DomainBlock.new(domain: params[:_domain]) @@ -76,5 +87,15 @@ module Admin def resource_params params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate) end + + def form_domain_block_batch_params + params.require(:form_domain_block_batch).permit(domain_blocks_attributes: [:enabled, :domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate]) + end + + def action_from_button + if params[:save] + 'save' + end + end end end diff --git a/app/controllers/admin/export_domain_allows_controller.rb b/app/controllers/admin/export_domain_allows_controller.rb new file mode 100644 index 000000000..eb2955ac3 --- /dev/null +++ b/app/controllers/admin/export_domain_allows_controller.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +require 'csv' + +module Admin + class ExportDomainAllowsController < BaseController + include AdminExportControllerConcern + + before_action :set_dummy_import!, only: [:new] + + ROWS_PROCESSING_LIMIT = 20_000 + + def new + authorize :domain_allow, :create? + end + + def export + authorize :instance, :index? + send_export_file + end + + def import + authorize :domain_allow, :create? + begin + @import = Admin::Import.new(import_params) + parse_import_data!(export_headers) + + @data.take(ROWS_PROCESSING_LIMIT).each do |row| + domain = row['#domain'].strip + next if DomainAllow.allowed?(domain) + + domain_allow = DomainAllow.new(domain: domain) + log_action :create, domain_allow if domain_allow.save + end + flash[:notice] = I18n.t('admin.domain_allows.created_msg') + rescue ActionController::ParameterMissing + flash[:error] = I18n.t('admin.export_domain_allows.no_file') + end + redirect_to admin_instances_path + end + + private + + def export_filename + 'domain_allows.csv' + end + + def export_headers + %w(#domain) + end + + def export_data + CSV.generate(headers: export_headers, write_headers: true) do |content| + DomainAllow.allowed_domains.each do |instance| + content << [instance.domain] + end + end + end + end +end diff --git a/app/controllers/admin/export_domain_blocks_controller.rb b/app/controllers/admin/export_domain_blocks_controller.rb new file mode 100644 index 000000000..db8863551 --- /dev/null +++ b/app/controllers/admin/export_domain_blocks_controller.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +require 'csv' + +module Admin + class ExportDomainBlocksController < BaseController + include AdminExportControllerConcern + + before_action :set_dummy_import!, only: [:new] + + ROWS_PROCESSING_LIMIT = 20_000 + + def new + authorize :domain_block, :create? + end + + def export + authorize :instance, :index? + send_export_file + end + + def import + authorize :domain_block, :create? + + @import = Admin::Import.new(import_params) + parse_import_data!(export_headers) + + @global_private_comment = I18n.t('admin.export_domain_blocks.import.private_comment_template', source: @import.data_file_name, date: I18n.l(Time.now.utc)) + + @form = Form::DomainBlockBatch.new + @domain_blocks = @data.take(ROWS_PROCESSING_LIMIT).filter_map do |row| + domain = row['#domain'].strip + next if DomainBlock.rule_for(domain).present? + + domain_block = DomainBlock.new(domain: domain, + severity: row['#severity'].strip, + reject_media: row['#reject_media'].strip, + reject_reports: row['#reject_reports'].strip, + private_comment: @global_private_comment, + public_comment: row['#public_comment']&.strip, + obfuscate: row['#obfuscate'].strip) + + domain_block if domain_block.valid? + end + + @warning_domains = Instance.where(domain: @domain_blocks.map(&:domain)).where('EXISTS (SELECT 1 FROM follows JOIN accounts ON follows.account_id = accounts.id OR follows.target_account_id = accounts.id WHERE accounts.domain = instances.domain)').pluck(:domain) + rescue ActionController::ParameterMissing + flash.now[:alert] = I18n.t('admin.export_domain_blocks.no_file') + set_dummy_import! + render :new + end + + private + + def export_filename + 'domain_blocks.csv' + end + + def export_headers + %w(#domain #severity #reject_media #reject_reports #public_comment #obfuscate) + end + + def export_data + CSV.generate(headers: export_headers, write_headers: true) do |content| + DomainBlock.with_user_facing_limitations.each do |instance| + content << [instance.domain, instance.severity, instance.reject_media, instance.reject_reports, instance.public_comment, instance.obfuscate] + end + end + end + end +end diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index d96285b44..2e393fbb6 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -11,6 +11,7 @@ class Api::BaseController < ApplicationController skip_before_action :require_functional!, unless: :whitelist_mode? before_action :require_authenticated_user!, if: :disallow_unauthenticated_api_access? + before_action :require_not_suspended! before_action :set_cache_headers protect_from_forgery with: :null_session @@ -97,6 +98,10 @@ class Api::BaseController < ApplicationController render json: { error: 'This method requires an authenticated user' }, status: 401 unless current_user end + def require_not_suspended! + render json: { error: 'Your login is currently disabled' }, status: 403 if current_user&.account&.suspended? + end + def require_user! if !current_user render json: { error: 'This method requires an authenticated user' }, status: 422 diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index 5134bfb94..5537cc9b0 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -9,6 +9,8 @@ class Api::V1::AccountsController < Api::BaseController before_action :require_user!, except: [:show, :create] before_action :set_account, except: [:create] + before_action :check_account_approval, except: [:create] + before_action :check_account_confirmation, except: [:create] before_action :check_enabled_registrations, only: [:create] skip_before_action :require_authenticated_user!, only: :create @@ -74,6 +76,14 @@ class Api::V1::AccountsController < Api::BaseController @account = Account.find(params[:id]) end + def check_account_approval + raise(ActiveRecord::RecordNotFound) if @account.local? && @account.user_pending? + end + + def check_account_confirmation + raise(ActiveRecord::RecordNotFound) if @account.local? && !@account.user_confirmed? + end + def relationships(**options) AccountRelationshipsPresenter.new([@account.id], current_user.account_id, **options) end diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb index 17ad56fa8..0817a905c 100644 --- a/app/controllers/auth/confirmations_controller.rb +++ b/app/controllers/auth/confirmations_controller.rb @@ -89,7 +89,7 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController def after_confirmation_path_for(_resource_name, user) if user.created_by_application && truthy_param?(:redirect_to_app) - user.created_by_application.redirect_uri + user.created_by_application.confirmation_redirect_uri else super end diff --git a/app/controllers/concerns/admin_export_controller_concern.rb b/app/controllers/concerns/admin_export_controller_concern.rb new file mode 100644 index 000000000..013915d02 --- /dev/null +++ b/app/controllers/concerns/admin_export_controller_concern.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +module AdminExportControllerConcern + extend ActiveSupport::Concern + + private + + def send_export_file + respond_to do |format| + format.csv { send_data export_data, filename: export_filename } + end + end + + def export_data + raise 'Override in controller' + end + + def export_filename + raise 'Override in controller' + end + + def set_dummy_import! + @import = Admin::Import.new + end + + def import_params + params.require(:admin_import).permit(:data) + end + + def import_data + Paperclip.io_adapters.for(@import.data).read + end + + def parse_import_data!(default_headers) + data = CSV.parse(import_data, headers: true) + data = CSV.parse(import_data, headers: default_headers) unless data.headers&.first&.strip&.include?(default_headers[0]) + @data = data.reject(&:blank?) + end +end diff --git a/app/controllers/media_proxy_controller.rb b/app/controllers/media_proxy_controller.rb index d2a4cb207..3b228722f 100644 --- a/app/controllers/media_proxy_controller.rb +++ b/app/controllers/media_proxy_controller.rb @@ -4,6 +4,7 @@ class MediaProxyController < ApplicationController include RoutingHelper include Authorization include Redisable + include Lockable skip_before_action :store_current_location skip_before_action :require_functional! @@ -16,14 +17,10 @@ class MediaProxyController < ApplicationController rescue_from HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError, with: :internal_server_error def show - RedisLock.acquire(lock_options) do |lock| - if lock.acquired? - @media_attachment = MediaAttachment.remote.attached.find(params[:id]) - authorize @media_attachment.status, :show? - redownload! if @media_attachment.needs_redownload? && !reject_media? - else - raise Mastodon::RaceConditionError - end + with_lock("media_download:#{params[:id]}") do + @media_attachment = MediaAttachment.remote.attached.find(params[:id]) + authorize @media_attachment.status, :show? + redownload! if @media_attachment.needs_redownload? && !reject_media? end redirect_to full_asset_url(@media_attachment.file.url(version)) @@ -45,10 +42,6 @@ class MediaProxyController < ApplicationController end end - def lock_options - { redis: redis, key: "media_download:#{params[:id]}", autorelease: 15.minutes.seconds } - end - def reject_media? DomainBlock.reject_media?(@media_attachment.account.domain) end diff --git a/app/controllers/settings/exports_controller.rb b/app/controllers/settings/exports_controller.rb index 1638d3412..deaa7940e 100644 --- a/app/controllers/settings/exports_controller.rb +++ b/app/controllers/settings/exports_controller.rb @@ -3,6 +3,7 @@ class Settings::ExportsController < Settings::BaseController include Authorization include Redisable + include Lockable skip_before_action :require_functional! @@ -14,21 +15,13 @@ class Settings::ExportsController < Settings::BaseController def create backup = nil - RedisLock.acquire(lock_options) do |lock| - if lock.acquired? - authorize :backup, :create? - backup = current_user.backups.create! - else - raise Mastodon::RaceConditionError - end + with_lock("backup:#{current_user.id}") do + authorize :backup, :create? + backup = current_user.backups.create! end BackupWorker.perform_async(backup.id) redirect_to settings_export_path end - - def lock_options - { redis: redis, key: "backup:#{current_user.id}" } - end end diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 64736e77f..46821a200 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -27,7 +27,6 @@ class TagsController < ApplicationController format.rss do expires_in 0, public: true - render xml: RSS::TagSerializer.render(@tag, @statuses) end format.json do diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index ce25e26f9..b26e68c4d 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -132,7 +132,7 @@ module ApplicationHelper elsif status.private_visibility? || status.limited_visibility? fa_icon('lock', title: I18n.t('statuses.visibilities.private')) elsif status.direct_visibility? - fa_icon('envelope', title: I18n.t('statuses.visibilities.direct')) + fa_icon('at', title: I18n.t('statuses.visibilities.direct')) end end @@ -244,7 +244,7 @@ module ApplicationHelper end.values end - def prerender_custom_emojis(html, custom_emojis) - EmojiFormatter.new(html, custom_emojis, animate: prefers_autoplay?).to_s + def prerender_custom_emojis(html, custom_emojis, other_options = {}) + EmojiFormatter.new(html, custom_emojis, other_options.merge(animate: prefers_autoplay?)).to_s end end diff --git a/app/helpers/formatting_helper.rb b/app/helpers/formatting_helper.rb index 53e100dd2..448177bec 100644 --- a/app/helpers/formatting_helper.rb +++ b/app/helpers/formatting_helper.rb @@ -18,6 +18,32 @@ module FormattingHelper html_aware_format(status.text, status.local?, preloaded_accounts: [status.account] + (status.respond_to?(:active_mentions) ? status.active_mentions.map(&:account) : []), content_type: status.content_type) end + def rss_status_content_format(status) + html = status_content_format(status) + + before_html = begin + if status.spoiler_text? + "<p><strong>#{I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale)}</strong> #{h(status.spoiler_text)}</p><hr />" + else + '' + end + end.html_safe # rubocop:disable Rails/OutputSafety + + after_html = begin + if status.preloadable_poll + "<p>#{status.preloadable_poll.options.map { |o| "<input type=#{status.preloadable_poll.multiple? ? 'checkbox' : 'radio'} disabled /> #{h(o)}" }.join('<br />')}</p>" + else + '' + end + end.html_safe # rubocop:disable Rails/OutputSafety + + prerender_custom_emojis( + safe_join([before_html, html, after_html]), + status.emojis, + style: 'width: 1.1em; height: 1.1em; object-fit: contain; vertical-align: middle; margin: -.2ex .15em .2ex' + ).to_str + end + def account_bio_format(account) html_aware_format(account.note, account.local?) end diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb index cbda21b2a..7ab2c9b66 100644 --- a/app/helpers/languages_helper.rb +++ b/app/helpers/languages_helper.rb @@ -258,4 +258,8 @@ module LanguagesHelper def valid_locale?(locale) locale.present? && SUPPORTED_LOCALES.key?(locale.to_sym) end + + def available_locale_or_nil(locale_name) + locale_name.to_sym if locale_name.present? && I18n.available_locales.include?(locale_name.to_sym) + end end diff --git a/app/helpers/settings/keyword_mutes_helper.rb b/app/helpers/settings/keyword_mutes_helper.rb deleted file mode 100644 index 7b98cd59e..000000000 --- a/app/helpers/settings/keyword_mutes_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module Settings::KeywordMutesHelper -end diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb index e92b4c839..488eabeec 100644 --- a/app/helpers/statuses_helper.rb +++ b/app/helpers/statuses_helper.rb @@ -101,7 +101,7 @@ module StatusesHelper when 'private' fa_icon 'lock fw' when 'direct' - fa_icon 'envelope fw' + fa_icon 'at fw' end end diff --git a/app/javascript/core/admin.js b/app/javascript/core/admin.js index ef0a8f267..c1b9f07a4 100644 --- a/app/javascript/core/admin.js +++ b/app/javascript/core/admin.js @@ -102,6 +102,12 @@ ready(() => { const registrationMode = document.getElementById('form_admin_settings_registrations_mode'); if (registrationMode) onChangeRegistrationMode(registrationMode); + const checkAllElement = document.querySelector('#batch_checkbox_all'); + if (checkAllElement) { + checkAllElement.checked = [].every.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked); + checkAllElement.indeterminate = !checkAllElement.checked && [].some.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked); + } + document.querySelector('a#add-instance-button')?.addEventListener('click', (e) => { const domain = document.getElementById('by_domain')?.value; diff --git a/app/javascript/flavours/glitch/actions/accounts.js b/app/javascript/flavours/glitch/actions/accounts.js index 0cf64e076..f5871beb3 100644 --- a/app/javascript/flavours/glitch/actions/accounts.js +++ b/app/javascript/flavours/glitch/actions/accounts.js @@ -88,6 +88,8 @@ export const PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE = 'PINNED_ACCOUNTS_EDITOR export const PINNED_ACCOUNTS_EDITOR_RESET = 'PINNED_ACCOUNTS_EDITOR_RESET'; +export const ACCOUNT_REVEAL = 'ACCOUNT_REVEAL'; + export function fetchAccount(id) { return (dispatch, getState) => { dispatch(fetchRelationships([id])); @@ -798,6 +800,11 @@ export function unpinAccountFail(error) { }; }; +export const revealAccount = id => ({ + type: ACCOUNT_REVEAL, + id, +}); + export function fetchPinnedAccounts() { return (dispatch, getState) => { dispatch(fetchPinnedAccountsRequest()); diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index baa98e98f..ab74fb303 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -48,12 +48,13 @@ export const COMPOSE_MOUNT = 'COMPOSE_MOUNT'; export const COMPOSE_UNMOUNT = 'COMPOSE_UNMOUNT'; export const COMPOSE_ADVANCED_OPTIONS_CHANGE = 'COMPOSE_ADVANCED_OPTIONS_CHANGE'; -export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE'; -export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE'; +export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE'; +export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE'; export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE'; -export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE'; -export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE'; +export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE'; +export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE'; export const COMPOSE_CONTENT_TYPE_CHANGE = 'COMPOSE_CONTENT_TYPE_CHANGE'; +export const COMPOSE_LANGUAGE_CHANGE = 'COMPOSE_LANGUAGE_CHANGE'; export const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT'; @@ -189,6 +190,7 @@ export function submitCompose(routerHistory) { spoiler_text: spoilerText, visibility: getState().getIn(['compose', 'privacy']), poll: getState().getIn(['compose', 'poll'], null), + language: getState().getIn(['compose', 'language']), }, headers: { 'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']), @@ -675,6 +677,11 @@ export function changeComposeSensitivity() { }; }; +export const changeComposeLanguage = language => ({ + type: COMPOSE_LANGUAGE_CHANGE, + language, +}); + export function changeComposeSpoilerness() { return { type: COMPOSE_SPOILERNESS_CHANGE, diff --git a/app/javascript/flavours/glitch/actions/importer/normalizer.js b/app/javascript/flavours/glitch/actions/importer/normalizer.js index bda15a9b0..c38af196a 100644 --- a/app/javascript/flavours/glitch/actions/importer/normalizer.js +++ b/app/javascript/flavours/glitch/actions/importer/normalizer.js @@ -1,7 +1,6 @@ import escapeTextContentForBrowser from 'escape-html'; import emojify from 'flavours/glitch/util/emoji'; import { unescapeHTML } from 'flavours/glitch/util/html'; -import { expandSpoilers } from 'flavours/glitch/util/initial_state'; const domParser = new DOMParser(); diff --git a/app/javascript/flavours/glitch/actions/languages.js b/app/javascript/flavours/glitch/actions/languages.js new file mode 100644 index 000000000..ad186ba0c --- /dev/null +++ b/app/javascript/flavours/glitch/actions/languages.js @@ -0,0 +1,12 @@ +import { saveSettings } from './settings'; + +export const LANGUAGE_USE = 'LANGUAGE_USE'; + +export const useLanguage = language => dispatch => { + dispatch({ + type: LANGUAGE_USE, + language, + }); + + dispatch(saveSettings()); +}; diff --git a/app/javascript/flavours/glitch/actions/local_settings.js b/app/javascript/flavours/glitch/actions/local_settings.js index 28660a4e8..856674eb3 100644 --- a/app/javascript/flavours/glitch/actions/local_settings.js +++ b/app/javascript/flavours/glitch/actions/local_settings.js @@ -1,4 +1,46 @@ +import { expandSpoilers, disableSwiping } from 'flavours/glitch/util/initial_state'; +import { openModal } from './modal'; + export const LOCAL_SETTING_CHANGE = 'LOCAL_SETTING_CHANGE'; +export const LOCAL_SETTING_DELETE = 'LOCAL_SETTING_DELETE'; + +export function checkDeprecatedLocalSettings() { + return (dispatch, getState) => { + const local_auto_unfold = getState().getIn(['local_settings', 'content_warnings', 'auto_unfold']); + const local_swipe_to_change_columns = getState().getIn(['local_settings', 'swipe_to_change_columns']); + let changed_settings = []; + + if (local_auto_unfold !== null && local_auto_unfold !== undefined) { + if (local_auto_unfold === expandSpoilers) { + dispatch(deleteLocalSetting(['content_warnings', 'auto_unfold'])); + } else { + changed_settings.push('user_setting_expand_spoilers'); + } + } + + if (local_swipe_to_change_columns !== null && local_swipe_to_change_columns !== undefined) { + if (local_swipe_to_change_columns === !disableSwiping) { + dispatch(deleteLocalSetting(['swipe_to_change_columns'])); + } else { + changed_settings.push('user_setting_disable_swiping'); + } + } + + if (changed_settings.length > 0) { + dispatch(openModal('DEPRECATED_SETTINGS', { + settings: changed_settings, + onConfirm: () => dispatch(clearDeprecatedLocalSettings()), + })); + } + }; +}; + +export function clearDeprecatedLocalSettings() { + return (dispatch) => { + dispatch(deleteLocalSetting(['content_warnings', 'auto_unfold'])); + dispatch(deleteLocalSetting(['swipe_to_change_columns'])); + }; +}; export function changeLocalSetting(key, value) { return dispatch => { @@ -12,6 +54,17 @@ export function changeLocalSetting(key, value) { }; }; +export function deleteLocalSetting(key) { + return dispatch => { + dispatch({ + type: LOCAL_SETTING_DELETE, + key, + }); + + dispatch(saveLocalSettings()); + }; +}; + // __TODO :__ // Right now `saveLocalSettings()` doesn't keep track of which user // is currently signed in, but it might be better to give each user diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js index 42ad39efa..85938867b 100644 --- a/app/javascript/flavours/glitch/actions/notifications.js +++ b/app/javascript/flavours/glitch/actions/notifications.js @@ -70,7 +70,8 @@ export const loadPending = () => ({ export function updateNotifications(notification, intlMessages, intlLocale) { return (dispatch, getState) => { - const showInColumn = getState().getIn(['settings', 'notifications', 'shows', notification.type], true); + const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']); + const showInColumn = activeFilter === 'all' ? getState().getIn(['settings', 'notifications', 'shows', notification.type], true) : activeFilter === notification.type; const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true); const playSound = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true); const filters = getFiltersRegex(getState(), { contextType: 'notifications' }); diff --git a/app/javascript/flavours/glitch/components/account.js b/app/javascript/flavours/glitch/components/account.js index 396a36ea0..489f60736 100644 --- a/app/javascript/flavours/glitch/components/account.js +++ b/app/javascript/flavours/glitch/components/account.js @@ -16,8 +16,10 @@ const messages = defineMessages({ requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' }, unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' }, unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' }, - mute_notifications: { id: 'account.mute_notifications', defaultMessage: 'You are not currently muting notifications from @{name}. Click to mute notifications' }, - unmute_notifications: { id: 'account.unmute_notifications', defaultMessage: 'You are currently muting notifications from @{name}. Click to unmute notifications' }, + mute_notifications: { id: 'account.mute_notifications', defaultMessage: 'Mute notifications from @{name}' }, + unmute_notifications: { id: 'account.unmute_notifications', defaultMessage: 'Unmute notifications from @{name}' }, + mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' }, + block: { id: 'account.block', defaultMessage: 'Block @{name}' }, }); export default @injectIntl @@ -34,6 +36,7 @@ class Account extends ImmutablePureComponent { small: PropTypes.bool, actionIcon: PropTypes.string, actionTitle: PropTypes.string, + defaultAction: PropTypes.string, onActionClick: PropTypes.func, }; @@ -70,6 +73,7 @@ class Account extends ImmutablePureComponent { onActionClick, actionIcon, actionTitle, + defaultAction, } = this.props; if (!account) { @@ -114,6 +118,10 @@ class Account extends ImmutablePureComponent { {hidingNotificationsButton} </Fragment> ); + } else if (defaultAction === 'mute') { + buttons = <IconButton icon='volume-off' title={intl.formatMessage(messages.mute, { name: account.get('username') })} onClick={this.handleMute} />; + } else if (defaultAction === 'block') { + buttons = <IconButton icon='lock' title={intl.formatMessage(messages.block, { name: account.get('username') })} onClick={this.handleBlock} />; } else if (!account.get('moved') || following) { buttons = <IconButton icon={following ? 'user-times' : 'user-plus'} title={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={this.handleFollow} active={following} />; } diff --git a/app/javascript/flavours/glitch/components/avatar.js b/app/javascript/flavours/glitch/components/avatar.js index c5e9072c4..6d53a5298 100644 --- a/app/javascript/flavours/glitch/components/avatar.js +++ b/app/javascript/flavours/glitch/components/avatar.js @@ -1,13 +1,13 @@ -import classNames from 'classnames'; import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { autoPlayGif } from 'flavours/glitch/util/initial_state'; +import classNames from 'classnames'; export default class Avatar extends React.PureComponent { static propTypes = { - account: ImmutablePropTypes.map.isRequired, + account: ImmutablePropTypes.map, className: PropTypes.string, size: PropTypes.number.isRequired, style: PropTypes.object, @@ -45,11 +45,6 @@ export default class Avatar extends React.PureComponent { } = this.props; const { hovering } = this.state; - const src = account.get('avatar'); - const staticSrc = account.get('avatar_static'); - - const computedClass = classNames('account__avatar', { 'account__avatar-inline': inline }, className); - const style = { ...this.props.style, width: `${size}px`, @@ -57,19 +52,24 @@ export default class Avatar extends React.PureComponent { backgroundSize: `${size}px ${size}px`, }; - if (hovering || animate) { - style.backgroundImage = `url(${src})`; - } else { - style.backgroundImage = `url(${staticSrc})`; + if (account) { + const src = account.get('avatar'); + const staticSrc = account.get('avatar_static'); + + if (hovering || animate) { + style.backgroundImage = `url(${src})`; + } else { + style.backgroundImage = `url(${staticSrc})`; + } } return ( <div - className={computedClass} + className={classNames('account__avatar', { 'account__avatar-inline': inline }, className)} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} style={style} - data-avatar-of={`@${account.get('acct')}`} + data-avatar-of={account && `@${account.get('acct')}`} /> ); } diff --git a/app/javascript/flavours/glitch/components/dropdown_menu.js b/app/javascript/flavours/glitch/components/dropdown_menu.js index bd6bc4ffd..e04af8074 100644 --- a/app/javascript/flavours/glitch/components/dropdown_menu.js +++ b/app/javascript/flavours/glitch/components/dropdown_menu.js @@ -7,7 +7,7 @@ import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import { supportsPassiveEvents } from 'detect-passive-events'; import classNames from 'classnames'; -import { CircularProgress } from 'mastodon/components/loading_indicator'; +import { CircularProgress } from 'flavours/glitch/components/loading_indicator'; const listenerOptions = supportsPassiveEvents ? { passive: true } : false; let id = 0; diff --git a/app/javascript/flavours/glitch/components/modal_root.js b/app/javascript/flavours/glitch/components/modal_root.js index 0595f6a0e..056277447 100644 --- a/app/javascript/flavours/glitch/components/modal_root.js +++ b/app/javascript/flavours/glitch/components/modal_root.js @@ -55,6 +55,10 @@ export default class ModalRoot extends React.PureComponent { window.addEventListener('keyup', this.handleKeyUp, false); window.addEventListener('keydown', this.handleKeyDown, false); this.history = this.context.router ? this.context.router.history : createBrowserHistory(); + + if (this.props.children) { + this._handleModalOpen(); + } } componentWillReceiveProps (nextProps) { diff --git a/app/javascript/flavours/glitch/containers/mastodon.js b/app/javascript/flavours/glitch/containers/mastodon.js index de8ea8ee2..989e37024 100644 --- a/app/javascript/flavours/glitch/containers/mastodon.js +++ b/app/javascript/flavours/glitch/containers/mastodon.js @@ -8,6 +8,7 @@ import UI from 'flavours/glitch/features/ui'; import { fetchCustomEmojis } from 'flavours/glitch/actions/custom_emojis'; import { hydrateStore } from 'flavours/glitch/actions/store'; import { connectUserStream } from 'flavours/glitch/actions/streaming'; +import { checkDeprecatedLocalSettings } from 'flavours/glitch/actions/local_settings'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from 'locales'; import initialState from 'flavours/glitch/util/initial_state'; @@ -20,6 +21,9 @@ export const store = configureStore(); const hydrateAction = hydrateStore(initialState); store.dispatch(hydrateAction); +// check for deprecated local settings +store.dispatch(checkDeprecatedLocalSettings()); + // load custom emojis store.dispatch(fetchCustomEmojis()); diff --git a/app/javascript/flavours/glitch/features/account/components/header.js b/app/javascript/flavours/glitch/features/account/components/header.js index 68c6bae8e..45aba53f7 100644 --- a/app/javascript/flavours/glitch/features/account/components/header.js +++ b/app/javascript/flavours/glitch/features/account/components/header.js @@ -82,6 +82,7 @@ class Header extends ImmutablePureComponent { onEditAccountNote: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, domain: PropTypes.string.isRequired, + hidden: PropTypes.bool, }; openEditProfile = () => { @@ -115,7 +116,7 @@ class Header extends ImmutablePureComponent { } render () { - const { account, intl, domain, identity_proofs } = this.props; + const { account, hidden, intl, domain } = this.props; if (!account) { return null; @@ -270,23 +271,29 @@ class Header extends ImmutablePureComponent { {info} </div> - <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' className='parallax' /> + {!(suspended || hidden) && <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' className='parallax' />} </div> <div className='account__header__bar'> <div className='account__header__tabs'> <a className='avatar' href={account.get('url')} rel='noopener noreferrer' target='_blank'> - <Avatar account={account} size={90} /> + <Avatar account={suspended || hidden ? undefined : account} size={90} /> </a> <div className='spacer' /> - <div className='account__header__tabs__buttons'> - {actionBtn} - {bellBtn} + {!suspended && ( + <div className='account__header__tabs__buttons'> + {!hidden && ( + <React.Fragment> + {actionBtn} + {bellBtn} + </React.Fragment> + )} - <DropdownMenuContainer items={menu} icon='ellipsis-v' size={24} direction='right' /> - </div> + <DropdownMenuContainer items={menu} icon='ellipsis-v' size={24} direction='right' /> + </div> + )} </div> <div className='account__header__tabs__name'> @@ -298,23 +305,11 @@ class Header extends ImmutablePureComponent { <AccountNoteContainer account={account} /> - {!suspended && ( + {!(suspended || hidden) && ( <div className='account__header__extra'> <div className='account__header__bio'> - { (fields.size > 0 || identity_proofs.size > 0) && ( + { fields.size > 0 && ( <div className='account__header__fields'> - {identity_proofs.map((proof, i) => ( - <dl key={i}> - <dt dangerouslySetInnerHTML={{ __html: proof.get('provider') }} className='translate' /> - - <dd className='verified'> - <a href={proof.get('proof_url')} target='_blank' rel='noopener noreferrer'><span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(proof.get('updated_at'), dateFormatOptions) })}> - <Icon id='check' className='verified__mark' /> - </span></a> - <a href={proof.get('profile_url')} target='_blank' rel='noopener noreferrer'><span dangerouslySetInnerHTML={{ __html: ' '+proof.get('provider_username') }} className='translate' /></a> - </dd> - </dl> - ))} {fields.map((pair, i) => ( <dl key={i}> <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} /> diff --git a/app/javascript/flavours/glitch/features/account_timeline/components/header.js b/app/javascript/flavours/glitch/features/account_timeline/components/header.js index d6e607a37..645ff29ea 100644 --- a/app/javascript/flavours/glitch/features/account_timeline/components/header.js +++ b/app/javascript/flavours/glitch/features/account_timeline/components/header.js @@ -12,7 +12,6 @@ export default class Header extends ImmutablePureComponent { static propTypes = { account: ImmutablePropTypes.map, - identity_proofs: ImmutablePropTypes.list, onFollow: PropTypes.func.isRequired, onBlock: PropTypes.func.isRequired, onMention: PropTypes.func.isRequired, @@ -26,6 +25,7 @@ export default class Header extends ImmutablePureComponent { onAddToList: PropTypes.func.isRequired, hideTabs: PropTypes.bool, domain: PropTypes.string.isRequired, + hidden: PropTypes.bool, }; static contextTypes = { @@ -93,7 +93,7 @@ export default class Header extends ImmutablePureComponent { } render () { - const { account, hideTabs, identity_proofs } = this.props; + const { account, hidden, hideTabs } = this.props; if (account === null) { return null; @@ -101,11 +101,10 @@ export default class Header extends ImmutablePureComponent { return ( <div className='account-timeline__header'> - {account.get('moved') && <MovedNote from={account} to={account.get('moved')} />} + {(!hidden && account.get('moved')) && <MovedNote from={account} to={account.get('moved')} />} <InnerHeader account={account} - identity_proofs={identity_proofs} onFollow={this.handleFollow} onBlock={this.handleBlock} onMention={this.handleMention} @@ -120,13 +119,14 @@ export default class Header extends ImmutablePureComponent { onAddToList={this.handleAddToList} onEditAccountNote={this.handleEditAccountNote} domain={this.props.domain} + hidden={hidden} /> <ActionBar account={account} /> - {!hideTabs && ( + {!(hideTabs || hidden) && ( <div className='account__section-headline'> <NavLink exact to={`/@${account.get('acct')}`}><FormattedMessage id='account.posts' defaultMessage='Posts' /></NavLink> <NavLink exact to={`/@${account.get('acct')}/with_replies`}><FormattedMessage id='account.posts_with_replies' defaultMessage='Posts with replies' /></NavLink> diff --git a/app/javascript/flavours/glitch/features/account_timeline/components/limited_account_hint.js b/app/javascript/flavours/glitch/features/account_timeline/components/limited_account_hint.js new file mode 100644 index 000000000..e465c83b4 --- /dev/null +++ b/app/javascript/flavours/glitch/features/account_timeline/components/limited_account_hint.js @@ -0,0 +1,35 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import { revealAccount } from 'flavours/glitch/actions/accounts'; +import { FormattedMessage } from 'react-intl'; +import Button from 'flavours/glitch/components/button'; + +const mapDispatchToProps = (dispatch, { accountId }) => ({ + + reveal () { + dispatch(revealAccount(accountId)); + }, + +}); + +export default @connect(() => {}, mapDispatchToProps) +class LimitedAccountHint extends React.PureComponent { + + static propTypes = { + accountId: PropTypes.string.isRequired, + reveal: PropTypes.func, + } + + render () { + const { reveal } = this.props; + + return ( + <div className='limited-account-hint'> + <p><FormattedMessage id='limited_account_hint.title' defaultMessage='This profile has been hidden by the moderators of your server.' /></p> + <Button onClick={reveal}><FormattedMessage id='limited_account_hint.action' defaultMessage='Show profile anyway' /></Button> + </div> + ); + } + +} diff --git a/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js index 90e746679..3fa7c1448 100644 --- a/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js +++ b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js @@ -1,6 +1,6 @@ import React from 'react'; import { connect } from 'react-redux'; -import { makeGetAccount } from 'flavours/glitch/selectors'; +import { makeGetAccount, getAccountHidden } from 'flavours/glitch/selectors'; import Header from '../components/header'; import { followAccount, @@ -22,7 +22,6 @@ import { blockDomain, unblockDomain } from 'flavours/glitch/actions/domain_block import { initEditAccountNote } from 'flavours/glitch/actions/account_notes'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { unfollowModal } from 'flavours/glitch/util/initial_state'; -import { List as ImmutableList } from 'immutable'; const messages = defineMessages({ unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' }, @@ -35,7 +34,7 @@ const makeMapStateToProps = () => { const mapStateToProps = (state, { accountId }) => ({ account: getAccount(state, accountId), domain: state.getIn(['meta', 'domain']), - identity_proofs: state.getIn(['identity_proofs', accountId], ImmutableList()), + hidden: getAccountHidden(state, accountId), }); return mapStateToProps; diff --git a/app/javascript/flavours/glitch/features/account_timeline/index.js b/app/javascript/flavours/glitch/features/account_timeline/index.js index 6d2df5c6f..68d558e66 100644 --- a/app/javascript/flavours/glitch/features/account_timeline/index.js +++ b/app/javascript/flavours/glitch/features/account_timeline/index.js @@ -13,9 +13,10 @@ import ColumnBackButton from 'flavours/glitch/components/column_back_button'; import { List as ImmutableList } from 'immutable'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { FormattedMessage } from 'react-intl'; -import { fetchAccountIdentityProofs } from '../../actions/identity_proofs'; import MissingIndicator from 'flavours/glitch/components/missing_indicator'; import TimelineHint from 'flavours/glitch/components/timeline_hint'; +import LimitedAccountHint from './components/limited_account_hint'; +import { getAccountHidden } from 'flavours/glitch/selectors'; const emptyList = ImmutableList(); @@ -40,6 +41,7 @@ const mapStateToProps = (state, { params: { acct, id }, withReplies = false }) = isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']), hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']), suspended: state.getIn(['accounts', accountId, 'suspended'], false), + hidden: getAccountHidden(state, accountId), }; }; @@ -68,6 +70,7 @@ class AccountTimeline extends ImmutablePureComponent { withReplies: PropTypes.bool, isAccount: PropTypes.bool, suspended: PropTypes.bool, + hidden: PropTypes.bool, remote: PropTypes.bool, remoteUrl: PropTypes.string, multiColumn: PropTypes.bool, @@ -77,7 +80,7 @@ class AccountTimeline extends ImmutablePureComponent { const { accountId, withReplies, dispatch } = this.props; dispatch(fetchAccount(accountId)); - dispatch(fetchAccountIdentityProofs(accountId)); + if (!withReplies) { dispatch(expandAccountFeaturedTimeline(accountId)); } @@ -109,10 +112,11 @@ class AccountTimeline extends ImmutablePureComponent { if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) { dispatch(fetchAccount(nextProps.params.accountId)); - dispatch(fetchAccountIdentityProofs(nextProps.params.accountId)); + if (!nextProps.withReplies) { dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId)); } + dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies })); } } @@ -130,7 +134,7 @@ class AccountTimeline extends ImmutablePureComponent { } render () { - const { statusIds, featuredStatusIds, isLoading, hasMore, suspended, isAccount, multiColumn, remote, remoteUrl } = this.props; + const { accountId, statusIds, featuredStatusIds, isLoading, hasMore, suspended, isAccount, hidden, multiColumn, remote, remoteUrl } = this.props; if (!isAccount) { return ( @@ -151,8 +155,12 @@ class AccountTimeline extends ImmutablePureComponent { let emptyMessage; + const forceEmptyState = suspended || hidden; + if (suspended) { emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />; + } else if (hidden) { + emptyMessage = <LimitedAccountHint accountId={accountId} />; } else if (remote && statusIds.isEmpty()) { emptyMessage = <RemoteHint url={remoteUrl} />; } else { @@ -166,14 +174,14 @@ class AccountTimeline extends ImmutablePureComponent { <ProfileColumnHeader onClick={this.handleHeaderClick} multiColumn={multiColumn} /> <StatusList - prepend={<HeaderContainer accountId={this.props.accountId} />} + prepend={<HeaderContainer accountId={this.props.accountId} hideTabs={forceEmptyState} />} alwaysPrepend append={remoteMessage} scrollKey='account_timeline' - statusIds={suspended ? emptyList : statusIds} + statusIds={forceEmptyState ? emptyList : statusIds} featuredStatusIds={featuredStatusIds} isLoading={isLoading} - hasMore={hasMore} + hasMore={!forceEmptyState && hasMore} onLoadMore={this.handleLoadMore} emptyMessage={emptyMessage} bindToDocument={!multiColumn} diff --git a/app/javascript/flavours/glitch/features/blocks/index.js b/app/javascript/flavours/glitch/features/blocks/index.js index 4d0f58239..4461bd14d 100644 --- a/app/javascript/flavours/glitch/features/blocks/index.js +++ b/app/javascript/flavours/glitch/features/blocks/index.js @@ -69,7 +69,7 @@ class Blocks extends ImmutablePureComponent { bindToDocument={!multiColumn} > {accountIds.map(id => - <AccountContainer key={id} id={id} />, + <AccountContainer key={id} id={id} defaultAction='block' />, )} </ScrollableList> </Column> diff --git a/app/javascript/flavours/glitch/features/compose/components/language_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/language_dropdown.js new file mode 100644 index 000000000..c8c503e58 --- /dev/null +++ b/app/javascript/flavours/glitch/features/compose/components/language_dropdown.js @@ -0,0 +1,332 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { injectIntl, defineMessages } from 'react-intl'; +import TextIconButton from './text_icon_button'; +import Overlay from 'react-overlays/lib/Overlay'; +import Motion from 'flavours/glitch/util/optional_motion'; +import spring from 'react-motion/lib/spring'; +import { supportsPassiveEvents } from 'detect-passive-events'; +import classNames from 'classnames'; +import { languages as preloadedLanguages } from 'flavours/glitch/util/initial_state'; +import fuzzysort from 'fuzzysort'; + +const messages = defineMessages({ + changeLanguage: { id: 'compose.language.change', defaultMessage: 'Change language' }, + search: { id: 'compose.language.search', defaultMessage: 'Search languages...' }, + clear: { id: 'emoji_button.clear', defaultMessage: 'Clear' }, +}); + +// Copied from emoji-mart for consistency with emoji picker and since +// they don't export the icons in the package +const icons = { + loupe: ( + <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' width='13' height='13'> + <path d='M12.9 14.32a8 8 0 1 1 1.41-1.41l5.35 5.33-1.42 1.42-5.33-5.34zM8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z' /> + </svg> + ), + + delete: ( + <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' width='13' height='13'> + <path d='M10 8.586L2.929 1.515 1.515 2.929 8.586 10l-7.071 7.071 1.414 1.414L10 11.414l7.071 7.071 1.414-1.414L11.414 10l7.071-7.071-1.414-1.414L10 8.586z' /> + </svg> + ), +}; + +const listenerOptions = supportsPassiveEvents ? { passive: true } : false; + +class LanguageDropdownMenu extends React.PureComponent { + + static propTypes = { + style: PropTypes.object, + value: PropTypes.string.isRequired, + frequentlyUsedLanguages: PropTypes.arrayOf(PropTypes.string).isRequired, + placement: PropTypes.string.isRequired, + onClose: PropTypes.func.isRequired, + onChange: PropTypes.func.isRequired, + languages: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)), + intl: PropTypes.object, + }; + + static defaultProps = { + languages: preloadedLanguages, + }; + + state = { + mounted: false, + searchValue: '', + }; + + handleDocumentClick = e => { + if (this.node && !this.node.contains(e.target)) { + this.props.onClose(); + } + } + + componentDidMount () { + document.addEventListener('click', this.handleDocumentClick, false); + document.addEventListener('touchend', this.handleDocumentClick, listenerOptions); + this.setState({ mounted: true }); + } + + componentWillUnmount () { + document.removeEventListener('click', this.handleDocumentClick, false); + document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions); + } + + setRef = c => { + this.node = c; + } + + setListRef = c => { + this.listNode = c; + } + + handleSearchChange = ({ target }) => { + this.setState({ searchValue: target.value }); + } + + search () { + const { languages, value, frequentlyUsedLanguages } = this.props; + const { searchValue } = this.state; + + if (searchValue === '') { + return [...languages].sort((a, b) => { + // Push current selection to the top of the list + + if (a[0] === value) { + return -1; + } else if (b[0] === value) { + return 1; + } else { + // Sort according to frequently used languages + + const indexOfA = frequentlyUsedLanguages.indexOf(a[0]); + const indexOfB = frequentlyUsedLanguages.indexOf(b[0]); + + return ((indexOfA > -1 ? indexOfA : Infinity) - (indexOfB > -1 ? indexOfB : Infinity)); + } + }); + } + + return fuzzysort.go(searchValue, languages, { + keys: ['0', '1', '2'], + limit: 5, + threshold: -10000, + }).map(result => result.obj); + } + + frequentlyUsed () { + const { languages, value } = this.props; + const current = languages.find(lang => lang[0] === value); + const results = []; + + if (current) { + results.push(current); + } + + return results; + } + + handleClick = e => { + const value = e.currentTarget.getAttribute('data-index'); + + e.preventDefault(); + + this.props.onClose(); + this.props.onChange(value); + } + + handleKeyDown = e => { + const { onClose } = this.props; + const index = Array.from(this.listNode.childNodes).findIndex(node => node === e.currentTarget); + + let element = null; + + switch(e.key) { + case 'Escape': + onClose(); + break; + case 'Enter': + this.handleClick(e); + break; + case 'ArrowDown': + element = this.listNode.childNodes[index + 1] || this.listNode.firstChild; + break; + case 'ArrowUp': + element = this.listNode.childNodes[index - 1] || this.listNode.lastChild; + break; + case 'Tab': + if (e.shiftKey) { + element = this.listNode.childNodes[index - 1] || this.listNode.lastChild; + } else { + element = this.listNode.childNodes[index + 1] || this.listNode.firstChild; + } + break; + case 'Home': + element = this.listNode.firstChild; + break; + case 'End': + element = this.listNode.lastChild; + break; + } + + if (element) { + element.focus(); + e.preventDefault(); + e.stopPropagation(); + } + } + + handleSearchKeyDown = e => { + const { onChange, onClose } = this.props; + const { searchValue } = this.state; + + let element = null; + + switch(e.key) { + case 'Tab': + case 'ArrowDown': + element = this.listNode.firstChild; + + if (element) { + element.focus(); + e.preventDefault(); + e.stopPropagation(); + } + + break; + case 'Enter': + element = this.listNode.firstChild; + + if (element) { + onChange(element.getAttribute('data-index')); + onClose(); + } + break; + case 'Escape': + if (searchValue !== '') { + e.preventDefault(); + this.handleClear(); + } + + break; + } + } + + handleClear = () => { + this.setState({ searchValue: '' }); + } + + renderItem = lang => { + const { value } = this.props; + + return ( + <div key={lang[0]} role='option' tabIndex='0' data-index={lang[0]} className={classNames('language-dropdown__dropdown__results__item', { active: lang[0] === value })} aria-selected={lang[0] === value} onClick={this.handleClick} onKeyDown={this.handleKeyDown}> + <span className='language-dropdown__dropdown__results__item__native-name'>{lang[2]}</span> <span className='language-dropdown__dropdown__results__item__common-name'>({lang[1]})</span> + </div> + ); + } + + render () { + const { style, placement, intl } = this.props; + const { mounted, searchValue } = this.state; + const isSearching = searchValue !== ''; + const results = this.search(); + + return ( + <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}> + {({ opacity, scaleX, scaleY }) => ( + // It should not be transformed when mounting because the resulting + // size will be used to determine the coordinate of the menu by + // react-overlays + <div className={`language-dropdown__dropdown ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null }} ref={this.setRef}> + <div className='emoji-mart-search'> + <input type='search' value={searchValue} onChange={this.handleSearchChange} onKeyDown={this.handleSearchKeyDown} placeholder={intl.formatMessage(messages.search)} autoFocus /> + <button className='emoji-mart-search-icon' disabled={!isSearching} aria-label={intl.formatMessage(messages.clear)} onClick={this.handleClear}>{!isSearching ? icons.loupe : icons.delete}</button> + </div> + + <div className='language-dropdown__dropdown__results emoji-mart-scroll' role='listbox' ref={this.setListRef}> + {results.map(this.renderItem)} + </div> + </div> + )} + </Motion> + ); + } + +} + +export default @injectIntl +class LanguageDropdown extends React.PureComponent { + + static propTypes = { + value: PropTypes.string, + frequentlyUsedLanguages: PropTypes.arrayOf(PropTypes.string), + intl: PropTypes.object.isRequired, + onChange: PropTypes.func, + onClose: PropTypes.func, + }; + + state = { + open: false, + placement: 'bottom', + }; + + handleToggle = ({ target }) => { + const { top } = target.getBoundingClientRect(); + + if (this.state.open && this.activeElement) { + this.activeElement.focus({ preventScroll: true }); + } + + this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' }); + this.setState({ open: !this.state.open }); + } + + handleClose = () => { + const { value, onClose } = this.props; + + if (this.state.open && this.activeElement) { + this.activeElement.focus({ preventScroll: true }); + } + + this.setState({ open: false }); + onClose(value); + } + + handleChange = value => { + const { onChange } = this.props; + onChange(value); + } + + render () { + const { value, intl, frequentlyUsedLanguages } = this.props; + const { open, placement } = this.state; + + return ( + <div className={classNames('privacy-dropdown', { active: open })}> + <div className='privacy-dropdown__value'> + <TextIconButton + className='privacy-dropdown__value-icon' + label={value && value.toUpperCase()} + title={intl.formatMessage(messages.changeLanguage)} + active={open} + onClick={this.handleToggle} + /> + </div> + + <Overlay show={open} placement={placement} target={this}> + <LanguageDropdownMenu + value={value} + frequentlyUsedLanguages={frequentlyUsedLanguages} + onClose={this.handleClose} + onChange={this.handleChange} + placement={placement} + intl={intl} + /> + </Overlay> + </div> + ); + } + +} diff --git a/app/javascript/flavours/glitch/features/compose/components/options.js b/app/javascript/flavours/glitch/features/compose/components/options.js index 3a31e214d..f005dbdd1 100644 --- a/app/javascript/flavours/glitch/features/compose/components/options.js +++ b/app/javascript/flavours/glitch/features/compose/components/options.js @@ -12,6 +12,7 @@ import IconButton from 'flavours/glitch/components/icon_button'; import TextIconButton from './text_icon_button'; import Dropdown from './dropdown'; import PrivacyDropdown from './privacy_dropdown'; +import LanguageDropdown from '../containers/language_dropdown_container'; import ImmutablePureComponent from 'react-immutable-pure-component'; // Utils. @@ -306,6 +307,7 @@ class ComposerOptions extends ImmutablePureComponent { title={formatMessage(messages.spoiler)} /> )} + <LanguageDropdown /> <Dropdown active={advancedOptions && advancedOptions.some(value => !!value)} disabled={disabled || isEditing} diff --git a/app/javascript/flavours/glitch/features/compose/components/search_results.js b/app/javascript/flavours/glitch/features/compose/components/search_results.js index d92a6bf6b..e82ee2ca2 100644 --- a/app/javascript/flavours/glitch/features/compose/components/search_results.js +++ b/app/javascript/flavours/glitch/features/compose/components/search_results.js @@ -48,6 +48,9 @@ class SearchResults extends ImmutablePureComponent { render () { const { intl, results, suggestions, dismissSuggestion, searchTerm } = this.props; + let accounts, statuses, hashtags; + let count = 0; + if (searchTerm === '' && !suggestions.isEmpty()) { return ( <div className='drawer--results'> @@ -81,9 +84,6 @@ class SearchResults extends ImmutablePureComponent { ); } - let accounts, statuses, hashtags; - let count = 0; - if (results.get('accounts') && results.get('accounts').size > 0) { count += results.get('accounts').size; accounts = ( diff --git a/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js b/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js index 7f2005060..a35bd4ff5 100644 --- a/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js +++ b/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js @@ -17,11 +17,6 @@ export default class TextIconButton extends React.PureComponent { ariaControls: PropTypes.string, }; - handleClick = (e) => { - e.preventDefault(); - this.props.onClick(); - } - render () { const { label, title, active, ariaControls } = this.props; @@ -31,7 +26,7 @@ export default class TextIconButton extends React.PureComponent { aria-label={title} className={`text-icon-button ${active ? 'active' : ''}`} aria-expanded={active} - onClick={this.handleClick} + onClick={this.props.onClick} aria-controls={ariaControls} style={iconStyle} > diff --git a/app/javascript/flavours/glitch/features/compose/containers/language_dropdown_container.js b/app/javascript/flavours/glitch/features/compose/containers/language_dropdown_container.js new file mode 100644 index 000000000..828d08cf5 --- /dev/null +++ b/app/javascript/flavours/glitch/features/compose/containers/language_dropdown_container.js @@ -0,0 +1,34 @@ +import { connect } from 'react-redux'; +import LanguageDropdown from '../components/language_dropdown'; +import { changeComposeLanguage } from 'flavours/glitch/actions/compose'; +import { useLanguage } from 'flavours/glitch/actions/languages'; +import { createSelector } from 'reselect'; +import { Map as ImmutableMap } from 'immutable'; + +const getFrequentlyUsedLanguages = createSelector([ + state => state.getIn(['settings', 'frequentlyUsedLanguages'], ImmutableMap()), +], languageCounters => ( + languageCounters.keySeq() + .sort((a, b) => languageCounters.get(a) - languageCounters.get(b)) + .reverse() + .toArray() +)); + +const mapStateToProps = state => ({ + frequentlyUsedLanguages: getFrequentlyUsedLanguages(state), + value: state.getIn(['compose', 'language']), +}); + +const mapDispatchToProps = dispatch => ({ + + onChange (value) { + dispatch(changeComposeLanguage(value)); + }, + + onClose (value) { + dispatch(useLanguage(value)); + }, + +}); + +export default connect(mapStateToProps, mapDispatchToProps)(LanguageDropdown); diff --git a/app/javascript/flavours/glitch/features/followers/index.js b/app/javascript/flavours/glitch/features/followers/index.js index 978436dcc..27a63b3fd 100644 --- a/app/javascript/flavours/glitch/features/followers/index.js +++ b/app/javascript/flavours/glitch/features/followers/index.js @@ -19,6 +19,8 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import MissingIndicator from 'flavours/glitch/components/missing_indicator'; import ScrollableList from 'flavours/glitch/components/scrollable_list'; import TimelineHint from 'flavours/glitch/components/timeline_hint'; +import LimitedAccountHint from '../account_timeline/components/limited_account_hint'; +import { getAccountHidden } from 'flavours/glitch/selectors'; const mapStateToProps = (state, { params: { acct, id } }) => { const accountId = id || state.getIn(['accounts_map', acct]); @@ -37,6 +39,8 @@ const mapStateToProps = (state, { params: { acct, id } }) => { accountIds: state.getIn(['user_lists', 'followers', accountId, 'items']), hasMore: !!state.getIn(['user_lists', 'followers', accountId, 'next']), isLoading: state.getIn(['user_lists', 'followers', accountId, 'isLoading'], true), + suspended: state.getIn(['accounts', accountId, 'suspended'], false), + hidden: getAccountHidden(state, accountId), }; }; @@ -62,6 +66,8 @@ class Followers extends ImmutablePureComponent { hasMore: PropTypes.bool, isLoading: PropTypes.bool, isAccount: PropTypes.bool, + suspended: PropTypes.bool, + hidden: PropTypes.bool, remote: PropTypes.bool, remoteUrl: PropTypes.string, multiColumn: PropTypes.bool, @@ -107,7 +113,7 @@ class Followers extends ImmutablePureComponent { } render () { - const { accountIds, hasMore, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props; + const { accountId, accountIds, hasMore, isAccount, multiColumn, isLoading, suspended, hidden, remote, remoteUrl } = this.props; if (!isAccount) { return ( @@ -127,7 +133,13 @@ class Followers extends ImmutablePureComponent { let emptyMessage; - if (remote && accountIds.isEmpty()) { + const forceEmptyState = suspended || hidden; + + if (suspended) { + emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />; + } else if (hidden) { + emptyMessage = <LimitedAccountHint accountId={accountId} />; + } else if (remote && accountIds.isEmpty()) { emptyMessage = <RemoteHint url={remoteUrl} />; } else { emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />; @@ -141,7 +153,7 @@ class Followers extends ImmutablePureComponent { <ScrollableList scrollKey='followers' - hasMore={hasMore} + hasMore={!forceEmptyState && hasMore} isLoading={isLoading} onLoadMore={this.handleLoadMore} prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />} diff --git a/app/javascript/flavours/glitch/features/following/index.js b/app/javascript/flavours/glitch/features/following/index.js index 446a19894..aa187bf95 100644 --- a/app/javascript/flavours/glitch/features/following/index.js +++ b/app/javascript/flavours/glitch/features/following/index.js @@ -19,6 +19,8 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import MissingIndicator from 'flavours/glitch/components/missing_indicator'; import ScrollableList from 'flavours/glitch/components/scrollable_list'; import TimelineHint from 'flavours/glitch/components/timeline_hint'; +import LimitedAccountHint from '../account_timeline/components/limited_account_hint'; +import { getAccountHidden } from 'flavours/glitch/selectors'; const mapStateToProps = (state, { params: { acct, id } }) => { const accountId = id || state.getIn(['accounts_map', acct]); @@ -37,6 +39,8 @@ const mapStateToProps = (state, { params: { acct, id } }) => { accountIds: state.getIn(['user_lists', 'following', accountId, 'items']), hasMore: !!state.getIn(['user_lists', 'following', accountId, 'next']), isLoading: state.getIn(['user_lists', 'following', accountId, 'isLoading'], true), + suspended: state.getIn(['accounts', accountId, 'suspended'], false), + hidden: getAccountHidden(state, accountId), }; }; @@ -62,6 +66,8 @@ class Following extends ImmutablePureComponent { hasMore: PropTypes.bool, isLoading: PropTypes.bool, isAccount: PropTypes.bool, + suspended: PropTypes.bool, + hidden: PropTypes.bool, remote: PropTypes.bool, remoteUrl: PropTypes.string, multiColumn: PropTypes.bool, @@ -107,7 +113,7 @@ class Following extends ImmutablePureComponent { } render () { - const { accountIds, hasMore, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props; + const { accountId, accountIds, hasMore, isAccount, multiColumn, isLoading, suspended, hidden, remote, remoteUrl } = this.props; if (!isAccount) { return ( @@ -127,7 +133,13 @@ class Following extends ImmutablePureComponent { let emptyMessage; - if (remote && accountIds.isEmpty()) { + const forceEmptyState = suspended || hidden; + + if (suspended) { + emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />; + } else if (hidden) { + emptyMessage = <LimitedAccountHint accountId={accountId} />; + } else if (remote && accountIds.isEmpty()) { emptyMessage = <RemoteHint url={remoteUrl} />; } else { emptyMessage = <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />; @@ -141,7 +153,7 @@ class Following extends ImmutablePureComponent { <ScrollableList scrollKey='following' - hasMore={hasMore} + hasMore={!forceEmptyState && hasMore} isLoading={isLoading} onLoadMore={this.handleLoadMore} prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />} diff --git a/app/javascript/flavours/glitch/features/getting_started/components/announcements.js b/app/javascript/flavours/glitch/features/getting_started/components/announcements.js index 2f6d2de5c..f7097e2ec 100644 --- a/app/javascript/flavours/glitch/features/getting_started/components/announcements.js +++ b/app/javascript/flavours/glitch/features/getting_started/components/announcements.js @@ -6,7 +6,7 @@ import PropTypes from 'prop-types'; import IconButton from 'flavours/glitch/components/icon_button'; import Icon from 'flavours/glitch/components/icon'; import { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl'; -import { autoPlayGif, reduceMotion } from 'flavours/glitch/util/initial_state'; +import { autoPlayGif, reduceMotion, disableSwiping } from 'flavours/glitch/util/initial_state'; import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg'; import { mascot } from 'flavours/glitch/util/initial_state'; import unicodeMapping from 'flavours/glitch/util/emoji/emoji_unicode_mapping_light'; @@ -430,6 +430,7 @@ class Announcements extends ImmutablePureComponent { removeReaction={this.props.removeReaction} intl={intl} selected={index === idx} + disabled={disableSwiping} /> ))} </ReactSwipeableViews> diff --git a/app/javascript/flavours/glitch/features/local_settings/page/deprecated_item/index.js b/app/javascript/flavours/glitch/features/local_settings/page/deprecated_item/index.js new file mode 100644 index 000000000..362bd97c0 --- /dev/null +++ b/app/javascript/flavours/glitch/features/local_settings/page/deprecated_item/index.js @@ -0,0 +1,83 @@ +// Package imports +import React from 'react'; +import PropTypes from 'prop-types'; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +export default class LocalSettingsPageItem extends React.PureComponent { + + static propTypes = { + children: PropTypes.node.isRequired, + id: PropTypes.string.isRequired, + options: PropTypes.arrayOf(PropTypes.shape({ + value: PropTypes.string.isRequired, + message: PropTypes.string.isRequired, + hint: PropTypes.string, + })), + value: PropTypes.any, + placeholder: PropTypes.string, + }; + + render () { + const { id, options, children, placeholder, value } = this.props; + + if (options && options.length > 0) { + const currentValue = value; + const optionElems = options && options.length > 0 && options.map((opt) => { + let optionId = `${id}--${opt.value}`; + return ( + <label htmlFor={optionId}> + <input + type='radio' + name={id} + id={optionId} + value={opt.value} + checked={currentValue === opt.value} + disabled + /> + {opt.message} + {opt.hint && <span className='hint'>{opt.hint}</span>} + </label> + ); + }); + return ( + <div className='glitch local-settings__page__item radio_buttons'> + <fieldset> + <legend>{children}</legend> + {optionElems} + </fieldset> + </div> + ); + } else if (placeholder) { + return ( + <div className='glitch local-settings__page__item string'> + <label htmlFor={id}> + <p>{children}</p> + <p> + <input + id={id} + type='text' + value={value} + placeholder={placeholder} + disabled + /> + </p> + </label> + </div> + ); + } else return ( + <div className='glitch local-settings__page__item boolean'> + <label htmlFor={id}> + <input + id={id} + type='checkbox' + checked={value} + disabled + /> + {children} + </label> + </div> + ); + } + +} 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 45d10d154..4b86a8f6f 100644 --- a/app/javascript/flavours/glitch/features/local_settings/page/index.js +++ b/app/javascript/flavours/glitch/features/local_settings/page/index.js @@ -5,7 +5,10 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; // Our imports +import { expandSpoilers, disableSwiping } from 'flavours/glitch/util/initial_state'; +import { preferenceLink } from 'flavours/glitch/util/backend_links'; import LocalSettingsPageItem from './item'; +import DeprecatedLocalSettingsPageItem from './deprecated_item'; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @@ -146,14 +149,28 @@ class LocalSettingsPage extends React.PureComponent { > <FormattedMessage id='settings.navbar_under' defaultMessage='Navbar at the bottom (Mobile only)' /> </LocalSettingsPageItem> - <LocalSettingsPageItem - settings={settings} - item={['swipe_to_change_columns']} + <DeprecatedLocalSettingsPageItem id='mastodon-settings--swipe_to_change_columns' - onChange={onChange} + value={!disableSwiping} > <FormattedMessage id='settings.swipe_to_change_columns' defaultMessage='Allow swiping to change columns (Mobile only)' /> - </LocalSettingsPageItem> + <span className='hint'> + <FormattedMessage + id='settings.deprecated_setting' + defaultMessage="This setting is now controlled from Mastodon's {settings_page_link}" + values={{ + settings_page_link: ( + <a href={preferenceLink('user_setting_disable_swiping')}> + <FormattedMessage + id='settings.shared_settings_link' + defaultMessage='user preferences' + /> + </a> + ) + }} + /> + </span> + </DeprecatedLocalSettingsPageItem> </section> </div> ), @@ -242,21 +259,35 @@ class LocalSettingsPage extends React.PureComponent { ({ intl, onChange, settings }) => ( <div className='glitch local-settings__page content_warnings'> <h1><FormattedMessage id='settings.content_warnings' defaultMessage='Content warnings' /></h1> - <LocalSettingsPageItem - settings={settings} - item={['content_warnings', 'auto_unfold']} + <DeprecatedLocalSettingsPageItem id='mastodon-settings--content_warnings-auto_unfold' - onChange={onChange} + value={expandSpoilers} > <FormattedMessage id='settings.enable_content_warnings_auto_unfold' defaultMessage='Automatically unfold content-warnings' /> - </LocalSettingsPageItem> + <span className='hint'> + <FormattedMessage + id='settings.deprecated_setting' + defaultMessage="This setting is now controlled from Mastodon's {settings_page_link}" + values={{ + settings_page_link: ( + <a href={preferenceLink('user_setting_expand_spoilers')}> + <FormattedMessage + id='settings.shared_settings_link' + defaultMessage='user preferences' + /> + </a> + ) + }} + /> + </span> + </DeprecatedLocalSettingsPageItem> <LocalSettingsPageItem settings={settings} item={['content_warnings', 'filter']} id='mastodon-settings--content_warnings-auto_unfold' onChange={onChange} - dependsOn={[['content_warnings', 'auto_unfold']]} placeholder={intl.formatMessage(messages.regexp)} + disabled={!expandSpoilers} > <FormattedMessage id='settings.content_warnings_filter' defaultMessage='Content warnings to not automatically unfold:' /> </LocalSettingsPageItem> diff --git a/app/javascript/flavours/glitch/features/local_settings/page/item/index.js b/app/javascript/flavours/glitch/features/local_settings/page/item/index.js index 5a68523f6..6b24e4143 100644 --- a/app/javascript/flavours/glitch/features/local_settings/page/item/index.js +++ b/app/javascript/flavours/glitch/features/local_settings/page/item/index.js @@ -21,6 +21,7 @@ export default class LocalSettingsPageItem extends React.PureComponent { })), settings: ImmutablePropTypes.map.isRequired, placeholder: PropTypes.string, + disabled: PropTypes.bool, }; handleChange = e => { @@ -33,8 +34,8 @@ export default class LocalSettingsPageItem extends React.PureComponent { render () { const { handleChange } = this; - const { settings, item, id, options, children, dependsOn, dependsOnNot, placeholder } = this.props; - let enabled = true; + const { settings, item, id, options, children, dependsOn, dependsOnNot, placeholder, disabled } = this.props; + let enabled = !disabled; if (dependsOn) { for (let i = 0; i < dependsOn.length; i++) { diff --git a/app/javascript/flavours/glitch/features/mutes/index.js b/app/javascript/flavours/glitch/features/mutes/index.js index 9f0d5a43e..764cbef1a 100644 --- a/app/javascript/flavours/glitch/features/mutes/index.js +++ b/app/javascript/flavours/glitch/features/mutes/index.js @@ -69,7 +69,7 @@ class Mutes extends ImmutablePureComponent { bindToDocument={!multiColumn} > {accountIds.map(id => - <AccountContainer key={id} id={id} />, + <AccountContainer key={id} id={id} defaultAction='mute' />, )} </ScrollableList> </Column> diff --git a/app/javascript/flavours/glitch/features/report/thanks.js b/app/javascript/flavours/glitch/features/report/thanks.js index 9c41baa7f..454979f9f 100644 --- a/app/javascript/flavours/glitch/features/report/thanks.js +++ b/app/javascript/flavours/glitch/features/report/thanks.js @@ -8,7 +8,7 @@ import { unfollowAccount, muteAccount, blockAccount, -} from 'mastodon/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; const mapStateToProps = () => ({}); diff --git a/app/javascript/flavours/glitch/features/ui/components/columns_area.js b/app/javascript/flavours/glitch/features/ui/components/columns_area.js index e39a31e5d..bfb1ae405 100644 --- a/app/javascript/flavours/glitch/features/ui/components/columns_area.js +++ b/app/javascript/flavours/glitch/features/ui/components/columns_area.js @@ -8,6 +8,8 @@ import ReactSwipeableViews from 'react-swipeable-views'; import TabsBar, { links, getIndex, getLink } from './tabs_bar'; import { Link } from 'react-router-dom'; +import { disableSwiping } from 'flavours/glitch/util/initial_state'; + import BundleContainer from '../containers/bundle_container'; import ColumnLoading from './column_loading'; import DrawerLoading from './drawer_loading'; @@ -63,7 +65,6 @@ class ColumnsArea extends ImmutablePureComponent { static propTypes = { intl: PropTypes.object.isRequired, columns: ImmutablePropTypes.list.isRequired, - swipeToChangeColumns: PropTypes.bool, singleColumn: PropTypes.bool, children: PropTypes.node, navbarUnder: PropTypes.bool, @@ -210,7 +211,7 @@ class ColumnsArea extends ImmutablePureComponent { } render () { - const { columns, children, singleColumn, swipeToChangeColumns, intl, navbarUnder, openSettings } = this.props; + const { columns, children, singleColumn, intl, navbarUnder, openSettings } = this.props; const { shouldAnimate, renderComposePanel } = this.state; const columnIndex = getIndex(this.context.router.history.location.pathname); @@ -219,7 +220,7 @@ class ColumnsArea extends ImmutablePureComponent { const floatingActionButton = shouldHideFAB(this.context.router.history.location.pathname) ? null : <Link key='floating-action-button' to='/publish' className='floating-action-button' aria-label={intl.formatMessage(messages.publish)}><Icon id='pencil' /></Link>; const content = columnIndex !== -1 ? ( - <ReactSwipeableViews key='content' hysteresis={0.2} threshold={15} index={columnIndex} onChangeIndex={this.handleSwipe} onTransitionEnd={this.handleAnimationEnd} animateTransitions={shouldAnimate} springConfig={{ duration: '400ms', delay: '0s', easeFunction: 'ease' }} style={{ height: '100%' }} disabled={!swipeToChangeColumns}> + <ReactSwipeableViews key='content' hysteresis={0.2} threshold={15} index={columnIndex} onChangeIndex={this.handleSwipe} onTransitionEnd={this.handleAnimationEnd} animateTransitions={shouldAnimate} springConfig={{ duration: '400ms', delay: '0s', easeFunction: 'ease' }} style={{ height: '100%' }} disabled={disableSwiping}> {links.map(this.renderView)} </ReactSwipeableViews> ) : ( @@ -234,7 +235,7 @@ class ColumnsArea extends ImmutablePureComponent { </div> </div> - <div className='columns-area__panels__main'> + <div className={`columns-area__panels__main ${floatingActionButton && 'with-fab'}`}> {!navbarUnder && <TabsBar key='tabs' />} {content} {navbarUnder && <TabsBar key='tabs' />} diff --git a/app/javascript/flavours/glitch/features/ui/components/deprecated_settings_modal.js b/app/javascript/flavours/glitch/features/ui/components/deprecated_settings_modal.js new file mode 100644 index 000000000..9cb5a30b9 --- /dev/null +++ b/app/javascript/flavours/glitch/features/ui/components/deprecated_settings_modal.js @@ -0,0 +1,86 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { preferenceLink } from 'flavours/glitch/util/backend_links'; +import Button from 'flavours/glitch/components/button'; +import Icon from 'flavours/glitch/components/icon'; +import illustration from 'flavours/glitch/images/logo_warn_glitch.svg'; + +const messages = defineMessages({ + discardChanges: { id: 'confirmations.deprecated_settings.confirm', defaultMessage: 'Use Mastodon preferences' }, + user_setting_expand_spoilers: { id: 'settings.enable_content_warnings_auto_unfold', defaultMessage: 'Automatically unfold content-warnings' }, + user_setting_disable_swiping: { id: 'settings.swipe_to_change_columns', defaultMessage: 'Allow swiping to change columns (Mobile only)' }, +}); + +export default @injectIntl +class DeprecatedSettingsModal extends React.PureComponent { + + static propTypes = { + settings: ImmutablePropTypes.list.isRequired, + onClose: PropTypes.func.isRequired, + onConfirm: PropTypes.func.isRequired, + intl: PropTypes.object.isRequired, + }; + + componentDidMount() { + this.button.focus(); + } + + handleClick = () => { + this.props.onConfirm(); + this.props.onClose(); + } + + setRef = (c) => { + this.button = c; + } + + render () { + const { settings, intl } = this.props; + + return ( + <div className='modal-root__modal confirmation-modal'> + <div className='confirmation-modal__container'> + + <img src={illustration} className='modal-warning' alt='' /> + + <FormattedMessage + id='confirmations.deprecated_settings.message' + defaultMessage='Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:' + values={{ + app_settings: ( + <strong className='deprecated-settings-label'> + <Icon id='cogs' /> <FormattedMessage id='navigation_bar.app_settings' defaultMessage='App settings' /> + </strong> + ), + preferences: ( + <strong className='deprecated-settings-label'> + <Icon id='cog' /> <FormattedMessage id='navigation_bar.preferences' defaultMessage='Preferences' /> + </strong> + ), + }} + /> + + <div className='deprecated-settings-info'> + <ul> + { settings.map((setting_name) => ( + <li> + <a href={preferenceLink(setting_name)}><FormattedMessage {...messages[setting_name]} /></a> + </li> + )) } + </ul> + </div> + </div> + + <div> + <div className='confirmation-modal__action-bar'> + <div /> + <Button text={intl.formatMessage(messages.discardChanges)} onClick={this.handleClick} ref={this.setRef} /> + </div> + </div> + </div> + ); + } + +} diff --git a/app/javascript/flavours/glitch/features/ui/components/media_modal.js b/app/javascript/flavours/glitch/features/ui/components/media_modal.js index 6974aab26..baa5ff275 100644 --- a/app/javascript/flavours/glitch/features/ui/components/media_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/media_modal.js @@ -12,6 +12,7 @@ import Icon from 'flavours/glitch/components/icon'; import GIFV from 'flavours/glitch/components/gifv'; import Footer from 'flavours/glitch/features/picture_in_picture/components/footer'; import { getAverageFromBlurhash } from 'flavours/glitch/blurhash'; +import { disableSwiping } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ close: { id: 'lightbox.close', defaultMessage: 'Close' }, @@ -227,6 +228,7 @@ class MediaModal extends ImmutablePureComponent { onChangeIndex={this.handleSwipe} onTransitionEnd={this.handleTransitionEnd} index={index} + disabled={disableSwiping} > {content} </ReactSwipeableViews> 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 a975c4013..8f18d93b7 100644 --- a/app/javascript/flavours/glitch/features/ui/components/modal_root.js +++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.js @@ -14,6 +14,7 @@ import AudioModal from './audio_modal'; import DoodleModal from './doodle_modal'; import ConfirmationModal from './confirmation_modal'; import FocalPointModal from './focal_point_modal'; +import DeprecatedSettingsModal from './deprecated_settings_modal'; import { OnboardingModal, MuteModal, @@ -40,6 +41,7 @@ const MODAL_COMPONENTS = { 'BLOCK': BlockModal, 'REPORT': ReportModal, 'SETTINGS': SettingsModal, + 'DEPRECATED_SETTINGS': () => Promise.resolve({ default: DeprecatedSettingsModal }), 'ACTIONS': () => Promise.resolve({ default: ActionsModal }), 'EMBED': EmbedModal, 'LIST_EDITOR': ListEditor, diff --git a/app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js b/app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js index b69842cd6..1107be740 100644 --- a/app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js +++ b/app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js @@ -4,7 +4,6 @@ import { openModal } from 'flavours/glitch/actions/modal'; const mapStateToProps = state => ({ columns: state.getIn(['settings', 'columns']), - swipeToChangeColumns: state.getIn(['local_settings', 'swipe_to_change_columns']), }); const mapDispatchToProps = dispatch => ({ diff --git a/app/javascript/flavours/glitch/images/logo_warn_glitch.svg b/app/javascript/flavours/glitch/images/logo_warn_glitch.svg new file mode 100644 index 000000000..32c5854ee --- /dev/null +++ b/app/javascript/flavours/glitch/images/logo_warn_glitch.svg @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + viewBox="0 0 216.41507 232.00976" + version="1.1" + id="svg6" + sodipodi:docname="logo_warn_glitch.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs10" /> + <sodipodi:namedview + id="namedview8" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="1.7951831" + inkscape:cx="-30.916067" + inkscape:cy="90.241493" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="32" + inkscape:window-maximized="1" + inkscape:current-layer="svg6" /> + <g + id="g2025"> + <path + d="M211.80683 139.0875c-3.1825 16.36625-28.4925 34.2775-57.5625 37.74875-15.16 1.80875-30.0825 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.3925 27.9425 21.115.7225 39.91625-5.20625 39.91625-5.20625l.86875 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23183 213.82 1.40558 165.31125.20808 116.09125c-.36375-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67058 3.45375 78.20308.2425 107.86433 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.97625 14.7525 32.97625 65.0825 0 0 .4125 37.13375-4.6 62.915" + fill="#3088d4" + id="path2" /> + <path + d="m 124.52893,137.75645 c 0,9.01375 -7.30875,16.32125 -16.3225,16.32125 -9.01375,0 -16.32125,-7.3075 -16.32125,-16.32125 0,-9.01375 7.3075,-16.3225 16.32125,-16.3225 9.01375,0 16.3225,7.30875 16.3225,16.3225" + fill="#ffffff" + id="path4" + sodipodi:nodetypes="csssc" /> + <path + id="path1121" + d="m 108.20703,25.453125 c -9.013749,0 -16.322264,7.308516 -16.322264,16.322266 0,5.31808 2.555126,37.386806 6.492187,67.763669 4.100497,4.20028 15.890147,3.77063 19.660157,-0.01 3.9367,-30.375272 6.49219,-62.4364 6.49219,-67.753909 0,-9.01375 -7.30852,-16.322266 -16.32227,-16.322266 z" + style="fill:#ffffff" + sodipodi:nodetypes="ssccsss" /> + </g> +</svg> diff --git a/app/javascript/flavours/glitch/reducers/accounts.js b/app/javascript/flavours/glitch/reducers/accounts.js index 530ed8e60..e02a5592e 100644 --- a/app/javascript/flavours/glitch/reducers/accounts.js +++ b/app/javascript/flavours/glitch/reducers/accounts.js @@ -1,4 +1,5 @@ -import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from '../actions/importer'; +import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from 'flavours/glitch/actions/importer'; +import { ACCOUNT_REVEAL } from 'flavours/glitch/actions/accounts'; import { Map as ImmutableMap, fromJS } from 'immutable'; const initialState = ImmutableMap(); @@ -10,6 +11,8 @@ const normalizeAccount = (state, account) => { delete account.following_count; delete account.statuses_count; + account.hidden = state.getIn([account.id, 'hidden']) === false ? false : account.limited; + return state.set(account.id, fromJS(account)); }; @@ -27,6 +30,8 @@ export default function accounts(state = initialState, action) { return normalizeAccount(state, action.account); case ACCOUNTS_IMPORT: return normalizeAccounts(state, action.accounts); + case ACCOUNT_REVEAL: + return state.setIn([action.id, 'hidden'], false); default: return state; } diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js index f97c799e7..d0aeaa1f0 100644 --- a/app/javascript/flavours/glitch/reducers/compose.js +++ b/app/javascript/flavours/glitch/reducers/compose.js @@ -30,6 +30,7 @@ import { COMPOSE_SPOILERNESS_CHANGE, COMPOSE_SPOILER_TEXT_CHANGE, COMPOSE_VISIBILITY_CHANGE, + COMPOSE_LANGUAGE_CHANGE, COMPOSE_CONTENT_TYPE_CHANGE, COMPOSE_EMOJI_INSERT, COMPOSE_UPLOAD_CHANGE_REQUEST, @@ -100,6 +101,7 @@ const initialState = ImmutableMap({ }), default_privacy: 'public', default_sensitive: false, + default_language: 'en', resetFileKey: Math.floor((Math.random() * 0x10000)), idempotencyKey: null, tagHistory: ImmutableList(), @@ -175,7 +177,8 @@ function clearAll(state) { map => map.mergeWith(overwrite, state.get('default_advanced_options')) ); map.set('privacy', state.get('default_privacy')); - map.set('sensitive', false); + map.set('sensitive', state.get('default_sensitive')); + map.set('language', state.get('default_language')); map.update('media_attachments', list => list.clear()); map.set('poll', null); map.set('idempotencyKey', uuid()); @@ -557,6 +560,7 @@ export default function compose(state = initialState, action) { map.set('caretPosition', null); map.set('idempotencyKey', uuid()); map.set('sensitive', action.status.get('sensitive')); + map.set('language', action.status.get('language')); map.update( 'advanced_options', map => map.merge(new ImmutableMap({ do_not_federate })) @@ -589,6 +593,7 @@ export default function compose(state = initialState, action) { map.set('caretPosition', null); map.set('idempotencyKey', uuid()); map.set('sensitive', action.status.get('sensitive')); + map.set('language', action.status.get('language')); if (action.spoiler_text.length > 0) { map.set('spoiler', true); @@ -618,6 +623,8 @@ export default function compose(state = initialState, action) { return state.updateIn(['poll', 'options'], options => options.delete(action.index)); case COMPOSE_POLL_SETTINGS_CHANGE: return state.update('poll', poll => poll.set('expires_in', action.expiresIn).set('multiple', action.isMultiple)); + case COMPOSE_LANGUAGE_CHANGE: + return state.set('language', action.language); default: return state; } diff --git a/app/javascript/flavours/glitch/reducers/identity_proofs.js b/app/javascript/flavours/glitch/reducers/identity_proofs.js deleted file mode 100644 index 58af0a5fa..000000000 --- a/app/javascript/flavours/glitch/reducers/identity_proofs.js +++ /dev/null @@ -1,25 +0,0 @@ -import { Map as ImmutableMap, fromJS } from 'immutable'; -import { - IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST, - IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS, - IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL, -} from '../actions/identity_proofs'; - -const initialState = ImmutableMap(); - -export default function identityProofsReducer(state = initialState, action) { - switch(action.type) { - case IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST: - return state.set('isLoading', true); - case IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL: - return state.set('isLoading', false); - case IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS: - return state.update(identity_proofs => identity_proofs.withMutations(map => { - map.set('isLoading', false); - map.set('loaded', true); - map.set(action.accountId, fromJS(action.identity_proofs)); - })); - default: - return state; - } -}; diff --git a/app/javascript/flavours/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js index 92348c0c5..b8aad9fad 100644 --- a/app/javascript/flavours/glitch/reducers/index.js +++ b/app/javascript/flavours/glitch/reducers/index.js @@ -34,7 +34,6 @@ import conversations from './conversations'; import suggestions from './suggestions'; import pinnedAccountsEditor from './pinned_accounts_editor'; import polls from './polls'; -import identity_proofs from './identity_proofs'; import trends from './trends'; import announcements from './announcements'; import markers from './markers'; @@ -73,7 +72,6 @@ const reducers = { notifications, height_cache, custom_emojis, - identity_proofs, lists, listEditor, listAdder, diff --git a/app/javascript/flavours/glitch/reducers/local_settings.js b/app/javascript/flavours/glitch/reducers/local_settings.js index c115cad6b..a16c337fc 100644 --- a/app/javascript/flavours/glitch/reducers/local_settings.js +++ b/app/javascript/flavours/glitch/reducers/local_settings.js @@ -3,13 +3,12 @@ import { Map as ImmutableMap } from 'immutable'; // Our imports. import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; -import { LOCAL_SETTING_CHANGE } from 'flavours/glitch/actions/local_settings'; +import { LOCAL_SETTING_CHANGE, LOCAL_SETTING_DELETE } from 'flavours/glitch/actions/local_settings'; const initialState = ImmutableMap({ layout : 'auto', stretch : true, navbar_under : false, - swipe_to_change_columns: true, side_arm : 'none', side_arm_reply_mode : 'keep', show_reply_count : false, @@ -26,7 +25,6 @@ const initialState = ImmutableMap({ tag_misleading_links: true, rewrite_mentions: 'no', content_warnings : ImmutableMap({ - auto_unfold : false, filter : null, }), collapsed : ImmutableMap({ @@ -66,6 +64,8 @@ export default function localSettings(state = initialState, action) { return hydrate(state, action.state.get('local_settings')); case LOCAL_SETTING_CHANGE: return state.setIn(action.key, action.value); + case LOCAL_SETTING_DELETE: + return state.deleteIn(action.key); default: return state; } diff --git a/app/javascript/flavours/glitch/reducers/settings.js b/app/javascript/flavours/glitch/reducers/settings.js index 676a1ccc1..0c28b2959 100644 --- a/app/javascript/flavours/glitch/reducers/settings.js +++ b/app/javascript/flavours/glitch/reducers/settings.js @@ -3,6 +3,7 @@ import { NOTIFICATIONS_FILTER_SET } from 'flavours/glitch/actions/notifications' import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE, COLUMN_PARAMS_CHANGE } from 'flavours/glitch/actions/columns'; import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; import { EMOJI_USE } from 'flavours/glitch/actions/emojis'; +import { LANGUAGE_USE } from 'flavours/glitch/actions/languages'; import { LIST_DELETE_SUCCESS, LIST_FETCH_FAIL } from '../actions/lists'; import { Map as ImmutableMap, fromJS } from 'immutable'; import uuid from 'flavours/glitch/util/uuid'; @@ -134,6 +135,8 @@ const changeColumnParams = (state, uuid, path, value) => { const updateFrequentEmojis = (state, emoji) => state.update('frequentlyUsedEmojis', ImmutableMap(), map => map.update(emoji.id, 0, count => count + 1)).set('saved', false); +const updateFrequentLanguages = (state, language) => state.update('frequentlyUsedLanguages', ImmutableMap(), map => map.update(language, 0, count => count + 1)).set('saved', false); + const filterDeadListColumns = (state, listId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'LIST' && column.get('params').get('id') === listId)); export default function settings(state = initialState, action) { @@ -159,6 +162,8 @@ export default function settings(state = initialState, action) { return changeColumnParams(state, action.uuid, action.path, action.value); case EMOJI_USE: return updateFrequentEmojis(state, action.emoji); + case LANGUAGE_USE: + return updateFrequentLanguages(state, action.language); case SETTING_SAVE: return state.set('saved', true); case LIST_FETCH_FAIL: diff --git a/app/javascript/flavours/glitch/selectors/index.js b/app/javascript/flavours/glitch/selectors/index.js index bb9180d12..99afe5355 100644 --- a/app/javascript/flavours/glitch/selectors/index.js +++ b/app/javascript/flavours/glitch/selectors/index.js @@ -194,3 +194,11 @@ export const getAccountGallery = createSelector([ return medias; }); + +export const getAccountHidden = createSelector([ + (state, id) => state.getIn(['accounts', id, 'hidden']), + (state, id) => state.getIn(['relationships', id, 'following']) || state.getIn(['relationships', id, 'requested']), + (state, id) => id === me, +], (hidden, followingOrRequested, isSelf) => { + return hidden && !(isSelf || followingOrRequested); +}); diff --git a/app/javascript/flavours/glitch/styles/accessibility.scss b/app/javascript/flavours/glitch/styles/accessibility.scss index cb27497a4..96e20f839 100644 --- a/app/javascript/flavours/glitch/styles/accessibility.scss +++ b/app/javascript/flavours/glitch/styles/accessibility.scss @@ -12,6 +12,21 @@ $emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange' } } +// Display a checkmark on active UI elements otherwise differing only by color +.status__action-bar-button, +.detailed-status__button .icon-button { + position: relative; + + &.active::after { + position: absolute; + content: "\F00C"; + font-size: 50%; + font-family: FontAwesome; + right: -5px; + top: -4px; + } +} + .hicolor-privacy-icons { .status__visibility-icon.fa-globe, .composer--options--dropdown--content--item .fa-globe { diff --git a/app/javascript/flavours/glitch/styles/components/columns.scss b/app/javascript/flavours/glitch/styles/components/columns.scss index 96e292d8b..d52ecf02c 100644 --- a/app/javascript/flavours/glitch/styles/components/columns.scss +++ b/app/javascript/flavours/glitch/styles/components/columns.scss @@ -560,6 +560,15 @@ } } +.limited-account-hint { + p { + color: $secondary-text-color; + font-size: 15px; + font-weight: 500; + margin-bottom: 20px; + } +} + .empty-column-indicator, .error-column, .follow_requests-unlocked_explanation { diff --git a/app/javascript/flavours/glitch/styles/components/composer.scss b/app/javascript/flavours/glitch/styles/components/composer.scss index 3137b2dea..6d45c110c 100644 --- a/app/javascript/flavours/glitch/styles/components/composer.scss +++ b/app/javascript/flavours/glitch/styles/components/composer.scss @@ -644,3 +644,68 @@ & > .count { color: $warning-red } } } + +.language-dropdown { + &__dropdown { + position: absolute; + background: $simple-background-color; + box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); + border-radius: 4px; + overflow: hidden; + z-index: 2; + + &.top { + transform-origin: 50% 100%; + } + + &.bottom { + transform-origin: 50% 0; + } + + .emoji-mart-search { + padding-right: 10px; + } + + .emoji-mart-search-icon { + right: 10px + 5px; + } + + .emoji-mart-scroll { + padding: 0 10px 10px; + } + + &__results { + &__item { + cursor: pointer; + color: $inverted-text-color; + font-weight: 500; + padding: 10px; + border-radius: 4px; + + &:focus, + &:active, + &:hover { + background: $ui-secondary-color; + } + + &__common-name { + color: $darker-text-color; + } + + &.active { + background: $ui-highlight-color; + color: $primary-text-color; + outline: 0; + + .language-dropdown__dropdown__results__item__common-name { + color: $secondary-text-color; + } + + &:hover { + background: lighten($ui-highlight-color, 4%); + } + } + } + } + } +} diff --git a/app/javascript/flavours/glitch/styles/components/local_settings.scss b/app/javascript/flavours/glitch/styles/components/local_settings.scss index 0b7a74575..db2b9f154 100644 --- a/app/javascript/flavours/glitch/styles/components/local_settings.scss +++ b/app/javascript/flavours/glitch/styles/components/local_settings.scss @@ -98,6 +98,18 @@ .glitch.local-settings__page__item { margin-bottom: 2px; + + .hint a { + color: $lighter-text-color; + font-weight: 500; + text-decoration: underline; + + &:active, + &:focus, + &:hover { + text-decoration: none; + } + } } .glitch.local-settings__page__item.string, @@ -120,3 +132,29 @@ } } } + +.deprecated-settings-label { + white-space: nowrap; +} + +.deprecated-settings-info { + text-align: start; + + ul { + padding: 10px; + margin-left: 12px; + list-style: disc inside; + } + + a { + color: $lighter-text-color; + font-weight: 500; + text-decoration: underline; + + &:active, + &:focus, + &:hover { + text-decoration: none; + } + } +} diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss index 61c292b19..90e0da02a 100644 --- a/app/javascript/flavours/glitch/styles/components/modal.scss +++ b/app/javascript/flavours/glitch/styles/components/modal.scss @@ -1279,3 +1279,10 @@ pointer-events: auto; z-index: 9999; } + +img.modal-warning { + display: block; + margin: auto; + margin-bottom: 15px; + width: 60px; +} diff --git a/app/javascript/flavours/glitch/styles/components/single_column.scss b/app/javascript/flavours/glitch/styles/components/single_column.scss index db510f1f4..ba43e7f29 100644 --- a/app/javascript/flavours/glitch/styles/components/single_column.scss +++ b/app/javascript/flavours/glitch/styles/components/single_column.scss @@ -233,6 +233,10 @@ .columns-area__panels__pane--compositional { display: none; } + + .with-fab .scrollable .item-list:last-child { + padding-bottom: 5.25rem; + } } @media screen and (min-width: 600px + (285px * 1) + (10px * 1)) { diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss index ea416a79f..e4105cba5 100644 --- a/app/javascript/flavours/glitch/styles/forms.scss +++ b/app/javascript/flavours/glitch/styles/forms.scss @@ -1016,68 +1016,6 @@ code { } } -.connection-prompt { - margin-bottom: 25px; - - .fa-link { - background-color: darken($ui-base-color, 4%); - border-radius: 100%; - font-size: 24px; - padding: 10px; - } - - &__column { - align-items: center; - display: flex; - flex: 1; - flex-direction: column; - flex-shrink: 1; - max-width: 50%; - - &-sep { - align-self: center; - flex-grow: 0; - overflow: visible; - position: relative; - z-index: 1; - } - - p { - word-break: break-word; - } - } - - .account__avatar { - margin-bottom: 20px; - } - - &__connection { - background-color: lighten($ui-base-color, 8%); - box-shadow: 0 0 15px rgba($base-shadow-color, 0.2); - border-radius: 4px; - padding: 25px 10px; - position: relative; - text-align: center; - - &::after { - background-color: darken($ui-base-color, 4%); - content: ''; - display: block; - height: 100%; - left: 50%; - position: absolute; - top: 0; - width: 1px; - } - } - - &__row { - align-items: flex-start; - display: flex; - flex-direction: row; - } -} - .input.user_confirm_password, .input.user_website { &:not(.field_with_errors) { diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss index bb91abdac..d16f23aed 100644 --- a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss +++ b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss @@ -165,6 +165,12 @@ } } +.language-dropdown__dropdown__results__item:hover, +.language-dropdown__dropdown__results__item:focus, +.language-dropdown__dropdown__results__item:active { + background-color: $ui-base-color; +} + .dropdown-menu__separator, .dropdown-menu__item.edited-timestamp__history__item, .dropdown-menu__container__header, diff --git a/app/javascript/flavours/glitch/util/backend_links.js b/app/javascript/flavours/glitch/util/backend_links.js index 2e5111a7f..5b2dd8dbf 100644 --- a/app/javascript/flavours/glitch/util/backend_links.js +++ b/app/javascript/flavours/glitch/util/backend_links.js @@ -7,3 +7,12 @@ export const statusAdminLink = (account_id, status_id) => `/admin/accounts/${acc export const filterEditLink = (id) => `/filters/${id}/edit`; export const relationshipsLink = '/relationships'; export const securityLink = '/auth/edit'; +export const preferenceLink = (setting_name) => { + switch (setting_name) { + case 'user_setting_expand_spoilers': + case 'user_setting_disable_swiping': + return `/settings/preferences/appearance#${setting_name}`; + default: + return preferencesLink; + } +}; diff --git a/app/javascript/flavours/glitch/util/content_warning.js b/app/javascript/flavours/glitch/util/content_warning.js index 5e874a49c..baeb97881 100644 --- a/app/javascript/flavours/glitch/util/content_warning.js +++ b/app/javascript/flavours/glitch/util/content_warning.js @@ -1,5 +1,7 @@ +import { expandSpoilers } from 'flavours/glitch/util/initial_state'; + export function autoUnfoldCW (settings, status) { - if (!settings.getIn(['content_warnings', 'auto_unfold'])) { + if (!expandSpoilers) { return false; } diff --git a/app/javascript/flavours/glitch/util/initial_state.js b/app/javascript/flavours/glitch/util/initial_state.js index 7154e020b..b6eab0c87 100644 --- a/app/javascript/flavours/glitch/util/initial_state.js +++ b/app/javascript/flavours/glitch/util/initial_state.js @@ -13,8 +13,8 @@ const getMeta = (prop) => initialState && initialState.meta && initialState.meta export const reduceMotion = getMeta('reduce_motion'); export const autoPlayGif = getMeta('auto_play_gif'); -export const displaySensitiveMedia = getMeta('display_sensitive_media'); export const displayMedia = getMeta('display_media') || (getMeta('display_sensitive_media') ? 'show_all' : 'default'); +export const expandSpoilers = getMeta('expand_spoilers'); export const unfollowModal = getMeta('unfollow_modal'); export const boostModal = getMeta('boost_modal'); export const favouriteModal = getMeta('favourite_modal'); @@ -37,5 +37,7 @@ export const useBlurhash = getMeta('use_blurhash'); export const usePendingItems = getMeta('use_pending_items'); export const useSystemEmojiFont = getMeta('system_emoji_font'); export const showTrends = getMeta('trends'); +export const disableSwiping = getMeta('disable_swiping'); +export const languages = initialState && initialState.languages; export default initialState; diff --git a/app/javascript/mastodon/actions/accounts.js b/app/javascript/mastodon/actions/accounts.js index ce7bb6d5f..eedf61dc9 100644 --- a/app/javascript/mastodon/actions/accounts.js +++ b/app/javascript/mastodon/actions/accounts.js @@ -77,6 +77,8 @@ export const FOLLOW_REQUEST_REJECT_REQUEST = 'FOLLOW_REQUEST_REJECT_REQUEST'; export const FOLLOW_REQUEST_REJECT_SUCCESS = 'FOLLOW_REQUEST_REJECT_SUCCESS'; export const FOLLOW_REQUEST_REJECT_FAIL = 'FOLLOW_REQUEST_REJECT_FAIL'; +export const ACCOUNT_REVEAL = 'ACCOUNT_REVEAL'; + export function fetchAccount(id) { return (dispatch, getState) => { dispatch(fetchRelationships([id])); @@ -780,3 +782,8 @@ export function unpinAccountFail(error) { error, }; }; + +export const revealAccount = id => ({ + type: ACCOUNT_REVEAL, + id, +}); diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index f3129f8d9..878011fc0 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -45,12 +45,12 @@ export const COMPOSE_TAG_HISTORY_UPDATE = 'COMPOSE_TAG_HISTORY_UPDATE'; export const COMPOSE_MOUNT = 'COMPOSE_MOUNT'; export const COMPOSE_UNMOUNT = 'COMPOSE_UNMOUNT'; -export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE'; -export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE'; +export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE'; +export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE'; export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE'; -export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE'; -export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE'; -export const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE'; +export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE'; +export const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE'; +export const COMPOSE_LANGUAGE_CHANGE = 'COMPOSE_LANGUAGE_CHANGE'; export const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT'; @@ -169,6 +169,7 @@ export function submitCompose(routerHistory) { spoiler_text: getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : '', visibility: getState().getIn(['compose', 'privacy']), poll: getState().getIn(['compose', 'poll'], null), + language: getState().getIn(['compose', 'language']), }, headers: { 'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']), @@ -637,6 +638,11 @@ export function changeComposeSensitivity() { }; }; +export const changeComposeLanguage = language => ({ + type: COMPOSE_LANGUAGE_CHANGE, + language, +}); + export function changeComposeSpoilerness() { return { type: COMPOSE_SPOILERNESS_CHANGE, diff --git a/app/javascript/mastodon/actions/languages.js b/app/javascript/mastodon/actions/languages.js new file mode 100644 index 000000000..ad186ba0c --- /dev/null +++ b/app/javascript/mastodon/actions/languages.js @@ -0,0 +1,12 @@ +import { saveSettings } from './settings'; + +export const LANGUAGE_USE = 'LANGUAGE_USE'; + +export const useLanguage = language => dispatch => { + dispatch({ + type: LANGUAGE_USE, + language, + }); + + dispatch(saveSettings()); +}; diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index 00e8d74d7..96cf628d6 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -58,7 +58,8 @@ export const loadPending = () => ({ export function updateNotifications(notification, intlMessages, intlLocale) { return (dispatch, getState) => { - const showInColumn = getState().getIn(['settings', 'notifications', 'shows', notification.type], true); + const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']); + const showInColumn = activeFilter === 'all' ? getState().getIn(['settings', 'notifications', 'shows', notification.type], true) : activeFilter === notification.type; const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true); const playSound = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true); const filters = getFiltersRegex(getState(), { contextType: 'notifications' }); diff --git a/app/javascript/mastodon/components/account.js b/app/javascript/mastodon/components/account.js index 62b5843a9..af9f119c8 100644 --- a/app/javascript/mastodon/components/account.js +++ b/app/javascript/mastodon/components/account.js @@ -18,6 +18,8 @@ const messages = defineMessages({ unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' }, mute_notifications: { id: 'account.mute_notifications', defaultMessage: 'Mute notifications from @{name}' }, unmute_notifications: { id: 'account.unmute_notifications', defaultMessage: 'Unmute notifications from @{name}' }, + mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' }, + block: { id: 'account.block', defaultMessage: 'Block @{name}' }, }); export default @injectIntl @@ -33,6 +35,7 @@ class Account extends ImmutablePureComponent { hidden: PropTypes.bool, actionIcon: PropTypes.string, actionTitle: PropTypes.string, + defaultAction: PropTypes.string, onActionClick: PropTypes.func, }; @@ -61,7 +64,7 @@ class Account extends ImmutablePureComponent { } render () { - const { account, intl, hidden, onActionClick, actionIcon, actionTitle } = this.props; + const { account, intl, hidden, onActionClick, actionIcon, actionTitle, defaultAction } = this.props; if (!account) { return <div />; @@ -105,6 +108,10 @@ class Account extends ImmutablePureComponent { {hidingNotificationsButton} </Fragment> ); + } else if (defaultAction === 'mute') { + buttons = <IconButton icon='volume-off' title={intl.formatMessage(messages.mute, { name: account.get('username') })} onClick={this.handleMute} />; + } else if (defaultAction === 'block') { + buttons = <IconButton icon='lock' title={intl.formatMessage(messages.block, { name: account.get('username') })} onClick={this.handleBlock} />; } else if (!account.get('moved') || following) { buttons = <IconButton icon={following ? 'user-times' : 'user-plus'} title={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={this.handleFollow} active={following} />; } diff --git a/app/javascript/mastodon/components/avatar.js b/app/javascript/mastodon/components/avatar.js index 570505833..12ab7d2df 100644 --- a/app/javascript/mastodon/components/avatar.js +++ b/app/javascript/mastodon/components/avatar.js @@ -2,11 +2,12 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { autoPlayGif } from '../initial_state'; +import classNames from 'classnames'; export default class Avatar extends React.PureComponent { static propTypes = { - account: ImmutablePropTypes.map.isRequired, + account: ImmutablePropTypes.map, size: PropTypes.number.isRequired, style: PropTypes.object, inline: PropTypes.bool, @@ -37,15 +38,6 @@ export default class Avatar extends React.PureComponent { const { account, size, animate, inline } = this.props; const { hovering } = this.state; - const src = account.get('avatar'); - const staticSrc = account.get('avatar_static'); - - let className = 'account__avatar'; - - if (inline) { - className = className + ' account__avatar-inline'; - } - const style = { ...this.props.style, width: `${size}px`, @@ -53,15 +45,21 @@ export default class Avatar extends React.PureComponent { backgroundSize: `${size}px ${size}px`, }; - if (hovering || animate) { - style.backgroundImage = `url(${src})`; - } else { - style.backgroundImage = `url(${staticSrc})`; + if (account) { + const src = account.get('avatar'); + const staticSrc = account.get('avatar_static'); + + if (hovering || animate) { + style.backgroundImage = `url(${src})`; + } else { + style.backgroundImage = `url(${staticSrc})`; + } } + return ( <div - className={className} + className={classNames('account__avatar', { 'account__avatar-inline': inline })} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} style={style} diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 8d917a995..766093226 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -468,7 +468,7 @@ class Status extends ImmutablePureComponent { 'public': { icon: 'globe', text: intl.formatMessage(messages.public_short) }, 'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.unlisted_short) }, 'private': { icon: 'lock', text: intl.formatMessage(messages.private_short) }, - 'direct': { icon: 'envelope', text: intl.formatMessage(messages.direct_short) }, + 'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) }, }; const visibilityIcon = visibilityIconInfo[status.get('visibility')]; diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js index 2830bee29..8e6b9f063 100644 --- a/app/javascript/mastodon/features/account/components/header.js +++ b/app/javascript/mastodon/features/account/components/header.js @@ -82,6 +82,7 @@ class Header extends ImmutablePureComponent { onEditAccountNote: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, domain: PropTypes.string.isRequired, + hidden: PropTypes.bool, }; openEditProfile = () => { @@ -123,7 +124,7 @@ class Header extends ImmutablePureComponent { } render () { - const { account, intl, domain } = this.props; + const { account, hidden, intl, domain } = this.props; if (!account) { return null; @@ -267,21 +268,25 @@ class Header extends ImmutablePureComponent { {!suspended && info} </div> - <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' className='parallax' /> + {!(suspended || hidden) && <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' className='parallax' />} </div> <div className='account__header__bar'> <div className='account__header__tabs'> <a className='avatar' href={account.get('url')} rel='noopener noreferrer' target='_blank'> - <Avatar account={account} size={90} /> + <Avatar account={suspended || hidden ? undefined : account} size={90} /> </a> <div className='spacer' /> {!suspended && ( <div className='account__header__tabs__buttons'> - {actionBtn} - {bellBtn} + {!hidden && ( + <React.Fragment> + {actionBtn} + {bellBtn} + </React.Fragment> + )} <DropdownMenuContainer items={menu} icon='ellipsis-v' size={24} direction='right' /> </div> @@ -295,30 +300,30 @@ class Header extends ImmutablePureComponent { </h1> </div> - <div className='account__header__extra'> - <div className='account__header__bio'> - {fields.size > 0 && ( - <div className='account__header__fields'> - {fields.map((pair, i) => ( - <dl key={i}> - <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} className='translate' /> + {!(suspended || hidden) && ( + <div className='account__header__extra'> + <div className='account__header__bio'> + {fields.size > 0 && ( + <div className='account__header__fields'> + {fields.map((pair, i) => ( + <dl key={i}> + <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} className='translate' /> - <dd className={`${pair.get('verified_at') ? 'verified' : ''} translate`} title={pair.get('value_plain')}> - {pair.get('verified_at') && <span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><Icon id='check' className='verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} /> - </dd> - </dl> - ))} - </div> - )} + <dd className={`${pair.get('verified_at') ? 'verified' : ''} translate`} title={pair.get('value_plain')}> + {pair.get('verified_at') && <span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><Icon id='check' className='verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} /> + </dd> + </dl> + ))} + </div> + )} - {account.get('id') !== me && !suspended && <AccountNoteContainer account={account} />} + {account.get('id') !== me && <AccountNoteContainer account={account} />} - {account.get('note').length > 0 && account.get('note') !== '<p></p>' && <div className='account__header__content translate' dangerouslySetInnerHTML={content} />} + {account.get('note').length > 0 && account.get('note') !== '<p></p>' && <div className='account__header__content translate' dangerouslySetInnerHTML={content} />} - <div className='account__header__joined'><FormattedMessage id='account.joined' defaultMessage='Joined {date}' values={{ date: intl.formatDate(account.get('created_at'), { year: 'numeric', month: 'short', day: '2-digit' }) }} /></div> - </div> + <div className='account__header__joined'><FormattedMessage id='account.joined' defaultMessage='Joined {date}' values={{ date: intl.formatDate(account.get('created_at'), { year: 'numeric', month: 'short', day: '2-digit' }) }} /></div> + </div> - {!suspended && ( <div className='account__header__extra__links'> <NavLink isActive={this.isStatusesPageActive} activeClassName='active' to={`/@${account.get('acct')}`} title={intl.formatNumber(account.get('statuses_count'))}> <ShortNumber @@ -341,8 +346,8 @@ class Header extends ImmutablePureComponent { /> </NavLink> </div> - )} - </div> + </div> + )} </div> </div> ); diff --git a/app/javascript/mastodon/features/account_timeline/components/header.js b/app/javascript/mastodon/features/account_timeline/components/header.js index 507b6c895..fab0bc597 100644 --- a/app/javascript/mastodon/features/account_timeline/components/header.js +++ b/app/javascript/mastodon/features/account_timeline/components/header.js @@ -24,6 +24,7 @@ export default class Header extends ImmutablePureComponent { onAddToList: PropTypes.func.isRequired, hideTabs: PropTypes.bool, domain: PropTypes.string.isRequired, + hidden: PropTypes.bool, }; static contextTypes = { @@ -91,7 +92,7 @@ export default class Header extends ImmutablePureComponent { } render () { - const { account, hideTabs } = this.props; + const { account, hidden, hideTabs } = this.props; if (account === null) { return null; @@ -99,7 +100,7 @@ export default class Header extends ImmutablePureComponent { return ( <div className='account-timeline__header'> - {account.get('moved') && <MovedNote from={account} to={account.get('moved')} />} + {(!hidden && account.get('moved')) && <MovedNote from={account} to={account.get('moved')} />} <InnerHeader account={account} @@ -117,9 +118,10 @@ export default class Header extends ImmutablePureComponent { onAddToList={this.handleAddToList} onEditAccountNote={this.handleEditAccountNote} domain={this.props.domain} + hidden={hidden} /> - {!hideTabs && ( + {!(hideTabs || hidden) && ( <div className='account__section-headline'> <NavLink exact to={`/@${account.get('acct')}`}><FormattedMessage id='account.posts' defaultMessage='Posts' /></NavLink> <NavLink exact to={`/@${account.get('acct')}/with_replies`}><FormattedMessage id='account.posts_with_replies' defaultMessage='Posts and replies' /></NavLink> diff --git a/app/javascript/mastodon/features/account_timeline/components/limited_account_hint.js b/app/javascript/mastodon/features/account_timeline/components/limited_account_hint.js new file mode 100644 index 000000000..6b025596c --- /dev/null +++ b/app/javascript/mastodon/features/account_timeline/components/limited_account_hint.js @@ -0,0 +1,35 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import { revealAccount } from 'mastodon/actions/accounts'; +import { FormattedMessage } from 'react-intl'; +import Button from 'mastodon/components/button'; + +const mapDispatchToProps = (dispatch, { accountId }) => ({ + + reveal () { + dispatch(revealAccount(accountId)); + }, + +}); + +export default @connect(() => {}, mapDispatchToProps) +class LimitedAccountHint extends React.PureComponent { + + static propTypes = { + accountId: PropTypes.string.isRequired, + reveal: PropTypes.func, + } + + render () { + const { reveal } = this.props; + + return ( + <div className='limited-account-hint'> + <p><FormattedMessage id='limited_account_hint.title' defaultMessage='This profile has been hidden by the moderators of your server.' /></p> + <Button onClick={reveal}><FormattedMessage id='limited_account_hint.action' defaultMessage='Show profile anyway' /></Button> + </div> + ); + } + +} diff --git a/app/javascript/mastodon/features/account_timeline/containers/header_container.js b/app/javascript/mastodon/features/account_timeline/containers/header_container.js index b3f8521cb..371794dd7 100644 --- a/app/javascript/mastodon/features/account_timeline/containers/header_container.js +++ b/app/javascript/mastodon/features/account_timeline/containers/header_container.js @@ -1,6 +1,6 @@ import React from 'react'; import { connect } from 'react-redux'; -import { makeGetAccount } from '../../../selectors'; +import { makeGetAccount, getAccountHidden } from '../../../selectors'; import Header from '../components/header'; import { followAccount, @@ -33,6 +33,7 @@ const makeMapStateToProps = () => { const mapStateToProps = (state, { accountId }) => ({ account: getAccount(state, accountId), domain: state.getIn(['meta', 'domain']), + hidden: getAccountHidden(state, accountId), }); return mapStateToProps; diff --git a/app/javascript/mastodon/features/account_timeline/index.js b/app/javascript/mastodon/features/account_timeline/index.js index 5122aec4e..5b592c5a7 100644 --- a/app/javascript/mastodon/features/account_timeline/index.js +++ b/app/javascript/mastodon/features/account_timeline/index.js @@ -16,6 +16,8 @@ import MissingIndicator from 'mastodon/components/missing_indicator'; import TimelineHint from 'mastodon/components/timeline_hint'; import { me } from 'mastodon/initial_state'; import { connectTimeline, disconnectTimeline } from 'mastodon/actions/timelines'; +import LimitedAccountHint from './components/limited_account_hint'; +import { getAccountHidden } from 'mastodon/selectors'; const emptyList = ImmutableList(); @@ -40,6 +42,7 @@ const mapStateToProps = (state, { params: { acct, id }, withReplies = false }) = isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']), hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']), suspended: state.getIn(['accounts', accountId, 'suspended'], false), + hidden: getAccountHidden(state, accountId), blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false), }; }; @@ -70,6 +73,7 @@ class AccountTimeline extends ImmutablePureComponent { blockedBy: PropTypes.bool, isAccount: PropTypes.bool, suspended: PropTypes.bool, + hidden: PropTypes.bool, remote: PropTypes.bool, remoteUrl: PropTypes.string, multiColumn: PropTypes.bool, @@ -128,7 +132,7 @@ class AccountTimeline extends ImmutablePureComponent { } render () { - const { statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, suspended, isAccount, multiColumn, remote, remoteUrl } = this.props; + const { accountId, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, suspended, isAccount, hidden, multiColumn, remote, remoteUrl } = this.props; if (!isAccount) { return ( @@ -149,8 +153,12 @@ class AccountTimeline extends ImmutablePureComponent { let emptyMessage; + const forceEmptyState = suspended || blockedBy || hidden; + if (suspended) { emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />; + } else if (hidden) { + emptyMessage = <LimitedAccountHint accountId={accountId} />; } else if (blockedBy) { emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />; } else if (remote && statusIds.isEmpty()) { @@ -166,14 +174,14 @@ class AccountTimeline extends ImmutablePureComponent { <ColumnBackButton multiColumn={multiColumn} /> <StatusList - prepend={<HeaderContainer accountId={this.props.accountId} />} + prepend={<HeaderContainer accountId={this.props.accountId} hideTabs={forceEmptyState} />} alwaysPrepend append={remoteMessage} scrollKey='account_timeline' - statusIds={(suspended || blockedBy) ? emptyList : statusIds} + statusIds={forceEmptyState ? emptyList : statusIds} featuredStatusIds={featuredStatusIds} isLoading={isLoading} - hasMore={hasMore} + hasMore={!forceEmptyState && hasMore} onLoadMore={this.handleLoadMore} emptyMessage={emptyMessage} bindToDocument={!multiColumn} diff --git a/app/javascript/mastodon/features/blocks/index.js b/app/javascript/mastodon/features/blocks/index.js index 7ec177434..e00f2b60e 100644 --- a/app/javascript/mastodon/features/blocks/index.js +++ b/app/javascript/mastodon/features/blocks/index.js @@ -69,7 +69,7 @@ class Blocks extends ImmutablePureComponent { bindToDocument={!multiColumn} > {accountIds.map(id => - <AccountContainer key={id} id={id} />, + <AccountContainer key={id} id={id} defaultAction='block' />, )} </ScrollableList> </Column> diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index 826d9f504..a6fea42b7 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -15,6 +15,7 @@ import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container'; import PollFormContainer from '../containers/poll_form_container'; import UploadFormContainer from '../containers/upload_form_container'; import WarningContainer from '../containers/warning_container'; +import LanguageDropdown from '../containers/language_dropdown_container'; import { isMobile } from '../../../is_mobile'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { length } from 'stringz'; @@ -205,6 +206,7 @@ class ComposeForm extends ImmutablePureComponent { render () { const { intl, onPaste, showSearch } = this.props; const disabled = this.props.isSubmitting; + let publishText = ''; if (this.props.isEditing) { @@ -255,6 +257,7 @@ class ComposeForm extends ImmutablePureComponent { autoFocus={!showSearch && !isMobile(window.innerWidth)} > <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} /> + <div className='compose-form__modifiers'> <UploadFormContainer /> <PollFormContainer /> @@ -267,12 +270,18 @@ class ComposeForm extends ImmutablePureComponent { <PollButtonContainer /> <PrivacyDropdownContainer disabled={this.props.isEditing} /> <SpoilerButtonContainer /> + <LanguageDropdown /> + </div> + + <div className='character-counter__wrapper'> + <CharacterCounter max={maxChars} text={this.getFulltextForCharacterCounting()} /> </div> - <div className='character-counter__wrapper'><CharacterCounter max={maxChars} text={this.getFulltextForCharacterCounting()} /></div> </div> <div className='compose-form__publish'> - <div className='compose-form__publish-button-wrapper'><Button text={publishText} onClick={this.handleSubmit} disabled={!this.canSubmit()} block /></div> + <div className='compose-form__publish-button-wrapper'> + <Button text={publishText} onClick={this.handleSubmit} disabled={!this.canSubmit()} block /> + </div> </div> </div> ); diff --git a/app/javascript/mastodon/features/compose/components/language_dropdown.js b/app/javascript/mastodon/features/compose/components/language_dropdown.js new file mode 100644 index 000000000..d76490c77 --- /dev/null +++ b/app/javascript/mastodon/features/compose/components/language_dropdown.js @@ -0,0 +1,332 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { injectIntl, defineMessages } from 'react-intl'; +import TextIconButton from './text_icon_button'; +import Overlay from 'react-overlays/lib/Overlay'; +import Motion from 'mastodon/features/ui/util/optional_motion'; +import spring from 'react-motion/lib/spring'; +import { supportsPassiveEvents } from 'detect-passive-events'; +import classNames from 'classnames'; +import { languages as preloadedLanguages } from 'mastodon/initial_state'; +import fuzzysort from 'fuzzysort'; + +const messages = defineMessages({ + changeLanguage: { id: 'compose.language.change', defaultMessage: 'Change language' }, + search: { id: 'compose.language.search', defaultMessage: 'Search languages...' }, + clear: { id: 'emoji_button.clear', defaultMessage: 'Clear' }, +}); + +// Copied from emoji-mart for consistency with emoji picker and since +// they don't export the icons in the package +const icons = { + loupe: ( + <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' width='13' height='13'> + <path d='M12.9 14.32a8 8 0 1 1 1.41-1.41l5.35 5.33-1.42 1.42-5.33-5.34zM8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z' /> + </svg> + ), + + delete: ( + <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' width='13' height='13'> + <path d='M10 8.586L2.929 1.515 1.515 2.929 8.586 10l-7.071 7.071 1.414 1.414L10 11.414l7.071 7.071 1.414-1.414L11.414 10l7.071-7.071-1.414-1.414L10 8.586z' /> + </svg> + ), +}; + +const listenerOptions = supportsPassiveEvents ? { passive: true } : false; + +class LanguageDropdownMenu extends React.PureComponent { + + static propTypes = { + style: PropTypes.object, + value: PropTypes.string.isRequired, + frequentlyUsedLanguages: PropTypes.arrayOf(PropTypes.string).isRequired, + placement: PropTypes.string.isRequired, + onClose: PropTypes.func.isRequired, + onChange: PropTypes.func.isRequired, + languages: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)), + intl: PropTypes.object, + }; + + static defaultProps = { + languages: preloadedLanguages, + }; + + state = { + mounted: false, + searchValue: '', + }; + + handleDocumentClick = e => { + if (this.node && !this.node.contains(e.target)) { + this.props.onClose(); + } + } + + componentDidMount () { + document.addEventListener('click', this.handleDocumentClick, false); + document.addEventListener('touchend', this.handleDocumentClick, listenerOptions); + this.setState({ mounted: true }); + } + + componentWillUnmount () { + document.removeEventListener('click', this.handleDocumentClick, false); + document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions); + } + + setRef = c => { + this.node = c; + } + + setListRef = c => { + this.listNode = c; + } + + handleSearchChange = ({ target }) => { + this.setState({ searchValue: target.value }); + } + + search () { + const { languages, value, frequentlyUsedLanguages } = this.props; + const { searchValue } = this.state; + + if (searchValue === '') { + return [...languages].sort((a, b) => { + // Push current selection to the top of the list + + if (a[0] === value) { + return -1; + } else if (b[0] === value) { + return 1; + } else { + // Sort according to frequently used languages + + const indexOfA = frequentlyUsedLanguages.indexOf(a[0]); + const indexOfB = frequentlyUsedLanguages.indexOf(b[0]); + + return ((indexOfA > -1 ? indexOfA : Infinity) - (indexOfB > -1 ? indexOfB : Infinity)); + } + }); + } + + return fuzzysort.go(searchValue, languages, { + keys: ['0', '1', '2'], + limit: 5, + threshold: -10000, + }).map(result => result.obj); + } + + frequentlyUsed () { + const { languages, value } = this.props; + const current = languages.find(lang => lang[0] === value); + const results = []; + + if (current) { + results.push(current); + } + + return results; + } + + handleClick = e => { + const value = e.currentTarget.getAttribute('data-index'); + + e.preventDefault(); + + this.props.onClose(); + this.props.onChange(value); + } + + handleKeyDown = e => { + const { onClose } = this.props; + const index = Array.from(this.listNode.childNodes).findIndex(node => node === e.currentTarget); + + let element = null; + + switch(e.key) { + case 'Escape': + onClose(); + break; + case 'Enter': + this.handleClick(e); + break; + case 'ArrowDown': + element = this.listNode.childNodes[index + 1] || this.listNode.firstChild; + break; + case 'ArrowUp': + element = this.listNode.childNodes[index - 1] || this.listNode.lastChild; + break; + case 'Tab': + if (e.shiftKey) { + element = this.listNode.childNodes[index - 1] || this.listNode.lastChild; + } else { + element = this.listNode.childNodes[index + 1] || this.listNode.firstChild; + } + break; + case 'Home': + element = this.listNode.firstChild; + break; + case 'End': + element = this.listNode.lastChild; + break; + } + + if (element) { + element.focus(); + e.preventDefault(); + e.stopPropagation(); + } + } + + handleSearchKeyDown = e => { + const { onChange, onClose } = this.props; + const { searchValue } = this.state; + + let element = null; + + switch(e.key) { + case 'Tab': + case 'ArrowDown': + element = this.listNode.firstChild; + + if (element) { + element.focus(); + e.preventDefault(); + e.stopPropagation(); + } + + break; + case 'Enter': + element = this.listNode.firstChild; + + if (element) { + onChange(element.getAttribute('data-index')); + onClose(); + } + break; + case 'Escape': + if (searchValue !== '') { + e.preventDefault(); + this.handleClear(); + } + + break; + } + } + + handleClear = () => { + this.setState({ searchValue: '' }); + } + + renderItem = lang => { + const { value } = this.props; + + return ( + <div key={lang[0]} role='option' tabIndex='0' data-index={lang[0]} className={classNames('language-dropdown__dropdown__results__item', { active: lang[0] === value })} aria-selected={lang[0] === value} onClick={this.handleClick} onKeyDown={this.handleKeyDown}> + <span className='language-dropdown__dropdown__results__item__native-name'>{lang[2]}</span> <span className='language-dropdown__dropdown__results__item__common-name'>({lang[1]})</span> + </div> + ); + } + + render () { + const { style, placement, intl } = this.props; + const { mounted, searchValue } = this.state; + const isSearching = searchValue !== ''; + const results = this.search(); + + return ( + <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}> + {({ opacity, scaleX, scaleY }) => ( + // It should not be transformed when mounting because the resulting + // size will be used to determine the coordinate of the menu by + // react-overlays + <div className={`language-dropdown__dropdown ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null }} ref={this.setRef}> + <div className='emoji-mart-search'> + <input type='search' value={searchValue} onChange={this.handleSearchChange} onKeyDown={this.handleSearchKeyDown} placeholder={intl.formatMessage(messages.search)} autoFocus /> + <button className='emoji-mart-search-icon' disabled={!isSearching} aria-label={intl.formatMessage(messages.clear)} onClick={this.handleClear}>{!isSearching ? icons.loupe : icons.delete}</button> + </div> + + <div className='language-dropdown__dropdown__results emoji-mart-scroll' role='listbox' ref={this.setListRef}> + {results.map(this.renderItem)} + </div> + </div> + )} + </Motion> + ); + } + +} + +export default @injectIntl +class LanguageDropdown extends React.PureComponent { + + static propTypes = { + value: PropTypes.string, + frequentlyUsedLanguages: PropTypes.arrayOf(PropTypes.string), + intl: PropTypes.object.isRequired, + onChange: PropTypes.func, + onClose: PropTypes.func, + }; + + state = { + open: false, + placement: 'bottom', + }; + + handleToggle = ({ target }) => { + const { top } = target.getBoundingClientRect(); + + if (this.state.open && this.activeElement) { + this.activeElement.focus({ preventScroll: true }); + } + + this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' }); + this.setState({ open: !this.state.open }); + } + + handleClose = () => { + const { value, onClose } = this.props; + + if (this.state.open && this.activeElement) { + this.activeElement.focus({ preventScroll: true }); + } + + this.setState({ open: false }); + onClose(value); + } + + handleChange = value => { + const { onChange } = this.props; + onChange(value); + } + + render () { + const { value, intl, frequentlyUsedLanguages } = this.props; + const { open, placement } = this.state; + + return ( + <div className={classNames('privacy-dropdown', { active: open })}> + <div className='privacy-dropdown__value'> + <TextIconButton + className='privacy-dropdown__value-icon' + label={value && value.toUpperCase()} + title={intl.formatMessage(messages.changeLanguage)} + active={open} + onClick={this.handleToggle} + /> + </div> + + <Overlay show={open} placement={placement} target={this}> + <LanguageDropdownMenu + value={value} + frequentlyUsedLanguages={frequentlyUsedLanguages} + onClose={this.handleClose} + onChange={this.handleChange} + placement={placement} + intl={intl} + /> + </Overlay> + </div> + ); + } + +} diff --git a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js index c94db59c5..1f0e998d3 100644 --- a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js +++ b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js @@ -16,7 +16,7 @@ const messages = defineMessages({ unlisted_long: { id: 'privacy.unlisted.long', defaultMessage: 'Visible for all, but opted-out of discovery features' }, private_short: { id: 'privacy.private.short', defaultMessage: 'Followers only' }, private_long: { id: 'privacy.private.long', defaultMessage: 'Visible for followers only' }, - direct_short: { id: 'privacy.direct.short', defaultMessage: 'Only people I mention' }, + direct_short: { id: 'privacy.direct.short', defaultMessage: 'Mentioned people only' }, direct_long: { id: 'privacy.direct.long', defaultMessage: 'Visible for mentioned users only' }, change_privacy: { id: 'privacy.change', defaultMessage: 'Adjust status privacy' }, }); diff --git a/app/javascript/mastodon/features/compose/components/text_icon_button.js b/app/javascript/mastodon/features/compose/components/text_icon_button.js index f0b133538..cd644b680 100644 --- a/app/javascript/mastodon/features/compose/components/text_icon_button.js +++ b/app/javascript/mastodon/features/compose/components/text_icon_button.js @@ -17,11 +17,6 @@ export default class TextIconButton extends React.PureComponent { ariaControls: PropTypes.string, }; - handleClick = (e) => { - e.preventDefault(); - this.props.onClick(); - } - render () { const { label, title, active, ariaControls } = this.props; @@ -31,7 +26,7 @@ export default class TextIconButton extends React.PureComponent { aria-label={title} className={`text-icon-button ${active ? 'active' : ''}`} aria-expanded={active} - onClick={this.handleClick} + onClick={this.props.onClick} aria-controls={ariaControls} style={iconStyle} > {label} diff --git a/app/javascript/mastodon/features/compose/containers/language_dropdown_container.js b/app/javascript/mastodon/features/compose/containers/language_dropdown_container.js new file mode 100644 index 000000000..2a040a13f --- /dev/null +++ b/app/javascript/mastodon/features/compose/containers/language_dropdown_container.js @@ -0,0 +1,34 @@ +import { connect } from 'react-redux'; +import LanguageDropdown from '../components/language_dropdown'; +import { changeComposeLanguage } from 'mastodon/actions/compose'; +import { useLanguage } from 'mastodon/actions/languages'; +import { createSelector } from 'reselect'; +import { Map as ImmutableMap } from 'immutable'; + +const getFrequentlyUsedLanguages = createSelector([ + state => state.getIn(['settings', 'frequentlyUsedLanguages'], ImmutableMap()), +], languageCounters => ( + languageCounters.keySeq() + .sort((a, b) => languageCounters.get(a) - languageCounters.get(b)) + .reverse() + .toArray() +)); + +const mapStateToProps = state => ({ + frequentlyUsedLanguages: getFrequentlyUsedLanguages(state), + value: state.getIn(['compose', 'language']), +}); + +const mapDispatchToProps = dispatch => ({ + + onChange (value) { + dispatch(changeComposeLanguage(value)); + }, + + onClose (value) { + dispatch(useLanguage(value)); + }, + +}); + +export default connect(mapStateToProps, mapDispatchToProps)(LanguageDropdown); diff --git a/app/javascript/mastodon/features/followers/index.js b/app/javascript/mastodon/features/followers/index.js index 224e74b3d..5b7f402f8 100644 --- a/app/javascript/mastodon/features/followers/index.js +++ b/app/javascript/mastodon/features/followers/index.js @@ -19,6 +19,8 @@ import ColumnBackButton from '../../components/column_back_button'; import ScrollableList from '../../components/scrollable_list'; import MissingIndicator from 'mastodon/components/missing_indicator'; import TimelineHint from 'mastodon/components/timeline_hint'; +import LimitedAccountHint from '../account_timeline/components/limited_account_hint'; +import { getAccountHidden } from 'mastodon/selectors'; const mapStateToProps = (state, { params: { acct, id } }) => { const accountId = id || state.getIn(['accounts_map', acct]); @@ -37,6 +39,8 @@ const mapStateToProps = (state, { params: { acct, id } }) => { accountIds: state.getIn(['user_lists', 'followers', accountId, 'items']), hasMore: !!state.getIn(['user_lists', 'followers', accountId, 'next']), isLoading: state.getIn(['user_lists', 'followers', accountId, 'isLoading'], true), + suspended: state.getIn(['accounts', accountId, 'suspended'], false), + hidden: getAccountHidden(state, accountId), blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false), }; }; @@ -64,6 +68,8 @@ class Followers extends ImmutablePureComponent { isLoading: PropTypes.bool, blockedBy: PropTypes.bool, isAccount: PropTypes.bool, + suspended: PropTypes.bool, + hidden: PropTypes.bool, remote: PropTypes.bool, remoteUrl: PropTypes.string, multiColumn: PropTypes.bool, @@ -101,7 +107,7 @@ class Followers extends ImmutablePureComponent { }, 300, { leading: true }); render () { - const { accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props; + const { accountId, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, suspended, hidden, remote, remoteUrl } = this.props; if (!isAccount) { return ( @@ -121,7 +127,13 @@ class Followers extends ImmutablePureComponent { let emptyMessage; - if (blockedBy) { + const forceEmptyState = blockedBy || suspended || hidden; + + if (suspended) { + emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />; + } else if (hidden) { + emptyMessage = <LimitedAccountHint accountId={accountId} />; + } else if (blockedBy) { emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />; } else if (remote && accountIds.isEmpty()) { emptyMessage = <RemoteHint url={remoteUrl} />; @@ -137,7 +149,7 @@ class Followers extends ImmutablePureComponent { <ScrollableList scrollKey='followers' - hasMore={hasMore} + hasMore={!forceEmptyState && hasMore} isLoading={isLoading} onLoadMore={this.handleLoadMore} prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />} @@ -146,7 +158,7 @@ class Followers extends ImmutablePureComponent { emptyMessage={emptyMessage} bindToDocument={!multiColumn} > - {blockedBy ? [] : accountIds.map(id => + {forceEmptyState ? [] : accountIds.map(id => <AccountContainer key={id} id={id} withNote={false} />, )} </ScrollableList> diff --git a/app/javascript/mastodon/features/following/index.js b/app/javascript/mastodon/features/following/index.js index aadce1644..143082d76 100644 --- a/app/javascript/mastodon/features/following/index.js +++ b/app/javascript/mastodon/features/following/index.js @@ -19,6 +19,8 @@ import ColumnBackButton from '../../components/column_back_button'; import ScrollableList from '../../components/scrollable_list'; import MissingIndicator from 'mastodon/components/missing_indicator'; import TimelineHint from 'mastodon/components/timeline_hint'; +import LimitedAccountHint from '../account_timeline/components/limited_account_hint'; +import { getAccountHidden } from 'mastodon/selectors'; const mapStateToProps = (state, { params: { acct, id } }) => { const accountId = id || state.getIn(['accounts_map', acct]); @@ -37,6 +39,8 @@ const mapStateToProps = (state, { params: { acct, id } }) => { accountIds: state.getIn(['user_lists', 'following', accountId, 'items']), hasMore: !!state.getIn(['user_lists', 'following', accountId, 'next']), isLoading: state.getIn(['user_lists', 'following', accountId, 'isLoading'], true), + suspended: state.getIn(['accounts', accountId, 'suspended'], false), + hidden: getAccountHidden(state, accountId), blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false), }; }; @@ -64,6 +68,8 @@ class Following extends ImmutablePureComponent { isLoading: PropTypes.bool, blockedBy: PropTypes.bool, isAccount: PropTypes.bool, + suspended: PropTypes.bool, + hidden: PropTypes.bool, remote: PropTypes.bool, remoteUrl: PropTypes.string, multiColumn: PropTypes.bool, @@ -101,7 +107,7 @@ class Following extends ImmutablePureComponent { }, 300, { leading: true }); render () { - const { accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props; + const { accountId, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, suspended, hidden, remote, remoteUrl } = this.props; if (!isAccount) { return ( @@ -121,7 +127,13 @@ class Following extends ImmutablePureComponent { let emptyMessage; - if (blockedBy) { + const forceEmptyState = blockedBy || suspended || hidden; + + if (suspended) { + emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />; + } else if (hidden) { + emptyMessage = <LimitedAccountHint accountId={accountId} />; + } else if (blockedBy) { emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />; } else if (remote && accountIds.isEmpty()) { emptyMessage = <RemoteHint url={remoteUrl} />; @@ -137,7 +149,7 @@ class Following extends ImmutablePureComponent { <ScrollableList scrollKey='following' - hasMore={hasMore} + hasMore={!forceEmptyState && hasMore} isLoading={isLoading} onLoadMore={this.handleLoadMore} prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />} @@ -146,7 +158,7 @@ class Following extends ImmutablePureComponent { emptyMessage={emptyMessage} bindToDocument={!multiColumn} > - {blockedBy ? [] : accountIds.map(id => + {forceEmptyState ? [] : accountIds.map(id => <AccountContainer key={id} id={id} withNote={false} />, )} </ScrollableList> diff --git a/app/javascript/mastodon/features/mutes/index.js b/app/javascript/mastodon/features/mutes/index.js index c1d50d194..c21433cc4 100644 --- a/app/javascript/mastodon/features/mutes/index.js +++ b/app/javascript/mastodon/features/mutes/index.js @@ -69,7 +69,7 @@ class Mutes extends ImmutablePureComponent { bindToDocument={!multiColumn} > {accountIds.map(id => - <AccountContainer key={id} id={id} />, + <AccountContainer key={id} id={id} defaultAction='mute' />, )} </ScrollableList> </Column> diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js index c99e01f73..13bce1b83 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.js +++ b/app/javascript/mastodon/features/status/components/detailed_status.js @@ -185,7 +185,7 @@ class DetailedStatus extends ImmutablePureComponent { 'public': { icon: 'globe', text: intl.formatMessage(messages.public_short) }, 'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.unlisted_short) }, 'private': { icon: 'lock', text: intl.formatMessage(messages.private_short) }, - 'direct': { icon: 'envelope', text: intl.formatMessage(messages.direct_short) }, + 'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) }, }; const visibilityIcon = visibilityIconInfo[status.get('visibility')]; diff --git a/app/javascript/mastodon/features/ui/components/boost_modal.js b/app/javascript/mastodon/features/ui/components/boost_modal.js index f8a344690..ab87ee427 100644 --- a/app/javascript/mastodon/features/ui/components/boost_modal.js +++ b/app/javascript/mastodon/features/ui/components/boost_modal.js @@ -88,7 +88,7 @@ class BoostModal extends ImmutablePureComponent { 'public': { icon: 'globe', text: intl.formatMessage(messages.public_short) }, 'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.unlisted_short) }, 'private': { icon: 'lock', text: intl.formatMessage(messages.private_short) }, - 'direct': { icon: 'envelope', text: intl.formatMessage(messages.direct_short) }, + 'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) }, }; const visibilityIcon = visibilityIconInfo[status.get('visibility')]; diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js index db047f5f0..e665f4447 100644 --- a/app/javascript/mastodon/features/ui/components/columns_area.js +++ b/app/javascript/mastodon/features/ui/components/columns_area.js @@ -234,7 +234,7 @@ class ColumnsArea extends ImmutablePureComponent { </div> </div> - <div className='columns-area__panels__main'> + <div className={`columns-area__panels__main ${floatingActionButton && 'with-fab'}`}> <TabsBar key='tabs' /> {content} </div> diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 1307bf23e..51d023c8e 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -28,5 +28,6 @@ export const showTrends = getMeta('trends'); export const title = getMeta('title'); export const cropImages = getMeta('crop_images'); export const disableSwiping = getMeta('disable_swiping'); +export const languages = initialState && initialState.languages; export default initialState; diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json index fe91569bc..650a3b708 100644 --- a/app/javascript/mastodon/locales/af.json +++ b/app/javascript/mastodon/locales/af.json @@ -20,12 +20,12 @@ "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", "account.following": "Following", "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", - "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows.empty": "Die gebruiker volg nie tans iemand nie.", "account.follows_you": "Volg jou", "account.hide_reblogs": "Versteek hupstoot vanaf @{name}", "account.joined": "{date} aangesluit", "account.link_verified_on": "Eienaarskap van die skakel was getoets op {date}", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.locked_info": "Die rekening se privaatheidstatus is gesluit. Die eienaar hersien handmatig wie hom/haar kan volg.", "account.media": "Media", "account.mention": "Noem @{name}", "account.moved_to": "{name} is geskuif na:", @@ -43,7 +43,7 @@ "account.unblock_domain": "Ontblok domein {domain}", "account.unblock_short": "Ontblok", "account.unendorse": "Moenie beklemtoon op profiel nie", - "account.unfollow": "Unfollow", + "account.unfollow": "Ontvolg", "account.unmute": "Ontdemp @{name}", "account.unmute_notifications": "Ontdemp kennisgewings vanaf @{name}", "account.unmute_short": "Ontdemp", @@ -57,56 +57,58 @@ "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "An unexpected error occurred.", "alert.unexpected.title": "Oops!", - "announcement.announcement": "Announcement", + "announcement.announcement": "Aankondiging", "attachments_list.unprocessed": "(unprocessed)", "autosuggest_hashtag.per_week": "{count} per week", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", + "bundle_column_error.retry": "Probeer weer", + "bundle_column_error.title": "Netwerk fout", "bundle_modal_error.close": "Close", - "bundle_modal_error.message": "Something went wrong while loading this component.", - "bundle_modal_error.retry": "Try again", + "bundle_modal_error.message": "Iets het verkeerd gegaan terwyl hierdie komponent besig was om te laai.", + "bundle_modal_error.retry": "Probeer weer", "column.blocks": "Blocked users", - "column.bookmarks": "Bookmarks", - "column.community": "Local timeline", - "column.conversations": "Conversations", - "column.directory": "Browse profiles", - "column.domain_blocks": "Blocked domains", - "column.favourites": "Favourites", - "column.follow_requests": "Follow requests", - "column.home": "Home", - "column.lists": "Lists", - "column.mutes": "Muted users", - "column.notifications": "Notifications", + "column.bookmarks": "Boekmerke", + "column.community": "Plaaslike tydlyn", + "column.direct": "Direkte boodskappe", + "column.directory": "Blaai deur profiele", + "column.domain_blocks": "Geblokte domeine", + "column.favourites": "Gunstelinge", + "column.follow_requests": "Volgversoeke", + "column.home": "Tuis", + "column.lists": "Lyste", + "column.mutes": "Gedempte gebruikers", + "column.notifications": "Kennisgewings", "column.pins": "Pinned toot", - "column.public": "Federated timeline", - "column_back_button.label": "Back", - "column_header.hide_settings": "Hide settings", - "column_header.moveLeft_settings": "Move column to the left", - "column_header.moveRight_settings": "Move column to the right", - "column_header.pin": "Pin", - "column_header.show_settings": "Show settings", - "column_header.unpin": "Unpin", - "column_subheading.settings": "Settings", - "community.column_settings.local_only": "Local only", + "column.public": "Gefedereerde tydlyn", + "column_back_button.label": "Terug", + "column_header.hide_settings": "Versteek instellings", + "column_header.moveLeft_settings": "Skuif kolom na links", + "column_header.moveRight_settings": "Skuif kolom na regs", + "column_header.pin": "Pen vas", + "column_header.show_settings": "Wys instellings", + "column_header.unpin": "Ontpen", + "column_subheading.settings": "Instellings", + "community.column_settings.local_only": "Slegs plaaslik", "community.column_settings.media_only": "Media only", - "community.column_settings.remote_only": "Remote only", - "compose_form.direct_message_warning_learn_more": "Learn more", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "community.column_settings.remote_only": "Slegs afgeleë", + "compose.language.change": "Verander taal", + "compose.language.search": "Soek tale...", + "compose_form.direct_message_warning_learn_more": "Leer meer", + "compose_form.encryption_warning": "Plasings op Mastodon het nie end-tot-end enkripsie nie. Moet nie enige gevaarlike inligting oor Mastodon deel nie.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", - "compose_form.lock_disclaimer.lock": "locked", + "compose_form.lock_disclaimer.lock": "gesluit", "compose_form.placeholder": "What is on your mind?", - "compose_form.poll.add_option": "Add a choice", - "compose_form.poll.duration": "Poll duration", - "compose_form.poll.option_placeholder": "Choice {number}", - "compose_form.poll.remove_option": "Remove this choice", - "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices", - "compose_form.poll.switch_to_single": "Change poll to allow for a single choice", - "compose_form.publish": "Toot", + "compose_form.poll.add_option": "Voeg 'n keuse by", + "compose_form.poll.duration": "Duur van peiling", + "compose_form.poll.option_placeholder": "Keuse {number}", + "compose_form.poll.remove_option": "Verwyder hierdie keuse", + "compose_form.poll.switch_to_multiple": "Verander die peiling na verskeie keuses", + "compose_form.poll.switch_to_single": "Verander die peiling na 'n enkel keuse", + "compose_form.publish": "Toet", "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Save changes", + "compose_form.save_changes": "Stoor veranderinge", "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}", "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}", "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", + "emoji_button.clear": "Maak skoon", "emoji_button.custom": "Custom", "emoji_button.flags": "Flags", "emoji_button.food": "Food & Drink", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "Jy het nog nie direkte boodskappe nie. Wanneer jy een stuur of ontvang, sal dit hier verskyn.", "empty_column.domain_blocks": "There are no blocked domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "om direkte boodskappe kolom oop te maak", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Vertoon profiel in elkgeval", + "limited_account_hint.title": "Hierdie profiel is deur moderators van jou bediener versteek.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direkte boodskappe", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Remove poll", "privacy.change": "Adjust status privacy", "privacy.direct.long": "Visible for mentioned users only", - "privacy.direct.short": "Direct", + "privacy.direct.short": "Slegs genoemde persone", "privacy.private.long": "Visible for followers only", "privacy.private.short": "Followers-only", "privacy.public.long": "Visible for all", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index ac93bf706..1f113213c 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -70,17 +70,17 @@ "column.blocks": "المُستَخدِمون المَحظورون", "column.bookmarks": "الفواصل المرجعية", "column.community": "الخيط الزمني المحلي", - "column.conversations": "المحادثات", + "column.direct": "الرسائل المباشِرة", "column.directory": "تَصَفُّحُ المَلفات الشخصية", - "column.domain_blocks": "النِّطاقَاتُ المَحظُورَة", + "column.domain_blocks": "النطاقات المحظورة", "column.favourites": "المُفَضَّلَة", - "column.follow_requests": "طَلَبَاتُ المُتَابَعَة", + "column.follow_requests": "طلبات المتابعة", "column.home": "الرئيسية", "column.lists": "القوائم", "column.mutes": "المُستَخدِمون المَكتومون", "column.notifications": "الإشعارات", "column.pins": "المنشورات المُثَبَّتَة", - "column.public": "الخَطُّ الزَّمَنِيُّ المُوَحَّد", + "column.public": "الخيط الزمني المُوَحَّد", "column_back_button.label": "العودة", "column_header.hide_settings": "إخفاء الإعدادات", "column_header.moveLeft_settings": "نقل العامود إلى اليسار", @@ -92,8 +92,10 @@ "community.column_settings.local_only": "المحلي فقط", "community.column_settings.media_only": "الوسائط فقط", "community.column_settings.remote_only": "عن بُعد فقط", + "compose.language.change": "تغيير اللغة", + "compose.language.search": "البحث عن لغة…", "compose_form.direct_message_warning_learn_more": "تَعَلَّم المَزيد", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.encryption_warning": "إنّ المنشورات على ماستدون ليست مشفرة من النهاية إلى النهاية. لا تشارك أي معلومات حساسة عبر ماستدون.", "compose_form.hashtag_warning": "لن يُدرَج هذا المنشور تحت أي وسم بما أنَّه غير مُدرَج. فقط المنشورات العامة يُمكن البحث عنها بواسطة الوسم.", "compose_form.lock_disclaimer": "حسابُك غير {locked}. يُمكن لأي شخص مُتابعتك لرؤية (منشورات المتابعين فقط).", "compose_form.lock_disclaimer.lock": "مُقفَل", @@ -104,7 +106,7 @@ "compose_form.poll.remove_option": "إزالة هذا الخيار", "compose_form.poll.switch_to_multiple": "تغيِير الاستطلاع للسماح باِخيارات مُتعدِّدة", "compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط", - "compose_form.publish": "تبويق", + "compose_form.publish": "بوّق", "compose_form.publish_loud": "{publish}!", "compose_form.save_changes": "احفظ التعديلات", "compose_form.sensitive.hide": "{count, plural, one {الإشارة إلى الوَسط كمُحتوى حسّاس} two{الإشارة إلى الوسطان كمُحتويان حسّاسان} other {الإشارة إلى الوسائط كمُحتويات حسّاسة}}", @@ -130,7 +132,7 @@ "confirmations.mute.confirm": "أكتم", "confirmations.mute.explanation": "هذا سيخفي المنشورات عنهم وتلك المشار فيها إليهم، لكنه سيسمح لهم برؤية منشوراتك ومتابعتك.", "confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟", - "confirmations.redraft.confirm": "إزالة و إعادة الصياغة", + "confirmations.redraft.confirm": "إزالة وإعادة الصياغة", "confirmations.redraft.message": "هل أنت متأكد من أنك تريد حذف هذا المنشور و إعادة صياغته؟ سوف تفقد جميع الإعجابات و الترقيات أما الردود المتصلة به فستُصبِح يتيمة.", "confirmations.reply.confirm": "رد", "confirmations.reply.message": "الرد في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد كتابتها. متأكد من أنك تريد المواصلة؟", @@ -147,12 +149,13 @@ "embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", "embed.preview": "هكذا ما سوف يبدو عليه:", "emoji_button.activity": "الأنشطة", + "emoji_button.clear": "امسح", "emoji_button.custom": "مخصص", "emoji_button.flags": "الأعلام", "emoji_button.food": "الطعام والشراب", "emoji_button.label": "أدرج إيموجي", "emoji_button.nature": "الطبيعة", - "emoji_button.not_found": "لا إيموجو!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "لا توجد هناك وجوه تعبيرية مطابقة", "emoji_button.objects": "أشياء", "emoji_button.people": "الناس", "emoji_button.recent": "الشائعة الاستخدام", @@ -166,9 +169,9 @@ "empty_column.blocks": "لم تقم بحظر أي مستخدِم بعد.", "empty_column.bookmarked_statuses": "ليس لديك أية منشورات في الفواصل المرجعية بعد. عندما ستقوم بإضافة البعض منها، ستظهر هنا.", "empty_column.community": "الخط العام المحلي فارغ. أكتب شيئا ما للعامة كبداية!", - "empty_column.conversations": "عندما ترسل أو تستلم منشورًا محصورٌا على الأشخاص المشار إليهم فيه، سيظهر هنا.", + "empty_column.direct": "لم تتلق أية رسالة خاصة مباشِرة بعد. سوف يتم عرض الرسائل المباشرة هنا إن قمت بإرسال واحدة أو تلقيت البعض منها.", "empty_column.domain_blocks": "ليس هناك نطاقات مخفية بعد.", - "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", + "empty_column.explore_statuses": "ليس هناك ما هو متداوَل الآن. عد في وقت لاحق!", "empty_column.favourited_statuses": "ليس لديك أية منشورات مفضلة بعد. عندما ستقوم بالإعجاب بواحدة، ستظهر هنا.", "empty_column.favourites": "لم يقم أي أحد بالإعجاب بهذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.", "empty_column.follow_recommendations": "يبدو أنه لا يمكن إنشاء أي اقتراحات لك. يمكنك البحث عن أشخاص قد تعرفهم أو استكشاف الوسوم الرائجة.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "للترقية", "keyboard_shortcuts.column": "للتركيز على منشور على أحد الأعمدة", "keyboard_shortcuts.compose": "للتركيز على نافذة تحرير النصوص", - "keyboard_shortcuts.conversations": "لفتح عمود المحادثات", "keyboard_shortcuts.description": "الوصف", + "keyboard_shortcuts.direct": "لفتح عمود الرسائل المباشرة", "keyboard_shortcuts.down": "للانتقال إلى أسفل القائمة", "keyboard_shortcuts.enter": "لفتح المنشور", "keyboard_shortcuts.favourite": "للإضافة إلى المفضلة", @@ -264,6 +267,8 @@ "lightbox.expand": "توسيع مربع عرض الصور", "lightbox.next": "التالي", "lightbox.previous": "العودة", + "limited_account_hint.action": "إظهار الملف التعريفي على أي حال", + "limited_account_hint.title": "أخف مشرف الخادم هذا الملف التعريفي.", "lists.account.add": "أضف إلى القائمة", "lists.account.remove": "احذف من القائمة", "lists.delete": "احذف القائمة", @@ -278,8 +283,8 @@ "lists.search": "إبحث في قائمة الحسابات التي تُتابِعها", "lists.subheading": "قوائمك", "load_pending": "{count, plural, one {# عنصر جديد} other {# عناصر جديدة}}", - "loading_indicator.label": "تحميل...", - "media_gallery.toggle_visible": "عرض / إخفاء", + "loading_indicator.label": "جارٍ التحميل…", + "media_gallery.toggle_visible": "{number, plural, zero {} one {اخف الصورة} two {اخف الصورتين} few {اخف الصور} many {اخف الصور} other {اخف الصور}}", "missing_indicator.label": "غير موجود", "missing_indicator.sublabel": "تعذر العثور على هذا المورد", "mute_modal.duration": "المدة", @@ -288,10 +293,11 @@ "navigation_bar.apps": "تطبيقات الأجهزة المحمولة", "navigation_bar.blocks": "الحسابات المحجوبة", "navigation_bar.bookmarks": "الفواصل المرجعية", - "navigation_bar.community_timeline": "الخيط العام المحلي", - "navigation_bar.compose": "لتحرير منشور جديد", + "navigation_bar.community_timeline": "الخيط المحلي", + "navigation_bar.compose": "تحرير منشور جديد", + "navigation_bar.direct": "الرسائل المباشِرة", "navigation_bar.discover": "اكتشف", - "navigation_bar.domain_blocks": "النطاقات المخفية", + "navigation_bar.domain_blocks": "النطاقات المحظورة", "navigation_bar.edit_profile": "عدّل الملف التعريفي", "navigation_bar.explore": "استكشف", "navigation_bar.favourites": "المفضلة", @@ -365,13 +371,13 @@ "poll_button.add_poll": "إضافة استطلاع للرأي", "poll_button.remove_poll": "إزالة استطلاع الرأي", "privacy.change": "اضبط خصوصية المنشور", - "privacy.direct.long": "أنشر إلى المستخدمين المشار إليهم فقط", - "privacy.direct.short": "للمشار إليهم فقط", + "privacy.direct.long": "مرئي للمستخدمين المذكورين فقط", + "privacy.direct.short": "الأشخاص المشار إليهم فقط", "privacy.private.long": "أنشر لمتابعيك فقط", "privacy.private.short": "للمتابِعين فقط", "privacy.public.long": "مرئي للكل", "privacy.public.short": "للعامة", - "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", + "privacy.unlisted.long": "مرئي للجميع، ولكن مِن دون ميزات الاكتشاف", "privacy.unlisted.short": "غير مدرج", "refresh": "أنعِش", "regeneration_indicator.label": "جارٍ التحميل…", @@ -393,8 +399,8 @@ "report.categories.other": "أخرى", "report.categories.spam": "مزعج", "report.categories.violation": "المحتوى ينتهك شرطا أو عدة شروط استخدام للخادم", - "report.category.subtitle": "Choose the best match", - "report.category.title": "Tell us what's going on with this {type}", + "report.category.subtitle": "اختر أفضل تطابق", + "report.category.title": "وضح لنا ما أمر {type}", "report.category.title_account": "ملف تعريفي", "report.category.title_status": "منشور", "report.close": "تم", @@ -410,16 +416,16 @@ "report.reasons.other": "شيء آخر", "report.reasons.other_description": "لا تندرج هذه المشكلة ضمن فئات أخرى", "report.reasons.spam": "إنها رسالة مزعجة", - "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies", + "report.reasons.spam_description": "روابط خبيثة أو تفاعل كاذب أو ردود متكررة", "report.reasons.violation": "ينتهك قواعد الخادم", - "report.reasons.violation_description": "You are aware that it breaks specific rules", - "report.rules.subtitle": "Select all that apply", + "report.reasons.violation_description": "تعلم أنه ينتهك قواعد محددة", + "report.rules.subtitle": "اختر كل ما ينطبق", "report.rules.title": "ما هي القواعد المنتهكة؟", - "report.statuses.subtitle": "Select all that apply", + "report.statuses.subtitle": "اختر كل ما ينطبق", "report.statuses.title": "هل توجد مشاركات تدعم صحة هذا البلاغ؟", "report.submit": "إرسال", "report.target": "ابلغ عن {target}", - "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:", + "report.thanks.take_action": "يمكنك هنا التحكم في ما يعرض لك على ماستدون:", "report.thanks.take_action_actionable": "في أثناء مراجعتنا للبلاغ، يمكنك اتخاذ إجراء ضد @{name}:", "report.thanks.title": "هل ترغب في مشاهدة هذا؟", "report.thanks.title_actionable": "شُكرًا لَكَ على الإبلاغ، سَوفَ نَنظُرُ فِي هَذَا الأمر.", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 3400e3cd1..148527b96 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -70,7 +70,7 @@ "column.blocks": "Usuarios bloquiaos", "column.bookmarks": "Marcadores", "column.community": "Llinia temporal llocal", - "column.conversations": "Conversations", + "column.direct": "Mensaxes direutos", "column.directory": "Browse profiles", "column.domain_blocks": "Dominios anubríos", "column.favourites": "Favoritos", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Namái multimedia", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Saber más", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Empotra esti estáu nun sitiu web copiando'l códigu d'embaxo.", "embed.preview": "Asina ye cómo va vese:", "emoji_button.activity": "Actividaes", + "emoji_button.clear": "Clear", "emoji_button.custom": "Custom", "emoji_button.flags": "Banderes", "emoji_button.food": "Comida y bébora", @@ -166,7 +169,7 @@ "empty_column.blocks": "Entá nun bloquiesti a nengún usuariu.", "empty_column.bookmarked_statuses": "Entá nun tienes nengún barritu en Marcadores. Cuando amiestes unu, va amosase equí.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "Entá nun tienes nengún mensaxe direutu. Cuando unvies o recibas dalgún, apaez equí.", "empty_column.domain_blocks": "Entá nun hai dominios anubríos.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Entá nun tienes nengún barritu en Favoritos. Cuando amiestes unu, va amosase equí.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "pa compartir un toot", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "Enfocar l'área de composición", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Descripción", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "pa baxar na llista", "keyboard_shortcuts.enter": "p'abrir estaos", "keyboard_shortcuts.favourite": "p'amestar a Favoritos", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Siguiente", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Amestar a la llista", "lists.account.remove": "Desaniciar de la llista", "lists.delete": "Desaniciar la llista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Marcadores", "navigation_bar.community_timeline": "Llinia temporal llocal", "navigation_bar.compose": "Compose new post", + "navigation_bar.direct": "Mensaxes direutos", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Dominios anubríos", "navigation_bar.edit_profile": "Editar el perfil", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 42cd08f1f..06d4760f0 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -70,7 +70,7 @@ "column.blocks": "Блокирани потребители", "column.bookmarks": "Отметки", "column.community": "Локална емисия", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Преглед на профили", "column.domain_blocks": "Hidden domains", "column.favourites": "Любими", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Само локално", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Само дистанционно", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Още информация", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Тази публикация няма да бъде изброена под нито един хаштаг, тъй като е скрита. Само публични публикации могат да се търсят по хаштаг.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Ето как ще изглежда:", "emoji_button.activity": "Дейност", + "emoji_button.clear": "Clear", "emoji_button.custom": "Персонализирано", "emoji_button.flags": "Знамена", "emoji_button.food": "Храна и напитки", @@ -166,7 +169,7 @@ "empty_column.blocks": "Не сте блокирали потребители все още.", "empty_column.bookmarked_statuses": "Все още нямате отметнати публикации. Когато отметнете някоя, тя ще се покаже тук.", "empty_column.community": "Локалната емисия е празна. Напишете нещо публично, за да започнете!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no hidden domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Все още нямате любими публикации. Когато поставите някоя в любими, тя ще се покаже тук.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "за споделяне", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "за фокусиране на текстовото пространство за композиране", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Описание", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "за придвижване надолу в списъка", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "за поставяне в любими", @@ -264,6 +267,8 @@ "lightbox.expand": "Разгъване на полето за преглед на изображение", "lightbox.next": "Напред", "lightbox.previous": "Назад", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Добавяне към списък", "lists.account.remove": "Премахване от списък", "lists.delete": "Изтриване на списък", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Отметки", "navigation_bar.community_timeline": "Локална емисия", "navigation_bar.compose": "Композиране на нова публикация", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Откриване", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Редактирай профил", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index b009d5964..e89f4690b 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -70,7 +70,7 @@ "column.blocks": "যাদের ব্লক করা হয়েছে", "column.bookmarks": "বুকমার্ক", "column.community": "স্থানীয় সময়সারি", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "প্রোফাইল ব্রাউজ করুন", "column.domain_blocks": "লুকোনো ডোমেনগুলি", "column.favourites": "পছন্দের গুলো", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "শুধুমাত্র স্থানীয়", "community.column_settings.media_only": "শুধুমাত্র ছবি বা ভিডিও", "community.column_settings.remote_only": "শুধুমাত্র দূরবর্তী", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "আরো জানুন", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "কোনো হ্যাশট্যাগের ভেতরে এই টুটটি থাকবেনা কারণ এটি তালিকাবহির্ভূত। শুধুমাত্র প্রকাশ্য ঠোটগুলো হ্যাশট্যাগের ভেতরে খুঁজে পাওয়া যাবে।", @@ -147,6 +149,7 @@ "embed.instructions": "এই লেখাটি আপনার ওয়েবসাইটে যুক্ত করতে নিচের কোডটি বেবহার করুন।", "embed.preview": "সেটা দেখতে এরকম হবে:", "emoji_button.activity": "কার্যকলাপ", + "emoji_button.clear": "Clear", "emoji_button.custom": "প্রথা", "emoji_button.flags": "পতাকা", "emoji_button.food": "খাদ্য ও পানীয়", @@ -166,7 +169,7 @@ "empty_column.blocks": "আপনি কোনো ব্যবহারকারীদের ব্লক করেন নি।", "empty_column.bookmarked_statuses": "আপনার কাছে এখনও কোনও বুকমার্কড টুট নেই। আপনি যখন একটি বুকমার্ক করেন, এটি এখানে প্রদর্শিত হবে।", "empty_column.community": "স্থানীয় সময়রেখাতে কিছু নেই। প্রকাশ্যভাবে কিছু লিখে লেখালেখির উদ্বোধন করে ফেলুন!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "এখনও কোনও লুকানো ডোমেন নেই।", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "আপনার পছন্দের কোনো টুট এখনো নেই। আপনি কোনো লেখা পছন্দের হিসেবে চিহ্নিত করলে এখানে পাওয়া যাবে।", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "সমর্থন করতে", "keyboard_shortcuts.column": "কোনো কলামএ কোনো লেখা ফোকাস করতে", "keyboard_shortcuts.compose": "লেখা সম্পদনার জায়গায় ফোকাস করতে", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "বিবরণ", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "তালিকার ভেতরে নিচে যেতে", "keyboard_shortcuts.enter": "অবস্থা দেখতে", "keyboard_shortcuts.favourite": "পছন্দের দেখতে", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "পরবর্তী", "lightbox.previous": "পূর্ববর্তী", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "তালিকাতে যুক্ত করতে", "lists.account.remove": "তালিকা থেকে বাদ দিতে", "lists.delete": "তালিকা মুছে ফেলতে", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "বুকমার্ক", "navigation_bar.community_timeline": "স্থানীয় সময়রেখা", "navigation_bar.compose": "নতুন টুট লিখুন", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "ঘুরে দেখুন", "navigation_bar.domain_blocks": "লুকানো ডোমেনগুলি", "navigation_bar.edit_profile": "নিজের পাতা সম্পাদনা করতে", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 74d430b50..cbe7fc6cb 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -70,7 +70,7 @@ "column.blocks": "Implijer·ezed·ien berzet", "column.bookmarks": "Sinedoù", "column.community": "Red-amzer lec'hel", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Mont a-dreuz ar profiloù", "column.domain_blocks": "Domani berzet", "column.favourites": "Muiañ-karet", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Nemet lec'hel", "community.column_settings.media_only": "Nemet Mediaoù", "community.column_settings.remote_only": "Nemet a-bell", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Gouzout hiroc'h", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Ne vo ket lakaet an toud-mañ er rolloù gerioù-klik dre mard eo anlistennet. N'eus nemet an toudoù foran a c'hall bezañ klasket dre c'her-klik.", @@ -147,6 +149,7 @@ "embed.instructions": "Enkorfit ar statud war ho lec'hienn en ur eilañ ar c'hod dindan.", "embed.preview": "Setu penaos e vo diskouezet:", "emoji_button.activity": "Obererezh", + "emoji_button.clear": "Clear", "emoji_button.custom": "Kempennet", "emoji_button.flags": "Bannieloù", "emoji_button.food": "Boued hag Evaj", @@ -166,7 +169,7 @@ "empty_column.blocks": "N'eus ket bet berzet implijer·ez ganeoc'h c'hoazh.", "empty_column.bookmarked_statuses": "N'ho peus toud ebet enrollet en ho sinedoù c'hoazh. Pa vo ouzhpennet unan ganeoc'h e teuio war wel amañ.", "empty_column.community": "Goulo eo ar red-amzer lec'hel. Skrivit'ta un dra evit lakaat tan dezhi !", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "N'eus domani kuzh ebet c'hoazh.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "N'ho peus toud muiañ-karet ebet c'hoazh. Pa vo lakaet unan ganeoc'h e vo diskouezet amañ.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "da skignañ", "keyboard_shortcuts.column": "Fokus ar bann", "keyboard_shortcuts.compose": "Fokus an takad testenn", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Deskrivadur", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "Diskennañ er roll", "keyboard_shortcuts.enter": "evit digeriñ un toud", "keyboard_shortcuts.favourite": "Lakaat an toud evel muiañ-karet", @@ -264,6 +267,8 @@ "lightbox.expand": "Ledanaat boest hewel ar skeudenn", "lightbox.next": "Da-heul", "lightbox.previous": "A-raok", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Ouzhpennañ d'al listenn", "lists.account.remove": "Lemel kuit eus al listenn", "lists.delete": "Dilemel al listenn", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Sinedoù", "navigation_bar.community_timeline": "Red-amzer lec'hel", "navigation_bar.compose": "Skrivañ un toud nevez", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Dizoleiñ", "navigation_bar.domain_blocks": "Domanioù kuzhet", "navigation_bar.edit_profile": "Aozañ ar profil", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 16de55828..1072001b4 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -1,24 +1,24 @@ { "account.account_note_header": "Nota", - "account.add_or_remove_from_list": "Afegeix o treu de les llistes", + "account.add_or_remove_from_list": "Afegeix o elimina de les llistes", "account.badges.bot": "Bot", "account.badges.group": "Grup", "account.block": "Bloqueja @{name}", - "account.block_domain": "Amaga-ho tot de {domain}", + "account.block_domain": "Bloqueja el domini {domain}", "account.blocked": "Bloquejat", "account.browse_more_on_origin_server": "Navega més en el perfil original", "account.cancel_follow_request": "Anul·la la sol·licitud de seguiment", "account.direct": "Envia missatge directe a @{name}", - "account.disable_notifications": "Deixa de notificar-me les publicacions de @{name}", + "account.disable_notifications": "No em notifiquis les publicacions de @{name}", "account.domain_blocked": "Domini bloquejat", "account.edit_profile": "Edita el perfil", "account.enable_notifications": "Notifica’m les publicacions de @{name}", "account.endorse": "Recomana en el teu perfil", "account.follow": "Segueix", "account.followers": "Seguidors", - "account.followers.empty": "Encara ningú no segueix aquest usuari.", + "account.followers.empty": "Ningú segueix aquest usuari encara.", "account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidors}}", - "account.following": "Seguits", + "account.following": "Seguint", "account.following_counter": "{count, plural, other {{counter} Seguint}}", "account.follows.empty": "Aquest usuari encara no segueix ningú.", "account.follows_you": "Et segueix", @@ -26,8 +26,8 @@ "account.joined": "Membre des de {date}", "account.link_verified_on": "La propietat d'aquest enllaç es va verificar el dia {date}", "account.locked_info": "Aquest estat de privadesa del compte està definit com a bloquejat. El propietari revisa manualment qui pot seguir-lo.", - "account.media": "Mèdia", - "account.mention": "Esmenta @{name}", + "account.media": "Multimèdia", + "account.mention": "Menciona @{name}", "account.moved_to": "{name} s'ha traslladat a:", "account.mute": "Silencia @{name}", "account.mute_notifications": "Silencia les notificacions de @{name}", @@ -41,10 +41,10 @@ "account.statuses_counter": "{count, plural, one {{counter} Publicació} other {{counter} Publicacions}}", "account.unblock": "Desbloqueja @{name}", "account.unblock_domain": "Desbloqueja el domini {domain}", - "account.unblock_short": "Desbloqueja", - "account.unendorse": "No recomanis en el perfil", - "account.unfollow": "Deixa de seguir", - "account.unmute": "Deixa de silenciar @{name}", + "account.unblock_short": "Desbloquejar", + "account.unendorse": "No recomanar en el perfil", + "account.unfollow": "Deixar de seguir", + "account.unmute": "Deixar de silenciar @{name}", "account.unmute_notifications": "Activar notificacions de @{name}", "account.unmute_short": "Deixa de silenciar", "account_note.placeholder": "Fes clic per afegir una nota", @@ -62,16 +62,16 @@ "autosuggest_hashtag.per_week": "{count} per setmana", "boost_modal.combo": "Pots prémer {combo} per evitar-ho el pròxim cop", "bundle_column_error.body": "S'ha produït un error en carregar aquest component.", - "bundle_column_error.retry": "Torna-ho a provar", + "bundle_column_error.retry": "Tornar-ho a provar", "bundle_column_error.title": "Error de connexió", "bundle_modal_error.close": "Tanca", "bundle_modal_error.message": "S'ha produït un error en carregar aquest component.", - "bundle_modal_error.retry": "Torna-ho a provar", + "bundle_modal_error.retry": "Tornar-ho a provar", "column.blocks": "Usuaris bloquejats", "column.bookmarks": "Marcadors", "column.community": "Línia de temps local", - "column.conversations": "Converses", - "column.directory": "Navega pels perfils", + "column.direct": "Missatges directes", + "column.directory": "Navegar pels perfils", "column.domain_blocks": "Dominis bloquejats", "column.favourites": "Favorits", "column.follow_requests": "Peticions per a seguir-te", @@ -92,19 +92,21 @@ "community.column_settings.local_only": "Només local", "community.column_settings.media_only": "Només multimèdia", "community.column_settings.remote_only": "Només remot", + "compose.language.change": "Canvia d'idioma", + "compose.language.search": "Cerca idiomes...", "compose_form.direct_message_warning_learn_more": "Més informació", "compose_form.encryption_warning": "Les publicacions a Mastodon no estant xifrades punt a punt. No comparteixis informació perillosa mitjançant Mastodon.", "compose_form.hashtag_warning": "Aquesta publicació no es mostrarà en cap etiqueta, ja que no està llistada. Només les publicacions públiques es poden cercar per etiqueta.", - "compose_form.lock_disclaimer": "El teu compte no està bloquejat {locked}. Tothom pot seguir-te i veure els teus missatges només per a seguidors.", + "compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure les publicacions de només per a seguidors.", "compose_form.lock_disclaimer.lock": "bloquejat", "compose_form.placeholder": "Què et passa pel cap?", - "compose_form.poll.add_option": "Afegeix una opció", + "compose_form.poll.add_option": "Afegir una opció", "compose_form.poll.duration": "Durada de l'enquesta", "compose_form.poll.option_placeholder": "Opció {number}", "compose_form.poll.remove_option": "Elimina aquesta opció", "compose_form.poll.switch_to_multiple": "Canvia l’enquesta per a permetre diverses opcions", "compose_form.poll.switch_to_single": "Canvia l’enquesta per permetre una única opció", - "compose_form.publish": "Publica", + "compose_form.publish": "Publicar", "compose_form.publish_loud": "{publish}!", "compose_form.save_changes": "Desa els canvis", "compose_form.sensitive.hide": "{count, plural, one {Marca contingut com a sensible} other {Marca contingut com a sensible}}", @@ -118,7 +120,7 @@ "confirmations.block.confirm": "Bloqueja", "confirmations.block.message": "Segur que vols bloquejar a {name}?", "confirmations.delete.confirm": "Suprimeix", - "confirmations.delete.message": "Segur que vols suprimir aquesta publicació?", + "confirmations.delete.message": "Segur que vols eliminar la publicació?", "confirmations.delete_list.confirm": "Suprimeix", "confirmations.delete_list.message": "Segur que vols suprimir permanentment aquesta llista?", "confirmations.discard_edit_media.confirm": "Descarta", @@ -138,7 +140,7 @@ "confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?", "conversation.delete": "Elimina la conversa", "conversation.mark_as_read": "Marca com a llegida", - "conversation.open": "Veure conversa", + "conversation.open": "Mostra la conversa", "conversation.with": "Amb {names}", "directory.federated": "Del fedivers conegut", "directory.local": "Només de {domain}", @@ -147,6 +149,7 @@ "embed.instructions": "Incrusta aquesta publicació a la teva pàgina web copiant el codi següent.", "embed.preview": "Aquí està quin aspecte tindrà:", "emoji_button.activity": "Activitat", + "emoji_button.clear": "Neteja", "emoji_button.custom": "Personalitzat", "emoji_button.flags": "Banderes", "emoji_button.food": "Menjar i beure", @@ -161,12 +164,12 @@ "emoji_button.symbols": "Símbols", "emoji_button.travel": "Viatges i llocs", "empty_column.account_suspended": "Compte suspès", - "empty_column.account_timeline": "Aquí no hi ha publicacions!", + "empty_column.account_timeline": "No hi ha publicacions aquí!", "empty_column.account_unavailable": "Perfil no disponible", "empty_column.blocks": "Encara no has bloquejat cap usuari.", "empty_column.bookmarked_statuses": "Encara no has marcat com publicació com a preferida. Quan en marquis una apareixerà aquí.", "empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per posar-ho tot en marxa!", - "empty_column.conversations": "Cada vegada que envies o reps una publicació que és només visible per la gent que hi has mencionat en ella, serà mostrada aquí.", + "empty_column.direct": "Encara no tens missatges directes. Quan n'enviïs o en rebis, es mostraran aquí.", "empty_column.domain_blocks": "Encara no hi ha dominis bloquejats.", "empty_column.explore_statuses": "No hi ha res en tendència ara mateix. Revisa-ho més tard!", "empty_column.favourited_statuses": "Encara no has marcat cap publicació com a preferida. Quan les marquis, apareixeran aquí.", @@ -227,14 +230,14 @@ "intervals.full.minutes": "{number, plural, one {# minut} other {# minuts}}", "keyboard_shortcuts.back": "Anar enrere", "keyboard_shortcuts.blocked": "Obre la llista d'usuaris bloquejats", - "keyboard_shortcuts.boost": "Impulsa publicació", + "keyboard_shortcuts.boost": "Impulsa la publicació", "keyboard_shortcuts.column": "Centra la columna", "keyboard_shortcuts.compose": "Centra l'àrea de composició del text", - "keyboard_shortcuts.conversations": "per a obrir la columna de converses", "keyboard_shortcuts.description": "Descripció", + "keyboard_shortcuts.direct": "per obrir la columna de missatges directes", "keyboard_shortcuts.down": "Mou-lo avall en la llista", - "keyboard_shortcuts.enter": "Obre publicació", - "keyboard_shortcuts.favourite": "Afavorir publicació", + "keyboard_shortcuts.enter": "Obrir publicació", + "keyboard_shortcuts.favourite": "Afavoreix la publicació", "keyboard_shortcuts.favourites": "Obre la llista de preferits", "keyboard_shortcuts.federated": "Obre la línia de temps federada", "keyboard_shortcuts.heading": "Dreceres de teclat", @@ -242,7 +245,7 @@ "keyboard_shortcuts.hotkey": "Tecla d'accés directe", "keyboard_shortcuts.legend": "Mostra aquesta llegenda", "keyboard_shortcuts.local": "Obre la línia de temps local", - "keyboard_shortcuts.mention": "Esmenta l'autor", + "keyboard_shortcuts.mention": "Mencionar l'autor", "keyboard_shortcuts.muted": "Obre la llista d'usuaris silenciats", "keyboard_shortcuts.my_profile": "Obre el teu perfil", "keyboard_shortcuts.notifications": "Obre la columna de notificacions", @@ -256,7 +259,7 @@ "keyboard_shortcuts.start": "Obre la columna \"Primers passos\"", "keyboard_shortcuts.toggle_hidden": "Mostra/oculta el text marcat com a sensible", "keyboard_shortcuts.toggle_sensitivity": "Mostra/amaga contingut multimèdia", - "keyboard_shortcuts.toot": "Inicia una nova publicació", + "keyboard_shortcuts.toot": "Iniciar una publicació nova", "keyboard_shortcuts.unfocus": "Descentra l'àrea de composició de text/cerca", "keyboard_shortcuts.up": "Moure amunt en la llista", "lightbox.close": "Tanca", @@ -264,6 +267,8 @@ "lightbox.expand": "Amplia el quadre de visualització de l’imatge", "lightbox.next": "Següent", "lightbox.previous": "Anterior", + "limited_account_hint.action": "Mostra el perfil", + "limited_account_hint.title": "Aquest perfil ha estat amagat pels moderadors del servidor.", "lists.account.add": "Afegeix a la llista", "lists.account.remove": "Elimina de la llista", "lists.delete": "Esborra la llista", @@ -289,7 +294,8 @@ "navigation_bar.blocks": "Usuaris bloquejats", "navigation_bar.bookmarks": "Marcadors", "navigation_bar.community_timeline": "Línia de temps local", - "navigation_bar.compose": "Redacta una nova publicació", + "navigation_bar.compose": "Redactar una nova publicació", + "navigation_bar.direct": "Missatges directes", "navigation_bar.discover": "Descobrir", "navigation_bar.domain_blocks": "Dominis bloquejats", "navigation_bar.edit_profile": "Edita el perfil", @@ -301,7 +307,7 @@ "navigation_bar.info": "Sobre aquest servidor", "navigation_bar.keyboard_shortcuts": "Dreceres de teclat", "navigation_bar.lists": "Llistes", - "navigation_bar.logout": "Tanca la sessió", + "navigation_bar.logout": "Tancar sessió", "navigation_bar.mutes": "Usuaris silenciats", "navigation_bar.personal": "Personal", "navigation_bar.pins": "Publicacions fixades", @@ -312,11 +318,11 @@ "notification.favourite": "{name} ha afavorit la teva publicació", "notification.follow": "{name} et segueix", "notification.follow_request": "{name} ha sol·licitat seguir-te", - "notification.mention": "{name} t'ha esmentat", + "notification.mention": "{name} t'ha mencionat", "notification.own_poll": "La teva enquesta ha finalitzat", "notification.poll": "Ha finalitzat una enquesta en què has votat", - "notification.reblog": "{name} ha impulsat el teu estat", - "notification.status": "ha publicat {name}", + "notification.reblog": "{name} ha impulsat la teva publicació", + "notification.status": "{name} acaba de publicar", "notification.update": "{name} ha editat una publicació", "notifications.clear": "Esborra les notificacions", "notifications.clear_confirmation": "Segur que vols esborrar permanentment totes les teves notificacions?", @@ -362,11 +368,11 @@ "poll.vote": "Vota", "poll.voted": "Vas votar per aquesta resposta", "poll.votes": "{votes, plural, one {# vot} other {# vots}}", - "poll_button.add_poll": "Afegeix una enquesta", + "poll_button.add_poll": "Afegir una enquesta", "poll_button.remove_poll": "Elimina l'enquesta", - "privacy.change": "Ajusta la privacitat de la publicació", + "privacy.change": "Canvia la privacitat de la publicació", "privacy.direct.long": "Visible només per als usuaris esmentats", - "privacy.direct.short": "Només la gent que menciono", + "privacy.direct.short": "Només gent mencionada", "privacy.private.long": "Visible només per als seguidors", "privacy.private.short": "Només seguidors", "privacy.public.long": "Visible per tothom", @@ -440,12 +446,12 @@ "search_results.statuses_fts_disabled": "La cerca de publicacions pel seu contingut no està habilitada en aquest servidor Mastodon.", "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}", "status.admin_account": "Obre l'interfície de moderació per a @{name}", - "status.admin_status": "Obre aquesta publicació a la interfície de moderació", + "status.admin_status": "Obrir aquesta publicació a la interfície de moderació", "status.block": "Bloqueja @{name}", "status.bookmark": "Afavoreix", "status.cancel_reblog_private": "Desfés l'impuls", "status.cannot_reblog": "Aquesta publicació no es pot impulsar", - "status.copy": "Copia l'enllaç a l'estat", + "status.copy": "Copia l'enllaç a la publicació", "status.delete": "Esborra", "status.detailed_status": "Visualització detallada de la conversa", "status.direct": "Envia missatge directe a @{name}", @@ -462,7 +468,7 @@ "status.mention": "Esmenta @{name}", "status.more": "Més", "status.mute": "Silencia @{name}", - "status.mute_conversation": "Silencia conversació", + "status.mute_conversation": "Silencia la conversa", "status.open": "Amplia la publicació", "status.pin": "Fixa en el perfil", "status.pinned": "Publicació fixada", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index 5a64eaebb..a642c8a81 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -18,12 +18,12 @@ "account.followers": "شوێنکەوتووان", "account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە", "account.followers_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}", - "account.following": "Following", - "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", + "account.following": "دواکەوتن", + "account.following_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}", "account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.", "account.follows_you": "شوێنکەوتووەکانت", "account.hide_reblogs": "داشاردنی بووستەکان لە @{name}", - "account.joined": "Joined {date}", + "account.joined": "بەشداری {date}", "account.link_verified_on": "خاوەنداریەتی ئەم لینکە لە {date} چێک کراوە", "account.locked_info": "تایبەتمەندی ئەم هەژمارەیە ڕیکخراوە بۆ قوفڵدراوە. خاوەنەکە بە دەستی پێداچوونەوە دەکات کە کێ دەتوانێت شوێنیان بکەوێت.", "account.media": "میدیا", @@ -41,18 +41,18 @@ "account.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", "account.unblock": "@{name} لاببە", "account.unblock_domain": "کردنەوەی دۆمەینی {domain}", - "account.unblock_short": "Unblock", + "account.unblock_short": "لابردنی بەربەست", "account.unendorse": "تایبەتمەندی لەسەر پرۆفایلەکە نیە", "account.unfollow": "بەدوادانەچو", "account.unmute": "بێدەنگکردنی @{name}", "account.unmute_notifications": "بێدەنگکردنی هۆشیارییەکان لە @{name}", - "account.unmute_short": "Unmute", + "account.unmute_short": "بێدەنگی مەکە", "account_note.placeholder": "کرتەبکە بۆ زیادکردنی تێبینی", - "admin.dashboard.daily_retention": "User retention rate by day after sign-up", - "admin.dashboard.monthly_retention": "User retention rate by month after sign-up", - "admin.dashboard.retention.average": "Average", - "admin.dashboard.retention.cohort": "Sign-up month", - "admin.dashboard.retention.cohort_size": "New users", + "admin.dashboard.daily_retention": "ڕێژەی مانەوەی بەکارهێنەر بەپێی ڕۆژ دوای ناو تۆمارکردن", + "admin.dashboard.monthly_retention": "ڕێژەی مانەوەی بەکارهێنەر بەپێی مانگ دوای ناو تۆمارکردن", + "admin.dashboard.retention.average": "ڕێژە", + "admin.dashboard.retention.cohort": "چوونەژوورەوەی مانگانە", + "admin.dashboard.retention.cohort_size": "ئەندامی نوێ", "alert.rate_limited.message": "تکایە هەوڵبدەرەوە دوای {retry_time, time, medium}.", "alert.rate_limited.title": "ڕێژەی سنووردار", "alert.unexpected.message": "هەڵەیەکی چاوەڕوان نەکراو ڕوویدا.", @@ -70,7 +70,7 @@ "column.blocks": "بەکارهێنەرە بلۆککراوەکان", "column.bookmarks": "نیشانەکان", "column.community": "هێڵی کاتی ناوخۆیی", - "column.conversations": "Conversations", + "column.direct": "نامە ڕاستەوخۆ", "column.directory": "گەڕان لە پرۆفایلەکان", "column.domain_blocks": "دۆمەینە داخراوەکان", "column.favourites": "دڵخوازترینەکان", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "تەنها خۆماڵی", "community.column_settings.media_only": "تەنها میدیا", "community.column_settings.remote_only": "تەنها بۆ دوور", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "زیاتر فێربه", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "ئەم توتە لە ژێر هیچ هاشتاگییەک دا ناکرێت وەک ئەوەی لە لیستەکەدا نەریزراوە. تەنها توتی گشتی دەتوانرێت بە هاشتاگی بگەڕێت.", @@ -106,7 +108,7 @@ "compose_form.poll.switch_to_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک", "compose_form.publish": "توت", "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Save changes", + "compose_form.save_changes": "پاشکەوتی گۆڕانکاریەکان", "compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار", "compose_form.sensitive.marked": "وادەی کۆتایی", "compose_form.sensitive.unmarked": "میدیا وەک هەستیار نیشان نەکراوە", @@ -121,8 +123,8 @@ "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?", "confirmations.delete_list.confirm": "سڕینەوە", "confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?", - "confirmations.discard_edit_media.confirm": "Discard", - "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", + "confirmations.discard_edit_media.confirm": "ڕەتکردنەوە", + "confirmations.discard_edit_media.message": "گۆڕانکاریت لە وەسف یان پێشبینی میدیادا هەڵنەگیراوە، بەهەر حاڵ فڕێیان بدە؟", "confirmations.domain_block.confirm": "بلۆککردنی هەموو دۆمەینەکە", "confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.", "confirmations.logout.confirm": "چوونە دەرەوە", @@ -147,6 +149,7 @@ "embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.", "embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:", "emoji_button.activity": "چالاکی", + "emoji_button.clear": "ڕوون", "emoji_button.custom": "ئاسایی", "emoji_button.flags": "ئاڵاکان", "emoji_button.food": "خواردن& خواردنەوە", @@ -160,22 +163,22 @@ "emoji_button.search_results": "ئەنجامەکانی گەڕان", "emoji_button.symbols": "هێماکان", "emoji_button.travel": "گەشت & شوێنەکان", - "empty_column.account_suspended": "Account suspended", - "empty_column.account_timeline": "لێرە هیچ توتەک نییە!", + "empty_column.account_suspended": "هەژمار ڕاگیرا", + "empty_column.account_timeline": "لێرە هیچ نووسراوە نییە!", "empty_column.account_unavailable": "پرۆفایل بەردەست نیە", "empty_column.blocks": "تۆ هێشتا هیچ بەکارهێنەرێکت بلۆک نەکردووە.", "empty_column.bookmarked_statuses": "تۆ هێشتا هیچ توتێکی دیاریکراوت نیە کاتێک نیشانەیەک نیشان دەکەیت، لێرە دەرئەکەویت.", "empty_column.community": "هێڵی کاتی ناوخۆیی بەتاڵە. شتێک بە ئاشکرا بنووسە بۆ ئەوەی تۆپەکە بسووڕێت!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "تا ئێستا هیچ نامەیەکی ڕاستەوخۆت نییە. کاتێک یەکێکیان دەنێری یان وەریدەگریت، لێرە دەردەکەوێت.", "empty_column.domain_blocks": "هێشتا هیچ دۆمەینێکی بلۆک کراو نییە.", - "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", + "empty_column.explore_statuses": "لە ئێستادا هیچ شتێک ترێند نییە. دواتر سەیری بکە!", "empty_column.favourited_statuses": "تۆ هێشتا هیچ توتێکی دڵخوازت نییە، کاتێک حەزت لە دانەیەکی باشە، لێرە دەرئەکەویت.", "empty_column.favourites": "کەس ئەم توتەی دڵخواز نەکردووە،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.", - "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.", + "empty_column.follow_recommendations": "پێدەچێت هیچ پێشنیارێک بۆ تۆ دروست نەکرێت. دەتوانیت هەوڵبدەیت گەڕان بەکاربهێنیت بۆ گەڕان بەدوای ئەو کەسانەی کە ڕەنگە بیانناسیت یان بەدوای هاشتاگە ڕەوتەکاندا بگەڕێیت.", "empty_column.follow_requests": "تۆ هێشتا هیچ داواکارییەکی بەدواداچووت نیە. کاتێک یەکێکت بۆ هات، لێرە دەرئەکەویت.", "empty_column.hashtag": "هێشتا هیچ شتێک لەم هاشتاگەدا نییە.", "empty_column.home": "تایم لاینی ماڵەوەت بەتاڵە! سەردانی {public} بکە یان گەڕان بەکاربێنە بۆ دەستپێکردن و بینینی بەکارهێنەرانی تر.", - "empty_column.home.suggestions": "See some suggestions", + "empty_column.home.suggestions": "چەند پێشنیارێک ببینە", "empty_column.list": "هێشتا هیچ شتێک لەم لیستەدا نییە. کاتێک ئەندامانی ئەم لیستە دەنگی نوێ بڵاودەکەن، لێرە دەردەکەون.", "empty_column.lists": "تۆ هێشتا هیچ لیستت دروست نەکردووە، کاتێک دانەیەک دروست دەکەیت، لێرە پیشان دەدرێت.", "empty_column.mutes": "تۆ هێشتا هیچ بەکارهێنەرێکت بێدەنگ نەکردووە.", @@ -187,15 +190,15 @@ "error.unexpected_crash.next_steps_addons": "هەوڵدە لەکاریان بخەیت و لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکانی دیکە یان نەرمەکالاکانی ئەسڵی.", "errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد", "errors.unexpected_crash.report_issue": "کێشەی گوزارشت", - "explore.search_results": "Search results", - "explore.suggested_follows": "For you", - "explore.title": "Explore", - "explore.trending_links": "News", - "explore.trending_statuses": "Posts", - "explore.trending_tags": "Hashtags", - "follow_recommendations.done": "Done", - "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.", - "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!", + "explore.search_results": "ئەنجامەکانی گەڕان", + "explore.suggested_follows": "بۆ تۆ", + "explore.title": "گەڕان", + "explore.trending_links": "هەواڵەکان", + "explore.trending_statuses": "نووسراوەکان", + "explore.trending_tags": "هاشتاگ", + "follow_recommendations.done": "تەواو", + "follow_recommendations.heading": "شوێن ئەو کەسانە بکەون کە دەتەوێت پۆستەکان ببینیت لە! لێرەدا چەند پێشنیارێک هەیە.", + "follow_recommendations.lead": "بابەتەکانی ئەو کەسانەی کە بەدوایدا دەگەڕێیت بە فەرمانی کرۆنۆلۆجی لە خواردنەکانی ماڵەکەت دەردەکەون. مەترسە لە هەڵەکردن، دەتوانیت بە ئاسانی خەڵک هەڵبکەیت هەر کاتێک!", "follow_request.authorize": "دهسهڵاتپێدراو", "follow_request.reject": "ڕەتکردنەوە", "follow_requests.unlocked_explanation": "هەرچەندە هەژمارەکەت داخراو نییە، ستافی {domain} وا بیریان کردەوە کە لەوانەیە بتانەوێت پێداچوونەوە بە داواکاریەکانی ئەم هەژمارەدا بکەن بە دەستی.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "بۆ بەهێزکردن", "keyboard_shortcuts.column": "بۆ ئەوەی تیشک بخاتە سەر توتێک لە یەکێک لە ستوونەکان", "keyboard_shortcuts.compose": "بۆ سەرنجدان بە نووسینی ناوچەی دەق", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "وهسف", + "keyboard_shortcuts.direct": "بۆ کردنەوەی ستوونی نامە ڕاستەوخۆکان", "keyboard_shortcuts.down": "بۆ چوونە خوارەوە لە لیستەکەدا", "keyboard_shortcuts.enter": "بۆ کردنەوەی توت", "keyboard_shortcuts.favourite": "بۆ دڵخواز", @@ -264,6 +267,8 @@ "lightbox.expand": "فراوانکردنی سندوقی بینینی وێنە", "lightbox.next": "داهاتوو", "lightbox.previous": "پێشوو", + "limited_account_hint.action": "بەهەر حاڵ پڕۆفایلی پیشان بدە", + "limited_account_hint.title": "ئەم پرۆفایلییە لەلایەن بەڕێوەبەرانی سێرڤەرەکەتەوە شاراوەتەوە.", "lists.account.add": "زیادکردن بۆ لیست", "lists.account.remove": "لابردن لە لیست", "lists.delete": "سڕینەوەی لیست", @@ -271,13 +276,13 @@ "lists.edit.submit": "گۆڕینی ناونیشان", "lists.new.create": "زیادکردنی لیست", "lists.new.title_placeholder": "ناونیشانی لیستی نوێ", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", + "lists.replies_policy.followed": "هەر بەکارهێنەرێکی بەدواکەوتوو", + "lists.replies_policy.list": "ئەندامانی لیستەکە", + "lists.replies_policy.none": "هیچکەس", "lists.replies_policy.title": "پیشاندانی وەڵامەکان بۆ:", "lists.search": "بگەڕێ لەناو ئەو کەسانەی کە شوێنیان کەوتویت", "lists.subheading": "لیستەکانت", - "load_pending": "{count, plural, one {# new item} other {# new items}}", + "load_pending": "{count, plural, one {# بەڕگەی نوێ} other {# بەڕگەی نوێ}}", "loading_indicator.label": "بارکردن...", "media_gallery.toggle_visible": "شاردنەوەی {number, plural, one {image} other {images}}", "missing_indicator.label": "نەدۆزرایەوە", @@ -290,10 +295,11 @@ "navigation_bar.bookmarks": "نیشانکراوەکان", "navigation_bar.community_timeline": "دەمنامەی ناوخۆیی", "navigation_bar.compose": "نووسینی توتی نوێ", + "navigation_bar.direct": "نامە ڕاستەوخۆ", "navigation_bar.discover": "دۆزینەوە", "navigation_bar.domain_blocks": "دۆمەینە بلۆک کراوەکان", "navigation_bar.edit_profile": "دەستکاری پرۆفایل بکە", - "navigation_bar.explore": "Explore", + "navigation_bar.explore": "گەڕان", "navigation_bar.favourites": "دڵخوازەکان", "navigation_bar.filters": "وشە کپەکان", "navigation_bar.follow_requests": "بەدواداچوی داواکاریەکان بکە", @@ -308,7 +314,7 @@ "navigation_bar.preferences": "پەسەندەکان", "navigation_bar.public_timeline": "نووسراوەکانی هەمووشوێنێک", "navigation_bar.security": "ئاسایش", - "notification.admin.sign_up": "{name} signed up", + "notification.admin.sign_up": "{name} تۆمارکرا", "notification.favourite": "{name} نووسراوەکەتی پەسەند کرد", "notification.follow": "{name} دوای تۆ کەوت", "notification.follow_request": "{name} داوای کردووە کە شوێنت بکەوێت", @@ -317,15 +323,15 @@ "notification.poll": "ڕاپرسییەک کە دەنگی پێداویت کۆتایی هات", "notification.reblog": "{name} نووسراوەکەتی دووبارە توتاند", "notification.status": "{name} تازە بڵاوکرایەوە", - "notification.update": "{name} edited a post", + "notification.update": "{name} پۆستێکی دەستکاریکرد", "notifications.clear": "ئاگانامەکان بسڕیەوە", "notifications.clear_confirmation": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی هەموو ئاگانامەکانت بسڕیتەوە?", - "notifications.column_settings.admin.sign_up": "New sign-ups:", + "notifications.column_settings.admin.sign_up": "چوونەژوورەوەی نوێ:", "notifications.column_settings.alert": "ئاگانامەکانی پیشانگەرر ڕومێزی", "notifications.column_settings.favourite": "دڵخوازترین:", "notifications.column_settings.filter_bar.advanced": "هەموو پۆلەکان پیشان بدە", "notifications.column_settings.filter_bar.category": "شریتی پاڵێوەری خێرا", - "notifications.column_settings.filter_bar.show_bar": "Show filter bar", + "notifications.column_settings.filter_bar.show_bar": "نیشاندانی شریتی پاڵافتن", "notifications.column_settings.follow": "شوێنکەوتوانی نوێ:", "notifications.column_settings.follow_request": "شوینکەوتنی داواکاری نوێ:", "notifications.column_settings.mention": "ئاماژەکان:", @@ -335,22 +341,22 @@ "notifications.column_settings.show": "لە ستووندا پیشان بدە", "notifications.column_settings.sound": "لێدانی دەنگ", "notifications.column_settings.status": "توتەکانی نوێ:", - "notifications.column_settings.unread_notifications.category": "Unread notifications", - "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications", - "notifications.column_settings.update": "Edits:", + "notifications.column_settings.unread_notifications.category": "ئاگاداریی نەبینراو", + "notifications.column_settings.unread_notifications.highlight": "تیشک بخە سەر ئاگاداری نەخوێنراو", + "notifications.column_settings.update": "دەستکاری:", "notifications.filter.all": "هەموو", "notifications.filter.boosts": "دووبارەتوتەکان", "notifications.filter.favourites": "دڵخوازەکان", - "notifications.filter.follows": "شوێنکەوتن", + "notifications.filter.follows": "بەدواداچوون", "notifications.filter.mentions": "ئاماژەکان", "notifications.filter.polls": "ئەنجامەکانی ڕاپرسی", "notifications.filter.statuses": "نوێکردنەوەکان ئەو کەسانەی کە پەیڕەوی دەکەیت", - "notifications.grant_permission": "Grant permission.", + "notifications.grant_permission": "مۆڵەت بدە.", "notifications.group": "{count} ئاگانامە", "notifications.mark_as_read": "هەموو ئاگانامەکان وەک خوێندراوەتەوە نیشان بکە", "notifications.permission_denied": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت وەک ڕێپێدان ڕەتکرایەوە.", "notifications.permission_denied_alert": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت، چونکە پێشتر مۆڵەتی وێبگەڕ ڕەتکرایەوە", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_required": "ئاگادارکردنەوەکانی سەر مێز بەردەست نین چونکە مۆڵەتی پێویست نەدراوە.", "notifications_permission_banner.enable": "چالاککردنی ئاگانامەکانی دێسکتۆپ", "notifications_permission_banner.how_to_control": "بۆ وەرگرتنی ئاگانامەکان کاتێک ماستۆدۆن نەکراوەیە، ئاگانامەکانی دێسکتۆپ چالاک بکە. دەتوانیت بە وردی کۆنترۆڵی جۆری کارلێکەکان بکەیت کە ئاگانامەکانی دێسکتۆپ دروست دەکەن لە ڕێگەی دوگمەی {icon} لەسەرەوە کاتێک چالاک دەکرێن.", "notifications_permission_banner.title": "هەرگیز شتێک لە دەست مەدە", @@ -361,70 +367,70 @@ "poll.total_votes": "{count, plural, one {# دەنگ} other {# دەنگ}}\n", "poll.vote": "دەنگ", "poll.voted": "تۆ دەنگت بەو وەڵامە دا", - "poll.votes": "{votes, plural, one {# vote} other {# votes}}", + "poll.votes": "{votes, plural, one {# دەنگ} other {# دەنگ}}", "poll_button.add_poll": "ڕاپرسییەک زیاد بکە", "poll_button.remove_poll": "دهنگدان بسڕهوه", "privacy.change": "ڕێکخستنی تایبەتمەندی توت", "privacy.direct.long": "تەنیا بۆ بەکارهێنەرانی ناوبراو", - "privacy.direct.short": "Direct", + "privacy.direct.short": "تەنها کەسانی باس کراو", "privacy.private.long": "بینراو تەنها بۆ شوێنکەوتوان", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Visible for all", + "privacy.private.short": "تەنیا شوێنکەوتووان", + "privacy.public.long": "بۆ هەمووان دیارە", "privacy.public.short": "گشتی", - "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", + "privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە تایبەتمەندییەکانی دۆزینەوە دەرچووە", "privacy.unlisted.short": "لە لیست نەکراو", "refresh": "نوێکردنەوە", "regeneration_indicator.label": "بارکردن…", "regeneration_indicator.sublabel": "ڕاگەیەنەری ماڵەوەت ئامادە دەکرێت!", "relative_time.days": "{number}ڕۆژ", - "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago", - "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago", - "relative_time.full.just_now": "just now", - "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago", - "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago", + "relative_time.full.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژ}} ماوە", + "relative_time.full.hours": "{number, plural, one {# کاتژمێر} other {# کاتژمێر}} ماوە", + "relative_time.full.just_now": "ئێستا", + "relative_time.full.minutes": "{number, plural, one {# خولەک} other {# خولەک}} ماوە", + "relative_time.full.seconds": "{number, plural, one {# چرکە} other {# چرکە}} ماوە", "relative_time.hours": "{number}کات", "relative_time.just_now": "ئێستا", "relative_time.minutes": "{number}کات", "relative_time.seconds": "{number}کات", "relative_time.today": "ئیمڕۆ", "reply_indicator.cancel": "هەڵوەشاندنەوه", - "report.block": "Block", - "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", - "report.categories.other": "Other", - "report.categories.spam": "Spam", - "report.categories.violation": "Content violates one or more server rules", - "report.category.subtitle": "Choose the best match", - "report.category.title": "Tell us what's going on with this {type}", - "report.category.title_account": "profile", - "report.category.title_status": "post", - "report.close": "Done", - "report.comment.title": "Is there anything else you think we should know?", + "report.block": "بلۆک", + "report.block_explanation": "تۆ پۆستەکانیان نابینیت. ئەوان ناتوانن بابەتەکانتان ببینن یان شوێنتان بکەون. ئەوان دەتوانن بڵێن کە بەربەستکراون.", + "report.categories.other": "هی تر", + "report.categories.spam": "سپام", + "report.categories.violation": "ناوەڕۆک یەک یان زیاتر لە یاساکانی سێرڤەر پێشێل دەکات", + "report.category.subtitle": "باشترین هاوتا هەڵبژێرە", + "report.category.title": "پێمان بڵێ بە {type} چی ڕوودەدات", + "report.category.title_account": "پرۆفایل", + "report.category.title_status": "پۆست", + "report.close": "تەواو", + "report.comment.title": "ئایا هیچ شتێکی تر هەیە کە پێت وایە ئێمە دەبێت بزانین?", "report.forward": "ناردن بۆ {target}", "report.forward_hint": "هەژمارەکە لە ڕاژەیەکی ترە. ڕونووسێکی نەناسراو بنێرە بۆ گوزارشت لەوێ?", - "report.mute": "Mute", - "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.", - "report.next": "Next", + "report.mute": "بێدەنگ", + "report.mute_explanation": "تۆ پۆستەکانیان نابینیت. ئەوان هێشتا دەتوانن شوێنتان بکەون و پۆستەکانتان ببینن و نازانن کە ئەوان بێ دەنگن.", + "report.next": "دواتر", "report.placeholder": "سەرنجەکانی زیاتر", - "report.reasons.dislike": "I don't like it", - "report.reasons.dislike_description": "It is not something you want to see", - "report.reasons.other": "It's something else", - "report.reasons.other_description": "The issue does not fit into other categories", - "report.reasons.spam": "It's spam", - "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies", - "report.reasons.violation": "It violates server rules", - "report.reasons.violation_description": "You are aware that it breaks specific rules", - "report.rules.subtitle": "Select all that apply", - "report.rules.title": "Which rules are being violated?", - "report.statuses.subtitle": "Select all that apply", - "report.statuses.title": "Are there any posts that back up this report?", + "report.reasons.dislike": "حەزم لێی نییە", + "report.reasons.dislike_description": "ئەوە شتێک نیە کە دەتەوێت بیبینیت", + "report.reasons.other": "شتێکی ترە", + "report.reasons.other_description": "کێشەکە ناگونجێت بۆ هاوپۆلەکانی تر", + "report.reasons.spam": "ئەوە سپامە", + "report.reasons.spam_description": "لینکە خراپەکان، بەشداری ساختە، یان وەڵامدانەوەی دووبارە", + "report.reasons.violation": "یاساکانی سێرڤەر پێشێل دەکات", + "report.reasons.violation_description": "ئاگاداری ئەوەن کە یاسا تایبەتەکان دەشکێنێت", + "report.rules.subtitle": "هەموو ئەوانەی کە کاریان پێدەکرێت هەڵبژێرە", + "report.rules.title": "کام یاسا پێشێل دەکرێت؟", + "report.statuses.subtitle": "هەموو ئەوانەی کە کاریان پێدەکرێت هەڵبژێرە", + "report.statuses.title": "ئایا هیچ پۆستێک هەیە کە پشتگیری ئەم ڕاپۆرتە بکات؟", "report.submit": "ناردن", "report.target": "گوزارشتکردنی{target}", - "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:", - "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:", - "report.thanks.title": "Don't want to see this?", - "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", - "report.unfollow": "Unfollow @{name}", - "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report.thanks.take_action": "لێرەدا بژاردەکانت بۆ کۆنترۆڵکردنی ئەو شتانە دەخەینەڕوو کە لە ماستۆدۆن دەیبینیت:", + "report.thanks.take_action_actionable": "لە کاتێکدا ئێمە پێداچوونەوە بەم بابەتە دەکەین، دەتوانیت ڕێوشوێن بگریتەبەر دژی @{name}:", + "report.thanks.title": "ناتەوێت ئەمە ببینیت؟", + "report.thanks.title_actionable": "سوپاس بۆ ڕاپۆرتکردن، ئێمە سەیری ئەم بابەتە دەکەین.", + "report.unfollow": "بەدوادانەچوو@{name}", + "report.unfollow_explanation": "تۆ شوێنکەوتووی ئەم هەژماررەی دەکەیت. بۆ ئەوەی چیتر نووسراوەکانیان لە هۆم فیدی خۆت نەبینی، بەدوایان مەچۆ.", "search.placeholder": "گەڕان", "search_popout.search_format": "شێوەی گەڕانی پێشکەوتوو", "search_popout.tips.full_text": "گەڕانێکی دەقی سادە دەتوانێت توتەکانی ئێوە کە، نووسیوتانە،پەسەنتان کردووە، دووبارەتانکردووە، یان ئەو توتانە کە باسی ئێوەی تێدا کراوە پەیدا دەکا. هەروەها ناوی بەکارهێنەران، ناوی پیشاندراو و هەشتەگەکانیش لە خۆ دەگرێت.", @@ -433,7 +439,7 @@ "search_popout.tips.text": "دەقی سادە هەڵدەسێ بە گەڕاندنەوەی هاوتایی ناوی پیشاندان، ناوی بەکارهێنەر و هاشتاگەکان", "search_popout.tips.user": "بەکارهێنەر", "search_results.accounts": "خەڵک", - "search_results.all": "All", + "search_results.all": "هەموو", "search_results.hashtags": "هەشتاگ", "search_results.nothing_found": "Could not find anything for these search terms", "search_results.statuses": "توتەکان", @@ -449,14 +455,14 @@ "status.delete": "سڕینەوە", "status.detailed_status": "ڕوانگەی گفتوگۆ بە وردەکاری", "status.direct": "پەیامی ڕاستەوخۆ @{name}", - "status.edit": "Edit", - "status.edited": "Edited {date}", - "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}", + "status.edit": "دەستکاری", + "status.edited": "بەشداری {date}", + "status.edited_x_times": "دەستکاریکراوە {count, plural, one {{count} کات} other {{count} کات}}", "status.embed": "نیشتەجێ بکە", "status.favourite": "دڵخواز", "status.filtered": "پاڵاوتن", - "status.history.created": "{name} created {date}", - "status.history.edited": "{name} edited {date}", + "status.history.created": "{name} دروستکراوە لە{date}", + "status.history.edited": "{name} دروستکاریکراوە لە{date}", "status.load_more": "زیاتر بار بکە", "status.media_hidden": "میدیای شاراوە", "status.mention": "ناوبنێ @{name}", @@ -514,14 +520,14 @@ "upload_error.poll": "فایل و ڕاپرسی پێکەوە ڕێپێنەدراون.", "upload_form.audio_description": "پەیامەکەت بۆ نابیستەکان", "upload_form.description": "پەیامەکەت بۆ نابیناکان", - "upload_form.description_missing": "No description added", + "upload_form.description_missing": "هیچ وەسفێک زیاد نەکراوە", "upload_form.edit": "دەستکاری", "upload_form.thumbnail": "گۆڕانی وینۆچکە", "upload_form.undo": "بیسڕەوە", "upload_form.video_description": "پەیامەکەت بۆ نابیست و نابیناکان", "upload_modal.analyzing_picture": "وێنەکە شی دەکرێتەوە…", "upload_modal.apply": "بیسەپێنە", - "upload_modal.applying": "Applying…", + "upload_modal.applying": "داواکاری…", "upload_modal.choose_image": "وێنە هەڵبژێرە", "upload_modal.description_placeholder": "بە دڵ کەین با بە نەشئەی مەی غوباری میحنەتی دونیا", "upload_modal.detect_text": "نووسینی ناو وێنەکە دەستنیشان بکە", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 770bd71bc..d2db35f16 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -70,7 +70,7 @@ "column.blocks": "Utilizatori bluccati", "column.bookmarks": "Segnalibri", "column.community": "Linea pubblica lucale", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Percorre i prufili", "column.domain_blocks": "Duminii piattati", "column.favourites": "Favuriti", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Solu lucale", "community.column_settings.media_only": "Solu media", "community.column_settings.remote_only": "Solu distante", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Amparà di più", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Stu statutu ùn hè \"Micca listatu\" è ùn sarà micca listatu indè e circate da hashtag. Per esse vistu in quesse, u statutu deve esse \"Pubblicu\".", @@ -147,6 +149,7 @@ "embed.instructions": "Integrà stu statutu à u vostru situ cù u codice quì sottu.", "embed.preview": "Hà da parè à quessa:", "emoji_button.activity": "Attività", + "emoji_button.clear": "Clear", "emoji_button.custom": "Persunalizati", "emoji_button.flags": "Bandere", "emoji_button.food": "Manghjusca è Bienda", @@ -166,7 +169,7 @@ "empty_column.blocks": "Per avà ùn avete bluccatu manc'un utilizatore.", "empty_column.bookmarked_statuses": "Ùn avete manc'un segnalibru. Quandu aghjunghjerate unu, sarà mustratu quì.", "empty_column.community": "Ùn c'hè nunda indè a linea lucale. Scrivete puru qualcosa!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Ùn c'hè manc'un duminiu bluccatu avà.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Ùn avete manc'unu statutu favuritu. Quandu aghjunghjerate unu à i vostri favuriti, sarà mustratu quì.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "sparte", "keyboard_shortcuts.column": "fucalizà un statutu indè una colonna", "keyboard_shortcuts.compose": "fucalizà nant'à l'area di ridazzione", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Descrizzione", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "falà indè a lista", "keyboard_shortcuts.enter": "apre u statutu", "keyboard_shortcuts.favourite": "aghjunghje à i favuriti", @@ -264,6 +267,8 @@ "lightbox.expand": "Ingrandà a finestra d'affissera di i ritratti", "lightbox.next": "Siguente", "lightbox.previous": "Pricidente", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Aghjunghje à a lista", "lists.account.remove": "Toglie di a lista", "lists.delete": "Toglie a lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Segnalibri", "navigation_bar.community_timeline": "Linea pubblica lucale", "navigation_bar.compose": "Scrive un novu statutu", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Scopre", "navigation_bar.domain_blocks": "Duminii piattati", "navigation_bar.edit_profile": "Mudificà u prufile", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index df1e750b7..91dda4f44 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -70,7 +70,7 @@ "column.blocks": "Blokovaní uživatelé", "column.bookmarks": "Záložky", "column.community": "Místní časová osa", - "column.conversations": "Konverzace", + "column.direct": "Přímé zprávy", "column.directory": "Prozkoumat profily", "column.domain_blocks": "Blokované domény", "column.favourites": "Oblíbené", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Pouze místní", "community.column_settings.media_only": "Pouze média", "community.column_settings.remote_only": "Pouze vzdálené", + "compose.language.change": "Změnit jazyk", + "compose.language.search": "Prohledat jazyky...", "compose_form.direct_message_warning_learn_more": "Zjistit více", "compose_form.encryption_warning": "Příspěvky na Mastodonu nejsou end-to-end šifrovány. Nesdílejte přes Mastodon žádné nebezpečné informace.", "compose_form.hashtag_warning": "Tento příspěvek nebude zobrazen pod žádným hashtagem, neboť je neuvedený. Pouze veřejné příspěvky mohou být vyhledány podle hashtagu.", @@ -147,6 +149,7 @@ "embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.", "embed.preview": "Takhle to bude vypadat:", "emoji_button.activity": "Aktivita", + "emoji_button.clear": "Vyčistit", "emoji_button.custom": "Vlastní", "emoji_button.flags": "Vlajky", "emoji_button.food": "Jídla a nápoje", @@ -166,7 +169,7 @@ "empty_column.blocks": "Ještě jste nezablokovali žádného uživatele.", "empty_column.bookmarked_statuses": "Ještě nemáte v záložkách žádné příspěvky. Pokud si do nich nějaký přidáte, zobrazí se zde.", "empty_column.community": "Místní časová osa je prázdná. Napište něco veřejně a rozhýbejte to tu!", - "empty_column.conversations": "Jakmile pošlete nebo obdržíte příspěvek, který je viditelný pouze lidem v něm zmíněným, objeví se tady.", + "empty_column.direct": "Ještě nemáte žádné přímé zprávy. Pokud nějakou pošlete nebo dostanete, zobrazí se zde.", "empty_column.domain_blocks": "Ještě nemáte žádné blokované domény.", "empty_column.explore_statuses": "Momentálně není nic populární. Vraťte se později!", "empty_column.favourited_statuses": "Ještě nemáte žádné oblíbené příspěvky. Pokud si nějaký oblíbíte, zobrazí se zde.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Boostnout příspěvek", "keyboard_shortcuts.column": "Focus na sloupec", "keyboard_shortcuts.compose": "Focus na textové pole nového příspěvku", - "keyboard_shortcuts.conversations": "Otevřít sloupec konverzací", "keyboard_shortcuts.description": "Popis", + "keyboard_shortcuts.direct": "Otevřít sloupec přímých zpráv", "keyboard_shortcuts.down": "Posunout dolů v seznamu", "keyboard_shortcuts.enter": "Otevřít příspěvek", "keyboard_shortcuts.favourite": "Oblíbit příspěvek", @@ -264,6 +267,8 @@ "lightbox.expand": "Ukázat obrázek v plné velikosti", "lightbox.next": "Další", "lightbox.previous": "Předchozí", + "limited_account_hint.action": "Přesto profil zobrazit", + "limited_account_hint.title": "Tento profil byl skryt moderátory vašeho serveru.", "lists.account.add": "Přidat do seznamu", "lists.account.remove": "Odebrat ze seznamu", "lists.delete": "Smazat seznam", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Záložky", "navigation_bar.community_timeline": "Místní časová osa", "navigation_bar.compose": "Vytvořit nový příspěvek", + "navigation_bar.direct": "Přímé zprávy", "navigation_bar.discover": "Objevujte", "navigation_bar.domain_blocks": "Blokované domény", "navigation_bar.edit_profile": "Upravit profil", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Odstranit anketu", "privacy.change": "Změnit soukromí příspěvku", "privacy.direct.long": "Viditelný pouze pro zmíněné uživatele", - "privacy.direct.short": "Pouze lidé, které zmíním", + "privacy.direct.short": "Jen zmínění lidé", "privacy.private.long": "Viditelný pouze pro sledující", "privacy.private.short": "Pouze sledující", "privacy.public.long": "Viditelný pro všechny", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 7edb1d1cf..2a29cbbfb 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -70,7 +70,7 @@ "column.blocks": "Defnyddwyr a flociwyd", "column.bookmarks": "Tudalnodau", "column.community": "Ffrwd lleol", - "column.conversations": "Sgyrsiau", + "column.direct": "Negeseuon preifat", "column.directory": "Pori proffiliau", "column.domain_blocks": "Parthau cuddiedig", "column.favourites": "Ffefrynnau", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Lleol yn unig", "community.column_settings.media_only": "Cyfryngau yn unig", "community.column_settings.remote_only": "Anghysbell yn unig", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Dysgu mwy", "compose_form.encryption_warning": "Dyw postiadau ar Mastodon ddim wedi'u hamgryptio o ben i ben. Peidiwch â rhannu unrhyw wybodaeth beryglus dros Mastodon.", "compose_form.hashtag_warning": "Ni fydd y post hwn wedi ei restru o dan unrhyw hashnod gan ei fod heb ei restru. Dim ond postiadau cyhoeddus gellid chwilio amdanynt drwy hashnod.", @@ -147,6 +149,7 @@ "embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.", "embed.preview": "Dyma sut olwg fydd arno:", "emoji_button.activity": "Gweithgarwch", + "emoji_button.clear": "Clear", "emoji_button.custom": "Unigryw", "emoji_button.flags": "Baneri", "emoji_button.food": "Bwyd a Diod", @@ -166,10 +169,10 @@ "empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.", "empty_column.bookmarked_statuses": "Nid oes gennych unrhyw dwtiau tudalnodiedig eto. Pan y byddwch yn tudalnodi un, mi fydd yn ymddangos yma.", "empty_column.community": "Mae'r ffrwd lleol yn wag. Ysgrifenwch rhywbeth yn gyhoeddus i gael dechrau arni!", - "empty_column.conversations": "Unwaith y byddwch chi'n anfon neu'n derbyn post sydd ond yn weladwy i'r bobl a grybwyllir ynddo, bydd yn ymddangos yma.", + "empty_column.direct": "Does gennych unrhyw negeseuon preifat eto. Pan byddwch yn anfon neu derbyn un, bydd yn ymddangos yma.", "empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.", "empty_column.explore_statuses": "Does dim byd yn trendio ar hyn o bryd. Gwiriwch yn ôl yn nes ymlaen!", - "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff dwtiau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.", + "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff bostiadau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.", "empty_column.favourites": "Does neb wedi hoffi'r post hwn eto. Pan bydd rhywun yn ei hoffi, byddent yn ymddangos yma.", "empty_column.follow_recommendations": "Does dim awgrymiadau yma i chi. Gallwch geisio chwilio am bobl yr ydych yn eu hadnabod neu archwilio hashnodau sy'n trendio.", "empty_column.follow_requests": "Nid oes gennych unrhyw geisiadau dilyn eto. Pan dderbyniwch chi un, byddent yn ymddangos yma.", @@ -191,8 +194,8 @@ "explore.suggested_follows": "I chi", "explore.title": "Archwilio", "explore.trending_links": "Newyddion", - "explore.trending_statuses": "Postiau", - "explore.trending_tags": "Hanshnodau", + "explore.trending_statuses": "Postiadau", + "explore.trending_tags": "Hashnodau", "follow_recommendations.done": "Wedi gorffen", "follow_recommendations.heading": "Dilynwch y bobl yr hoffech chi weld eu postiadau! Dyma ambell i awgrymiad.", "follow_recommendations.lead": "Bydd postiadau gan bobl rydych chi'n eu dilyn yn ymddangos mewn trefn amser ar eich ffrwd cartref. Peidiwch â bod ofn gwneud camgymeriadau, gallwch chi ddad-ddilyn pobl yr un mor hawdd unrhyw bryd!", @@ -222,7 +225,7 @@ "home.column_settings.show_replies": "Dangos ymatebion", "home.hide_announcements": "Cuddio cyhoeddiadau", "home.show_announcements": "Dangos cyhoeddiadau", - "intervals.full.days": "{number, plural, one {# ddydd} other {# o ddyddiau}}", + "intervals.full.days": "{number, plural, one {# dydd} two {# ddydd} other {# o ddyddiau}}", "intervals.full.hours": "{number, plural, one {# awr} other {# o oriau}}", "intervals.full.minutes": "{number, plural, one {# funud} other {# o funudau}}", "keyboard_shortcuts.back": "i lywio nôl", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "i fŵstio", "keyboard_shortcuts.column": "Ffocysu colofn", "keyboard_shortcuts.compose": "i ffocysu yr ardal cyfansoddi testun", - "keyboard_shortcuts.conversations": "i agor colofn sgyrsiau", "keyboard_shortcuts.description": "Disgrifiad", + "keyboard_shortcuts.direct": "i agor colofn negeseuon preifat", "keyboard_shortcuts.down": "i symud lawr yn y rhestr", "keyboard_shortcuts.enter": "Agor post", "keyboard_shortcuts.favourite": "i hoffi", @@ -264,6 +267,8 @@ "lightbox.expand": "Ehangu blwch gweld delwedd", "lightbox.next": "Nesaf", "lightbox.previous": "Blaenorol", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Ychwanegwch at restr", "lists.account.remove": "Dileu o'r rhestr", "lists.delete": "Dileu rhestr", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Tudalnodau", "navigation_bar.community_timeline": "Ffrwd leol", "navigation_bar.compose": "Cyfansoddi post newydd", + "navigation_bar.direct": "Negeseuon preifat", "navigation_bar.discover": "Darganfod", "navigation_bar.domain_blocks": "Parthau cuddiedig", "navigation_bar.edit_profile": "Golygu proffil", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Tynnu pleidlais", "privacy.change": "Addasu preifatrwdd y post", "privacy.direct.long": "Cyhoeddi i'r defnyddwyr sy'n cael eu crybwyll yn unig", - "privacy.direct.short": "Dim ond pobl rwy'n eu crybwyll", + "privacy.direct.short": "Pobl sy wedi'u crybwyll yn unig", "privacy.private.long": "Cyhoeddi i ddilynwyr yn unig", "privacy.private.short": "Dilynwyr yn unig", "privacy.public.long": "Gweladwy i bawb", @@ -376,7 +382,7 @@ "refresh": "Adnewyddu", "regeneration_indicator.label": "Llwytho…", "regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!", - "relative_time.days": "{number}dydd", + "relative_time.days": "{number} dydd", "relative_time.full.days": "{number, plural, one {# dydd} other {# o ddyddiau}} yn ôl", "relative_time.full.hours": "{number, plural, one {# awr} other {# o oriau}} yn ôl", "relative_time.full.just_now": "jyst nawr", @@ -385,7 +391,7 @@ "relative_time.hours": "{number} awr", "relative_time.just_now": "nawr", "relative_time.minutes": "{number} munud", - "relative_time.seconds": "{number}eiliad", + "relative_time.seconds": "{number} eiliad", "relative_time.today": "heddiw", "reply_indicator.cancel": "Canslo", "report.block": "Blocio", @@ -434,7 +440,7 @@ "search_popout.tips.user": "defnyddiwr", "search_results.accounts": "Pobl", "search_results.all": "Popeth", - "search_results.hashtags": "Hanshnodau", + "search_results.hashtags": "Hashnodau", "search_results.nothing_found": "Methu dod o hyd i unrhyw beth ar gyfer y termau chwilio hyn", "search_results.statuses": "Postiadau", "search_results.statuses_fts_disabled": "Nid yw chwilio postiadau yn ôl eu cynnwys wedi'i alluogi ar y gweinydd Mastodon hwn.", @@ -465,11 +471,11 @@ "status.mute_conversation": "Tawelu sgwrs", "status.open": "Ehangu'r post hwn", "status.pin": "Pinio ar y proffil", - "status.pinned": "Pinio post", + "status.pinned": "Post wedi'i binio", "status.read_more": "Darllen mwy", "status.reblog": "Hybu", "status.reblog_private": "Hybu i'r gynulleidfa wreiddiol", - "status.reblogged_by": "Hybio {name}", + "status.reblogged_by": "Hybodd {name}", "status.reblogs.empty": "Does neb wedi hybio'r post yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.", "status.redraft": "Dileu & ailddrafftio", "status.remove_bookmark": "Tynnu'r tudalnod", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index e04a0634c..5a03f86d0 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -70,7 +70,7 @@ "column.blocks": "Blokerede brugere", "column.bookmarks": "Bogmærker", "column.community": "Lokal tidslinje", - "column.conversations": "Konversationer", + "column.direct": "Direkte beskeder", "column.directory": "Tjek profiler", "column.domain_blocks": "Blokerede domæner", "column.favourites": "Favoritter", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Kun lokalt", "community.column_settings.media_only": "Kun medier", "community.column_settings.remote_only": "Kun udefra", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Få mere at vide", "compose_form.encryption_warning": "Indlæg på Mastodon er ikke ende-til-ende krypteret. Del derfor ikke sensitiv information over Mastodon.", "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, idet kun offentlige indlæg kan søges via hashtags.", @@ -147,6 +149,7 @@ "embed.instructions": "Indlejr dette indlæg på dit websted ved at kopiere nedenstående kode.", "embed.preview": "Sådan kommer det til at se ud:", "emoji_button.activity": "Aktivitet", + "emoji_button.clear": "Clear", "emoji_button.custom": "Tilpasset", "emoji_button.flags": "Flag", "emoji_button.food": "Mad og drikke", @@ -166,7 +169,7 @@ "empty_column.blocks": "Ingen brugere blokeret endnu.", "empty_column.bookmarked_statuses": "Du har ingen bogmærkede indlæg endnu. Når du bogmærker ét, vil det dukke op hér.", "empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at sætte tingene i gang!", - "empty_column.conversations": "Når der sendes eller modtages indlæg, som kun er synligt for personer nævnt heri, vil de dukke op her.", + "empty_column.direct": "Der er endnu ingen direkte beskeder. Når en sendes eller modtages, dukker den op hér.", "empty_column.domain_blocks": "Ingen blokerede domæner endnu.", "empty_column.explore_statuses": "Ingen nye tendensen pt. Tjek igen senere!", "empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du favoritmarkerer ét, vil det dukke op hér.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Boost indlæg", "keyboard_shortcuts.column": "Fokusér kolonne", "keyboard_shortcuts.compose": "Fokusér skriveområdet", - "keyboard_shortcuts.conversations": "for at åbne konversationskolonnen", "keyboard_shortcuts.description": "Beskrivelse", + "keyboard_shortcuts.direct": "for at åbne direkte beskeder-kolonnen", "keyboard_shortcuts.down": "Flyt nedad på listen", "keyboard_shortcuts.enter": "Åbn indlæg", "keyboard_shortcuts.favourite": "Favoritmarkér indlæg", @@ -264,6 +267,8 @@ "lightbox.expand": "Udvid billedevisningsfelt", "lightbox.next": "Næste", "lightbox.previous": "Forrige", + "limited_account_hint.action": "Vis profil alligevel", + "limited_account_hint.title": "Denne profil er blevet skjult af servermoderatorerne.", "lists.account.add": "Føj til liste", "lists.account.remove": "Fjern fra liste", "lists.delete": "Slet liste", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bogmærker", "navigation_bar.community_timeline": "Lokal tidslinje", "navigation_bar.compose": "Skriv nyt indlæg", + "navigation_bar.direct": "Direkte beskeder", "navigation_bar.discover": "Opdag", "navigation_bar.domain_blocks": "Blokerede domæner", "navigation_bar.edit_profile": "Redigér profil", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Fjern afstemning", "privacy.change": "Justér indlægsfortrolighed", "privacy.direct.long": "Kun synlig for nævnte brugere", - "privacy.direct.short": "Kun personer, jeg nævner", + "privacy.direct.short": "Kun nævnte personer", "privacy.private.long": "Kun synlig for følgere", "privacy.private.short": "Kun følgere", "privacy.public.long": "Synlig for alle", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 1a36fa736..66b8cc9ba 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -13,10 +13,10 @@ "account.domain_blocked": "Domain versteckt", "account.edit_profile": "Profil bearbeiten", "account.enable_notifications": "Benachrichtige mich wenn @{name} etwas postet", - "account.endorse": "Im Profil anzeigen", + "account.endorse": "Auf Profil hervorheben", "account.follow": "Folgen", "account.followers": "Follower", - "account.followers.empty": "Diesem Profil folgt bislang niemand.", + "account.followers.empty": "Diesem Profil folgt noch niemand.", "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Follower}}", "account.following": "Folgt", "account.following_counter": "{count, plural, one {{counter} Folgt} other {{counter} Folgt}}", @@ -70,7 +70,7 @@ "column.blocks": "Blockierte Profile", "column.bookmarks": "Lesezeichen", "column.community": "Lokale Zeitleiste", - "column.conversations": "Konversationen", + "column.direct": "Mensaxes directas", "column.directory": "Profile durchsuchen", "column.domain_blocks": "Blockierte Domains", "column.favourites": "Favoriten", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Nur lokal", "community.column_settings.media_only": "Nur Medien", "community.column_settings.remote_only": "Nur entfernt", + "compose.language.change": "Sprache ändern", + "compose.language.search": "Sprachen durchsuchen...", "compose_form.direct_message_warning_learn_more": "Mehr erfahren", "compose_form.encryption_warning": "Beiträge auf Mastodon sind nicht Ende-zu-Ende-verschlüsselt. Teile keine sensiblen Informationen über Mastodon.", "compose_form.hashtag_warning": "Dieser Beitrag wird nicht durch Hashtags entdeckbar sein, weil er ungelistet ist. Nur öffentliche Beiträge tauchen in Hashtag-Zeitleisten auf.", @@ -133,7 +135,7 @@ "confirmations.redraft.confirm": "Löschen und neu erstellen", "confirmations.redraft.message": "Bist du dir sicher, dass du diesen Beitrag löschen und neu machen möchtest? Favoriten und Boosts werden verloren gehen und Antworten zu diesem Beitrag werden verwaist sein.", "confirmations.reply.confirm": "Antworten", - "confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?", + "confirmations.reply.message": "Wenn du jetzt antwortest wird die gesamte Nachricht verworfen, die du gerade schreibst. Möchtest du wirklich fortfahren?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?", "conversation.delete": "Unterhaltung löschen", @@ -147,6 +149,7 @@ "embed.instructions": "Du kannst diesen Beitrag auf deiner Webseite einbetten, indem du den folgenden Code einfügst.", "embed.preview": "So wird es aussehen:", "emoji_button.activity": "Aktivitäten", + "emoji_button.clear": "Leeren", "emoji_button.custom": "Eigene", "emoji_button.flags": "Flaggen", "emoji_button.food": "Essen und Trinken", @@ -165,8 +168,8 @@ "empty_column.account_unavailable": "Konto nicht verfügbar", "empty_column.blocks": "Du hast keine Profile blockiert.", "empty_column.bookmarked_statuses": "Du hast bis jetzt keine Beiträge als Lesezeichen gespeichert. Wenn du einen Beitrag als Lesezeichen speicherst wird er hier erscheinen.", - "empty_column.community": "Die lokale Zeitleiste ist leer. Schreibe einen öffentlichen Beitrag, um den Ball ins Rollen zu bringen!", - "empty_column.conversations": "Sobald du einen Beitrag sendest oder empfängst, der nur für die in ihm erwähnten Personen sichtbar ist, wird er hier angezeigt.", + "empty_column.community": "Die lokale Zeitleiste ist leer. Schreibe einen öffentlichen Beitrag, um den Stein ins Rollen zu bringen!", + "empty_column.direct": "Du hast noch keine Direktnachrichten. Sobald du eine sendest oder empfängst, wird sie hier zu sehen sein.", "empty_column.domain_blocks": "Es sind noch keine Domains versteckt.", "empty_column.explore_statuses": "Momentan ist nichts im Trend. Schau später wieder!", "empty_column.favourited_statuses": "Du hast noch keine favorisierten Tröts. Wenn du einen favorisierst, wird er hier erscheinen.", @@ -174,7 +177,7 @@ "empty_column.follow_recommendations": "Es sieht so aus, als könnten keine Vorschläge für dich generiert werden. Du kannst versuchen nach Leuten zu suchen, die du vielleicht kennst oder du kannst angesagte Hashtags erkunden.", "empty_column.follow_requests": "Du hast noch keine Folge-Anfragen. Sobald du eine erhältst, wird sie hier angezeigt.", "empty_column.hashtag": "Unter diesem Hashtag gibt es noch nichts.", - "empty_column.home": "Deine Startseite ist leer! Besuche {public} oder nutze die Suche, um loszulegen und andere Leute zu finden.", + "empty_column.home": "Deine Startseite ist leer! Folge mehr Leuten, um sie zu füllen. {suggestions}", "empty_column.home.suggestions": "Ein paar Vorschläge ansehen", "empty_column.list": "Diese Liste ist derzeit leer. Wenn Konten auf dieser Liste neue Beiträge veröffentlichen werden sie hier erscheinen.", "empty_column.lists": "Du hast noch keine Listen. Wenn du eine anlegst, wird sie hier angezeigt.", @@ -198,7 +201,7 @@ "follow_recommendations.lead": "Beiträge von Personen, denen du folgst, werden in chronologischer Reihenfolge auf deiner Startseite angezeigt. Hab keine Angst, Fehler zu machen, du kannst den Leuten jederzeit wieder entfolgen!", "follow_request.authorize": "Erlauben", "follow_request.reject": "Ablehnen", - "follow_requests.unlocked_explanation": "Auch wenn dein Konto nicht gesperrt ist, haben die Mitarbeiter von {domain} gedacht, dass es besser wäre den Follow manuell zu bestätigen.", + "follow_requests.unlocked_explanation": "Auch wenn dein Konto nicht gesperrt ist, haben die Moderator_innen von {domain} gedacht, dass du diesen Follower lieber manuell bestätigen solltest.", "generic.saved": "Gespeichert", "getting_started.developers": "Entwickler", "getting_started.directory": "Profilverzeichnis", @@ -225,13 +228,13 @@ "intervals.full.days": "{number, plural, one {# Tag} other {# Tage}}", "intervals.full.hours": "{number, plural, one {# Stunde} other {# Stunden}}", "intervals.full.minutes": "{number, plural, one {# Minute} other {# Minuten}}", - "keyboard_shortcuts.back": "zurück navigieren", + "keyboard_shortcuts.back": "Zurück navigieren", "keyboard_shortcuts.blocked": "Liste blockierter Profile öffnen", "keyboard_shortcuts.boost": "teilen", "keyboard_shortcuts.column": "einen Beitrag in einer der Spalten fokussieren", "keyboard_shortcuts.compose": "fokussiere das Eingabefeld", - "keyboard_shortcuts.conversations": "um die Konversationsspalte zu öffnen", "keyboard_shortcuts.description": "Beschreibung", + "keyboard_shortcuts.direct": "um Direktnachrichtenspalte zu öffnen", "keyboard_shortcuts.down": "sich in der Liste hinunter bewegen", "keyboard_shortcuts.enter": "Beitrag öffnen", "keyboard_shortcuts.favourite": "um zu favorisieren", @@ -264,6 +267,8 @@ "lightbox.expand": "Bildansicht erweitern", "lightbox.next": "Weiter", "lightbox.previous": "Zurück", + "limited_account_hint.action": "Profil trotzdem anzeigen", + "limited_account_hint.title": "Dieses Profil wurde von den Moderatoren deines Servers versteckt.", "lists.account.add": "Zur Liste hinzufügen", "lists.account.remove": "Von der Liste entfernen", "lists.delete": "Liste löschen", @@ -279,7 +284,7 @@ "lists.subheading": "Deine Listen", "load_pending": "{count, plural, one {# neuer Beitrag} other {# neue Beiträge}}", "loading_indicator.label": "Wird geladen …", - "media_gallery.toggle_visible": "Sichtbarkeit umschalten", + "media_gallery.toggle_visible": "{number, plural, one {Bild verbergen} other {Bilder verbergen}}", "missing_indicator.label": "Nicht gefunden", "missing_indicator.sublabel": "Die Ressource konnte nicht gefunden werden", "mute_modal.duration": "Dauer", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Lesezeichen", "navigation_bar.community_timeline": "Lokale Zeitleiste", "navigation_bar.compose": "Neuen Beitrag verfassen", + "navigation_bar.direct": "Direktnachrichten", "navigation_bar.discover": "Entdecken", "navigation_bar.domain_blocks": "Versteckte Domains", "navigation_bar.edit_profile": "Profil bearbeiten", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Umfrage entfernen", "privacy.change": "Sichtbarkeit des Beitrags anpassen", "privacy.direct.long": "Wird an erwähnte Profile gesendet", - "privacy.direct.short": "Nur Leute, die ich erwähne", + "privacy.direct.short": "Nur erwähnte Personen", "privacy.private.long": "Nur für Folgende sichtbar", "privacy.private.short": "Nur Follower", "privacy.public.long": "Für alle sichtbar", @@ -392,23 +398,23 @@ "report.block_explanation": "Du wirst die Beiträge von diesem Konto nicht sehen. Das Konto wird nicht in der Lage sein, deine Beiträge zu sehen oder dir zu folgen. Die Person hinter dem Konto wird wissen, dass du das Konto blockiert hast.", "report.categories.other": "Andere", "report.categories.spam": "Spam", - "report.categories.violation": "Inhalt verletzt ein oder mehrere Server-Regeln", - "report.category.subtitle": "Wähle die beste Zugehörigkeit", - "report.category.title": "Sag uns, was mit diesem {type} vor sich geht", + "report.categories.violation": "Der Inhalt verletzt eine oder mehrere Server-Regeln", + "report.category.subtitle": "Wähle die passendste Kategorie", + "report.category.title": "Sag uns, was das Problem mit diesem {type} ist", "report.category.title_account": "Profil", "report.category.title_status": "Beitrag", "report.close": "Fertig", "report.comment.title": "Gibt es etwas anderes, was wir wissen sollten?", "report.forward": "An {target} weiterleiten", - "report.forward_hint": "Dieses Konto ist von einem anderen Server. Soll eine anonymisierte Kopie des Berichts auch dorthin geschickt werden?", + "report.forward_hint": "Dieses Konto gehört zu einem anderen Server. Soll eine anonymisierte Kopie der Meldung auch dorthin geschickt werden?", "report.mute": "Stummschalten", "report.mute_explanation": "Du wirst die Beiträge vom Konto nicht mehr sehen. Das Konto kann dir immernoch folgen und die Person hinter dem Konto wird deine Beiträge sehen können und nicht wissen, dass du sie stumm geschaltet hast.", "report.next": "Weiter", "report.placeholder": "Zusätzliche Kommentare", "report.reasons.dislike": "Das gefällt mir nicht", - "report.reasons.dislike_description": "Das ist nicht etwas, was ihr nicht sehen wollt", + "report.reasons.dislike_description": "Es ist etwas, das du nicht sehen willst", "report.reasons.other": "Da ist was anderes", - "report.reasons.other_description": "Das Problem passt nicht in eine der Kategorien", + "report.reasons.other_description": "Das Problem passt nicht in die Kategorien", "report.reasons.spam": "Das ist Spam", "report.reasons.spam_description": "Bösartige Links, gefälschtes Engagement oder wiederholte Antworten", "report.reasons.violation": "Es verstößt gegen Serverregeln", @@ -419,10 +425,10 @@ "report.statuses.title": "Gibt es Beiträge, die diesen Bericht unterstützen?", "report.submit": "Absenden", "report.target": "{target} melden", - "report.thanks.take_action": "Hier sind deine Optionen, die es dir erlauben zu kontrollieren, was du auf Mastodon sehen möchtest:", + "report.thanks.take_action": "Das sind deine Möglichkeiten, zu bestimmen, was du auf Mastodon sehen möchtest:", "report.thanks.take_action_actionable": "Während wir dies überprüfen, kannst du gegen @{name} vorgehen:", "report.thanks.title": "Möchtest du das nicht sehen?", - "report.thanks.title_actionable": "Vielen Dank für die Berichterstattung, wir werden uns damit befassen.", + "report.thanks.title_actionable": "Vielen Dank für die Meldung, wir werden uns das ansehen.", "report.unfollow": "@{name} entfolgen", "report.unfollow_explanation": "Du folgst diesem Konto. Um die Beiträge nicht mehr auf deiner Startseite zu sehen, entfolge dem Konto.", "search.placeholder": "Suche", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index b699088d4..50f166021 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -75,6 +75,14 @@ { "defaultMessage": "Unmute notifications from @{name}", "id": "account.unmute_notifications" + }, + { + "defaultMessage": "Mute @{name}", + "id": "account.mute" + }, + { + "defaultMessage": "Block @{name}", + "id": "account.block" } ], "path": "app/javascript/mastodon/components/account.json" @@ -790,6 +798,19 @@ { "descriptors": [ { + "defaultMessage": "This profile has been hidden by the moderators of your server.", + "id": "limited_account_hint.title" + }, + { + "defaultMessage": "Show profile anyway", + "id": "limited_account_hint.action" + } + ], + "path": "app/javascript/mastodon/features/account_timeline/components/limited_account_hint.json" + }, + { + "descriptors": [ + { "defaultMessage": "{name} has moved to:", "id": "account.moved_to" } @@ -1239,6 +1260,23 @@ { "descriptors": [ { + "defaultMessage": "Change language", + "id": "compose.language.change" + }, + { + "defaultMessage": "Search languages...", + "id": "compose.language.search" + }, + { + "defaultMessage": "Clear", + "id": "emoji_button.clear" + } + ], + "path": "app/javascript/mastodon/features/compose/components/language_dropdown.json" + }, + { + "descriptors": [ + { "defaultMessage": "Edit profile", "id": "navigation_bar.edit_profile" } @@ -1326,7 +1364,7 @@ "id": "privacy.private.long" }, { - "defaultMessage": "Only people I mention", + "defaultMessage": "Mentioned people only", "id": "privacy.direct.short" }, { @@ -1508,7 +1546,7 @@ "id": "compose_form.hashtag_warning" }, { - "defaultMessage": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "defaultMessage": "Posts on Mastodon are not end-to-end encrypted. Do not share any sensitive information over Mastodon.", "id": "compose_form.encryption_warning" }, { @@ -1616,12 +1654,20 @@ { "descriptors": [ { - "defaultMessage": "Conversations", - "id": "column.conversations" + "defaultMessage": "Direct messages", + "id": "column.direct" + }, + { + "defaultMessage": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "id": "compose_form.encryption_warning" + }, + { + "defaultMessage": "Learn more", + "id": "compose_form.direct_message_warning_learn_more" }, { - "defaultMessage": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", - "id": "empty_column.conversations" + "defaultMessage": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "id": "empty_column.direct" } ], "path": "app/javascript/mastodon/features/direct_timeline/index.json" @@ -1881,6 +1927,10 @@ "id": "timeline_hint.resources.followers" }, { + "defaultMessage": "Account suspended", + "id": "empty_column.account_suspended" + }, + { "defaultMessage": "Profile unavailable", "id": "empty_column.account_unavailable" }, @@ -1898,6 +1948,10 @@ "id": "timeline_hint.resources.follows" }, { + "defaultMessage": "Account suspended", + "id": "empty_column.account_suspended" + }, + { "defaultMessage": "Profile unavailable", "id": "empty_column.account_unavailable" }, @@ -1965,8 +2019,8 @@ "id": "navigation_bar.explore" }, { - "defaultMessage": "Conversations", - "id": "column.conversations" + "defaultMessage": "Direct messages", + "id": "navigation_bar.direct" }, { "defaultMessage": "Bookmarks", @@ -2222,8 +2276,8 @@ "id": "keyboard_shortcuts.federated" }, { - "defaultMessage": "to open conversations column", - "id": "keyboard_shortcuts.conversations" + "defaultMessage": "to open direct messages column", + "id": "keyboard_shortcuts.direct" }, { "defaultMessage": "to open \"get started\" column", @@ -3526,8 +3580,8 @@ "id": "tabs_bar.federated_timeline" }, { - "defaultMessage": "Conversations", - "id": "column.conversations" + "defaultMessage": "Direct messages", + "id": "navigation_bar.direct" }, { "defaultMessage": "Favourites", @@ -3670,4 +3724,4 @@ ], "path": "app/javascript/mastodon/features/video/index.json" } -] \ No newline at end of file +] diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 5a6af8291..f9f62b9cb 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -70,7 +70,7 @@ "column.blocks": "Αποκλεισμένοι χρήστες", "column.bookmarks": "Σελιδοδείκτες", "column.community": "Τοπική ροή", - "column.conversations": "Συνομιλίες", + "column.direct": "Προσωπικά μηνύματα", "column.directory": "Δες προφίλ", "column.domain_blocks": "Κρυμμένοι τομείς", "column.favourites": "Αγαπημένα", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Τοπικά μόνο", "community.column_settings.media_only": "Μόνο πολυμέσα", "community.column_settings.remote_only": "Απομακρυσμένα μόνο", + "compose.language.change": "Αλλαγή γλώσσας", + "compose.language.search": "Αναζήτηση γλωσσών...", "compose_form.direct_message_warning_learn_more": "Μάθετε περισσότερα", "compose_form.encryption_warning": "Οι δημοσιεύσεις στο Mastodon δεν είναι κρυπτογραφημένες από άκρο σε άκρο. Μην μοιράζεστε επικίνδυνες πληροφορίες μέσω του Mastodon.", "compose_form.hashtag_warning": "Αυτό το τουτ δεν θα εμφανίζεται κάτω από κανένα hashtag καθώς είναι αφανές. Μόνο τα δημόσια τουτ μπορούν να αναζητηθούν ανά hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Ενσωματώστε αυτή την κατάσταση στην ιστοσελίδα σας αντιγράφοντας τον παρακάτω κώδικα.", "embed.preview": "Ορίστε πως θα φαίνεται:", "emoji_button.activity": "Δραστηριότητα", + "emoji_button.clear": "Καθαρισμός", "emoji_button.custom": "Προσαρμοσμένα", "emoji_button.flags": "Σημαίες", "emoji_button.food": "Φαγητά & Ποτά", @@ -166,7 +169,7 @@ "empty_column.blocks": "Δεν έχεις αποκλείσει κανέναν χρήστη ακόμα.", "empty_column.bookmarked_statuses": "Δεν έχεις κανένα αποθηκευμένο τουτ ακόμα. Μόλις αποθηκεύσεις κάποιο, θα εμφανιστεί εδώ.", "empty_column.community": "Η τοπική ροή είναι κενή. Γράψε κάτι δημόσιο παραμύθι ν' αρχινίσει!", - "empty_column.conversations": "Μόλις στείλετε ή λάβετε μια δημοσίευση που είναι ορατή μόνο σε άτομα που αναφέρονται σε αυτή, θα εμφανιστεί εδώ.", + "empty_column.direct": "Δεν έχεις προσωπικά μηνύματα ακόμα. Όταν στείλεις ή λάβεις κανένα, θα εμφανιστεί εδώ.", "empty_column.domain_blocks": "Δεν υπάρχουν αποκλεισμένοι τομείς ακόμα.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Δεν έχεις κανένα αγαπημένο τουτ ακόμα. Μόλις αγαπήσεις κάποιο, θα εμφανιστεί εδώ.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "προώθηση", "keyboard_shortcuts.column": "εμφάνιση της κατάστασης σε μια από τις στήλες", "keyboard_shortcuts.compose": "εστίαση στην περιοχή συγγραφής", - "keyboard_shortcuts.conversations": "για να ανοίξετε στήλη συνομιλιών", "keyboard_shortcuts.description": "Περιγραφή", + "keyboard_shortcuts.direct": "άνοιγμα στήλης προσωπικών μηνυμάτων", "keyboard_shortcuts.down": "κίνηση προς τα κάτω στη λίστα", "keyboard_shortcuts.enter": "εμφάνιση κατάστασης", "keyboard_shortcuts.favourite": "σημείωση ως αγαπημένο", @@ -264,6 +267,8 @@ "lightbox.expand": "Ανάπτυξη πλαισίου εμφάνισης εικόνας", "lightbox.next": "Επόμενο", "lightbox.previous": "Προηγούμενο", + "limited_account_hint.action": "Εμφάνιση προφίλ ούτως ή άλλως", + "limited_account_hint.title": "Αυτό το προφίλ έχει αποκρυφτεί από τους διαχειριστές του διακομιστή σας.", "lists.account.add": "Πρόσθεσε στη λίστα", "lists.account.remove": "Βγάλε από τη λίστα", "lists.delete": "Διαγραφή λίστας", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Σελιδοδείκτες", "navigation_bar.community_timeline": "Τοπική ροή", "navigation_bar.compose": "Γράψε νέο τουτ", + "navigation_bar.direct": "Προσωπικά μηνύματα", "navigation_bar.discover": "Ανακάλυψη", "navigation_bar.domain_blocks": "Κρυμμένοι τομείς", "navigation_bar.edit_profile": "Επεξεργασία προφίλ", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Αφαίρεση δημοσκόπησης", "privacy.change": "Προσαρμογή ιδιωτικότητας δημοσίευσης", "privacy.direct.long": "Δημοσίευση μόνο σε όσους και όσες αναφέρονται", - "privacy.direct.short": "Μόνο άτομα που αναφέρω", + "privacy.direct.short": "Αναφερόμενα άτομα μόνο", "privacy.private.long": "Δημοσίευση μόνο στους ακόλουθους", "privacy.private.short": "Μόνο ακόλουθοι", "privacy.public.long": "Ορατό σε όλους", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json new file mode 100644 index 000000000..51f8463cd --- /dev/null +++ b/app/javascript/mastodon/locales/en-GB.json @@ -0,0 +1,549 @@ +{ + "account.account_note_header": "Note", + "account.add_or_remove_from_list": "Add or Remove from lists", + "account.badges.bot": "Bot", + "account.badges.group": "Group", + "account.block": "Block @{name}", + "account.block_domain": "Block domain {domain}", + "account.blocked": "Blocked", + "account.browse_more_on_origin_server": "Browse more on the original profile", + "account.cancel_follow_request": "Cancel follow request", + "account.direct": "Direct message @{name}", + "account.disable_notifications": "Stop notifying me when @{name} posts", + "account.domain_blocked": "Domain blocked", + "account.edit_profile": "Edit profile", + "account.enable_notifications": "Notify me when @{name} posts", + "account.endorse": "Feature on profile", + "account.follow": "Follow", + "account.followers": "Followers", + "account.followers.empty": "No one follows this user yet.", + "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", + "account.following": "Following", + "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", + "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows_you": "Follows you", + "account.hide_reblogs": "Hide boosts from @{name}", + "account.joined": "Joined {date}", + "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.media": "Media", + "account.mention": "Mention @{name}", + "account.moved_to": "{name} has moved to:", + "account.mute": "Mute @{name}", + "account.mute_notifications": "Mute notifications from @{name}", + "account.muted": "Muted", + "account.posts": "Posts", + "account.posts_with_replies": "Posts and replies", + "account.report": "Report @{name}", + "account.requested": "Awaiting approval. Click to cancel follow request", + "account.share": "Share @{name}'s profile", + "account.show_reblogs": "Show boosts from @{name}", + "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}", + "account.unblock": "Unblock @{name}", + "account.unblock_domain": "Unblock domain {domain}", + "account.unblock_short": "Unblock", + "account.unendorse": "Don't feature on profile", + "account.unfollow": "Unfollow", + "account.unmute": "Unmute @{name}", + "account.unmute_notifications": "Unmute notifications from @{name}", + "account.unmute_short": "Unmute", + "account_note.placeholder": "Click to add a note", + "admin.dashboard.daily_retention": "User retention rate by day after sign-up", + "admin.dashboard.monthly_retention": "User retention rate by month after sign-up", + "admin.dashboard.retention.average": "Average", + "admin.dashboard.retention.cohort": "Sign-up month", + "admin.dashboard.retention.cohort_size": "New users", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", + "alert.unexpected.message": "An unexpected error occurred.", + "alert.unexpected.title": "Oops!", + "announcement.announcement": "Announcement", + "attachments_list.unprocessed": "(unprocessed)", + "autosuggest_hashtag.per_week": "{count} per week", + "boost_modal.combo": "You can press {combo} to skip this next time", + "bundle_column_error.body": "Something went wrong while loading this component.", + "bundle_column_error.retry": "Try again", + "bundle_column_error.title": "Network error", + "bundle_modal_error.close": "Close", + "bundle_modal_error.message": "Something went wrong while loading this component.", + "bundle_modal_error.retry": "Try again", + "column.blocks": "Blocked users", + "column.bookmarks": "Bookmarks", + "column.community": "Local timeline", + "column.direct": "Direct messages", + "column.directory": "Browse profiles", + "column.domain_blocks": "Blocked domains", + "column.favourites": "Favourites", + "column.follow_requests": "Follow requests", + "column.home": "Home", + "column.lists": "Lists", + "column.mutes": "Muted users", + "column.notifications": "Notifications", + "column.pins": "Pinned post", + "column.public": "Federated timeline", + "column_back_button.label": "Back", + "column_header.hide_settings": "Hide settings", + "column_header.moveLeft_settings": "Move column to the left", + "column_header.moveRight_settings": "Move column to the right", + "column_header.pin": "Pin", + "column_header.show_settings": "Show settings", + "column_header.unpin": "Unpin", + "column_subheading.settings": "Settings", + "community.column_settings.local_only": "Local only", + "community.column_settings.media_only": "Media only", + "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", + "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", + "compose_form.lock_disclaimer.lock": "locked", + "compose_form.placeholder": "What is on your mind?", + "compose_form.poll.add_option": "Add a choice", + "compose_form.poll.duration": "Poll duration", + "compose_form.poll.option_placeholder": "Choice {number}", + "compose_form.poll.remove_option": "Remove this choice", + "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices", + "compose_form.poll.switch_to_single": "Change poll to allow for a single choice", + "compose_form.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.save_changes": "Save changes", + "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}", + "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}", + "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}", + "compose_form.spoiler.marked": "Text is hidden behind warning", + "compose_form.spoiler.unmarked": "Text is not hidden", + "compose_form.spoiler_placeholder": "Write your warning here", + "confirmation_modal.cancel": "Cancel", + "confirmations.block.block_and_report": "Block & Report", + "confirmations.block.confirm": "Block", + "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.delete.confirm": "Delete", + "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.discard_edit_media.confirm": "Discard", + "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", + "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.mute.confirm": "Mute", + "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.", + "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "confirmations.unfollow.confirm": "Unfollow", + "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", + "embed.instructions": "Embed this status on your website by copying the code below.", + "embed.preview": "Here is what it will look like:", + "emoji_button.activity": "Activity", + "emoji_button.clear": "Clear", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flags", + "emoji_button.food": "Food & Drink", + "emoji_button.label": "Insert emoji", + "emoji_button.nature": "Nature", + "emoji_button.not_found": "No matching emojis found", + "emoji_button.objects": "Objects", + "emoji_button.people": "People", + "emoji_button.recent": "Frequently used", + "emoji_button.search": "Search...", + "emoji_button.search_results": "Search results", + "emoji_button.symbols": "Symbols", + "emoji_button.travel": "Travel & Places", + "empty_column.account_suspended": "Account suspended", + "empty_column.account_timeline": "No posts found", + "empty_column.account_unavailable": "Profile unavailable", + "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.", + "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.domain_blocks": "There are no blocked domains yet.", + "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", + "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.", + "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.", + "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.", + "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}", + "empty_column.home.suggestions": "See some suggestions", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", + "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.notifications": "You don't have any notifications yet. When other people interact with you, you will see it here.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", + "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.", + "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.", + "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", + "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", + "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", + "errors.unexpected_crash.report_issue": "Report issue", + "explore.search_results": "Search results", + "explore.suggested_follows": "For you", + "explore.title": "Explore", + "explore.trending_links": "News", + "explore.trending_statuses": "Posts", + "explore.trending_tags": "Hashtags", + "follow_recommendations.done": "Done", + "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.", + "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!", + "follow_request.authorize": "Authorize", + "follow_request.reject": "Reject", + "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.", + "generic.saved": "Saved", + "getting_started.developers": "Developers", + "getting_started.directory": "Profile directory", + "getting_started.documentation": "Documentation", + "getting_started.heading": "Getting started", + "getting_started.invite": "Invite people", + "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.security": "Security", + "getting_started.terms": "Terms of service", + "hashtag.column_header.tag_mode.all": "and {additional}", + "hashtag.column_header.tag_mode.any": "or {additional}", + "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", + "hashtag.column_settings.tag_mode.all": "All of these", + "hashtag.column_settings.tag_mode.any": "Any of these", + "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "home.column_settings.basic": "Basic", + "home.column_settings.show_reblogs": "Show boosts", + "home.column_settings.show_replies": "Show replies", + "home.hide_announcements": "Hide announcements", + "home.show_announcements": "Show announcements", + "intervals.full.days": "{number, plural, one {# day} other {# days}}", + "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", + "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", + "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.compose": "to focus the compose textarea", + "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.favourites": "to open favourites list", + "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.heading": "Keyboard Shortcuts", + "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.muted": "to open muted users list", + "keyboard_shortcuts.my_profile": "to open your profile", + "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.open_media": "to open media", + "keyboard_shortcuts.pinned": "to open pinned posts list", + "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.spoilers": "to show/hide CW field", + "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", + "keyboard_shortcuts.toot": "to start a brand new post", + "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.up": "to move up in the list", + "lightbox.close": "Close", + "lightbox.compress": "Compress image view box", + "lightbox.expand": "Expand image view box", + "lightbox.next": "Next", + "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", + "lists.account.add": "Add to list", + "lists.account.remove": "Remove from list", + "lists.delete": "Delete list", + "lists.edit": "Edit list", + "lists.edit.submit": "Change title", + "lists.new.create": "Add list", + "lists.new.title_placeholder": "New list title", + "lists.replies_policy.followed": "Any followed user", + "lists.replies_policy.list": "Members of the list", + "lists.replies_policy.none": "No one", + "lists.replies_policy.title": "Show replies to:", + "lists.search": "Search among people you follow", + "lists.subheading": "Your lists", + "load_pending": "{count, plural, one {# new item} other {# new items}}", + "loading_indicator.label": "Loading...", + "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}", + "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", + "mute_modal.duration": "Duration", + "mute_modal.hide_notifications": "Hide notifications from this user?", + "mute_modal.indefinite": "Indefinite", + "navigation_bar.apps": "Mobile apps", + "navigation_bar.blocks": "Blocked users", + "navigation_bar.bookmarks": "Bookmarks", + "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.compose": "Compose new post", + "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", + "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.edit_profile": "Edit profile", + "navigation_bar.explore": "Explore", + "navigation_bar.favourites": "Favourites", + "navigation_bar.filters": "Muted words", + "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.follows_and_followers": "Follows and followers", + "navigation_bar.info": "About this server", + "navigation_bar.keyboard_shortcuts": "Hotkeys", + "navigation_bar.lists": "Lists", + "navigation_bar.logout": "Logout", + "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", + "navigation_bar.pins": "Pinned posts", + "navigation_bar.preferences": "Preferences", + "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", + "notification.admin.sign_up": "{name} signed up", + "notification.favourite": "{name} favourited your status", + "notification.follow": "{name} followed you", + "notification.follow_request": "{name} has requested to follow you", + "notification.mention": "{name} mentioned you", + "notification.own_poll": "Your poll has ended", + "notification.poll": "A poll you have voted in has ended", + "notification.reblog": "{name} boosted your status", + "notification.status": "{name} just posted", + "notification.update": "{name} edited a post", + "notifications.clear": "Clear notifications", + "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.admin.sign_up": "New sign-ups:", + "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.favourite": "Favourites:", + "notifications.column_settings.filter_bar.advanced": "Display all categories", + "notifications.column_settings.filter_bar.category": "Quick filter bar", + "notifications.column_settings.filter_bar.show_bar": "Show filter bar", + "notifications.column_settings.follow": "New followers:", + "notifications.column_settings.follow_request": "New follow requests:", + "notifications.column_settings.mention": "Mentions:", + "notifications.column_settings.poll": "Poll results:", + "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.show": "Show in column", + "notifications.column_settings.sound": "Play sound", + "notifications.column_settings.status": "New posts:", + "notifications.column_settings.unread_notifications.category": "Unread notifications", + "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications", + "notifications.column_settings.update": "Edits:", + "notifications.filter.all": "All", + "notifications.filter.boosts": "Boosts", + "notifications.filter.favourites": "Favourites", + "notifications.filter.follows": "Follows", + "notifications.filter.mentions": "Mentions", + "notifications.filter.polls": "Poll results", + "notifications.filter.statuses": "Updates from people you follow", + "notifications.grant_permission": "Grant permission.", + "notifications.group": "{count} notifications", + "notifications.mark_as_read": "Mark every notification as read", + "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", + "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", + "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications_permission_banner.enable": "Enable desktop notifications", + "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", + "notifications_permission_banner.title": "Never miss a thing", + "picture_in_picture.restore": "Put it back", + "poll.closed": "Closed", + "poll.refresh": "Refresh", + "poll.total_people": "{count, plural, one {# person} other {# people}}", + "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", + "poll.vote": "Vote", + "poll.voted": "You voted for this answer", + "poll.votes": "{votes, plural, one {# vote} other {# votes}}", + "poll_button.add_poll": "Add a poll", + "poll_button.remove_poll": "Remove poll", + "privacy.change": "Adjust status privacy", + "privacy.direct.long": "Visible for mentioned users only", + "privacy.direct.short": "Direct", + "privacy.private.long": "Visible for followers only", + "privacy.private.short": "Followers-only", + "privacy.public.long": "Visible for all", + "privacy.public.short": "Public", + "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", + "privacy.unlisted.short": "Unlisted", + "refresh": "Refresh", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "relative_time.days": "{number}d", + "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago", + "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago", + "relative_time.full.just_now": "just now", + "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago", + "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago", + "relative_time.hours": "{number}h", + "relative_time.just_now": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "relative_time.today": "today", + "reply_indicator.cancel": "Cancel", + "report.block": "Block", + "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", + "report.categories.other": "Other", + "report.categories.spam": "Spam", + "report.categories.violation": "Content violates one or more server rules", + "report.category.subtitle": "Choose the best match", + "report.category.title": "Tell us what's going on with this {type}", + "report.category.title_account": "profile", + "report.category.title_status": "post", + "report.close": "Done", + "report.comment.title": "Is there anything else you think we should know?", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "report.mute": "Mute", + "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.", + "report.next": "Next", + "report.placeholder": "Type or paste additional comments", + "report.reasons.dislike": "I don't like it", + "report.reasons.dislike_description": "It is not something you want to see", + "report.reasons.other": "It's something else", + "report.reasons.other_description": "The issue does not fit into other categories", + "report.reasons.spam": "It's spam", + "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies", + "report.reasons.violation": "It violates server rules", + "report.reasons.violation_description": "You are aware that it breaks specific rules", + "report.rules.subtitle": "Select all that apply", + "report.rules.title": "Which rules are being violated?", + "report.statuses.subtitle": "Select all that apply", + "report.statuses.title": "Are there any posts that back up this report?", + "report.submit": "Submit report", + "report.target": "Report {target}", + "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:", + "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:", + "report.thanks.title": "Don't want to see this?", + "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", + "report.unfollow": "Unfollow @{name}", + "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "search.placeholder": "Search", + "search_popout.search_format": "Advanced search format", + "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.status": "status", + "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.user": "user", + "search_results.accounts": "People", + "search_results.all": "All", + "search_results.hashtags": "Hashtags", + "search_results.nothing_found": "Could not find anything for these search terms", + "search_results.statuses": "Posts", + "search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.", + "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "status.admin_account": "Open moderation interface for @{name}", + "status.admin_status": "Open this status in the moderation interface", + "status.block": "Block @{name}", + "status.bookmark": "Bookmark", + "status.cancel_reblog_private": "Unboost", + "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", + "status.delete": "Delete", + "status.detailed_status": "Detailed conversation view", + "status.direct": "Direct message @{name}", + "status.edit": "Edit", + "status.edited": "Edited {date}", + "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}", + "status.embed": "Embed", + "status.favourite": "Favourite", + "status.filtered": "Filtered", + "status.history.created": "{name} created {date}", + "status.history.edited": "{name} edited {date}", + "status.load_more": "Load more", + "status.media_hidden": "Media hidden", + "status.mention": "Mention @{name}", + "status.more": "More", + "status.mute": "Mute @{name}", + "status.mute_conversation": "Mute conversation", + "status.open": "Expand this status", + "status.pin": "Pin on profile", + "status.pinned": "Pinned post", + "status.read_more": "Read more", + "status.reblog": "Boost", + "status.reblog_private": "Boost with original visibility", + "status.reblogged_by": "{name} boosted", + "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.", + "status.redraft": "Delete & re-draft", + "status.remove_bookmark": "Remove bookmark", + "status.reply": "Reply", + "status.replyAll": "Reply to thread", + "status.report": "Report @{name}", + "status.sensitive_warning": "Sensitive content", + "status.share": "Share", + "status.show_less": "Show less", + "status.show_less_all": "Show less for all", + "status.show_more": "Show more", + "status.show_more_all": "Show more for all", + "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", + "status.unmute_conversation": "Unmute conversation", + "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", + "tabs_bar.federated_timeline": "Federated", + "tabs_bar.home": "Home", + "tabs_bar.local_timeline": "Local", + "tabs_bar.notifications": "Notifications", + "tabs_bar.search": "Search", + "time_remaining.days": "{number, plural, one {# day} other {# days}} left", + "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", + "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", + "time_remaining.moments": "Moments remaining", + "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", + "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.", + "timeline_hint.resources.followers": "Followers", + "timeline_hint.resources.follows": "Follows", + "timeline_hint.resources.statuses": "Older posts", + "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", + "trends.trending_now": "Trending now", + "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", + "units.short.billion": "{count}B", + "units.short.million": "{count}M", + "units.short.thousand": "{count}K", + "upload_area.title": "Drag & drop to upload", + "upload_button.label": "Add images, a video or an audio file", + "upload_error.limit": "File upload limit exceeded.", + "upload_error.poll": "File upload not allowed with polls.", + "upload_form.audio_description": "Describe for people with hearing loss", + "upload_form.description": "Describe for the visually impaired", + "upload_form.description_missing": "No description added", + "upload_form.edit": "Edit", + "upload_form.thumbnail": "Change thumbnail", + "upload_form.undo": "Delete", + "upload_form.video_description": "Describe for people with hearing loss or visual impairment", + "upload_modal.analyzing_picture": "Analyzing picture…", + "upload_modal.apply": "Apply", + "upload_modal.applying": "Applying…", + "upload_modal.choose_image": "Choose image", + "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", + "upload_modal.detect_text": "Detect text from picture", + "upload_modal.edit_media": "Edit media", + "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", + "upload_modal.preparing_ocr": "Preparing OCR…", + "upload_modal.preview_label": "Preview ({ratio})", + "upload_progress.label": "Uploading…", + "video.close": "Close video", + "video.download": "Download file", + "video.exit_fullscreen": "Exit full screen", + "video.expand": "Expand video", + "video.fullscreen": "Full screen", + "video.hide": "Hide video", + "video.mute": "Mute sound", + "video.pause": "Pause", + "video.play": "Play", + "video.unmute": "Unmute sound" +} diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 4804eefa2..a630f50c7 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -70,7 +70,7 @@ "column.blocks": "Blocked users", "column.bookmarks": "Bookmarks", "column.community": "Local timeline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Blocked domains", "column.favourites": "Favourites", @@ -96,8 +96,10 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Media Only", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Learn more", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any sensitive information over Mastodon.", "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", "compose_form.lock_disclaimer.lock": "locked", @@ -151,6 +153,7 @@ "embed.instructions": "Embed this post on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", + "emoji_button.clear": "Clear", "emoji_button.custom": "Custom", "emoji_button.flags": "Flags", "emoji_button.food": "Food & Drink", @@ -170,7 +173,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no blocked domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.", @@ -234,8 +237,8 @@ "keyboard_shortcuts.boost": "Boost post", "keyboard_shortcuts.column": "Focus column", "keyboard_shortcuts.compose": "Focus compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "Move down in the list", "keyboard_shortcuts.enter": "Open post", "keyboard_shortcuts.favourite": "Favourite post", @@ -268,6 +271,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -294,6 +299,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new post", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Blocked domains", "navigation_bar.edit_profile": "Edit profile", @@ -371,7 +377,7 @@ "poll_button.remove_poll": "Remove poll", "privacy.change": "Change post privacy", "privacy.direct.long": "Visible for mentioned users only", - "privacy.direct.short": "Only people I mention", + "privacy.direct.short": "Mentioned people only", "privacy.private.long": "Visible for followers only", "privacy.private.short": "Followers only", "privacy.public.long": "Visible for all", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 315c416db..917994561 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -18,7 +18,7 @@ "account.followers": "Sekvantoj", "account.followers.empty": "Ankoraŭ neniu sekvas tiun uzanton.", "account.followers_counter": "{count, plural, one{{counter} Sekvanto} other {{counter} Sekvantoj}}", - "account.following": "Following", + "account.following": "Sekvantaj", "account.following_counter": "{count, plural, one {{counter} Sekvato} other {{counter} Sekvatoj}}", "account.follows.empty": "Tiu uzanto ankoraŭ ne sekvas iun.", "account.follows_you": "Sekvas vin", @@ -70,7 +70,7 @@ "column.blocks": "Blokitaj uzantoj", "column.bookmarks": "Legosignoj", "column.community": "Loka templinio", - "column.conversations": "Conversations", + "column.direct": "Rektaj mesaĝoj", "column.directory": "Trarigardi profilojn", "column.domain_blocks": "Blokitaj domajnoj", "column.favourites": "Stelumoj", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Nur loka", "community.column_settings.media_only": "Nur aŭdovidaĵoj", "community.column_settings.remote_only": "Nur malproksima", + "compose.language.change": "Ŝanĝi lingvon", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Lerni pli", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Ĉi tiu mesaĝo ne estos listigita per ajna kradvorto. Nur publikaj mesaĝoj estas serĉeblaj per kradvortoj.", @@ -147,6 +149,7 @@ "embed.instructions": "Enkorpigu ĉi tiun mesaĝon en vian retejon per kopio de la suba kodo.", "embed.preview": "Ĝi aperos tiel:", "emoji_button.activity": "Agadoj", + "emoji_button.clear": "Forviŝi", "emoji_button.custom": "Propraj", "emoji_button.flags": "Flagoj", "emoji_button.food": "Manĝi kaj trinki", @@ -166,7 +169,7 @@ "empty_column.blocks": "Vi ankoraŭ ne blokis uzanton.", "empty_column.bookmarked_statuses": "Vi ankoraŭ ne aldonis mesaĝon al viaj legosignoj. Kiam vi aldonos iun, tiu aperos ĉi tie.", "empty_column.community": "La loka templinio estas malplena. Skribu ion por plenigi ĝin!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Ankoraŭ neniu domajno estas blokita.", "empty_column.explore_statuses": "Nenio tendencas nun. Rekontrolu poste!", "empty_column.favourited_statuses": "Vi ankoraŭ ne stelumis mesaĝon. Kiam vi stelumos iun, tiu aperos ĉi tie.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "diskonigi", "keyboard_shortcuts.column": "fokusi mesaĝon en unu el la kolumnoj", "keyboard_shortcuts.compose": "enfokusigi la tekstujon", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Priskribo", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "iri suben en la listo", "keyboard_shortcuts.enter": "malfermi mesaĝon", "keyboard_shortcuts.favourite": "stelumi", @@ -264,6 +267,8 @@ "lightbox.expand": "Pligrandigi bildan vidkeston", "lightbox.next": "Sekva", "lightbox.previous": "Antaŭa", + "limited_account_hint.action": "Montru profilon ĉiukaze", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Aldoni al la listo", "lists.account.remove": "Forigi de la listo", "lists.delete": "Forigi la liston", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Legosignoj", "navigation_bar.community_timeline": "Loka templinio", "navigation_bar.compose": "Skribi novan mesaĝon", + "navigation_bar.direct": "Rektaj mesaĝoj", "navigation_bar.discover": "Esplori", "navigation_bar.domain_blocks": "Blokitaj domajnoj", "navigation_bar.edit_profile": "Redakti profilon", @@ -325,7 +331,7 @@ "notifications.column_settings.favourite": "Stelumoj:", "notifications.column_settings.filter_bar.advanced": "Montri ĉiujn kategoriojn", "notifications.column_settings.filter_bar.category": "Rapida filtra breto", - "notifications.column_settings.filter_bar.show_bar": "Show filter bar", + "notifications.column_settings.filter_bar.show_bar": "Montru filtrilon", "notifications.column_settings.follow": "Novaj sekvantoj:", "notifications.column_settings.follow_request": "Novaj petoj de sekvado:", "notifications.column_settings.mention": "Mencioj:", @@ -368,8 +374,8 @@ "privacy.direct.long": "Videbla nur al menciitaj uzantoj", "privacy.direct.short": "Direct", "privacy.private.long": "Videbla nur al viaj sekvantoj", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Visible for all", + "privacy.private.short": "Nur abonantoj", + "privacy.public.long": "Videbla por ĉiuj", "privacy.public.short": "Publika", "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", "privacy.unlisted.short": "Nelistigita", @@ -402,7 +408,7 @@ "report.forward": "Plusendi al {target}", "report.forward_hint": "La konto estas en alia servilo. Ĉu sendi sennomigitan kopion de la signalo ankaŭ tien?", "report.mute": "Silentigi", - "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.", + "report.mute_explanation": "Vi ne vidos iliajn afiŝojn. Ili ankoraŭ povas sekvi vin kaj vidi viajn afiŝojn, kaj ne scios ke si estas silentigitaj.", "report.next": "Sekva", "report.placeholder": "Pliaj komentoj", "report.reasons.dislike": "Mi ne ŝatas ĝin", @@ -414,7 +420,7 @@ "report.reasons.violation": "Ĝi malrespektas servilajn regulojn", "report.reasons.violation_description": "You are aware that it breaks specific rules", "report.rules.subtitle": "Elektu ĉiujn, kiuj validas", - "report.rules.title": "Which rules are being violated?", + "report.rules.title": "Kiuj reguloj estas malobservataj?", "report.statuses.subtitle": "Elektu ĉiujn, kiuj validas", "report.statuses.title": "Are there any posts that back up this report?", "report.submit": "Sendi", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 1eac00cff..6f5ebee70 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -18,7 +18,7 @@ "account.followers": "Seguidores", "account.followers.empty": "Todavía nadie sigue a este usuario.", "account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}", - "account.following": "Siguiendo", + "account.following": "Seguimientos", "account.following_counter": "{count, plural, other {{counter} Siguiendo}}", "account.follows.empty": "Todavía este usuario no sigue a nadie.", "account.follows_you": "Te sigue", @@ -70,7 +70,7 @@ "column.blocks": "Usuarios bloqueados", "column.bookmarks": "Marcadores", "column.community": "Línea temporal local", - "column.conversations": "Conversaciones", + "column.direct": "Mensajes directos", "column.directory": "Explorar perfiles", "column.domain_blocks": "Dominios bloqueados", "column.favourites": "Favoritos", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Sólo local", "community.column_settings.media_only": "Sólo medios", "community.column_settings.remote_only": "Sólo remoto", + "compose.language.change": "Cambiar idioma", + "compose.language.search": "Buscar idiomas…", "compose_form.direct_message_warning_learn_more": "Aprendé más", "compose_form.encryption_warning": "Los mensajes en Mastodon no están cifrados de extremo a extremo. No comparta ninguna información sensible al usar Mastodon.", "compose_form.hashtag_warning": "Este mensaje no se mostrará bajo ninguna etiqueta porque no es público. Sólo los mensajes públicos se pueden buscar por etiquetas.", @@ -147,6 +149,7 @@ "embed.instructions": "Insertá este mensaje a tu sitio web copiando el código de abajo.", "embed.preview": "Así es cómo se verá:", "emoji_button.activity": "Actividad", + "emoji_button.clear": "Limpiar", "emoji_button.custom": "Personalizado", "emoji_button.flags": "Banderas", "emoji_button.food": "Comida y bebida", @@ -166,7 +169,7 @@ "empty_column.blocks": "Todavía no bloqueaste a ningún usuario.", "empty_column.bookmarked_statuses": "Todavía no tenés mensajes guardados en \"Marcadores\". Cuando guardés uno en \"Marcadores\", se mostrará acá.", "empty_column.community": "La línea temporal local está vacía. ¡Escribí algo en modo público para que se empiece a correr la bola!", - "empty_column.conversations": "Una vez que enviés o recibás un mensaje que sólo sea visible para la gente mencionada en él, aparecerá aquí.", + "empty_column.direct": "Todavía no tenés ningún mensaje directo. Cuando enviés o recibás uno, se mostrará acá.", "empty_column.domain_blocks": "Todavía no hay dominios bloqueados.", "empty_column.explore_statuses": "No hay nada en tendencia ahora mismo. ¡Volvé a revisar más tarde!", "empty_column.favourited_statuses": "Todavía no tenés mensajes favoritos. Cuando marqués uno como favorito, se mostrará acá.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Adherir al mensaje", "keyboard_shortcuts.column": "Enfocar columna", "keyboard_shortcuts.compose": "Enfocar el área de texto de redacción", - "keyboard_shortcuts.conversations": "para abrir la columna de conversaciones", "keyboard_shortcuts.description": "Descripción", + "keyboard_shortcuts.direct": "para abrir columna de mensajes directos", "keyboard_shortcuts.down": "Bajar en la lista", "keyboard_shortcuts.enter": "Abrir mensaje", "keyboard_shortcuts.favourite": "Marcar mensaje como favorito", @@ -264,6 +267,8 @@ "lightbox.expand": "Expandir cuadro de vista de imagen", "lightbox.next": "Siguiente", "lightbox.previous": "Anterior", + "limited_account_hint.action": "Mostrar perfil de todos modos", + "limited_account_hint.title": "Este perfil fue ocultado por los moderadores de tu servidor.", "lists.account.add": "Agregar a lista", "lists.account.remove": "Quitar de lista", "lists.delete": "Eliminar lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Marcadores", "navigation_bar.community_timeline": "Línea temporal local", "navigation_bar.compose": "Redactar un nuevo mensaje", + "navigation_bar.direct": "Mensajes directos", "navigation_bar.discover": "Descubrir", "navigation_bar.domain_blocks": "Dominios bloqueados", "navigation_bar.edit_profile": "Editar perfil", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Quitar encuesta", "privacy.change": "Configurar privacidad del mensaje", "privacy.direct.long": "Visible sólo para los usuarios mencionados", - "privacy.direct.short": "Sólo a las cuentas que menciono", + "privacy.direct.short": "Sólo cuentas mencionadas", "privacy.private.long": "Visible sólo para los seguidores", "privacy.private.short": "Sólo para seguidores", "privacy.public.long": "Visible para todos", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index c51ed52a6..bb18bfa95 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -70,7 +70,7 @@ "column.blocks": "Usuarios bloqueados", "column.bookmarks": "Marcadores", "column.community": "Línea de tiempo local", - "column.conversations": "Conversations", + "column.direct": "Mensajes directos", "column.directory": "Buscar perfiles", "column.domain_blocks": "Dominios ocultados", "column.favourites": "Favoritos", @@ -92,8 +92,10 @@ "community.column_settings.local_only": "Solo local", "community.column_settings.media_only": "Solo media", "community.column_settings.remote_only": "Solo remoto", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Aprender mas", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.encryption_warning": "Los mensajes en Mastodon no están cifrados de extremo a extremo. No comparta ninguna información confidencial en Mastodon.", "compose_form.hashtag_warning": "Este toot no se mostrará bajo hashtags porque no es público. Sólo los toots públicos se pueden buscar por hashtag.", "compose_form.lock_disclaimer": "Tu cuenta no está bloqueada. Todos pueden seguirte para ver tus toots solo para seguidores.", "compose_form.lock_disclaimer.lock": "bloqueado", @@ -147,6 +149,7 @@ "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.", "embed.preview": "Así es como se verá:", "emoji_button.activity": "Actividad", + "emoji_button.clear": "Clear", "emoji_button.custom": "Personalizado", "emoji_button.flags": "Marcas", "emoji_button.food": "Comida y bebida", @@ -166,7 +169,7 @@ "empty_column.blocks": "Aún no has bloqueado a ningún usuario.", "empty_column.bookmarked_statuses": "Aún no tienes ningún toot guardado como marcador. Cuando guardes uno, se mostrará aquí.", "empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "Aún no tienes ningún mensaje directo. Cuando envíes o recibas uno, se mostrará aquí.", "empty_column.domain_blocks": "Todavía no hay dominios ocultos.", "empty_column.explore_statuses": "Nada es tendencia en este momento. ¡Revisa más tarde!", "empty_column.favourited_statuses": "Aún no tienes toots preferidos. Cuando marques uno como favorito, aparecerá aquí.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "retootear", "keyboard_shortcuts.column": "enfocar un estado en una de las columnas", "keyboard_shortcuts.compose": "enfocar el área de texto de redacción", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Descripción", + "keyboard_shortcuts.direct": "para abrir la columna de mensajes directos", "keyboard_shortcuts.down": "mover hacia abajo en la lista", "keyboard_shortcuts.enter": "abrir estado", "keyboard_shortcuts.favourite": "añadir a favoritos", @@ -264,6 +267,8 @@ "lightbox.expand": "Expandir cuadro de visualización de imagen", "lightbox.next": "Siguiente", "lightbox.previous": "Anterior", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Añadir a lista", "lists.account.remove": "Quitar de lista", "lists.delete": "Borrar lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Marcadores", "navigation_bar.community_timeline": "Historia local", "navigation_bar.compose": "Escribir un nuevo toot", + "navigation_bar.direct": "Mensajes directos", "navigation_bar.discover": "Descubrir", "navigation_bar.domain_blocks": "Dominios ocultos", "navigation_bar.edit_profile": "Editar perfil", @@ -366,12 +372,12 @@ "poll_button.remove_poll": "Eliminar encuesta", "privacy.change": "Ajustar privacidad", "privacy.direct.long": "Sólo mostrar a los usuarios mencionados", - "privacy.direct.short": "Direct", + "privacy.direct.short": "Sólo cuentas mencionadas", "privacy.private.long": "Sólo mostrar a seguidores", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Visible for all", + "privacy.private.short": "Solo seguidores", + "privacy.public.long": "Visible para todos", "privacy.public.short": "Público", - "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", + "privacy.unlisted.long": "Visible para todos, pero excluido de las funciones de descubrimiento", "privacy.unlisted.short": "No listado", "refresh": "Actualizar", "regeneration_indicator.label": "Cargando…", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 510d84baa..48d8a2faa 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -4,7 +4,7 @@ "account.badges.bot": "Bot", "account.badges.group": "Grupo", "account.block": "Bloquear a @{name}", - "account.block_domain": "Ocultar todo de {domain}", + "account.block_domain": "Bloquear dominio {domain}", "account.blocked": "Bloqueado", "account.browse_more_on_origin_server": "Ver más en el perfil original", "account.cancel_follow_request": "Cancelar la solicitud de seguimiento", @@ -70,7 +70,7 @@ "column.blocks": "Usuarios bloqueados", "column.bookmarks": "Marcadores", "column.community": "Línea de tiempo local", - "column.conversations": "Conversaciones", + "column.direct": "Mensajes directos", "column.directory": "Buscar perfiles", "column.domain_blocks": "Dominios ocultados", "column.favourites": "Favoritos", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Solo local", "community.column_settings.media_only": "Solo media", "community.column_settings.remote_only": "Solo remoto", + "compose.language.change": "Cambiar idioma", + "compose.language.search": "Buscar idiomas...", "compose_form.direct_message_warning_learn_more": "Aprender más", "compose_form.encryption_warning": "Los mensajes en Mastodon no están cifrados de extremo a extremo. No comparta ninguna información confidencial en Mastodon.", "compose_form.hashtag_warning": "Esta publicación no se mostrará bajo ningún hashtag porque no está listada. Sólo las publicaciones públicas se pueden buscar por hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.", "embed.preview": "Así es como se verá:", "emoji_button.activity": "Actividad", + "emoji_button.clear": "Limpiar", "emoji_button.custom": "Personalizado", "emoji_button.flags": "Marcas", "emoji_button.food": "Comida y bebida", @@ -166,7 +169,7 @@ "empty_column.blocks": "Aún no has bloqueado a ningún usuario.", "empty_column.bookmarked_statuses": "Aún no tienes ninguna publicación guardada como marcador. Cuando guardes una, se mostrará aquí.", "empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!", - "empty_column.conversations": "Una vez que envíe o reciba un mensaje que solo sea visible para la gente mencionada en él, aparecerá aquí.", + "empty_column.direct": "Aún no tienes ningún mensaje directo. Cuando envíes o recibas uno, se mostrará aquí.", "empty_column.domain_blocks": "Todavía no hay dominios ocultos.", "empty_column.explore_statuses": "Nada está en tendencia en este momento. ¡Revisa más tarde!", "empty_column.favourited_statuses": "Aún no tienes publicaciones favoritas. Cuando marques una como favorita, aparecerá aquí.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Retootear", "keyboard_shortcuts.column": "enfocar un estado en una de las columnas", "keyboard_shortcuts.compose": "enfocar el área de texto de redacción", - "keyboard_shortcuts.conversations": "para abrir la columna de conversaciones", "keyboard_shortcuts.description": "Descripción", + "keyboard_shortcuts.direct": "para abrir la columna de mensajes directos", "keyboard_shortcuts.down": "mover hacia abajo en la lista", "keyboard_shortcuts.enter": "abrir estado", "keyboard_shortcuts.favourite": "añadir a favoritos", @@ -264,6 +267,8 @@ "lightbox.expand": "Expandir cuadro de visualización de imagen", "lightbox.next": "Siguiente", "lightbox.previous": "Anterior", + "limited_account_hint.action": "Mostrar perfil de todos modos", + "limited_account_hint.title": "Este perfil ha sido ocultado por los moderadores de tu servidor.", "lists.account.add": "Añadir a lista", "lists.account.remove": "Quitar de lista", "lists.delete": "Borrar lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Marcadores", "navigation_bar.community_timeline": "Línea de tiempo local", "navigation_bar.compose": "Escribir nueva publicación", + "navigation_bar.direct": "Mensajes directos", "navigation_bar.discover": "Descubrir", "navigation_bar.domain_blocks": "Dominios ocultos", "navigation_bar.edit_profile": "Editar perfil", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Eliminar encuesta", "privacy.change": "Ajustar privacidad", "privacy.direct.long": "Sólo mostrar a los usuarios mencionados", - "privacy.direct.short": "Solo la gente que yo menciono", + "privacy.direct.short": "Sólo cuentas mencionadas", "privacy.private.long": "Sólo mostrar a seguidores", "privacy.private.short": "Solo seguidores", "privacy.public.long": "Visible para todos", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index ca40ff370..e7c153681 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -1,5 +1,5 @@ { - "account.account_note_header": "Note", + "account.account_note_header": "Märge", "account.add_or_remove_from_list": "Lisa või Eemalda nimekirjadest", "account.badges.bot": "Robot", "account.badges.group": "Grupp", @@ -8,7 +8,7 @@ "account.blocked": "Blokeeritud", "account.browse_more_on_origin_server": "Browse more on the original profile", "account.cancel_follow_request": "Tühista jälgimistaotlus", - "account.direct": "Otsesõnum @{name}", + "account.direct": "Saada otsesõnum @{name}'ile", "account.disable_notifications": "Stop notifying me when @{name} posts", "account.domain_blocked": "Domeen peidetud", "account.edit_profile": "Muuda profiili", @@ -17,28 +17,28 @@ "account.follow": "Jälgi", "account.followers": "Jälgijad", "account.followers.empty": "Keegi ei jälgi seda kasutajat veel.", - "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", + "account.followers_counter": "{count, plural, one {{counter} jälgija} other {{counter} jälgijat}}", "account.following": "Following", - "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", + "account.following_counter": "{count, plural, one {{counter} jälgitav} other {{counter} jälgitavat}}", "account.follows.empty": "See kasutaja ei jälgi veel kedagi.", "account.follows_you": "Jälgib Teid", "account.hide_reblogs": "Peida upitused kasutajalt @{name}", - "account.joined": "Joined {date}", + "account.joined": "Liitus {date}", "account.link_verified_on": "Selle lingi autorsust kontrolliti {date}", "account.locked_info": "Selle konto privaatsussätteks on lukustatud. Omanik vaatab manuaalselt üle, kes teda jägida saab.", "account.media": "Meedia", - "account.mention": "Maini @{name}", + "account.mention": "Maini @{name}'i", "account.moved_to": "{name} on kolinud:", "account.mute": "Vaigista @{name}", "account.mute_notifications": "Vaigista teated kasutajalt @{name}", "account.muted": "Vaigistatud", - "account.posts": "Tuututused", - "account.posts_with_replies": "Tuututused ja vastused", + "account.posts": "Postitused", + "account.posts_with_replies": "Postitused ja vastused", "account.report": "Raporteeri @{name}", "account.requested": "Ootab kinnitust. Klõpsa jälgimise soovi tühistamiseks", "account.share": "Jaga @{name} profiili", "account.show_reblogs": "Näita kasutaja @{name} upitusi", - "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", + "account.statuses_counter": "{count, plural, one {{counter} postitus} other {{counter} postitust}}", "account.unblock": "Eemalda blokeering @{name}", "account.unblock_domain": "Tee {domain} nähtavaks", "account.unblock_short": "Unblock", @@ -47,7 +47,7 @@ "account.unmute": "Ära vaigista @{name}", "account.unmute_notifications": "Ära vaigista teateid kasutajalt @{name}", "account.unmute_short": "Unmute", - "account_note.placeholder": "Click to add a note", + "account_note.placeholder": "Klõpsa märkme lisamiseks", "admin.dashboard.daily_retention": "User retention rate by day after sign-up", "admin.dashboard.monthly_retention": "User retention rate by month after sign-up", "admin.dashboard.retention.average": "Average", @@ -70,7 +70,7 @@ "column.blocks": "Blokeeritud kasutajad", "column.bookmarks": "Järjehoidjad", "column.community": "Kohalik ajajoon", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Sirvi profiile", "column.domain_blocks": "Peidetud domeenid", "column.favourites": "Lemmikud", @@ -92,19 +92,21 @@ "community.column_settings.local_only": "Ainult kohalik", "community.column_settings.media_only": "Ainult meedia", "community.column_settings.remote_only": "Ainult kaug", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Vaata veel", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Seda tuuti ei kuvata ühegi sildi all, sest see on kirjendamata. Ainult avalikud tuutid on sildi järgi otsitavad.", "compose_form.lock_disclaimer": "Teie konto ei ole {locked}. Igaüks saab Teid jälgida ja näha Teie ainult-jälgijatele postitusi.", "compose_form.lock_disclaimer.lock": "lukus", - "compose_form.placeholder": "Millest mõtlete?", + "compose_form.placeholder": "Millest mõtled?", "compose_form.poll.add_option": "Lisa valik", "compose_form.poll.duration": "Küsitluse kestus", "compose_form.poll.option_placeholder": "Valik {number}", "compose_form.poll.remove_option": "Eemalda see valik", "compose_form.poll.switch_to_multiple": "Muuda küsitlust lubamaks mitut valikut", "compose_form.poll.switch_to_single": "Muuda küsitlust lubamaks ainult ühte valikut", - "compose_form.publish": "Tuut", + "compose_form.publish": "Tuututa", "compose_form.publish_loud": "{publish}!", "compose_form.save_changes": "Save changes", "compose_form.sensitive.hide": "Märgista meedia tundlikuks", @@ -147,9 +149,10 @@ "embed.instructions": "Manusta see staatus oma veebilehele, kopeerides alloleva koodi.", "embed.preview": "Nii näeb see välja:", "emoji_button.activity": "Tegevus", + "emoji_button.clear": "Clear", "emoji_button.custom": "Mugandatud", "emoji_button.flags": "Lipud", - "emoji_button.food": "Toit & Jook", + "emoji_button.food": "Toit & jook", "emoji_button.label": "Sisesta emoji", "emoji_button.nature": "Loodus", "emoji_button.not_found": "Ei ole emojosi!! (╯°□°)╯︵ ┻━┻", @@ -159,20 +162,20 @@ "emoji_button.search": "Otsi...", "emoji_button.search_results": "Otsitulemused", "emoji_button.symbols": "Sümbolid", - "emoji_button.travel": "Reisimine & Kohad", + "emoji_button.travel": "Reisimine & kohad", "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "Siin tuute ei ole!", "empty_column.account_unavailable": "Profiil pole saadaval", "empty_column.blocks": "Sa ei ole veel ühtegi kasutajat blokeerinud.", "empty_column.bookmarked_statuses": "Teil pole veel järjehoidjatesse lisatud tuututusi. Kui lisate mõne, näete neid siin.", "empty_column.community": "Kohalik ajajoon on tühi. Kirjutage midagi avalikult, et pall veerema ajada!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Siin ei ole veel peidetud domeene.", - "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", + "empty_column.explore_statuses": "Ükski postitus pole hetkel populaarne. Tule hiljem tagasi!", "empty_column.favourited_statuses": "Teil pole veel lemmikuid tuute. Kui märgite mõne, näete neid siin.", "empty_column.favourites": "Keegi pole veel seda tuuti lemmikuks märkinud. Kui seegi seda teeb, näed seda siin.", "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.", - "empty_column.follow_requests": "Teil pole veel ühtegi jälgimise taotlust. Kui saate mõne, näete neid siin.", + "empty_column.follow_requests": "Teil pole hetkel ühtegi jälgimistaotlust. Kui saate mõne, näete neid siin.", "empty_column.hashtag": "Selle sildiga pole veel midagi.", "empty_column.home": "Teie kodu ajajoon on tühi! Külastage {public} või kasutage otsingut alustamaks ja kohtamaks teisi kasutajaid.", "empty_column.home.suggestions": "See some suggestions", @@ -187,12 +190,12 @@ "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Kopeeri stacktrace lõikelauale", "errors.unexpected_crash.report_issue": "Teavita veast", - "explore.search_results": "Search results", - "explore.suggested_follows": "For you", - "explore.title": "Explore", - "explore.trending_links": "News", - "explore.trending_statuses": "Posts", - "explore.trending_tags": "Hashtags", + "explore.search_results": "Otsingutulemused", + "explore.suggested_follows": "Sinu jaoks", + "explore.title": "Avasta", + "explore.trending_links": "Uudised", + "explore.trending_statuses": "Postitused", + "explore.trending_tags": "Sildid", "follow_recommendations.done": "Done", "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.", "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!", @@ -230,10 +233,10 @@ "keyboard_shortcuts.boost": "upitamiseks", "keyboard_shortcuts.column": "fokuseerimaks staatust ühele tulpadest", "keyboard_shortcuts.compose": "fokuseerimaks tekstikoostamise alale", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Kirjeldus", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "liikumaks nimstus alla", - "keyboard_shortcuts.enter": "staatuse avamiseks", + "keyboard_shortcuts.enter": "Ava postitus", "keyboard_shortcuts.favourite": "lemmikuks märkimiseks", "keyboard_shortcuts.favourites": "avamaks lemmikute nimistut", "keyboard_shortcuts.federated": "avamaks föderatsiooni ajajoont", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Järgmine", "lightbox.previous": "Eelmine", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Lisa nimistusse", "lists.account.remove": "Eemalda nimistust", "lists.delete": "Kustuta nimistu", @@ -279,21 +284,22 @@ "lists.subheading": "Teie nimistud", "load_pending": "{count, plural, one {# uus kirje} other {# uut kirjet}}", "loading_indicator.label": "Laeb..", - "media_gallery.toggle_visible": "Lülita nähtavus", + "media_gallery.toggle_visible": "{number, plural, one {Varja pilt} other {Varja pildid}}", "missing_indicator.label": "Ei leitud", "missing_indicator.sublabel": "Seda ressurssi ei leitud", "mute_modal.duration": "Duration", "mute_modal.hide_notifications": "Kas peita teated sellelt kasutajalt?", "mute_modal.indefinite": "Indefinite", - "navigation_bar.apps": "Mobiilrakendused", + "navigation_bar.apps": "Mobiilirakendused", "navigation_bar.blocks": "Blokeeritud kasutajad", "navigation_bar.bookmarks": "Järjehoidjad", "navigation_bar.community_timeline": "Kohalik ajajoon", "navigation_bar.compose": "Koosta uus tuut", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Avasta", "navigation_bar.domain_blocks": "Peidetud domeenid", "navigation_bar.edit_profile": "Muuda profiili", - "navigation_bar.explore": "Explore", + "navigation_bar.explore": "Avasta", "navigation_bar.favourites": "Lemmikud", "navigation_bar.filters": "Vaigistatud sõnad", "navigation_bar.follow_requests": "Jälgimistaotlused", @@ -358,13 +364,13 @@ "poll.closed": "Suletud", "poll.refresh": "Värskenda", "poll.total_people": "{count, plural,one {# inimene} other {# inimest}}", - "poll.total_votes": "{count, plural, one {# hääl} other {# hääli}}", + "poll.total_votes": "{count, plural, one {# hääl} other {# häält}}", "poll.vote": "Hääleta", "poll.voted": "Teie hääletasite selle poolt", - "poll.votes": "{votes, plural, one {# vote} other {# votes}}", + "poll.votes": "{votes, plural, one {# hääl} other {# häält}}", "poll_button.add_poll": "Lisa küsitlus", "poll_button.remove_poll": "Eemalda küsitlus", - "privacy.change": "Muuda staatuse privaatsust", + "privacy.change": "Muuda postituse nähtavust", "privacy.direct.long": "Postita ainult mainitud kasutajatele", "privacy.direct.short": "Direct", "privacy.private.long": "Postita ainult jälgijatele", @@ -378,7 +384,7 @@ "regeneration_indicator.sublabel": "Teie kodu voog on ettevalmistamisel!", "relative_time.days": "{number}p", "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago", - "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago", + "relative_time.full.hours": "{number, plural, one {# tund} other {# tundi}} tagasi", "relative_time.full.just_now": "just now", "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago", "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago", @@ -433,7 +439,7 @@ "search_popout.tips.text": "Lihtne tekst toob esile kattuvad kuvanimed, kasutajanimed ning sildid", "search_popout.tips.user": "kasutaja", "search_results.accounts": "Inimesed", - "search_results.all": "All", + "search_results.all": "Kõik", "search_results.hashtags": "Sildid", "search_results.nothing_found": "Could not find anything for these search terms", "search_results.statuses": "Tuudid", @@ -445,10 +451,10 @@ "status.bookmark": "Järjehoidja", "status.cancel_reblog_private": "Äraupita", "status.cannot_reblog": "Seda postitust ei saa upitada", - "status.copy": "Kopeeri link staatusesse", + "status.copy": "Kopeeri postituse link", "status.delete": "Kustuta", "status.detailed_status": "Detailne vestluskuva", - "status.direct": "Otsesõnum @{name}", + "status.direct": "Saada otsesõnum @{name}'ile", "status.edit": "Edit", "status.edited": "Edited {date}", "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}", @@ -457,13 +463,13 @@ "status.filtered": "Filtreeritud", "status.history.created": "{name} created {date}", "status.history.edited": "{name} edited {date}", - "status.load_more": "Lae veel", + "status.load_more": "Lae rohkem", "status.media_hidden": "Meedia peidetud", - "status.mention": "Mainimine @{name}", + "status.mention": "Maini @{name}'i", "status.more": "Veel", "status.mute": "Vaigista @{name}", "status.mute_conversation": "Vaigista vestlus", - "status.open": "Laienda see staatus", + "status.open": "Laienda see postitus", "status.pin": "Kinnita profiilile", "status.pinned": "Kinnitatud tuut", "status.read_more": "Loe veel", @@ -475,7 +481,7 @@ "status.remove_bookmark": "Eemalda järjehoidja", "status.reply": "Vasta", "status.replyAll": "Vasta lõimele", - "status.report": "Raport @{name}", + "status.report": "Raporteeri @{name}", "status.sensitive_warning": "Tundlik sisu", "status.share": "Jaga", "status.show_less": "Näita vähem", @@ -493,17 +499,17 @@ "tabs_bar.local_timeline": "Kohalik", "tabs_bar.notifications": "Teated", "tabs_bar.search": "Otsi", - "time_remaining.days": "{number, plural, one {# päev} other {# päeva}} left", - "time_remaining.hours": "{number, plural, one {# tund} other {# tundi}} left", - "time_remaining.minutes": "{number, plural, one {# minut} other {# minutit}} left", + "time_remaining.days": "{number, plural, one {# päev} other {# päeva}} jäänud", + "time_remaining.hours": "{number, plural, one {# tund} other {# tundi}} jäänud", + "time_remaining.minutes": "{number, plural, one {# minut} other {# minutit}} jäänud", "time_remaining.moments": "Hetked jäänud", - "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} left", + "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} jäänud", "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.", "timeline_hint.resources.followers": "Followers", "timeline_hint.resources.follows": "Follows", "timeline_hint.resources.statuses": "Older toots", "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", - "trends.trending_now": "Praegu populaarne", + "trends.trending_now": "Hetkel populaarne", "ui.beforeunload": "Teie mustand läheb kaotsi, kui lahkute Mastodonist.", "units.short.billion": "{count}B", "units.short.million": "{count}M", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 119395b2f..4ab0c44be 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -70,7 +70,7 @@ "column.blocks": "Blokeatutako erabiltzaileak", "column.bookmarks": "Laster-markak", "column.community": "Denbora-lerro lokala", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Arakatu profilak", "column.domain_blocks": "Ezkutatutako domeinuak", "column.favourites": "Gogokoak", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Lokala soilik", "community.column_settings.media_only": "Multimedia besterik ez", "community.column_settings.remote_only": "Urrunekoa soilik", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Ikasi gehiago", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Bidalketa hau ez da traoletan agertuko zerrendatu gabekoa baita. Traoletan bidalketa publikoak besterik ez dira agertzen.", @@ -147,6 +149,7 @@ "embed.instructions": "Txertatu bidalketa hau zure webgunean beheko kodea kopiatuz.", "embed.preview": "Hau da izango duen itxura:", "emoji_button.activity": "Jarduera", + "emoji_button.clear": "Clear", "emoji_button.custom": "Pertsonalizatua", "emoji_button.flags": "Banderak", "emoji_button.food": "Janari eta edaria", @@ -166,7 +169,7 @@ "empty_column.blocks": "Ez duzu erabiltzailerik blokeatu oraindik.", "empty_column.bookmarked_statuses": "Oraindik ez dituzu bidalketa laster-markatutarik. Bat laster-markatzerakoan, hemen agertuko da.", "empty_column.community": "Denbora-lerro lokala hutsik dago. Idatzi zerbait publikoki pilota biraka jartzeko!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Ez dago ezkutatutako domeinurik oraindik.", "empty_column.explore_statuses": "Ez dago joerarik une honetan. Begiratu beranduago!", "empty_column.favourited_statuses": "Ez duzu gogokorik oraindik. Gogokoren bat duzunean hemen agertuko da.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Bultzatu bidalketa", "keyboard_shortcuts.column": "mezu bat zutabe batean fokatzea", "keyboard_shortcuts.compose": "testua konposatzeko arean fokatzea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Deskripzioa", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "zerrendan behera mugitzea", "keyboard_shortcuts.enter": "Ireki bidalketa", "keyboard_shortcuts.favourite": "Egin gogoko bidalketa", @@ -264,6 +267,8 @@ "lightbox.expand": "Zabaldu irudia ikusteko kaxa", "lightbox.next": "Hurrengoa", "lightbox.previous": "Aurrekoa", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Gehitu zerrendara", "lists.account.remove": "Kendu zerrendatik", "lists.delete": "Ezabatu zerrenda", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Laster-markak", "navigation_bar.community_timeline": "Denbora-lerro lokala", "navigation_bar.compose": "Idatzi bidalketa berria", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Aurkitu", "navigation_bar.domain_blocks": "Ezkutatutako domeinuak", "navigation_bar.edit_profile": "Aldatu profila", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index ae74607ab..5ae0872ca 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -70,7 +70,7 @@ "column.blocks": "کاربران مسدود شده", "column.bookmarks": "نشانکها", "column.community": "خط زمانی محلّی", - "column.conversations": "Conversations", + "column.direct": "پیامهای مستقیم", "column.directory": "مرور نمایهها", "column.domain_blocks": "دامنههای مسدود شده", "column.favourites": "پسندیدهها", @@ -92,8 +92,10 @@ "community.column_settings.local_only": "فقط محلّی", "community.column_settings.media_only": "فقط رسانه", "community.column_settings.remote_only": "تنها دوردست", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "بیشتر بدانید", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.encryption_warning": "فرستههای ماستودون رمزگذاری سرتاسری نشدهاند. هیچ اطّلاعات خطرناکی را روی ماستودون همرسانی نکنید.", "compose_form.hashtag_warning": "از آنجا که این فرسته فهرست نشده است، در نتایج جستوجوی هشتگها پیدا نخواهد شد. تنها فرستههای عمومی را میتوان با جستوجوی هشتگ یافت.", "compose_form.lock_disclaimer": "حسابتان {locked} نیست. هر کسی میتواند پیگیرتان شده و فرستههای ویژهٔ پیگیرانتان را ببیند.", "compose_form.lock_disclaimer.lock": "قفلشده", @@ -147,6 +149,7 @@ "embed.instructions": "برای جاسازی این فرسته در سایت خودتان، کد زیر را رونوشت کنید.", "embed.preview": "این گونه دیده خواهد شد:", "emoji_button.activity": "فعالیت", + "emoji_button.clear": "Clear", "emoji_button.custom": "سفارشی", "emoji_button.flags": "پرچمها", "emoji_button.food": "غذا و نوشیدنی", @@ -166,7 +169,7 @@ "empty_column.blocks": "هنوز کسی را مسدود نکردهاید.", "empty_column.bookmarked_statuses": "هنوز هیچ فرستهٔ نشانهگذاری شدهای ندارید. هنگامی که فرستهای را نشانهگذاری کنید، اینجا نشان داده خواهد شد.", "empty_column.community": "خط زمانی محلّی خالی است. چیزی بنویسید تا چرخش بچرخد!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "هنوز هیچ پیام مستقیمی ندارید. هنگامی که چنین پیامی بگیرید یا بفرستید اینجا نشان داده خواهد شد.", "empty_column.domain_blocks": "هنوز هیچ دامنهای مسدود نشده است.", "empty_column.explore_statuses": "الآن چیزی پرطرفدار نیست. بعداً دوباره بررسی کنید!", "empty_column.favourited_statuses": "شما هنوز هیچ فرستهای را نپسندیدهاید. هنگامی که فرستهای را بپسندید، اینجا نشان داده خواهد شد.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "تقویت فرسته", "keyboard_shortcuts.column": "برای تمرکز روی یک فرسته در یکی از ستونها", "keyboard_shortcuts.compose": "تمرکز روی محیط نوشتن", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "توضیح", + "keyboard_shortcuts.direct": "برای گشودن ستون پیغامهای مستقیم", "keyboard_shortcuts.down": "پایین بردن در سیاهه", "keyboard_shortcuts.enter": "گشودن فرسته", "keyboard_shortcuts.favourite": "پسندیدن فرسته", @@ -264,6 +267,8 @@ "lightbox.expand": "گسترش جعبهٔ نمایش تصویر", "lightbox.next": "بعدی", "lightbox.previous": "قبلی", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "افزودن به سیاهه", "lists.account.remove": "برداشتن از سیاهه", "lists.delete": "حذف سیاهه", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "نشانکها", "navigation_bar.community_timeline": "خط زمانی محلّی", "navigation_bar.compose": "نوشتن فرستهٔ تازه", + "navigation_bar.direct": "پیامهای مستقیم", "navigation_bar.discover": "گشت و گذار", "navigation_bar.domain_blocks": "دامنههای مسدود شده", "navigation_bar.edit_profile": "ویرایش نمایه", @@ -365,13 +371,13 @@ "poll_button.add_poll": "افزودن نظرسنجی", "poll_button.remove_poll": "برداشتن نظرسنجی", "privacy.change": "تغییر محرمانگی فرسته", - "privacy.direct.long": "فقط برای کاربران نامبرده نمایان است", - "privacy.direct.short": "Direct", + "privacy.direct.long": "نمایان فقط برای کاربران اشاره شده", + "privacy.direct.short": "فقط افراد اشاره شده", "privacy.private.long": "نمایان فقط برای پیگیرندگان", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Visible for all", + "privacy.private.short": "فقط پیگیرندگان", + "privacy.public.long": "نمایان برای همه", "privacy.public.short": "عمومی", - "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", + "privacy.unlisted.long": "نمایان برای همه، ولی خارج از قابلیتهای کشف", "privacy.unlisted.short": "فهرست نشده", "refresh": "نوسازی", "regeneration_indicator.label": "در حال بار شدن…", @@ -514,7 +520,7 @@ "upload_error.poll": "بارگذاری پرونده در نظرسنجیها مجاز نیست.", "upload_form.audio_description": "برای ناشنوایان توصیفش کنید", "upload_form.description": "برای کمبینایان توصیفش کنید", - "upload_form.description_missing": "No description added", + "upload_form.description_missing": "شرحی افزوده نشده", "upload_form.edit": "ویرایش", "upload_form.thumbnail": "تغییر بندانگشتی", "upload_form.undo": "حذف", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index e18e3b763..9db683eb1 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -70,7 +70,7 @@ "column.blocks": "Estetyt käyttäjät", "column.bookmarks": "Kirjanmerkit", "column.community": "Paikallinen aikajana", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Selaa profiileja", "column.domain_blocks": "Piilotetut verkkotunnukset", "column.favourites": "Suosikit", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Vain paikalliset", "community.column_settings.media_only": "Vain media", "community.column_settings.remote_only": "Vain etäkäyttö", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Lisätietoja", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Tätä julkaisua listata minkään hastagin alle, koska se on listaamaton. Ainoastaan julkisia julkaisuja etsiä hastageilla.", @@ -147,6 +149,7 @@ "embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.", "embed.preview": "Se tulee näyttämään tältä:", "emoji_button.activity": "Aktiviteetit", + "emoji_button.clear": "Clear", "emoji_button.custom": "Mukautetut", "emoji_button.flags": "Liput", "emoji_button.food": "Ruoka ja juoma", @@ -166,7 +169,7 @@ "empty_column.blocks": "Et ole vielä estänyt yhtään käyttäjää.", "empty_column.bookmarked_statuses": "Et ole vielä lisännyt viestejä kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.", "empty_column.community": "Paikallinen aikajana on tyhjä. Kirjoita jotain julkista, niin homma lähtee käyntiin!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Yhtään verkko-osoitetta ei ole vielä estetty.", "empty_column.explore_statuses": "Mikään ei ole nyt trendi. Tarkista myöhemmin!", "empty_column.favourited_statuses": "Et ole vielä lisännyt viestejä kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Buustaa viestiä", "keyboard_shortcuts.column": "Kohdista sarakkeeseen", "keyboard_shortcuts.compose": "siirry tekstinsyöttöön", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Kuvaus", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "Siirry listassa alaspäin", "keyboard_shortcuts.enter": "Avaa julkaisu", "keyboard_shortcuts.favourite": "Lisää suosikkeihin", @@ -264,6 +267,8 @@ "lightbox.expand": "Laajenna kuvan näkymälaatikko", "lightbox.next": "Seuraava", "lightbox.previous": "Edellinen", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Lisää listaan", "lists.account.remove": "Poista listasta", "lists.delete": "Poista lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Kirjanmerkit", "navigation_bar.community_timeline": "Paikallinen aikajana", "navigation_bar.compose": "Luo uusi viesti", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Löydä uutta", "navigation_bar.domain_blocks": "Estetyt verkkotunnukset", "navigation_bar.edit_profile": "Muokkaa profiilia", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index c7762fcef..1958cb98d 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -1,25 +1,25 @@ { "account.account_note_header": "Note", "account.add_or_remove_from_list": "Ajouter ou retirer des listes", - "account.badges.bot": "Robot", + "account.badges.bot": "Bot", "account.badges.group": "Groupe", "account.block": "Bloquer @{name}", "account.block_domain": "Bloquer le domaine {domain}", - "account.blocked": "Bloqué", + "account.blocked": "Bloqué·e", "account.browse_more_on_origin_server": "Parcourir davantage sur le profil original", "account.cancel_follow_request": "Annuler la demande de suivi", "account.direct": "Envoyer un message direct à @{name}", - "account.disable_notifications": "Arrêter de me notifier quand @{name} publie", + "account.disable_notifications": "Ne plus me notifier quand @{name} publie quelque chose", "account.domain_blocked": "Domaine bloqué", "account.edit_profile": "Modifier le profil", - "account.enable_notifications": "Me notifier quand @{name} publie", + "account.enable_notifications": "Me notifier quand @{name} publie quelque chose", "account.endorse": "Recommander sur votre profil", "account.follow": "Suivre", - "account.followers": "Abonnés", + "account.followers": "Abonné·e·s", "account.followers.empty": "Personne ne suit cet·te utilisateur·rice pour l’instant.", "account.followers_counter": "{count, plural, one {{counter} Abonné·e} other {{counter} Abonné·e·s}}", "account.following": "Abonnements", - "account.following_counter": "{count, plural, other {{counter} Abonnements}}", + "account.following_counter": "{count, plural, one {{counter} Abonnement} other {{counter} Abonnements}}", "account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.", "account.follows_you": "Vous suit", "account.hide_reblogs": "Masquer les partages de @{name}", @@ -30,12 +30,12 @@ "account.mention": "Mentionner @{name}", "account.moved_to": "{name} a déménagé vers :", "account.mute": "Masquer @{name}", - "account.mute_notifications": "Ignorer les notifications de @{name}", + "account.mute_notifications": "Masquer les notifications de @{name}", "account.muted": "Masqué·e", "account.posts": "Messages", "account.posts_with_replies": "Messages et réponses", "account.report": "Signaler @{name}", - "account.requested": "En attente d’approbation. Cliquez pour annuler la requête", + "account.requested": "En attente d’approbation. Cliquez pour annuler la demande", "account.share": "Partager le profil de @{name}", "account.show_reblogs": "Afficher les partages de @{name}", "account.statuses_counter": "{count, plural, one {{counter} Message} other {{counter} Messages}}", @@ -48,8 +48,8 @@ "account.unmute_notifications": "Ne plus masquer les notifications de @{name}", "account.unmute_short": "Ne plus masquer", "account_note.placeholder": "Cliquez pour ajouter une note", - "admin.dashboard.daily_retention": "Taux de maintien des utilisateur·rice·s par jour après inscription", - "admin.dashboard.monthly_retention": "Brugerfastholdelsesrate efter måned efter tilmelding", + "admin.dashboard.daily_retention": "Taux de rétention des utilisateur·rice·s par jour après inscription", + "admin.dashboard.monthly_retention": "Taux de rétention des utilisateur·rice·s par mois après inscription", "admin.dashboard.retention.average": "Moyenne", "admin.dashboard.retention.cohort": "Mois d'inscription", "admin.dashboard.retention.cohort_size": "Nouveaux utilisateurs", @@ -70,7 +70,7 @@ "column.blocks": "Comptes bloqués", "column.bookmarks": "Marque-pages", "column.community": "Fil public local", - "column.conversations": "Conversations", + "column.direct": "Messages directs", "column.directory": "Parcourir les profils", "column.domain_blocks": "Domaines bloqués", "column.favourites": "Favoris", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local seulement", "community.column_settings.media_only": "Média uniquement", "community.column_settings.remote_only": "Distant seulement", + "compose.language.change": "Changer de langue", + "compose.language.search": "Rechercher des langues …", "compose_form.direct_message_warning_learn_more": "En savoir plus", "compose_form.encryption_warning": "Les messages sur Mastodon ne sont pas chiffrés de bout en bout. Ne partagez aucune information confidentielle sur Mastodon.", "compose_form.hashtag_warning": "Ce pouet ne sera pas listé dans les recherches par hashtag car sa visibilité est réglée sur « non listé ». Seuls les pouets avec une visibilité « publique » peuvent être recherchés par hashtag.", @@ -146,10 +148,11 @@ "directory.recently_active": "Actif·ve·s récemment", "embed.instructions": "Intégrez ce message à votre site en copiant le code ci-dessous.", "embed.preview": "Il apparaîtra comme cela :", - "emoji_button.activity": "Activité", + "emoji_button.activity": "Activités", + "emoji_button.clear": "Effacer", "emoji_button.custom": "Personnalisés", "emoji_button.flags": "Drapeaux", - "emoji_button.food": "Nourriture & Boisson", + "emoji_button.food": "Nourriture et boisson", "emoji_button.label": "Insérer un émoji", "emoji_button.nature": "Nature", "emoji_button.not_found": "Aucun émoji correspondant n'a été trouvé", @@ -159,14 +162,14 @@ "emoji_button.search": "Recherche...", "emoji_button.search_results": "Résultats de la recherche", "emoji_button.symbols": "Symboles", - "emoji_button.travel": "Lieux & Voyages", + "emoji_button.travel": "Voyage et lieux", "empty_column.account_suspended": "Compte suspendu", "empty_column.account_timeline": "Aucun message ici !", "empty_column.account_unavailable": "Profil non disponible", "empty_column.blocks": "Vous n’avez bloqué aucun compte pour le moment.", "empty_column.bookmarked_statuses": "Vous n'avez pas de message en marque-page. Lorsque vous en ajouterez un, il apparaîtra ici.", "empty_column.community": "Le fil public local est vide. Écrivez donc quelque chose pour le remplir !", - "empty_column.conversations": "Une fois que vous avez envoyé ou reçu un message qui ne sera visible que par les personnes mentionnées, il apparaîtra ici.", + "empty_column.direct": "Vous n’avez pas encore de messages directs. Lorsque vous en enverrez ou recevrez un, il s’affichera ici.", "empty_column.domain_blocks": "Il n’y a aucun domaine bloqué pour le moment.", "empty_column.explore_statuses": "Rien n'est en tendance pour le moment. Revenez plus tard !", "empty_column.favourited_statuses": "Vous n’avez pas encore de message en favori. Lorsque vous en ajouterez un, il apparaîtra ici.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Partager le message", "keyboard_shortcuts.column": "Se placer dans une colonne", "keyboard_shortcuts.compose": "Se placer dans la zone de rédaction", - "keyboard_shortcuts.conversations": "pour ouvrir la colonne des conversations", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "pour ouvrir la colonne des messages directs", "keyboard_shortcuts.down": "Descendre dans la liste", "keyboard_shortcuts.enter": "Ouvrir le message", "keyboard_shortcuts.favourite": "Ajouter le message aux favoris", @@ -264,6 +267,8 @@ "lightbox.expand": "Agrandir la fenêtre de visualisation des images", "lightbox.next": "Suivant", "lightbox.previous": "Précédent", + "limited_account_hint.action": "Afficher le profil quand même", + "limited_account_hint.title": "Ce profil a été masqué par la modération de votre serveur.", "lists.account.add": "Ajouter à la liste", "lists.account.remove": "Supprimer de la liste", "lists.delete": "Supprimer la liste", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Marque-pages", "navigation_bar.community_timeline": "Fil public local", "navigation_bar.compose": "Rédiger un nouveau message", + "navigation_bar.direct": "Messages directs", "navigation_bar.discover": "Découvrir", "navigation_bar.domain_blocks": "Domaines bloqués", "navigation_bar.edit_profile": "Modifier le profil", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Supprimer le sondage", "privacy.change": "Ajuster la confidentialité du message", "privacy.direct.long": "Visible uniquement par les comptes mentionnés", - "privacy.direct.short": "Seulement les personnes mentionnées", + "privacy.direct.short": "Personnes mentionnées uniquement", "privacy.private.long": "Visible uniquement par vos abonné·e·s", "privacy.private.short": "Abonné·e·s uniquement", "privacy.public.long": "Visible pour tous", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 6370cd9d6..f56e6d5fa 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -70,7 +70,7 @@ "column.blocks": "Cuntais choiscthe", "column.bookmarks": "Leabharmharcanna", "column.community": "Local timeline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Blocked domains", "column.favourites": "Favourites", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Gníomhaíocht", + "emoji_button.clear": "Clear", "emoji_button.custom": "Custom", "emoji_button.flags": "Flags", "emoji_button.food": "Bia ⁊ Ól", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no blocked domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new post", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Cuir an phróifíl in eagar", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index be1b10025..4294cee84 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -50,7 +50,7 @@ "account_note.placeholder": "Briog airson nòta a chur ris", "admin.dashboard.daily_retention": "Reat glèidheadh nan cleachdaichean às dèidh an clàradh a-rèir latha", "admin.dashboard.monthly_retention": "Reat glèidheadh nan cleachdaichean às dèidh an clàradh a-rèir mìos", - "admin.dashboard.retention.average": "Cuibheasach", + "admin.dashboard.retention.average": "Średnia", "admin.dashboard.retention.cohort": "Mìos a’ chlàraidh", "admin.dashboard.retention.cohort_size": "Cleachdaichean ùra", "alert.rate_limited.message": "Feuch ris a-rithist às dèidh {retry_time, time, medium}.", @@ -59,7 +59,7 @@ "alert.unexpected.title": "Oich!", "announcement.announcement": "Brath-fios", "attachments_list.unprocessed": "(gun phròiseasadh)", - "autosuggest_hashtag.per_week": "{count} gach seachdain", + "autosuggest_hashtag.per_week": "{count} san t-seachdain", "boost_modal.combo": "Brùth air {combo} nam b’ fheàrr leat leum a ghearradh thar seo an ath-thuras", "bundle_column_error.body": "Chaidh rudeigin cearr nuair a dh’fheuch sinn ris a’ cho-phàirt seo a luchdadh.", "bundle_column_error.retry": "Feuch ris a-rithist", @@ -70,7 +70,7 @@ "column.blocks": "Cleachdaichean bacte", "column.bookmarks": "Comharran-lìn", "column.community": "Loidhne-ama ionadail", - "column.conversations": "Còmhraidhean", + "column.direct": "Teachdaireachdan dìreach", "column.directory": "Rùraich sna pròifilean", "column.domain_blocks": "Àrainnean bacte", "column.favourites": "Na h-annsachdan", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Feadhainn ionadail a-mhàin", "community.column_settings.media_only": "Meadhanan a-mhàin", "community.column_settings.remote_only": "Feadhainn chèin a-mhàin", + "compose.language.change": "Atharraich an cànan", + "compose.language.search": "Lorg cànan…", "compose_form.direct_message_warning_learn_more": "Barrachd fiosrachaidh", "compose_form.encryption_warning": "Chan eil crioptachadh ceann gu ceann air postaichean Mhastodon. Na co-roinn fiosrachadh cunnartach idir le Mastodon.", "compose_form.hashtag_warning": "Cha nochd am post seo fon taga hais on a tha e falaichte o liostaichean. Cha ghabh ach postaichean poblach a lorg a-rèir an tagaichean hais.", @@ -147,6 +149,7 @@ "embed.instructions": "Leabaich am post seo san làrach-lìn agad is tu a’ dèanamh lethbhreac dhen chòd gu h-ìosal.", "embed.preview": "Seo an coltas a bhios air:", "emoji_button.activity": "Gnìomhachd", + "emoji_button.clear": "Falamhaich", "emoji_button.custom": "Gnàthaichte", "emoji_button.flags": "Brataichean", "emoji_button.food": "Biadh ⁊ deoch", @@ -166,7 +169,7 @@ "empty_column.blocks": "Cha do bhac thu cleachdaiche sam bith fhathast.", "empty_column.bookmarked_statuses": "Chan eil comharra-lìn ri post agad fhathast. Nuair a nì thu comharra-lìn de dh’fhear, nochdaidh e an-seo.", "empty_column.community": "Tha an loidhne-ama ionadail falamh. Sgrìobh rudeigin gu poblach airson toiseach-tòiseachaidh a dhèanamh!", - "empty_column.conversations": "Nuair a chuireas no gheibh thu post nach fhaic ach an fheadhainn le iomradh orra ann, nochdaidh e an-seo.", + "empty_column.direct": "Chan eil teachdaireachd dhìreach agad fhathast. Nuair a chuireas no a gheibh thu tè, nochdaidh i an-seo.", "empty_column.domain_blocks": "Cha deach àrainn sam bith a bhacadh fhathast.", "empty_column.explore_statuses": "Chan eil dad a’ treandadh an-dràsta fhèin. Thoir sùil a-rithist an ceann greis!", "empty_column.favourited_statuses": "Chan eil annsachd air post agad fhathast. Nuair a nì thu annsachd de dh’fhear, nochdaidh e an-seo.", @@ -203,7 +206,7 @@ "getting_started.developers": "Luchd-leasachaidh", "getting_started.directory": "Eòlaire nam pròifil", "getting_started.documentation": "Docamaideadh", - "getting_started.heading": "Dèan toiseach-tòiseachaidh", + "getting_started.heading": "Toiseach", "getting_started.invite": "Thoir cuireadh do dhaoine", "getting_started.open_source_notice": "’S e bathar-bog le bun-tùs fosgailte a th’ ann am Mastodon. ’S urrainn dhut cuideachadh leis no aithris a dhèanamh air duilgheadasan air GitHub fo {github}.", "getting_started.security": "Roghainnean a’ chunntais", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Brosnaich post", "keyboard_shortcuts.column": "Cuir am fòcas air colbh", "keyboard_shortcuts.compose": "Cuir am fòcas air raon teacsa an sgrìobhaidh", - "keyboard_shortcuts.conversations": "a dh’fhosgladh colbh nan còmhraidhean", "keyboard_shortcuts.description": "Tuairisgeul", + "keyboard_shortcuts.direct": "a dh’fhosgladh colbh nan teachdaireachdan dìreach", "keyboard_shortcuts.down": "Gluais sìos air an liosta", "keyboard_shortcuts.enter": "Fosgail post", "keyboard_shortcuts.favourite": "Cuir post ris na h-annsachdan", @@ -253,7 +256,7 @@ "keyboard_shortcuts.requests": "Fosgail liosta nan iarrtasan leantainn", "keyboard_shortcuts.search": "Cuir am fòcas air a’ bhàr-luirg", "keyboard_shortcuts.spoilers": "Seall/Falaich raon an rabhaidh susbainte", - "keyboard_shortcuts.start": "Fosgail an colbh “dèan toiseach-tòiseachaidh”", + "keyboard_shortcuts.start": "Fosgail an colbh “Toiseach”", "keyboard_shortcuts.toggle_hidden": "Seall/Falaich an teacsa fo rabhadh susbainte", "keyboard_shortcuts.toggle_sensitivity": "Seall/Falaich na meadhanan", "keyboard_shortcuts.toot": "Tòisich air post ùr", @@ -264,6 +267,8 @@ "lightbox.expand": "Leudaich bogsa sealladh an deilbh", "lightbox.next": "Air adhart", "lightbox.previous": "Air ais", + "limited_account_hint.action": "Seall a’ phròifil co-dhiù", + "limited_account_hint.title": "Chaidh a’ phròifil seo fhalach le maoir an fhrithealaiche agad.", "lists.account.add": "Cuir ris an liosta", "lists.account.remove": "Thoir air falbh on liosta", "lists.delete": "Sguab às an liosta", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Comharran-lìn", "navigation_bar.community_timeline": "Loidhne-ama ionadail", "navigation_bar.compose": "Sgrìobh post ùr", + "navigation_bar.direct": "Teachdaireachdan dìreach", "navigation_bar.discover": "Rùraich", "navigation_bar.domain_blocks": "Àrainnean bacte", "navigation_bar.edit_profile": "Deasaich a’ phròifil", @@ -316,7 +322,7 @@ "notification.own_poll": "Thàinig an cunntas-bheachd agad gu crìoch", "notification.poll": "Thàinig cunntas-bheachd sa bhòt thu gu crìoch", "notification.reblog": "Bhrosnaich {name} am post agad", - "notification.status": "Tha {name} air rud a phostadh", + "notification.status": "Phostaich {name} rud", "notification.update": "Dheasaich {name} post", "notifications.clear": "Falamhaich na brathan", "notifications.clear_confirmation": "A bheil thu cinnteach gu bheil thu airson na brathan uile agad fhalamhachadh gu buan?", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Thoir air falbh an cunntas-bheachd", "privacy.change": "Cuir gleus air prìobhaideachd a’ phuist", "privacy.direct.long": "Chan fhaic ach na cleachdaichean le iomradh orra seo", - "privacy.direct.short": "Daoine air an dug mi iomradh a-mhàin", + "privacy.direct.short": "An fheadhainn le iomradh orra a-mhàin", "privacy.private.long": "Chan fhaic ach na daoine a tha a’ leantainn ort seo", "privacy.private.short": "Luchd-leantainn a-mhàin", "privacy.public.long": "Chì a h-uile duine e", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 114d90335..3a158ec76 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -70,7 +70,7 @@ "column.blocks": "Usuarias bloqueadas", "column.bookmarks": "Marcadores", "column.community": "Cronoloxía local", - "column.conversations": "Conversas", + "column.direct": "Mensaxes directas", "column.directory": "Procurar perfís", "column.domain_blocks": "Dominios agochados", "column.favourites": "Favoritos", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Só local", "community.column_settings.media_only": "Só multimedia", "community.column_settings.remote_only": "Só remoto", + "compose.language.change": "Elixe o idioma", + "compose.language.search": "Buscar idiomas...", "compose_form.direct_message_warning_learn_more": "Coñecer máis", "compose_form.encryption_warning": "As publicacións en Mastodon non están cifradas de extremo-a-extremo. Non compartas información sensible en Mastodon.", "compose_form.hashtag_warning": "Esta publicación non aparecerá baixo ningún cancelo (hashtag) porque non está listada. Só se poden procurar publicacións públicas por cancelos.", @@ -147,6 +149,7 @@ "embed.instructions": "Engade esta publicación ó teu sitio web copiando o seguinte código.", "embed.preview": "Así será mostrado:", "emoji_button.activity": "Actividade", + "emoji_button.clear": "Limpar", "emoji_button.custom": "Personalizado", "emoji_button.flags": "Marcas", "emoji_button.food": "Comida e Bebida", @@ -166,7 +169,7 @@ "empty_column.blocks": "Aínda non bloqueaches a ningún usuaria.", "empty_column.bookmarked_statuses": "Aínda non marcaches ningunha publicación. Cando o fagas, aparecerán aquí.", "empty_column.community": "A cronoloxía local está baleira. Escribe algo de xeito público para espallalo!", - "empty_column.conversations": "Aquí verás as publicacións que envíes ou recibas é só son visibles para as persoas mencionadas.", + "empty_column.direct": "Aínda non tes mensaxes directas. Cando envíes ou recibas unha, amosarase aquí.", "empty_column.domain_blocks": "Aínda non hai dominios agochados.", "empty_column.explore_statuses": "Non hai temas en voga. Volve máis tarde!", "empty_column.favourited_statuses": "Aínda non tes publicacións favoritas. Cando che guste algunha, aparecerá aquí.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Promover publicación", "keyboard_shortcuts.column": "Destacar unha columna", "keyboard_shortcuts.compose": "Por o cursor na área de escritura", - "keyboard_shortcuts.conversations": "para abrir a columna das conversas", "keyboard_shortcuts.description": "Descrición", + "keyboard_shortcuts.direct": "para abrir a columna de mensaxes directas", "keyboard_shortcuts.down": "Para mover cara abaixo na listaxe", "keyboard_shortcuts.enter": "Para abrir publicación", "keyboard_shortcuts.favourite": "Para engadir a favoritos", @@ -264,6 +267,8 @@ "lightbox.expand": "Expandir a caixa de vista da imaxe", "lightbox.next": "Seguinte", "lightbox.previous": "Anterior", + "limited_account_hint.action": "Mostrar perfil igualmente", + "limited_account_hint.title": "Este perfil foi agochado pola moderación do teu servidor.", "lists.account.add": "Engadir á listaxe", "lists.account.remove": "Eliminar da listaxe", "lists.delete": "Eliminar listaxe", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Marcadores", "navigation_bar.community_timeline": "Cronoloxía local", "navigation_bar.compose": "Escribir unha nova publicación", + "navigation_bar.direct": "Mensaxes directas", "navigation_bar.discover": "Descubrir", "navigation_bar.domain_blocks": "Dominios agochados", "navigation_bar.edit_profile": "Editar perfil", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Eliminar enquisa", "privacy.change": "Axustar privacidade", "privacy.direct.long": "Só para as usuarias mencionadas", - "privacy.direct.short": "Só para persoas mencionadas", + "privacy.direct.short": "Só persoas mencionadas", "privacy.private.long": "Só para os seguidoras", "privacy.private.short": "Só para seguidoras", "privacy.public.long": "Visible por todas", @@ -408,11 +414,11 @@ "report.reasons.dislike": "Non me gusta", "report.reasons.dislike_description": "Non é algo que queiras ver", "report.reasons.other": "É outra cousa", - "report.reasons.other_description": "O asunto non cae dentro de outras categorías", + "report.reasons.other_description": "O problema non cae dentro de outras categorías", "report.reasons.spam": "É spam", "report.reasons.spam_description": "Ligazóns perigosas, relacións falsas, ou respostas repetitivas", "report.reasons.violation": "Viola as regras do servidor", - "report.reasons.violation_description": "Daste conta de que quebra unhas normas en concreto", + "report.reasons.violation_description": "Décheste conta de que quebra unhas normas en concreto", "report.rules.subtitle": "Elixe todo o que sexa de aplicación", "report.rules.title": "Que regras foron incumpridas?", "report.statuses.subtitle": "Elixe todo o que corresponda", @@ -455,8 +461,8 @@ "status.embed": "Incrustar", "status.favourite": "Favorito", "status.filtered": "Filtrado", - "status.history.created": "{name} creado o {date}", - "status.history.edited": "{name} editado o {date}", + "status.history.created": "{name} creouno o {date}", + "status.history.edited": "{name} editouno o {date}", "status.load_more": "Cargar máis", "status.media_hidden": "Contido multimedia agochado", "status.mention": "Mencionar @{name}", @@ -493,11 +499,11 @@ "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notificacións", "tabs_bar.search": "Procurar", - "time_remaining.days": "{number, plural, one {# día} other {# días}} restantes", - "time_remaining.hours": "{number, plural, one {# hora} other {# horas}} restantes", - "time_remaining.minutes": "{number, plural, one {# minuto} other {# minutos}} restantes", - "time_remaining.moments": "Momentos restantes", - "time_remaining.seconds": "{number, plural, one {# segundo} other {# segundos}} restantes", + "time_remaining.days": "Remata en {number, plural, one {# día} other {# días}}", + "time_remaining.hours": "Remata en {number, plural, one {# hora} other {# horas}}", + "time_remaining.minutes": "Remata en {number, plural, one {# minuto} other {# minutos}}", + "time_remaining.moments": "A piques de rematar", + "time_remaining.seconds": "Remata en {number, plural, one {# segundo} other {# segundos}}", "timeline_hint.remote_resource_not_displayed": "Non se mostran {resource} desde outros servidores.", "timeline_hint.resources.followers": "Seguidoras", "timeline_hint.resources.follows": "Seguindo", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index efa740656..3dcb7c9c7 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -1,24 +1,24 @@ { - "account.account_note_header": "ההודעה שלך ל@{name}", + "account.account_note_header": "הערה", "account.add_or_remove_from_list": "הוסף או הסר מהרשימות", "account.badges.bot": "בוט", "account.badges.group": "קבוצה", - "account.block": "חסימת @{name}", - "account.block_domain": "להסתיר הכל מהקהילה {domain}", + "account.block": "חסמי את @{name}", + "account.block_domain": "חסמו את שם המתחם (דומיין) {domain}", "account.blocked": "חסום", - "account.browse_more_on_origin_server": "המשך לגלוש בפרופיל המקורי", + "account.browse_more_on_origin_server": "ראה יותר בפרופיל המקורי", "account.cancel_follow_request": "בטל בקשת מעקב", - "account.direct": "Direct Message @{name}", + "account.direct": "הודעה ישירה ל@{name}", "account.disable_notifications": "הפסק לשלוח לי התראות כש@{name} מפרסמים", - "account.domain_blocked": "הדומיין חסוי", + "account.domain_blocked": "הדומיין חסום", "account.edit_profile": "עריכת פרופיל", - "account.enable_notifications": "שלח לי התראות כש@{name} מפרסמים", - "account.endorse": "הצג בפרופיל", - "account.follow": "מעקב", + "account.enable_notifications": "שלח לי התראות כש@{name} מפרסם", + "account.endorse": "קדם את החשבון בפרופיל", + "account.follow": "עקוב", "account.followers": "עוקבים", "account.followers.empty": "אף אחד לא עוקב אחר המשתמש הזה עדיין.", "account.followers_counter": "{count, plural,one {עוקב אחד} other {{counter} עוקבים}}", - "account.following": "Following", + "account.following": "נעקבים", "account.following_counter": "{count, plural,one {עוקב אחרי {counter}}other {עוקב אחרי {counter}}}", "account.follows.empty": "משתמש זה לא עוקב אחר אף אחד עדיין.", "account.follows_you": "במעקב אחריך", @@ -30,28 +30,28 @@ "account.mention": "אזכור של @{name}", "account.moved_to": "החשבון {name} הועבר אל:", "account.mute": "להשתיק את @{name}", - "account.mute_notifications": "להסתיר התראות מאת @{name}", + "account.mute_notifications": "להסתיר התראות מ @{name}", "account.muted": "מושתק", - "account.posts": "הודעות", - "account.posts_with_replies": "Toots with replies", - "account.report": "לדווח על @{name}", - "account.requested": "בהמתנה לאישור", - "account.share": "לשתף את הפרופיל של @{name}", - "account.show_reblogs": "להראות הדהודים מאת @{name}", + "account.posts": "חצרוצים", + "account.posts_with_replies": "חצרוצים ותגובות", + "account.report": "דווח על @{name}", + "account.requested": "בהמתנה לאישור. לחצי כדי לבטל בקשת מעקב", + "account.share": "שתף את הפרופיל של @{name}", + "account.show_reblogs": "הצג הדהודים מאת @{name}", "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", - "account.unblock": "הסרת חסימה מעל @{name}", - "account.unblock_domain": "הסר חסימה מקהילת {domain}", - "account.unblock_short": "Unblock", - "account.unendorse": "לא להציג בפרופיל", + "account.unblock": "הסר את החסימה של @{name}", + "account.unblock_domain": "הסראת שם המתחם {domain}", + "account.unblock_short": "הסר חסימה", + "account.unendorse": "אל תקדם בפרופיל", "account.unfollow": "הפסקת מעקב", "account.unmute": "הפסקת השתקת @{name}", - "account.unmute_notifications": "להפסיק הסתרת הודעות מעם @{name}", - "account.unmute_short": "Unmute", - "account_note.placeholder": "ללא הערה", - "admin.dashboard.daily_retention": "User retention rate by day after sign-up", - "admin.dashboard.monthly_retention": "User retention rate by month after sign-up", + "account.unmute_notifications": "להפסיק השתקת הודעות מ @{name}", + "account.unmute_short": "ביטול השתקה", + "account_note.placeholder": "יש ללחוץ כדי להוסיף הערות", + "admin.dashboard.daily_retention": "קצב שימור משתמשים (פר יום) אחרי ההרשמה", + "admin.dashboard.monthly_retention": "קצב שימור משתמשים (פר חודש) אחרי ההרשמה", "admin.dashboard.retention.average": "ממוצע", - "admin.dashboard.retention.cohort": "Sign-up month", + "admin.dashboard.retention.cohort": "חודש רישום", "admin.dashboard.retention.cohort_size": "משתמשים חדשים", "alert.rate_limited.message": "נא לנסות אחרי {retry_time, time, medium}.", "alert.rate_limited.title": "מגבלות מיכסה", @@ -70,7 +70,7 @@ "column.blocks": "חסימות", "column.bookmarks": "סימניות", "column.community": "ציר זמן מקומי", - "column.conversations": "Conversations", + "column.direct": "הודעות ישירות", "column.directory": "גלוש פרופילים", "column.domain_blocks": "Hidden domains", "column.favourites": "חיבובים", @@ -92,8 +92,10 @@ "community.column_settings.local_only": "מקומי בלבד", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "מרחוק בלבד", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "מידע נוסף", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.encryption_warning": "חצרוצים במסטודון אינם מוצפנים מקצה לקצה. לעולם אל תחלקו מידע רגיש דרך מסטודון.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", "compose_form.lock_disclaimer": "חשבונך אינו {locked}. כל אחד יוכל לעקוב אחריך כדי לקרוא את הודעותיך המיועדות לעוקבים בלבד.", "compose_form.lock_disclaimer.lock": "נעול", @@ -105,11 +107,11 @@ "compose_form.poll.switch_to_multiple": "אפשרו בחירה מרובה בסקר", "compose_form.poll.switch_to_single": "אפשרו בחירה בודדת בסקר", "compose_form.publish": "ללחוש", - "compose_form.publish_loud": "לחצרץ!", - "compose_form.save_changes": "Save changes", - "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}", - "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}", + "compose_form.publish_loud": "{publish}!", + "compose_form.save_changes": "שמירת שינויים", + "compose_form.sensitive.hide": "{count, plural, one {סימון מידע כרגיש} other {סימון מידע כרגיש}}", + "compose_form.sensitive.marked": "{count, plural, one {מידע מסומן כרגיש} other {מידע מסומן כרגיש}}", + "compose_form.sensitive.unmarked": "{count, plural, one {מידע לא מסומן כרגיש} other {מידע לא מסומן כרגיש}}", "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "compose_form.spoiler_placeholder": "אזהרת תוכן", @@ -121,14 +123,14 @@ "confirmations.delete.message": "למחוק את ההודעה?", "confirmations.delete_list.confirm": "למחוק", "confirmations.delete_list.message": "האם אתם בטוחים שאתם רוצים למחוק את הרשימה לצמיתות?", - "confirmations.discard_edit_media.confirm": "Discard", - "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", + "confirmations.discard_edit_media.confirm": "השלך", + "confirmations.discard_edit_media.message": "יש לך שינויים לא שמורים לתיאור המדיה. להשליך אותם בכל זאת?", "confirmations.domain_block.confirm": "הסתר קהילה שלמה", "confirmations.domain_block.message": "באמת באמת לחסום את כל קהילת {domain}? ברב המקרים השתקות נבחרות של מספר משתמשים מסויימים צריכה להספיק.", "confirmations.logout.confirm": "להתנתק", "confirmations.logout.message": "האם אתם בטוחים שאתם רוצים להתנתק?", "confirmations.mute.confirm": "להשתיק", - "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.", + "confirmations.mute.explanation": "זה יסתיר חצרוצים שלהם וחצרוצים המזכירים אותם, אבל עדיין יתיר להם לראות פוסטים שלך ולעקוב אחריך.", "confirmations.mute.message": "להשתיק את {name}?", "confirmations.redraft.confirm": "מחק וערוך מחדש", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", @@ -140,13 +142,14 @@ "conversation.mark_as_read": "סמן כנקרא", "conversation.open": "צפו בשיחה", "conversation.with": "עם {names}", - "directory.federated": "From known fediverse", - "directory.local": "From {domain} only", - "directory.new_arrivals": "New arrivals", + "directory.federated": "מהפדרציה הידועה", + "directory.local": "מ- {domain} בלבד", + "directory.new_arrivals": "חדשים כאן", "directory.recently_active": "פעילים לאחרונה", "embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.", "embed.preview": "דוגמא כיצד זה יראה:", "emoji_button.activity": "פעילות", + "emoji_button.clear": "Clear", "emoji_button.custom": "מיוחדים", "emoji_button.flags": "דגלים", "emoji_button.food": "אוכל ושתיה", @@ -166,109 +169,111 @@ "empty_column.blocks": "עדיין לא חסמתם משתמשים אחרים.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "טור הסביבה ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "אין לך שום הודעות פרטיות עדיין. כשתשלחו או תקבלו אחת, היא תופיע כאן.", "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", + "empty_column.explore_statuses": "אין נושאים חמים כרגע. אולי אחר כך!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.follow_recommendations": "נראה שלא ניתן לייצר המלצות עבורך. נסה/י להשתמש בחיפוש כדי למצוא אנשים מוכרים או לבדוק את הנושאים החמים.", + "empty_column.follow_requests": "אין לך שום בקשות מעקב עדיין. לכשיתקבלו כאלה, הן תופענה כאן.", "empty_column.hashtag": "אין כלום בהאשתג הזה עדיין.", - "empty_column.home": "אף אחד לא במעקב עדיין. אפשר לבקר ב{public} או להשתמש בחיפוש כדי להתחיל ולהכיר חצוצרנים אחרים.", - "empty_column.home.suggestions": "See some suggestions", + "empty_column.home": "אף אחד לא במעקב עדיין. אפשר לבקר ב{public} או להשתמש בחיפוש כדי להתחיל ולהכיר חצוצרנים אחרים. {suggestions}", + "empty_column.home.suggestions": "ראה/י כמה הצעות", "empty_column.list": "אין עדיין מאום ברשימה.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.lists": "אין לך שום רשימות עדיין. לכשיהיו, הן תופענה כאן.", + "empty_column.mutes": "עוד לא השתקת שום משתמש.", "empty_column.notifications": "אין התראות עדיין. יאללה, הגיע הזמן להתחיל להתערבב.", "empty_column.public": "אין פה כלום! כדי למלא את הטור הזה אפשר לכתוב משהו, או להתחיל לעקוב אחרי אנשים מקהילות אחרות", - "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.", - "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.", - "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", - "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", - "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", - "errors.unexpected_crash.report_issue": "Report issue", - "explore.search_results": "Search results", - "explore.suggested_follows": "For you", - "explore.title": "Explore", - "explore.trending_links": "News", - "explore.trending_statuses": "Posts", - "explore.trending_tags": "Hashtags", - "follow_recommendations.done": "Done", - "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.", - "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!", + "error.unexpected_crash.explanation": "עקב תקלה בקוד שלנו או בעיית תאימות דפדפן, לא ניתן להציג דף זה כראוי.", + "error.unexpected_crash.explanation_addons": "לא ניתן להציג דף זה כראוי. הבעיה נגרמת כנראה עקב תוסף דפדפן או כלי תרגום אוטומטי.", + "error.unexpected_crash.next_steps": "נסה/י לרענן את הדף. אם זה לא עוזר, אולי אפשר עדיין להשתמש במסטודון דרך דפדפן אחר או באמצעות אפליקציה ילידית.", + "error.unexpected_crash.next_steps_addons": "נסה/י להסיר אותם ולרענן את הדף. אם זה לא עוזר, אולי אפשר עדיין להשתמש במסטודון דרך דפדפן אחר או באמצעות אפליקציה ילידית.", + "errors.unexpected_crash.copy_stacktrace": "להעתיק את הקוד ללוח הכתיבה", + "errors.unexpected_crash.report_issue": "דווח על בעיה", + "explore.search_results": "תוצאות חיפוש", + "explore.suggested_follows": "עבורך", + "explore.title": "סיור", + "explore.trending_links": "חדשות", + "explore.trending_statuses": "חצרוצים", + "explore.trending_tags": "האשטאגים", + "follow_recommendations.done": "בוצע", + "follow_recommendations.heading": "עקב/י אחרי אנשים שתרצה/י לראות את חצרוציהם! הנה כמה הצעות.", + "follow_recommendations.lead": "חצרוצים מאנשים במעקב יופיעו בסדר כרונולוגי בפיד הבית. אל תחששו מטעויות, אפשר להסיר מעקב באותה הקלות ובכל זמן!", "follow_request.authorize": "קבלה", "follow_request.reject": "דחיה", - "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.", - "generic.saved": "Saved", - "getting_started.developers": "Developers", - "getting_started.directory": "Profile directory", - "getting_started.documentation": "Documentation", + "follow_requests.unlocked_explanation": "למרות שחשבונך אינו נעול, צוות {domain} חושב שאולי כדאי לוודא את בקשות המעקב האלה ידנית.", + "generic.saved": "נשמר", + "getting_started.developers": "מפתחות", + "getting_started.directory": "ספריית פרופילים", + "getting_started.documentation": "תיעוד", "getting_started.heading": "בואו נתחיל", - "getting_started.invite": "Invite people", + "getting_started.invite": "להזמין אנשים", "getting_started.open_source_notice": "מסטודון היא תוכנה חופשית (בקוד פתוח). ניתן לתרום או לדווח על בעיות בגיטהאב: {github}.", "getting_started.security": "Security", - "getting_started.terms": "Terms of service", - "hashtag.column_header.tag_mode.all": "and {additional}", - "hashtag.column_header.tag_mode.any": "or {additional}", - "hashtag.column_header.tag_mode.none": "without {additional}", - "hashtag.column_settings.select.no_options_message": "No suggestions found", - "hashtag.column_settings.select.placeholder": "Enter hashtags…", - "hashtag.column_settings.tag_mode.all": "All of these", - "hashtag.column_settings.tag_mode.any": "Any of these", - "hashtag.column_settings.tag_mode.none": "None of these", + "getting_started.terms": "תנאי שימוש", + "hashtag.column_header.tag_mode.all": "ו- {additional}", + "hashtag.column_header.tag_mode.any": "או {additional}", + "hashtag.column_header.tag_mode.none": "ללא {additional}", + "hashtag.column_settings.select.no_options_message": "לא נמצאו הצעות", + "hashtag.column_settings.select.placeholder": "הזן תגי הקבצה…", + "hashtag.column_settings.tag_mode.all": "כל אלה", + "hashtag.column_settings.tag_mode.any": "כל אלה", + "hashtag.column_settings.tag_mode.none": "אפאחד מאלה", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "home.column_settings.basic": "למתחילים", "home.column_settings.show_reblogs": "הצגת הדהודים", "home.column_settings.show_replies": "הצגת תגובות", - "home.hide_announcements": "Hide announcements", - "home.show_announcements": "Show announcements", - "intervals.full.days": "{number, plural, one {# day} other {# days}}", - "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", - "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", + "home.hide_announcements": "הסתר הכרזות", + "home.show_announcements": "הצג הכרזות", + "intervals.full.days": "{number, plural, one {# יום} other {# ימים}}", + "intervals.full.hours": "{number, plural, one {# שעה} other {# שעות}}", + "intervals.full.minutes": "{number, plural, one {# דקה} other {# דקות}}", "keyboard_shortcuts.back": "ניווט חזרה", - "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.blocked": "פתיחת רשימת חסומים", "keyboard_shortcuts.boost": "להדהד", "keyboard_shortcuts.column": "להתמקד בהודעה באחד מהטורים", "keyboard_shortcuts.compose": "להתמקד בתיבת חיבור ההודעות", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "תיאור", + "keyboard_shortcuts.direct": "לפתיחת טור הודעות ישירות", "keyboard_shortcuts.down": "לנוע במורד הרשימה", - "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.enter": "פתח חצרוץ", "keyboard_shortcuts.favourite": "לחבב", - "keyboard_shortcuts.favourites": "to open favourites list", - "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.favourites": "פתיחת רשימת מועדפים", + "keyboard_shortcuts.federated": "פתיחת ציר זמן בין-קהילתי", "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.home": "פתיחת ציר זמן אישי", "keyboard_shortcuts.hotkey": "מקש קיצור", "keyboard_shortcuts.legend": "להציג את הפירוש", - "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.local": "פתיחת ציר זמן קהילתי", "keyboard_shortcuts.mention": "לאזכר את המחבר(ת)", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.open_media": "to open media", - "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.muted": "פתיחת רשימת משתמשים מושתקים", + "keyboard_shortcuts.my_profile": "פתיחת הפרופיל שלך", + "keyboard_shortcuts.notifications": "פתיחת טור התראות", + "keyboard_shortcuts.open_media": "פתיחת מדיה", + "keyboard_shortcuts.pinned": "פתיחת רשימת חצרותים מוצמדים", + "keyboard_shortcuts.profile": "פתח את פרופיל המשתמש", "keyboard_shortcuts.reply": "לענות", - "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.requests": "פתיחת רשימת בקשות מעקב", "keyboard_shortcuts.search": "להתמקד בחלון החיפוש", - "keyboard_shortcuts.spoilers": "to show/hide CW field", + "keyboard_shortcuts.spoilers": "הצגת/הסתרת שדה אזהרת תוכן (CW)", "keyboard_shortcuts.start": "to open \"get started\" column", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", - "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", + "keyboard_shortcuts.toggle_hidden": "הצגת/הסתרת טקסט מוסתר מאחורי אזהרת תוכן", + "keyboard_shortcuts.toggle_sensitivity": "הצגת/הסתרת מדיה", "keyboard_shortcuts.toot": "להתחיל חיצרוץ חדש", "keyboard_shortcuts.unfocus": "לצאת מתיבת חיבור/חיפוש", "keyboard_shortcuts.up": "לנוע במעלה הרשימה", "lightbox.close": "סגירה", - "lightbox.compress": "Compress image view box", - "lightbox.expand": "Expand image view box", + "lightbox.compress": "דחיסת קופסת צפייה בתמונה", + "lightbox.expand": "הרחבת קופסת צפייה בתמונה", "lightbox.next": "הלאה", "lightbox.previous": "הקודם", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "הוסף לרשימה", "lists.account.remove": "הסר מרשימה", - "lists.delete": "Delete list", - "lists.edit": "Edit list", - "lists.edit.submit": "Change title", + "lists.delete": "מחיקת רשימה", + "lists.edit": "עריכת רשימה", + "lists.edit.submit": "שנה/י כותרת", "lists.new.create": "הוספת רשימה", "lists.new.title_placeholder": "כותרת הרשימה החדשה", "lists.replies_policy.followed": "משתמשים שאני עוקב אחריהם", @@ -277,7 +282,7 @@ "lists.replies_policy.title": "הצג תגובות ל:", "lists.search": "חיפוש בין אנשים שאני עוקב\\ת אחריהם", "lists.subheading": "הרשימות שלך", - "load_pending": "{count, plural, one {# new item} other {# new items}}", + "load_pending": "{count, plural, one {# פריט חדש} other {# פריטים חדשים}}", "loading_indicator.label": "טוען...", "media_gallery.toggle_visible": "נראה\\בלתי נראה", "missing_indicator.label": "לא נמצא", @@ -285,146 +290,147 @@ "mute_modal.duration": "משך הזמן", "mute_modal.hide_notifications": "להסתיר הודעות מחשבון זה?", "mute_modal.indefinite": "ללא תאריך סיום", - "navigation_bar.apps": "Mobile apps", + "navigation_bar.apps": "יישומונים לנייד", "navigation_bar.blocks": "חסימות", - "navigation_bar.bookmarks": "Bookmarks", + "navigation_bar.bookmarks": "סימניות", "navigation_bar.community_timeline": "ציר זמן מקומי", "navigation_bar.compose": "Compose new toot", - "navigation_bar.discover": "Discover", + "navigation_bar.direct": "הודעות ישירות", + "navigation_bar.discover": "גלה", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "עריכת פרופיל", - "navigation_bar.explore": "Explore", + "navigation_bar.explore": "חקור", "navigation_bar.favourites": "חיבובים", - "navigation_bar.filters": "Muted words", + "navigation_bar.filters": "מילים מושתקות", "navigation_bar.follow_requests": "בקשות מעקב", - "navigation_bar.follows_and_followers": "Follows and followers", + "navigation_bar.follows_and_followers": "נעקבים ועוקבים", "navigation_bar.info": "מידע נוסף", "navigation_bar.keyboard_shortcuts": "קיצורי מקלדת", - "navigation_bar.lists": "Lists", + "navigation_bar.lists": "רשימות", "navigation_bar.logout": "יציאה", "navigation_bar.mutes": "השתקות", - "navigation_bar.personal": "Personal", + "navigation_bar.personal": "אישי", "navigation_bar.pins": "חיצרוצים מקובעים", "navigation_bar.preferences": "העדפות", "navigation_bar.public_timeline": "ציר זמן בין-קהילתי", - "navigation_bar.security": "Security", - "notification.admin.sign_up": "{name} signed up", + "navigation_bar.security": "בטיחות", + "notification.admin.sign_up": "{name} נרשמו", "notification.favourite": "חצרוצך חובב על ידי {name}", "notification.follow": "{name} במעקב אחרייך", - "notification.follow_request": "{name} has requested to follow you", + "notification.follow_request": "{name} ביקשו לעקוב אחריך", "notification.mention": "אוזכרת על ידי {name}", - "notification.own_poll": "Your poll has ended", - "notification.poll": "A poll you have voted in has ended", + "notification.own_poll": "הסקר שלך הסתיים", + "notification.poll": "סקר שהצבעת בו הסתיים", "notification.reblog": "חצרוצך הודהד על ידי {name}", - "notification.status": "{name} just posted", + "notification.status": "{name} הרגע פרסמו", "notification.update": "{name} ערכו פוסט", "notifications.clear": "הסרת התראות", "notifications.clear_confirmation": "להסיר את כל ההתראות? בטוח?", - "notifications.column_settings.admin.sign_up": "New sign-ups:", + "notifications.column_settings.admin.sign_up": "הרשמות חדשות:", "notifications.column_settings.alert": "התראות לשולחן העבודה", "notifications.column_settings.favourite": "מחובבים:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", - "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show_bar": "Show filter bar", + "notifications.column_settings.filter_bar.advanced": "הצג את כל הקטגוריות", + "notifications.column_settings.filter_bar.category": "שורת סינון מהיר", + "notifications.column_settings.filter_bar.show_bar": "הצג שורת סינון", "notifications.column_settings.follow": "עוקבים חדשים:", - "notifications.column_settings.follow_request": "New follow requests:", + "notifications.column_settings.follow_request": "בקשות מעקב חדשות:", "notifications.column_settings.mention": "פניות:", - "notifications.column_settings.poll": "Poll results:", + "notifications.column_settings.poll": "תוצאות סקר:", "notifications.column_settings.push": "הודעות בדחיפה", "notifications.column_settings.reblog": "הדהודים:", "notifications.column_settings.show": "הצגה בטור", "notifications.column_settings.sound": "שמע מופעל", "notifications.column_settings.status": "New toots:", - "notifications.column_settings.unread_notifications.category": "Unread notifications", - "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications", + "notifications.column_settings.unread_notifications.category": "התראות שלא נקראו", + "notifications.column_settings.unread_notifications.highlight": "הבלט התראות שלא נקראו", "notifications.column_settings.update": "שינויים:", - "notifications.filter.all": "All", - "notifications.filter.boosts": "Boosts", - "notifications.filter.favourites": "Favourites", - "notifications.filter.follows": "Follows", - "notifications.filter.mentions": "Mentions", - "notifications.filter.polls": "Poll results", - "notifications.filter.statuses": "Updates from people you follow", - "notifications.grant_permission": "Grant permission.", - "notifications.group": "{count} notifications", - "notifications.mark_as_read": "Mark every notification as read", - "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", - "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", - "notifications_permission_banner.enable": "Enable desktop notifications", - "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", - "notifications_permission_banner.title": "Never miss a thing", - "picture_in_picture.restore": "Put it back", - "poll.closed": "Closed", - "poll.refresh": "Refresh", - "poll.total_people": "{count, plural, one {# person} other {# people}}", - "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", - "poll.vote": "Vote", - "poll.voted": "You voted for this answer", - "poll.votes": "{votes, plural, one {# vote} other {# votes}}", - "poll_button.add_poll": "Add a poll", - "poll_button.remove_poll": "Remove poll", + "notifications.filter.all": "הכל", + "notifications.filter.boosts": "הדהודים", + "notifications.filter.favourites": "חיבובים", + "notifications.filter.follows": "נעקבים", + "notifications.filter.mentions": "אזכורים", + "notifications.filter.polls": "תוצאות סקר", + "notifications.filter.statuses": "עדכונים מאנשים במעקב", + "notifications.grant_permission": "מתן הרשאה.", + "notifications.group": "{count} התראות", + "notifications.mark_as_read": "סימון כל ההודעות כנקראו", + "notifications.permission_denied": "לא ניתן להציג התראות מסך כיוון כיוון שהרשאות דפדפן נשללו בעבר", + "notifications.permission_denied_alert": "לא ניתן לאפשר נוטיפיקציות מסך שכן הדפדפן סורב הרשאה בעבר", + "notifications.permission_required": "לא ניתן לאפשר נוטיפיקציות מסך כיוון שהרשאה דרושה לא ניתנה.", + "notifications_permission_banner.enable": "לאפשר נוטיפיקציות מסך", + "notifications_permission_banner.how_to_control": "כדי לקבל הודעות גם כאשר מסטודון סגור יש לאפשר נוטיפיקציות מסך. ניתן לשלוט בדיוק איזה סוג של אינטראקציות יביא לנוטיפיקציות מסך דרך כפתור ה- {icon} מרגע שהן מאופשרות.", + "notifications_permission_banner.title": "לעולם אל תחמיץ דבר", + "picture_in_picture.restore": "החזירי למקומו", + "poll.closed": "סגור", + "poll.refresh": "רענון", + "poll.total_people": "{count, plural, one {# איש/אישה} other {# אנשים}}", + "poll.total_votes": "{count, plural, one {# קול} other {# קולות}}", + "poll.vote": "קול", + "poll.voted": "הצבעת לתשובה זו", + "poll.votes": "{votes, plural, one {# קול} other {# קולות}}", + "poll_button.add_poll": "הוספת סקר", + "poll_button.remove_poll": "הסרת סקר", "privacy.change": "שינוי פרטיות ההודעה", "privacy.direct.long": "הצג רק למי שהודעה זו פונה אליו", - "privacy.direct.short": "Direct", + "privacy.direct.short": "אנשים מוזכרים בלבד", "privacy.private.long": "הצג לעוקבים בלבד", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Visible for all", + "privacy.private.short": "עוקבים בלבד", + "privacy.public.long": "גלוי לכל", "privacy.public.short": "פומבי", - "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", + "privacy.unlisted.long": "גלוי לכל, אבל מוסתר מאמצעי גילוי", "privacy.unlisted.short": "לא לפיד הכללי", - "refresh": "Refresh", - "regeneration_indicator.label": "Loading…", - "regeneration_indicator.sublabel": "Your home feed is being prepared!", - "relative_time.days": "{number}d", - "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago", - "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago", - "relative_time.full.just_now": "just now", - "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago", - "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago", - "relative_time.hours": "{number}h", + "refresh": "רענון", + "regeneration_indicator.label": "טוען…", + "regeneration_indicator.sublabel": "פיד הבית שלך בהכנה!", + "relative_time.days": "{number} ימים", + "relative_time.full.days": "לפני {number, plural, one {# יום} other {# ימים}}", + "relative_time.full.hours": "לפני {number, plural, one {# שעה} other {# שעות}}", + "relative_time.full.just_now": "ממש עכשיו", + "relative_time.full.minutes": "לפני {number, plural, one {# דקה} other {# דקות}}", + "relative_time.full.seconds": "לפני {number, plural, one {# שניה} other {# שניות}}", + "relative_time.hours": "{number} שעות", "relative_time.just_now": "כרגע", - "relative_time.minutes": "{number}m", - "relative_time.seconds": "{number}s", - "relative_time.today": "today", + "relative_time.minutes": "{number} דקות", + "relative_time.seconds": "{number} שניות", + "relative_time.today": "היום", "reply_indicator.cancel": "ביטול", - "report.block": "Block", - "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", - "report.categories.other": "Other", - "report.categories.spam": "Spam", - "report.categories.violation": "Content violates one or more server rules", - "report.category.subtitle": "Choose the best match", - "report.category.title": "Tell us what's going on with this {type}", - "report.category.title_account": "profile", - "report.category.title_status": "post", - "report.close": "Done", - "report.comment.title": "Is there anything else you think we should know?", - "report.forward": "Forward to {target}", - "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", - "report.mute": "Mute", - "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.", - "report.next": "Next", + "report.block": "לחסום", + "report.block_explanation": "לא ניתן יהיה לראות את חצרוציהם. הם לא יוכלו לראות את חצרוציך או לעקוב אחריך. הם יוכלו לדעת שהם חסומים.", + "report.categories.other": "אחר", + "report.categories.spam": "ספאם", + "report.categories.violation": "התוכן מפר אחד או יותר מחוקי השרת", + "report.category.subtitle": "בחר/י את המתאים ביותר", + "report.category.title": "ספר/י לנו מה קורה עם ה-{type} הזה", + "report.category.title_account": "פרופיל", + "report.category.title_status": "חצרוץ", + "report.close": "בוצע", + "report.comment.title": "האם יש דבר נוסף שלדעתך חשוב שנדע?", + "report.forward": "קדם ל-{target}", + "report.forward_hint": "חשבון זה הוא משרת אחר. האם לשלוח בנוסף עותק אנונימי לשם?", + "report.mute": "להשתיק", + "report.mute_explanation": "לא ניתן יהיה לראות את חצרוציהם. הם עדיין יוכלו לעקוב אחריך ולראות את חצרוציך ולא ידעו שהם מושתקים.", + "report.next": "הבא", "report.placeholder": "הערות נוספות", - "report.reasons.dislike": "I don't like it", - "report.reasons.dislike_description": "It is not something you want to see", - "report.reasons.other": "It's something else", - "report.reasons.other_description": "The issue does not fit into other categories", - "report.reasons.spam": "It's spam", - "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies", - "report.reasons.violation": "It violates server rules", - "report.reasons.violation_description": "You are aware that it breaks specific rules", - "report.rules.subtitle": "Select all that apply", - "report.rules.title": "Which rules are being violated?", - "report.statuses.subtitle": "Select all that apply", - "report.statuses.title": "Are there any posts that back up this report?", + "report.reasons.dislike": "אני לא אוהב את זה", + "report.reasons.dislike_description": "זה לא משהו שתרצה/י לראות", + "report.reasons.other": "זה משהו אחר", + "report.reasons.other_description": "הבעיה לא מתאימה לקטגוריות אחרות", + "report.reasons.spam": "זה ספאם", + "report.reasons.spam_description": "קישורים מרושעים, התייחסות מזוייפת או תגובות חוזרות", + "report.reasons.violation": "מפר את חוקי השרת", + "report.reasons.violation_description": "את/ה מודע/ת לכך שזה מפר חוקים ספציפיים", + "report.rules.subtitle": "בחר/י את כל המתאימים", + "report.rules.title": "אילו חוקים מופרים?", + "report.statuses.subtitle": "בחר/י את כל המתאימים", + "report.statuses.title": "האם ישנם חצרוצים התומכים בדיווח זה?", "report.submit": "שליחה", - "report.target": "דיווח", - "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:", - "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:", - "report.thanks.title": "Don't want to see this?", - "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", - "report.unfollow": "Unfollow @{name}", - "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report.target": "דיווח על {target}", + "report.thanks.take_action": "הנה כמה אפשרויות לשליטה בתצוגת מסטודון:", + "report.thanks.take_action_actionable": "בזמן שאנו בוחנות את הדיווח, ניתן לפעול כנגד @{name}:", + "report.thanks.title": "לא מעוניין/ת לראות את זה?", + "report.thanks.title_actionable": "תודה על הדיווח, נבדוק את העניין.", + "report.unfollow": "הפסיקו לעקוב אחרי @{name}", + "report.unfollow_explanation": "אתם עוקבים אחרי החשבון הזה. כדי להפסיק לראות את הפרסומים שלו בפיד הבית שלכם, הפסיקו לעקוב אחריהם.", "search.placeholder": "חיפוש", "search_popout.search_format": "מבנה חיפוש מתקדם", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", @@ -432,112 +438,112 @@ "search_popout.tips.status": "status", "search_popout.tips.text": "טקסט פשוט מחזיר כינויים, שמות משתמש והאשתגים", "search_popout.tips.user": "משתמש(ת)", - "search_results.accounts": "People", - "search_results.all": "All", - "search_results.hashtags": "Hashtags", - "search_results.nothing_found": "Could not find anything for these search terms", + "search_results.accounts": "אנשים", + "search_results.all": "כל התוצאות", + "search_results.hashtags": "האשתגיות", + "search_results.nothing_found": "לא נמצא דבר עבור תנאי חיפוש אלה", "search_results.statuses": "Toots", "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", "search_results.total": "{count, number} {count, plural, one {תוצאה} other {תוצאות}}", - "status.admin_account": "Open moderation interface for @{name}", + "status.admin_account": "פתח/י ממשק ניהול עבור @{name}", "status.admin_status": "Open this status in the moderation interface", - "status.block": "Block @{name}", - "status.bookmark": "Bookmark", - "status.cancel_reblog_private": "Unboost", + "status.block": "חסימת @{name}", + "status.bookmark": "סימניה", + "status.cancel_reblog_private": "הסרת הדהוד", "status.cannot_reblog": "לא ניתן להדהד הודעה זו", "status.copy": "Copy link to status", "status.delete": "מחיקה", - "status.detailed_status": "Detailed conversation view", + "status.detailed_status": "תצוגת שיחה מפורטת", "status.direct": "הודעה ישירה ל@{name}", - "status.edit": "Edit", - "status.edited": "Edited {date}", - "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}", + "status.edit": "עריכה", + "status.edited": "נערך ב{date}", + "status.edited_x_times": "נערך {count, plural, one {פעם {count}} other {{count} פעמים}}", "status.embed": "הטמעה", "status.favourite": "חיבוב", - "status.filtered": "Filtered", - "status.history.created": "{name} created {date}", - "status.history.edited": "{name} edited {date}", + "status.filtered": "סונן", + "status.history.created": "{name} יצר/ה {date}", + "status.history.edited": "{name} ערך/ה {date}", "status.load_more": "עוד", "status.media_hidden": "מדיה מוסתרת", "status.mention": "פניה אל @{name}", "status.more": "עוד", - "status.mute": "Mute @{name}", + "status.mute": "להשתיק את @{name}", "status.mute_conversation": "השתקת שיחה", "status.open": "הרחבת הודעה", "status.pin": "לקבע באודות", "status.pinned": "Pinned toot", - "status.read_more": "Read more", + "status.read_more": "לקרוא עוד", "status.reblog": "הדהוד", - "status.reblog_private": "Boost with original visibility", + "status.reblog_private": "להדהד ברמת הנראות המקורית", "status.reblogged_by": "הודהד על ידי {name}", "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", - "status.redraft": "Delete & re-draft", - "status.remove_bookmark": "Remove bookmark", + "status.redraft": "מחיקה ועריכה מחדש", + "status.remove_bookmark": "הסרת סימניה", "status.reply": "תגובה", "status.replyAll": "תגובה לכולם", "status.report": "דיווח על @{name}", "status.sensitive_warning": "תוכן רגיש", "status.share": "שיתוף", "status.show_less": "הראה פחות", - "status.show_less_all": "Show less for all", + "status.show_less_all": "להציג פחות מהכל", "status.show_more": "הראה יותר", - "status.show_more_all": "Show more for all", - "status.show_thread": "Show thread", - "status.uncached_media_warning": "Not available", + "status.show_more_all": "להציג יותר מהכל", + "status.show_thread": "להציג סיב", + "status.uncached_media_warning": "לא זמין", "status.unmute_conversation": "הסרת השתקת שיחה", "status.unpin": "לשחרר מקיבוע באודות", - "suggestions.dismiss": "Dismiss suggestion", - "suggestions.header": "You might be interested in…", + "suggestions.dismiss": "להתעלם מהצעה", + "suggestions.header": "ייתכן שזה יעניין אותך…", "tabs_bar.federated_timeline": "ציר זמן בין-קהילתי", "tabs_bar.home": "בבית", "tabs_bar.local_timeline": "ציר זמן מקומי", "tabs_bar.notifications": "התראות", - "tabs_bar.search": "Search", - "time_remaining.days": "{number, plural, one {# day} other {# days}} left", - "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", - "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", - "time_remaining.moments": "Moments remaining", - "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", - "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.", - "timeline_hint.resources.followers": "Followers", - "timeline_hint.resources.follows": "Follows", + "tabs_bar.search": "חיפוש", + "time_remaining.days": "נותרו {number, plural, one {# יום} other {# ימים}}", + "time_remaining.hours": "נותרו {number, plural, one {# שעה} other {# שעות}}", + "time_remaining.minutes": "נותרו {number, plural, one {# דקה} other {# דקות}}", + "time_remaining.moments": "רגעים נותרו", + "time_remaining.seconds": "נותרו {number, plural, one {# שניה} other {# שניות}}", + "timeline_hint.remote_resource_not_displayed": "{resource} משרתים אחרים לא מוצגים.", + "timeline_hint.resources.followers": "עוקבים", + "timeline_hint.resources.follows": "נעקבים", "timeline_hint.resources.statuses": "Older toots", - "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", - "trends.trending_now": "Trending now", + "trends.counter_by_accounts": "{count, plural, one {{counter} אחד/ת מדבר/ת} other {{counter} אנשים מדברים}}", + "trends.trending_now": "נושאים חמים", "ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.", - "units.short.billion": "{count}B", - "units.short.million": "{count}M", - "units.short.thousand": "{count}K", + "units.short.billion": "{count} מליארד", + "units.short.million": "{count} מליון", + "units.short.thousand": "{count} אלפים", "upload_area.title": "ניתן להעלות על ידי Drag & drop", "upload_button.label": "הוספת מדיה", - "upload_error.limit": "File upload limit exceeded.", - "upload_error.poll": "File upload not allowed with polls.", - "upload_form.audio_description": "Describe for people with hearing loss", + "upload_error.limit": "קובץ להעלאה חורג מנפח מותר.", + "upload_error.poll": "לא ניתן להעלות קובץ עם סקר.", + "upload_form.audio_description": "תאר/י עבור לקויי שמיעה", "upload_form.description": "תיאור לכבדי ראיה", - "upload_form.description_missing": "No description added", - "upload_form.edit": "Edit", - "upload_form.thumbnail": "Change thumbnail", + "upload_form.description_missing": "לא הוסף תיאור", + "upload_form.edit": "עריכה", + "upload_form.thumbnail": "שנה/י תמונה ממוזערת", "upload_form.undo": "ביטול", - "upload_form.video_description": "Describe for people with hearing loss or visual impairment", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.applying": "Applying…", - "upload_modal.choose_image": "Choose image", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preparing_ocr": "Preparing OCR…", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_form.video_description": "תאר/י עבור לקויי שמיעה ולקויי ראייה", + "upload_modal.analyzing_picture": "מנתח תמונה…", + "upload_modal.apply": "החל", + "upload_modal.applying": "מחיל…", + "upload_modal.choose_image": "בחר/י תמונה", + "upload_modal.description_placeholder": "דג סקרן שט בים מאוכזב ולפתע מצא חברה", + "upload_modal.detect_text": "זהה טקסט מתמונה", + "upload_modal.edit_media": "עריכת מדיה", + "upload_modal.hint": "הקליקי או גררי את המעגל על גבי התצוגה המקדימה על מנת לבחור בנקודת המוקד שתראה תמיד בכל התמונות הממוזערות.", + "upload_modal.preparing_ocr": "מכין OCR…", + "upload_modal.preview_label": "תצוגה ({ratio})", "upload_progress.label": "עולה...", "video.close": "סגירת וידאו", - "video.download": "Download file", + "video.download": "הורדת קובץ", "video.exit_fullscreen": "יציאה ממסך מלא", "video.expand": "להרחיב וידאו", - "video.fullscreen": "Full screen", + "video.fullscreen": "מסך מלא", "video.hide": "להסתיר וידאו", "video.mute": "השתקת צליל", - "video.pause": "Pause", + "video.pause": "השהיה", "video.play": "ניגון", "video.unmute": "החזרת צליל" } diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index d208cf51e..b347784af 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -9,21 +9,21 @@ "account.browse_more_on_origin_server": "मूल प्रोफ़ाइल पर अधिक ब्राउज़ करें", "account.cancel_follow_request": "फ़ॉलो रिक्वेस्ट रद्द करें", "account.direct": "प्रत्यक्ष संदेश @{name}", - "account.disable_notifications": "Stop notifying me when @{name} posts", + "account.disable_notifications": "@{name} पोस्ट के लिए मुझे सूचित मत करो", "account.domain_blocked": "छिपा हुआ डोमेन", "account.edit_profile": "प्रोफ़ाइल संपादित करें", - "account.enable_notifications": "Notify me when @{name} posts", + "account.enable_notifications": "जब @{name} पोस्ट मौजूद हो सूचित करें", "account.endorse": "प्रोफ़ाइल पर दिखाए", "account.follow": "फॉलो करें", "account.followers": "फॉलोवर", "account.followers.empty": "कोई भी इस यूज़र् को फ़ॉलो नहीं करता है", "account.followers_counter": "{count, plural, one {{counter} अनुगामी} other {{counter} समर्थक}}", - "account.following": "Following", + "account.following": "फॉलोइंग", "account.following_counter": "{count, plural, one {{counter} निम्नलिखित} other {{counter} निम्नलिखित}}", "account.follows.empty": "यह यूज़र् अभी तक किसी को फॉलो नहीं करता है।", "account.follows_you": "आपको फॉलो करता है", "account.hide_reblogs": "@{name} के बूस्ट छुपाएं", - "account.joined": "Joined {date}", + "account.joined": "शामिल हुये {date}", "account.link_verified_on": "इस लिंक का स्वामित्व {date} को चेक किया गया था", "account.locked_info": "यह खाता गोपनीयता स्थिति लॉक करने के लिए सेट है। मालिक मैन्युअल रूप से समीक्षा करता है कि कौन उनको फॉलो कर सकता है।", "account.media": "मीडिया", @@ -41,24 +41,24 @@ "account.statuses_counter": "{count, plural, one {{counter} भोंपू} other {{counter} भोंपू}}", "account.unblock": "@{name} को अनब्लॉक करें", "account.unblock_domain": "{domain} दिखाए", - "account.unblock_short": "Unblock", + "account.unblock_short": "अनब्लॉक", "account.unendorse": "प्रोफ़ाइल पर न दिखाए", "account.unfollow": "अनफॉलो करें", "account.unmute": "अनम्यूट @{name}", "account.unmute_notifications": "@{name} के नोटिफिकेशन अनम्यूट करे", - "account.unmute_short": "Unmute", + "account.unmute_short": "अनम्यूट", "account_note.placeholder": "नोट्स जोड़ने के लिए क्लिक करें", - "admin.dashboard.daily_retention": "User retention rate by day after sign-up", - "admin.dashboard.monthly_retention": "User retention rate by month after sign-up", - "admin.dashboard.retention.average": "Average", - "admin.dashboard.retention.cohort": "Sign-up month", - "admin.dashboard.retention.cohort_size": "New users", + "admin.dashboard.daily_retention": "साईन-अप के बाद उपयोगकर्ता के रिटेंशन दर", + "admin.dashboard.monthly_retention": "साईन-अप के बाद उपयोगकर्ता के महीने तक रिटेंशन दर", + "admin.dashboard.retention.average": "औसत", + "admin.dashboard.retention.cohort": "साईन-अप महिना", + "admin.dashboard.retention.cohort_size": "नये उपयोगकर्ता", "alert.rate_limited.message": "कृप्या {retry_time, time, medium} के बाद दुबारा कोशिश करें", "alert.rate_limited.title": "सीमित दर", "alert.unexpected.message": "एक अप्रत्याशित त्रुटि हुई है!", "alert.unexpected.title": "उफ़!", "announcement.announcement": "घोषणा", - "attachments_list.unprocessed": "(unprocessed)", + "attachments_list.unprocessed": "(असंसाधित)", "autosuggest_hashtag.per_week": "{count} हर सप्ताह", "boost_modal.combo": "अगली बार स्किप करने के लिए आप {combo} दबा सकते है", "bundle_column_error.body": "इस कॉम्पोनेन्ट को लोड करते वक्त कुछ गलत हो गया", @@ -70,7 +70,7 @@ "column.blocks": "ब्लॉक्ड यूज़र्स", "column.bookmarks": "पुस्तकचिह्न:", "column.community": "लोकल टाइम्लाइन", - "column.conversations": "Conversations", + "column.direct": "सीधा संदेश", "column.directory": "प्रोफाइल्स खोजें", "column.domain_blocks": "छुपे डोमेन्स", "column.favourites": "पसंदीदा", @@ -92,8 +92,10 @@ "community.column_settings.local_only": "स्थानीय ही", "community.column_settings.media_only": "सिर्फ़ मीडिया", "community.column_settings.remote_only": "केवल सुदूर", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "और जानें", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.encryption_warning": "मास्टोडॉन पर पोस्ट एन्ड-टू-एन्ड एन्क्रिप्टेड नहीं है", "compose_form.hashtag_warning": "यह टूट् किसी भी हैशटैग के तहत सूचीबद्ध नहीं होगा क्योंकि यह अनलिस्टेड है। हैशटैग द्वारा केवल सार्वजनिक टूट्स खोजे जा सकते हैं।", "compose_form.lock_disclaimer": "आपका खाता {locked} नहीं है। आपको केवल फॉलोवर्स को दिखाई दिए जाने वाले पोस्ट देखने के लिए कोई भी फॉलो कर सकता है।", "compose_form.lock_disclaimer.lock": "लॉक्ड", @@ -106,7 +108,7 @@ "compose_form.poll.switch_to_single": "एक ही विकल्प के लिए अनुमति देने के लिए पोल बदलें", "compose_form.publish": "टूट्", "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Save changes", + "compose_form.save_changes": "परिवर्तनों को सहेजें", "compose_form.sensitive.hide": "मीडिया को संवेदनशील के रूप में चिह्नित करें", "compose_form.sensitive.marked": "मीडिया संवेदनशील के रूप में चिह्नित है", "compose_form.sensitive.unmarked": "मीडिया संवेदनशील के रूप में चिह्नित नहीं है", @@ -121,8 +123,8 @@ "confirmations.delete.message": "क्या आप वाकई इस स्टेटस को हटाना चाहते हैं?", "confirmations.delete_list.confirm": "मिटाए", "confirmations.delete_list.message": "क्या आप वाकई इस लिस्ट को हमेशा के लिये मिटाना चाहते हैं?", - "confirmations.discard_edit_media.confirm": "Discard", - "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", + "confirmations.discard_edit_media.confirm": "डिस्कार्ड", + "confirmations.discard_edit_media.message": "लिस्ट में जोड़ें", "confirmations.domain_block.confirm": "संपूर्ण डोमेन छिपाएं", "confirmations.domain_block.message": "क्या आप वास्तव में, वास्तव में आप पूरे {domain} को ब्लॉक करना चाहते हैं? ज्यादातर मामलों में कुछ लक्षित ब्लॉक या म्यूट पर्याप्त और बेहतर हैं। आप किसी भी सार्वजनिक समय-सीमा या अपनी सूचनाओं में उस डोमेन की सामग्री नहीं देखेंगे। उस डोमेन से आपके फॉलोवर्स को हटा दिया जाएगा।", "confirmations.logout.confirm": "लॉग आउट करें", @@ -147,6 +149,7 @@ "embed.instructions": "अपने वेबसाइट पर, निचे दिए कोड को कॉपी करके, इस स्टेटस को एम्बेड करें", "embed.preview": "यह ऐसा दिखेगा :", "emoji_button.activity": "गतिविधि", + "emoji_button.clear": "Clear", "emoji_button.custom": "निजीकृत", "emoji_button.flags": "झंडे", "emoji_button.food": "भोजन एवं पेय", @@ -160,15 +163,15 @@ "emoji_button.search_results": "खोज परिणाम", "emoji_button.symbols": "प्रतीक", "emoji_button.travel": "यात्रा एवं स्थान", - "empty_column.account_suspended": "Account suspended", + "empty_column.account_suspended": "खाता निलंबित", "empty_column.account_timeline": "सन्नाटा! यहां कोई टूट्स नहीं!", "empty_column.account_unavailable": "प्रोफाइल उपलब्ध नहीं", "empty_column.blocks": "आप अभी तक किसी भी यूजर के द्वारा ब्लॉक्ड नहीं हो।", "empty_column.bookmarked_statuses": "आपके पास अभी तक कोई बुकमार्क नहीं है। जब आप एक बुकमार्क करते हैं, तो यह यहां दिखाई देगा।", "empty_column.community": "लोकल टाइम्लाइन खाली है, कुछ देखने के लिये सार्वजनिक रूप से कुछ लिखें!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "आपके पास अभी तक कोई सीधा संदेश नहीं है, जब आप भेजेंगे या प्राप्त करेंगे तो ये यहाँ दिखेगा |", "empty_column.domain_blocks": "अभी तक कोई छुपा हुआ डोमेन नहीं है।", - "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", + "empty_column.explore_statuses": "कुछ भी अभी ट्रैंडिंग नहीं है, कुछ देर बाद जांचे!", "empty_column.favourited_statuses": "आपके पास अभी कोई भी चहिता टूट नहीं है. जब आप किसी टूट को पसंद (स्टार) करेंगे, तब वो यहाँ दिखेगा।", "empty_column.favourites": "अभी तक किसी ने भी इस टूट को पसंद (स्टार) नहीं किया है. जब भी कोई इसे पसंद करेगा, उनका नाम यहाँ दिखेगा।", "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "बढ़ावा देने के लिए", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "कंपोज़ टेक्स्ट-एरिया पर ध्यान केंद्रित करने के लिए", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "विवरण", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "सूची में शामिल करने के लिए", "keyboard_shortcuts.enter": "स्टेटस खोलने के लिए", "keyboard_shortcuts.favourite": "पसंदीदा के लिए", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "अगला", "lightbox.previous": "पिछला", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "सूची से निकालें", "lists.delete": "सूची हटाएँ", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "पुस्तकचिह्न:", "navigation_bar.community_timeline": "लोकल टाइम्लाइन", "navigation_bar.compose": "नया टूट् लिखें", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "खोजें", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "प्रोफ़ाइल संपादित करें", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 16434ea46..4096c98d0 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -70,7 +70,7 @@ "column.blocks": "Blokirani korisnici", "column.bookmarks": "Knjižne oznake", "column.community": "Lokalna vremenska crta", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Pregledavanje profila", "column.domain_blocks": "Blokirane domene", "column.favourites": "Favoriti", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Samo lokalno", "community.column_settings.media_only": "Samo medijski sadržaj", "community.column_settings.remote_only": "Samo udaljeno", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Saznajte više", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Ovaj toot neće biti prikazan ni pod jednim hashtagom jer je postavljen kao neprikazan. Samo javni tootovi mogu biti pretraživani pomoći hashtagova.", @@ -122,7 +124,7 @@ "confirmations.delete_list.confirm": "Obriši", "confirmations.delete_list.message": "Jeste li sigurni da želite trajno obrisati ovu listu?", "confirmations.discard_edit_media.confirm": "Odbaciti", - "confirmations.discard_edit_media.message": "Niste spremili promjene u opisu medija ili u predpregledu, svejedno ih odbaciti?", + "confirmations.discard_edit_media.message": "Postoje nespremljene promjene u opisu medija ili u pretpregledu, svejedno ih odbaciti?", "confirmations.domain_block.confirm": "Blokiraj cijelu domenu", "confirmations.domain_block.message": "Jeste li zaista, zaista sigurni da želite blokirati cijelu domenu {domain}? U većini slučajeva dovoljno je i preferirano nekoliko ciljanih blokiranja ili utišavanja. Nećete vidjeti sadržaj s te domene ni u kojim javnim vremenskim crtama ili Vašim obavijestima. Vaši pratitelji s te domene bit će uklonjeni.", "confirmations.logout.confirm": "Odjavi se", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Evo kako će izgledati:", "emoji_button.activity": "Aktivnost", + "emoji_button.clear": "Clear", "emoji_button.custom": "Prilagođeno", "emoji_button.flags": "Zastave", "emoji_button.food": "Hrana i piće", @@ -166,7 +169,7 @@ "empty_column.blocks": "Još niste blokirali nikoga.", "empty_column.bookmarked_statuses": "Još nemaš niti jedan označeni toot. Kada označiš jedan, prikazad će se ovdje.", "empty_column.community": "Lokalna vremenska crta je prazna. Napišite nešto javno da biste pokrenuli stvari!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Još nema blokiranih domena.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "za boostanje", "keyboard_shortcuts.column": "za fokusiranje na toot u jednom od stupaca", "keyboard_shortcuts.compose": "za fokusiranje na tekstualni okvir za stvaranje", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Opis", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "za pomak dolje na listi", "keyboard_shortcuts.enter": "za otvaranje toota", "keyboard_shortcuts.favourite": "za označavanje favoritom", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Sljedeće", "lightbox.previous": "Prethodno", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Dodaj na listu", "lists.account.remove": "Ukloni s liste", "lists.delete": "Izbriši listu", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Lokalna vremenska crta", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Istraživanje", "navigation_bar.domain_blocks": "Blokirane domene", "navigation_bar.edit_profile": "Uredi profil", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index ccf0dd3fd..b22778e71 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -70,7 +70,7 @@ "column.blocks": "Letiltott felhasználók", "column.bookmarks": "Könyvjelzők", "column.community": "Helyi idővonal", - "column.conversations": "Beszélgetések", + "column.direct": "Közvetlen üzenetek", "column.directory": "Profilok böngészése", "column.domain_blocks": "Rejtett domainek", "column.favourites": "Kedvencek", @@ -86,12 +86,14 @@ "column_header.moveLeft_settings": "Oszlop elmozdítása balra", "column_header.moveRight_settings": "Oszlop elmozdítása jobbra", "column_header.pin": "Kitűzés", - "column_header.show_settings": "Beállítások mutatása", + "column_header.show_settings": "Beállítások megjelenítése", "column_header.unpin": "Kitűzés eltávolítása", "column_subheading.settings": "Beállítások", "community.column_settings.local_only": "Csak helyi", "community.column_settings.media_only": "Csak média", "community.column_settings.remote_only": "Csak távoli", + "compose.language.change": "Nyelv megváltoztatása", + "compose.language.search": "Nyelv keresése...", "compose_form.direct_message_warning_learn_more": "Tudj meg többet", "compose_form.encryption_warning": "A bejegyzések a Mastodonon nem használnak végpontok közötti titkosítást. Ne ossz meg érzékeny információt Mastodonon.", "compose_form.hashtag_warning": "Ez a bejegyzésed nem fog megjelenni semmilyen hashtag alatt, mivel listázatlan. Csak a nyilvános bejegyzések kereshetők hashtaggel.", @@ -110,8 +112,8 @@ "compose_form.sensitive.hide": "{count, plural, one {Média kényesnek jelölése} other {Média kényesnek jelölése}}", "compose_form.sensitive.marked": "{count, plural, one {A médiát kényesnek jelölték} other {A médiát kényesnek jelölték}}", "compose_form.sensitive.unmarked": "{count, plural, one {A médiát nem jelölték kényesnek} other {A médiát nem jelölték kényesnek}}", - "compose_form.spoiler.marked": "A szöveg figyelmeztetés mögé van rejtve", - "compose_form.spoiler.unmarked": "A szöveg nem rejtett", + "compose_form.spoiler.marked": "Tartalmi figyelmeztetés törlése", + "compose_form.spoiler.unmarked": "Tartalmi figyelmeztetés hozzáadása", "compose_form.spoiler_placeholder": "Írd ide a figyelmeztetést", "confirmation_modal.cancel": "Mégse", "confirmations.block.block_and_report": "Letiltás és jelentés", @@ -147,6 +149,7 @@ "embed.instructions": "Ágyazd be ezt a bejegyzést a weboldaladba az alábbi kód kimásolásával.", "embed.preview": "Így fog kinézni:", "emoji_button.activity": "Tevékenység", + "emoji_button.clear": "Törlés", "emoji_button.custom": "Egyéni", "emoji_button.flags": "Zászlók", "emoji_button.food": "Étel és Ital", @@ -166,7 +169,7 @@ "empty_column.blocks": "Még senkit sem tiltottál le.", "empty_column.bookmarked_statuses": "Még nincs egyetlen könyvjelzőzött bejegyzésed sem. Ha könyvjelzőzöl egyet, itt fog megjelenni.", "empty_column.community": "A helyi idővonal üres. Tégy közzé valamit nyilvánosan, hogy elindítsd az eseményeket!", - "empty_column.conversations": "Ha olyan bejegyzést küldesz vagy fogadsz, melyet csak az abban megemlítettek látnak, itt fog megjelenni.", + "empty_column.direct": "Még nincs egy közvetlen üzeneted sem. Ha küldesz vagy kapsz egyet, itt fog megjelenni.", "empty_column.domain_blocks": "Még nem rejtettél el egyetlen domaint sem.", "empty_column.explore_statuses": "Jelenleg semmi sem felkapott. Nézz vissza később!", "empty_column.favourited_statuses": "Még nincs egyetlen kedvenc bejegyzésed sem. Ha kedvencnek jelölsz egyet, itt fog megjelenni.", @@ -219,9 +222,9 @@ "hashtag.column_settings.tag_toggle": "Új címkék felvétele ehhez az oszlophoz", "home.column_settings.basic": "Alapvető", "home.column_settings.show_reblogs": "Megtolások mutatása", - "home.column_settings.show_replies": "Válaszok mutatása", + "home.column_settings.show_replies": "Válaszok megjelenítése", "home.hide_announcements": "Közlemények elrejtése", - "home.show_announcements": "Közlemények mutatása", + "home.show_announcements": "Közlemények megjelenítése", "intervals.full.days": "{number, plural, one {# nap} other {# nap}}", "intervals.full.hours": "{number, plural, one {# óra} other {# óra}}", "intervals.full.minutes": "{number, plural, one {# perc} other {# perc}}", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Bejegyzés megtolása", "keyboard_shortcuts.column": "Fókuszálás egy oszlopra", "keyboard_shortcuts.compose": "fókuszálás a szerkesztési szövegdobozra", - "keyboard_shortcuts.conversations": "beszélgetések megnyitása", "keyboard_shortcuts.description": "Leírás", + "keyboard_shortcuts.direct": "közvetlen üzenetek megnyitása", "keyboard_shortcuts.down": "lefele navigálás a listában", "keyboard_shortcuts.enter": "Bejegyzés megnyitása", "keyboard_shortcuts.favourite": "Bejegyzés kedvencnek jelölése", @@ -252,10 +255,10 @@ "keyboard_shortcuts.reply": "Válasz bejegyzésre", "keyboard_shortcuts.requests": "követési kérések listájának megnyitása", "keyboard_shortcuts.search": "fókuszálás a keresőre", - "keyboard_shortcuts.spoilers": "CW mező mutatása/elrejtése", + "keyboard_shortcuts.spoilers": "Tartalmi figyelmeztetés mező megjelenítése/elrejtése", "keyboard_shortcuts.start": "\"Első lépések\" megnyitása", - "keyboard_shortcuts.toggle_hidden": "tartalmi figyelmeztetéssel ellátott szöveg mutatása/elrejtése", - "keyboard_shortcuts.toggle_sensitivity": "média mutatása/elrejtése", + "keyboard_shortcuts.toggle_hidden": "Tartalmi figyelmeztetéssel ellátott szöveg megjelenítése/elrejtése", + "keyboard_shortcuts.toggle_sensitivity": "Média megjelenítése/elrejtése", "keyboard_shortcuts.toot": "Új bejegyzés írása", "keyboard_shortcuts.unfocus": "Szerkesztés/keresés fókuszból való kivétele", "keyboard_shortcuts.up": "felfelé mozdítás a listában", @@ -264,6 +267,8 @@ "lightbox.expand": "Képnézet kinagyítása", "lightbox.next": "Következő", "lightbox.previous": "Előző", + "limited_account_hint.action": "Mindenképpen mutassa a profilt", + "limited_account_hint.title": "Ezt a profilt a kiszolgálód moderátorai elrejtették.", "lists.account.add": "Hozzáadás a listához", "lists.account.remove": "Eltávolítás a listából", "lists.delete": "Lista törlése", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Könyvjelzők", "navigation_bar.community_timeline": "Helyi idővonal", "navigation_bar.compose": "Új bejegyzés írása", + "navigation_bar.direct": "Közvetlen üzenetek", "navigation_bar.discover": "Felfedezés", "navigation_bar.domain_blocks": "Rejtett domainek", "navigation_bar.edit_profile": "Profil szerkesztése", @@ -323,7 +329,7 @@ "notifications.column_settings.admin.sign_up": "Új regisztrálók:", "notifications.column_settings.alert": "Asztali értesítések", "notifications.column_settings.favourite": "Kedvencek:", - "notifications.column_settings.filter_bar.advanced": "Minden kategória mutatása", + "notifications.column_settings.filter_bar.advanced": "Minden kategória megjelenítése", "notifications.column_settings.filter_bar.category": "Gyorskereső mező", "notifications.column_settings.filter_bar.show_bar": "Szűrősáv mutatása", "notifications.column_settings.follow": "Új követők:", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Szavazás törlése", "privacy.change": "Bejegyzés láthatóságának módosítása", "privacy.direct.long": "Csak a megemlített felhasználóknak látható", - "privacy.direct.short": "Csak a megemlítettek", + "privacy.direct.short": "Csak megemlítetteknek", "privacy.private.long": "Csak követőknek látható", "privacy.private.short": "Csak követők", "privacy.public.long": "Mindenki számára látható", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index c7ba3b852..1285403fc 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -70,7 +70,7 @@ "column.blocks": "Արգելափակուած օգտատէրեր", "column.bookmarks": "Էջանիշեր", "column.community": "Տեղական հոսք", - "column.conversations": "Զրոյցներ", + "column.direct": "Հասցէագրուած", "column.directory": "Զննել անձնական էջերը", "column.domain_blocks": "Թաքցուած տիրոյթները", "column.favourites": "Հաւանածներ", @@ -92,8 +92,10 @@ "community.column_settings.local_only": "Միայն տեղական", "community.column_settings.media_only": "Միայն մեդիա", "community.column_settings.remote_only": "Միայն հեռակայ", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Իմանալ աւելին", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.encryption_warning": "Մաստոդոնում գրառումները ծայրից-ծայր գաղտնագրուող չեն։ Գաղտնիք պարունակող նամակներ մի ուղարկէք։", "compose_form.hashtag_warning": "Այս գրառումը չի հաշուառուի որեւէ պիտակի տակ, քանզի այն ծածուկ է։ Միայն հրապարակային թթերը հնարաւոր է որոնել պիտակներով։", "compose_form.lock_disclaimer": "Քո հաշիւը {locked} չէ։ Իւրաքանչիւրութիւն ոք կարող է հետեւել քեզ եւ տեսնել միայն հետեւողների համար նախատեսուած գրառումները։", "compose_form.lock_disclaimer.lock": "փակ", @@ -147,6 +149,7 @@ "embed.instructions": "Այս գրառումը քո կայքում ներդնելու համար կարող ես պատճէնել ներքեւի կոդը։", "embed.preview": "Ահա, թէ ինչ տեսք կունենայ այն՝", "emoji_button.activity": "Զբաղմունքներ", + "emoji_button.clear": "Clear", "emoji_button.custom": "Յատուկ", "emoji_button.flags": "Դրօշներ", "emoji_button.food": "Կերուխում", @@ -166,7 +169,7 @@ "empty_column.blocks": "Դու դեռ ոչ մէկի չես արգելափակել։", "empty_column.bookmarked_statuses": "Դու դեռ չունես որեւէ էջանշուած գրառում։ Երբ էջանշես, դրանք կը երեւան այստեղ։", "empty_column.community": "Տեղական հոսքը դատարկ է։ Հրապարակային մի բան գրի՛ր շարժիչը գործարկելու համար։", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "Դու դեռ չունես ոչ մի հասցէագրուած հաղորդագրութիւն։ Երբ ուղարկես կամ ստանաս որեւէ անձնական նամակ, այն կերեւայ այստեղ։", "empty_column.domain_blocks": "Թաքցուած տիրոյթներ դեռ չկան։", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Դու դեռ չունես որեւէ հաւանած գրառում։ Երբ հաւանես, դրանք կերեւան այստեղ։", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "տարածելու համար", "keyboard_shortcuts.column": "սիւներից մէկի վրայ սեւեռուելու համար", "keyboard_shortcuts.compose": "շարադրման տիրոյթին սեւեռուելու համար", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Նկարագրութիւն", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "ցանկով ներքեւ շարժուելու համար", "keyboard_shortcuts.enter": "Գրառումը բացելու համար", "keyboard_shortcuts.favourite": "հաւանելու համար", @@ -264,6 +267,8 @@ "lightbox.expand": "Բացել պատկերի դիտման պատուհանը", "lightbox.next": "Յաջորդ", "lightbox.previous": "Նախորդ", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Աւելացնել ցանկին", "lists.account.remove": "Հանել ցանկից", "lists.delete": "Ջնջել ցանկը", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Էջանիշեր", "navigation_bar.community_timeline": "Տեղական հոսք", "navigation_bar.compose": "Ստեղծել նոր գրառում", + "navigation_bar.direct": "Հասցէագրուած նամակներ", "navigation_bar.discover": "Բացայայտել", "navigation_bar.domain_blocks": "Թաքցուած տիրոյթներ", "navigation_bar.edit_profile": "Խմբագրել անձնական էջը", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Հեռացնել հարցումը", "privacy.change": "Կարգաւորել գրառման գաղտնիութիւնը", "privacy.direct.long": "Կը տեսնեն միայն նշուած օգտատէրերը", - "privacy.direct.short": "Միայն նշածս մարդիկ", + "privacy.direct.short": "Direct", "privacy.private.long": "Կը տեսնեն միայն հետեւորդները", "privacy.private.short": "Միայն հետեւողները", "privacy.public.long": "Տեսանելի բոլորին", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index c093688e4..ada2876dd 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -70,7 +70,7 @@ "column.blocks": "Pengguna yang diblokir", "column.bookmarks": "Markah", "column.community": "Linimasa Lokal", - "column.conversations": "Percakapan", + "column.direct": "Pesan langsung", "column.directory": "Jelajahi profil", "column.domain_blocks": "Topik tersembunyi", "column.favourites": "Favorit", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Hanya lokal", "community.column_settings.media_only": "Hanya media", "community.column_settings.remote_only": "Hanya jarak jauh", + "compose.language.change": "Ganti bahasa", + "compose.language.search": "Telusuri bahasa...", "compose_form.direct_message_warning_learn_more": "Pelajari selengkapnya", "compose_form.encryption_warning": "Kiriman di Mastodon tidak dienkripsi end-to-end. Jangan bagikan informasi rahasial melalui Mastodon.", "compose_form.hashtag_warning": "Toot ini tidak akan ada dalam daftar tagar manapun karena telah diatur sebagai tidak terdaftar. Hanya postingan publik yang bisa dicari dengan tagar.", @@ -147,6 +149,7 @@ "embed.instructions": "Sematkan kiriman ini di website anda dengan menyalin kode di bawah ini.", "embed.preview": "Tampilan akan seperti ini nantinya:", "emoji_button.activity": "Aktivitas", + "emoji_button.clear": "Hapus", "emoji_button.custom": "Kustom", "emoji_button.flags": "Bendera", "emoji_button.food": "Makanan & Minuman", @@ -166,7 +169,7 @@ "empty_column.blocks": "Anda belum memblokir siapapun.", "empty_column.bookmarked_statuses": "Anda belum memiliki toot termarkah. Saat Anda menandainya sebagai markah, ia akan muncul di sini.", "empty_column.community": "Linimasa lokal masih kosong. Tulis sesuatu secara publik dan buat roda berputar!", - "empty_column.conversations": "Saat Anda mengirim atau menerima kiriman yang hanya terlihat oleh orang yang disebutkan, itu akan muncul di sini.", + "empty_column.direct": "Anda belum memiliki pesan langsung. Ketika Anda mengirim atau menerimanya, maka akan muncul di sini.", "empty_column.domain_blocks": "Tidak ada topik tersembunyi.", "empty_column.explore_statuses": "Tidak ada yang sedang tren pada saat ini. Silakan mengecek lagi nanti!", "empty_column.favourited_statuses": "Anda belum memiliki toot favorit. Ketika Anda mengirim atau menerimanya, maka akan muncul di sini.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "untuk menyebarkan", "keyboard_shortcuts.column": "untuk fokus kepada sebuah status di sebuah kolom", "keyboard_shortcuts.compose": "untuk fokus ke area penulisan", - "keyboard_shortcuts.conversations": "untuk membuka kolom percakapan", "keyboard_shortcuts.description": "Deskripsi", + "keyboard_shortcuts.direct": "untuk membuka kolom pesan langsung", "keyboard_shortcuts.down": "untuk pindah ke bawah dalam sebuah daftar", "keyboard_shortcuts.enter": "untuk membuka status", "keyboard_shortcuts.favourite": "untuk memfavoritkan", @@ -264,6 +267,8 @@ "lightbox.expand": "Besarkan kotak tampilan gambar", "lightbox.next": "Selanjutnya", "lightbox.previous": "Sebelumnya", + "limited_account_hint.action": "Tetap tampilkan profil", + "limited_account_hint.title": "Profil ini telah disembunyikan oleh moderator server Anda.", "lists.account.add": "Tambah ke daftar", "lists.account.remove": "Hapus dari daftar", "lists.delete": "Hapus daftar", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Markah", "navigation_bar.community_timeline": "Linimasa lokal", "navigation_bar.compose": "Tulis toot baru", + "navigation_bar.direct": "Pesan langsung", "navigation_bar.discover": "Temukan", "navigation_bar.domain_blocks": "Domain tersembunyi", "navigation_bar.edit_profile": "Ubah profil", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Hapus japat", "privacy.change": "Tentukan privasi status", "privacy.direct.long": "Kirim hanya ke pengguna yang disebut", - "privacy.direct.short": "Hanya orang yang saya sebut", + "privacy.direct.short": "Orang yang disebutkan saja", "privacy.private.long": "Kirim postingan hanya kepada pengikut", "privacy.private.short": "Pengikut saja", "privacy.public.long": "Terlihat oleh semua", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index d0ce09335..bb13779f3 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -6,7 +6,7 @@ "account.block": "Blokusar @{name}", "account.block_domain": "Hide everything from {domain}", "account.blocked": "Restriktita", - "account.browse_more_on_origin_server": "Videz plu che originala profilo", + "account.browse_more_on_origin_server": "Videz pluse che originala profilo", "account.cancel_follow_request": "Removez sequodemando", "account.direct": "Direct Message @{name}", "account.disable_notifications": "Cesez avizar me kande @{name} postas", @@ -48,8 +48,8 @@ "account.unmute_notifications": "Desilencigez avizi de @{name}", "account.unmute_short": "Desilencigez", "account_note.placeholder": "Click to add a note", - "admin.dashboard.daily_retention": "User retention rate by day after sign-up", - "admin.dashboard.monthly_retention": "User retention rate by month after sign-up", + "admin.dashboard.daily_retention": "Dia uzantoretenseso pos registro", + "admin.dashboard.monthly_retention": "Monata uzantoreteneso pos registro", "admin.dashboard.retention.average": "Averajo", "admin.dashboard.retention.cohort": "Registromonato", "admin.dashboard.retention.cohort_size": "Nova uzanti", @@ -68,170 +68,173 @@ "bundle_modal_error.message": "Nulo ne functionis dum chargar ca kompozaj.", "bundle_modal_error.retry": "Probez itere", "column.blocks": "Blokusita uzeri", - "column.bookmarks": "Bookmarks", + "column.bookmarks": "Libromarki", "column.community": "Lokala tempolineo", - "column.conversations": "Conversations", - "column.directory": "Browse profiles", + "column.direct": "Direta mesaji", + "column.directory": "Videz profili", "column.domain_blocks": "Hidden domains", "column.favourites": "Favorati", "column.follow_requests": "Demandi di sequado", "column.home": "Hemo", - "column.lists": "Lists", + "column.lists": "Listi", "column.mutes": "Celita uzeri", "column.notifications": "Savigi", "column.pins": "Pinned toot", "column.public": "Federata tempolineo", "column_back_button.label": "Retro", - "column_header.hide_settings": "Hide settings", - "column_header.moveLeft_settings": "Move column to the left", - "column_header.moveRight_settings": "Move column to the right", - "column_header.pin": "Pin", - "column_header.show_settings": "Show settings", - "column_header.unpin": "Unpin", - "column_subheading.settings": "Settings", - "community.column_settings.local_only": "Local only", + "column_header.hide_settings": "Celez ajusti", + "column_header.moveLeft_settings": "Movez kolumno a la sinistro", + "column_header.moveRight_settings": "Movez kolumno a la dextro", + "column_header.pin": "Pinglagez", + "column_header.show_settings": "Montrez ajusti", + "column_header.unpin": "Depinglagez", + "column_subheading.settings": "Ajusti", + "community.column_settings.local_only": "Lokala nur", "community.column_settings.media_only": "Media only", - "community.column_settings.remote_only": "Remote only", - "compose_form.direct_message_warning_learn_more": "Learn more", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "community.column_settings.remote_only": "Fora nur", + "compose.language.change": "Chanjez linguo", + "compose.language.search": "Trovez linguo...", + "compose_form.direct_message_warning_learn_more": "Lernez pluse", + "compose_form.encryption_warning": "Posti di Mastodon ne intersequante chifrigesas. Ne partigez irga danjera informo che Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", - "compose_form.lock_disclaimer.lock": "locked", + "compose_form.lock_disclaimer": "Vua konto ne esas {locked}. Irgu povas sequar vu por vidar vua sequanto-nura posti.", + "compose_form.lock_disclaimer.lock": "klefagesas", "compose_form.placeholder": "Quo esas en tua spirito?", - "compose_form.poll.add_option": "Add a choice", - "compose_form.poll.duration": "Poll duration", - "compose_form.poll.option_placeholder": "Choice {number}", - "compose_form.poll.remove_option": "Remove this choice", - "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices", - "compose_form.poll.switch_to_single": "Change poll to allow for a single choice", + "compose_form.poll.add_option": "Insertez selekto", + "compose_form.poll.duration": "Votpostoduro", + "compose_form.poll.option_placeholder": "Selektato {number}", + "compose_form.poll.remove_option": "Efacez ca selektajo", + "compose_form.poll.switch_to_multiple": "Chanjez votposto por permisar multiselektaji", + "compose_form.poll.switch_to_single": "Chanjez votposto por permisar una selektajo", "compose_form.publish": "Siflar", "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Save changes", - "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}", - "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}", + "compose_form.save_changes": "Sparez chanji", + "compose_form.sensitive.hide": "{count, plural,one {Markizez medii quale privata} other {Markizez medii quale privata}}", + "compose_form.sensitive.marked": "{count, plural,one {Medii markizesis quale privata} other {Medii markizesis quale privata}}", + "compose_form.sensitive.unmarked": "{count, plural,one {Medii ne markizesis quale privata} other {Medii ne markizesis quale privata}}", "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "compose_form.spoiler_placeholder": "Averto di kontenajo", - "confirmation_modal.cancel": "Cancel", - "confirmations.block.block_and_report": "Block & Report", - "confirmations.block.confirm": "Block", - "confirmations.block.message": "Are you sure you want to block {name}?", - "confirmations.delete.confirm": "Delete", + "confirmation_modal.cancel": "Anulez", + "confirmations.block.block_and_report": "Restriktez e Raportizez", + "confirmations.block.confirm": "Restriktez", + "confirmations.block.message": "Ka vu certe volas restrikar {name}?", + "confirmations.delete.confirm": "Efacez", "confirmations.delete.message": "Are you sure you want to delete this status?", - "confirmations.delete_list.confirm": "Delete", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", - "confirmations.discard_edit_media.confirm": "Discard", - "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", + "confirmations.delete_list.confirm": "Efacez", + "confirmations.delete_list.message": "Ka vu certe volas netempale efacar ca listo?", + "confirmations.discard_edit_media.confirm": "Efacez", + "confirmations.discard_edit_media.message": "Vu havas nesparita chanji di mediodeskript o prevido, vu volas jus efacar?", "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", - "confirmations.logout.confirm": "Log out", - "confirmations.logout.message": "Are you sure you want to log out?", - "confirmations.mute.confirm": "Mute", - "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.", - "confirmations.mute.message": "Are you sure you want to mute {name}?", - "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.logout.confirm": "Ekirez", + "confirmations.logout.message": "Ka tu certe volas ekirar?", + "confirmations.mute.confirm": "Silencigez", + "confirmations.mute.explanation": "Co celigos posti de oli e posti quo mencionas oli, ma ol ankore permisas oli vidar vua posti e sequar vu.", + "confirmations.mute.message": "Ka vu certe volas silencigar {name}?", + "confirmations.redraft.confirm": "Efacez e riskisez", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", - "confirmations.reply.confirm": "Reply", - "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "confirmations.unfollow.confirm": "Unfollow", - "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", - "directory.federated": "From known fediverse", - "directory.local": "From {domain} only", - "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "confirmations.reply.confirm": "Respondez", + "confirmations.reply.message": "Respondar nun remplos mesajo quon vu nun igas. Ka vu certe volas durar?", + "confirmations.unfollow.confirm": "Desequez", + "confirmations.unfollow.message": "Ka vu certe volas desequar {name}?", + "conversation.delete": "Efacez konverso", + "conversation.mark_as_read": "Markizez quale lektita", + "conversation.open": "Videz konverso", + "conversation.with": "Kun {names}", + "directory.federated": "De savita fediverso", + "directory.local": "De {domain} nur", + "directory.new_arrivals": "Nova venanti", + "directory.recently_active": "Recenta aktivo", "embed.instructions": "Embed this status on your website by copying the code below.", - "embed.preview": "Here is what it will look like:", - "emoji_button.activity": "Activity", - "emoji_button.custom": "Custom", - "emoji_button.flags": "Flags", - "emoji_button.food": "Food & Drink", + "embed.preview": "Co esas quon ol semblos tale:", + "emoji_button.activity": "Ago", + "emoji_button.clear": "Efacez", + "emoji_button.custom": "Kustumizato", + "emoji_button.flags": "Flagi", + "emoji_button.food": "Manjajo & Drinkajo", "emoji_button.label": "Insertar emoji", - "emoji_button.nature": "Nature", - "emoji_button.not_found": "No matching emojis found", - "emoji_button.objects": "Objects", - "emoji_button.people": "People", - "emoji_button.recent": "Frequently used", - "emoji_button.search": "Search...", - "emoji_button.search_results": "Search results", - "emoji_button.symbols": "Symbols", - "emoji_button.travel": "Travel & Places", - "empty_column.account_suspended": "Account suspended", + "emoji_button.nature": "Naturo", + "emoji_button.not_found": "Nula tala parigata emojii", + "emoji_button.objects": "Kozi", + "emoji_button.people": "Personi", + "emoji_button.recent": "Ofta uzato", + "emoji_button.search": "Trovez...", + "emoji_button.search_results": "Trovuri", + "emoji_button.symbols": "Simboli", + "emoji_button.travel": "Vizito & Plasi", + "empty_column.account_suspended": "Konto restriktesis", "empty_column.account_timeline": "No toots here!", - "empty_column.account_unavailable": "Profile unavailable", - "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.account_unavailable": "Profilo esas nedisponebla", + "empty_column.blocks": "Vu ne restriktis irga uzanti til nun.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "La lokala tempolineo esas vakua. Skribez ulo publike por iniciar la agiveso!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "Vu ne havas irga direta mesaji til nun. Kande vu sendas o ganas, ol montresos hike.", "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", + "empty_column.explore_statuses": "Nulo esas tendenca nun. Videz itere pose!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.follow_recommendations": "Semblas tale nula sugestato povas facesar por vu. Vu povas probar trovar personi quon vu forsan konocas o exploras tendenca hashtagi.", + "empty_column.follow_requests": "Vu ne havas irga sequodemandi til nun. Kande vu ganas talo, ol montresos hike.", "empty_column.hashtag": "Esas ankore nulo en ta gretovorto.", "empty_column.home": "Tu sequas ankore nulu. Vizitez {public} od uzez la serchilo por komencar e renkontrar altra uzeri.", - "empty_column.home.suggestions": "See some suggestions", + "empty_column.home.suggestions": "Videz ula sugestati", "empty_column.list": "There is nothing in this list yet.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.lists": "Vu ne havas irga listi til nun. Kande vu kreas talo, ol montresos hike.", + "empty_column.mutes": "Vu ne silencigis irga uzanti til nun.", "empty_column.notifications": "Tu havas ankore nula savigo. Komunikez kun altri por debutar la konverso.", "empty_column.public": "Esas nulo hike! Skribez ulo publike, o manuale sequez uzeri de altra instaluri por plenigar ol.", - "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.", - "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.", - "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", - "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", - "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", - "errors.unexpected_crash.report_issue": "Report issue", - "explore.search_results": "Search results", - "explore.suggested_follows": "For you", - "explore.title": "Explore", - "explore.trending_links": "News", - "explore.trending_statuses": "Posts", - "explore.trending_tags": "Hashtags", - "follow_recommendations.done": "Done", - "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.", - "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!", + "error.unexpected_crash.explanation": "Pro eroro en nia kodexo o vidilkonciliebloproblemo, ca pagino ne povas korekte montresar.", + "error.unexpected_crash.explanation_addons": "Ca pagino ne povas korekte montresar. Ca eroro posible kauzigesas vidilplusajo o automata tradukutensili.", + "error.unexpected_crash.next_steps": "Probez rifreshar pagino. Se to ne helpas, vu forsan ankore povas uzar Mastodon per diferenta vidilo o provizita softwaro.", + "error.unexpected_crash.next_steps_addons": "Probez desaktivigar e rifreshar pagino. Se to ne helpas, vu forsan ankore povas uzar Mastodon per diferenta vidilo o provizita softwaro.", + "errors.unexpected_crash.copy_stacktrace": "Kopiez amastraso a klipplanko", + "errors.unexpected_crash.report_issue": "Reportigez problemo", + "explore.search_results": "Trovuri", + "explore.suggested_follows": "Por vu", + "explore.title": "Explorez", + "explore.trending_links": "Niuz", + "explore.trending_statuses": "Posti", + "explore.trending_tags": "Hashtagi", + "follow_recommendations.done": "Fina", + "follow_recommendations.heading": "Sequez personi quo igas posti quon vu volas vidar! Hike esas ula sugestati.", + "follow_recommendations.lead": "Posti de personi quon vu sequas kronologiale montresos en vua hemniuzeto. Ne timas igar erori, vu povas desequar personi tam same facila irgatempe!", "follow_request.authorize": "Yurizar", "follow_request.reject": "Refuzar", - "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.", - "generic.saved": "Saved", - "getting_started.developers": "Developers", - "getting_started.directory": "Profile directory", - "getting_started.documentation": "Documentation", + "follow_requests.unlocked_explanation": "Quankam vua konto ne klefklozesis, la {domain} laborero pensas ke vu forsan volas kontralar sequodemandi de ca konti manuale.", + "generic.saved": "Sparesis", + "getting_started.developers": "Developeri", + "getting_started.directory": "Profilcheflisto", + "getting_started.documentation": "Dokumentajo", "getting_started.heading": "Debuto", - "getting_started.invite": "Invite people", + "getting_started.invite": "Invitez personi", "getting_started.open_source_notice": "Mastodon esas programaro kun apertita kodexo. Tu povas kontributar o signalar problemi en GitHub ye {github}.", "getting_started.security": "Security", - "getting_started.terms": "Terms of service", - "hashtag.column_header.tag_mode.all": "and {additional}", - "hashtag.column_header.tag_mode.any": "or {additional}", - "hashtag.column_header.tag_mode.none": "without {additional}", - "hashtag.column_settings.select.no_options_message": "No suggestions found", - "hashtag.column_settings.select.placeholder": "Enter hashtags…", - "hashtag.column_settings.tag_mode.all": "All of these", - "hashtag.column_settings.tag_mode.any": "Any of these", - "hashtag.column_settings.tag_mode.none": "None of these", + "getting_started.terms": "Servkondicioni", + "hashtag.column_header.tag_mode.all": "e {additional}", + "hashtag.column_header.tag_mode.any": "o {additional}", + "hashtag.column_header.tag_mode.none": "sen {additional}", + "hashtag.column_settings.select.no_options_message": "Nula sugestati", + "hashtag.column_settings.select.placeholder": "Insertez hashtagi…", + "hashtag.column_settings.tag_mode.all": "Omna co", + "hashtag.column_settings.tag_mode.any": "Irga co", + "hashtag.column_settings.tag_mode.none": "Nula co", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "home.column_settings.basic": "Simpla", "home.column_settings.show_reblogs": "Montrar repeti", "home.column_settings.show_replies": "Montrar respondi", - "home.hide_announcements": "Hide announcements", - "home.show_announcements": "Show announcements", - "intervals.full.days": "{number, plural, one {# day} other {# days}}", - "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", - "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", + "home.hide_announcements": "Celez anunci", + "home.show_announcements": "Montrez anunci", + "intervals.full.days": "{number, plural, one {# dio} other {# dii}}", + "intervals.full.hours": "{number, plural, one {# horo} other {# hori}}", + "intervals.full.minutes": "{number, plural, one {# minuto} other {# minuti}}", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.blocked": "to open blocked users list", "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", - "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.description": "Deskripto", + "keyboard_shortcuts.direct": "apertar kolumno di direta mesaji", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -239,7 +242,7 @@ "keyboard_shortcuts.federated": "to open federated timeline", "keyboard_shortcuts.heading": "Keyboard Shortcuts", "keyboard_shortcuts.home": "to open home timeline", - "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.hotkey": "Rapidklavo", "keyboard_shortcuts.legend": "to display this legend", "keyboard_shortcuts.local": "to open local timeline", "keyboard_shortcuts.mention": "to mention author", @@ -260,284 +263,287 @@ "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "to move up in the list", "lightbox.close": "Klozar", - "lightbox.compress": "Compress image view box", - "lightbox.expand": "Expand image view box", - "lightbox.next": "Next", - "lightbox.previous": "Previous", - "lists.account.add": "Add to list", - "lists.account.remove": "Remove from list", - "lists.delete": "Delete list", - "lists.edit": "Edit list", - "lists.edit.submit": "Change title", - "lists.new.create": "Add list", - "lists.new.title_placeholder": "New list title", - "lists.replies_policy.followed": "Any followed user", - "lists.replies_policy.list": "Members of the list", - "lists.replies_policy.none": "No one", - "lists.replies_policy.title": "Show replies to:", - "lists.search": "Search among people you follow", - "lists.subheading": "Your lists", - "load_pending": "{count, plural, one {# new item} other {# new items}}", + "lightbox.compress": "Kompresez imajvidbuxo", + "lightbox.expand": "Expansez imajvidbuxo", + "lightbox.next": "Nexta", + "lightbox.previous": "Antea", + "limited_account_hint.action": "Jus montrez profilo", + "limited_account_hint.title": "Ca profilo celesas da jerero di vua servilo.", + "lists.account.add": "Insertez a listo", + "lists.account.remove": "Efacez de listo", + "lists.delete": "Efacez listo", + "lists.edit": "Modifikez listo", + "lists.edit.submit": "Chanjez titulo", + "lists.new.create": "Insertez listo", + "lists.new.title_placeholder": "Nova listotitulo", + "lists.replies_policy.followed": "Irga sequita uzanto", + "lists.replies_policy.list": "Membro di listo", + "lists.replies_policy.none": "Nulu", + "lists.replies_policy.title": "Montrez respondi a:", + "lists.search": "Trovez inter personi quon vu sequas", + "lists.subheading": "Vua listi", + "load_pending": "{count, plural, one {# nova kozo} other {# nova kozi}}", "loading_indicator.label": "Kargante...", "media_gallery.toggle_visible": "Chanjar videbleso", "missing_indicator.label": "Ne trovita", - "missing_indicator.sublabel": "This resource could not be found", - "mute_modal.duration": "Duration", - "mute_modal.hide_notifications": "Hide notifications from this user?", - "mute_modal.indefinite": "Indefinite", - "navigation_bar.apps": "Mobile apps", + "missing_indicator.sublabel": "Ca moyeno ne existas", + "mute_modal.duration": "Durado", + "mute_modal.hide_notifications": "Celez avizi de ca uzanto?", + "mute_modal.indefinite": "Nedefinitiva", + "navigation_bar.apps": "Smartfonsoftwari", "navigation_bar.blocks": "Blokusita uzeri", - "navigation_bar.bookmarks": "Bookmarks", + "navigation_bar.bookmarks": "Libromarki", "navigation_bar.community_timeline": "Lokala tempolineo", "navigation_bar.compose": "Compose new toot", - "navigation_bar.discover": "Discover", + "navigation_bar.direct": "Direta mesaji", + "navigation_bar.discover": "Deskovrez", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Modifikar profilo", - "navigation_bar.explore": "Explore", + "navigation_bar.explore": "Explorez", "navigation_bar.favourites": "Favorati", - "navigation_bar.filters": "Muted words", + "navigation_bar.filters": "Silencigita vorti", "navigation_bar.follow_requests": "Demandi di sequado", - "navigation_bar.follows_and_followers": "Follows and followers", + "navigation_bar.follows_and_followers": "Sequati e sequanti", "navigation_bar.info": "Detaloza informi", "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", - "navigation_bar.lists": "Lists", + "navigation_bar.lists": "Listi", "navigation_bar.logout": "Ekirar", "navigation_bar.mutes": "Celita uzeri", - "navigation_bar.personal": "Personal", + "navigation_bar.personal": "Personala", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferi", "navigation_bar.public_timeline": "Federata tempolineo", - "navigation_bar.security": "Security", - "notification.admin.sign_up": "{name} signed up", + "navigation_bar.security": "Sekureso", + "notification.admin.sign_up": "{name} registresis", "notification.favourite": "{name} favorizis tua mesajo", "notification.follow": "{name} sequeskis tu", - "notification.follow_request": "{name} has requested to follow you", + "notification.follow_request": "{name} demandas sequar vu", "notification.mention": "{name} mencionis tu", - "notification.own_poll": "Your poll has ended", - "notification.poll": "A poll you have voted in has ended", + "notification.own_poll": "Vua votposto finigis", + "notification.poll": "Votposto quo havas vua voto finigis", "notification.reblog": "{name} repetis tua mesajo", - "notification.status": "{name} just posted", - "notification.update": "{name} edited a post", + "notification.status": "{name} nove postigis", + "notification.update": "{name} modifikis posto", "notifications.clear": "Efacar savigi", "notifications.clear_confirmation": "Ka tu esas certa, ke tu volas efacar omna tua savigi?", - "notifications.column_settings.admin.sign_up": "New sign-ups:", - "notifications.column_settings.alert": "Surtabla savigi", + "notifications.column_settings.admin.sign_up": "Nova registranti:", + "notifications.column_settings.alert": "Desktopavizi", "notifications.column_settings.favourite": "Favorati:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", - "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show_bar": "Show filter bar", + "notifications.column_settings.filter_bar.advanced": "Montrez omna kategorii", + "notifications.column_settings.filter_bar.category": "Rapidfiltrobaro", + "notifications.column_settings.filter_bar.show_bar": "Montrez filtrobaro", "notifications.column_settings.follow": "Nova sequanti:", - "notifications.column_settings.follow_request": "New follow requests:", + "notifications.column_settings.follow_request": "Nova sequodemandi:", "notifications.column_settings.mention": "Mencioni:", - "notifications.column_settings.poll": "Poll results:", - "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.poll": "Votpostorezulti:", + "notifications.column_settings.push": "Pulsavizi", "notifications.column_settings.reblog": "Repeti:", "notifications.column_settings.show": "Montrar en kolumno", "notifications.column_settings.sound": "Plear sono", "notifications.column_settings.status": "New toots:", - "notifications.column_settings.unread_notifications.category": "Unread notifications", - "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications", - "notifications.column_settings.update": "Edits:", - "notifications.filter.all": "All", - "notifications.filter.boosts": "Boosts", - "notifications.filter.favourites": "Favourites", - "notifications.filter.follows": "Follows", - "notifications.filter.mentions": "Mentions", - "notifications.filter.polls": "Poll results", - "notifications.filter.statuses": "Updates from people you follow", - "notifications.grant_permission": "Grant permission.", - "notifications.group": "{count} notifications", - "notifications.mark_as_read": "Mark every notification as read", - "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", - "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", - "notifications_permission_banner.enable": "Enable desktop notifications", - "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", - "notifications_permission_banner.title": "Never miss a thing", - "picture_in_picture.restore": "Put it back", - "poll.closed": "Closed", - "poll.refresh": "Refresh", - "poll.total_people": "{count, plural, one {# person} other {# people}}", - "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", - "poll.vote": "Vote", - "poll.voted": "You voted for this answer", - "poll.votes": "{votes, plural, one {# vote} other {# votes}}", - "poll_button.add_poll": "Add a poll", - "poll_button.remove_poll": "Remove poll", + "notifications.column_settings.unread_notifications.category": "Nelektita avizi", + "notifications.column_settings.unread_notifications.highlight": "Briligez nelektita avizi", + "notifications.column_settings.update": "Modifikati:", + "notifications.filter.all": "Omna", + "notifications.filter.boosts": "Busti", + "notifications.filter.favourites": "Favorati", + "notifications.filter.follows": "Sequati", + "notifications.filter.mentions": "Mencioni", + "notifications.filter.polls": "Votpostorezulti", + "notifications.filter.statuses": "Niuz de personi quon vu sequas", + "notifications.grant_permission": "Donez permiso.", + "notifications.group": "{count} avizi", + "notifications.mark_as_read": "Markizez singla avizi quale lektita", + "notifications.permission_denied": "Desktopavizi esas nedisplonebla pro antea refuzita vidilpermisdemando", + "notifications.permission_denied_alert": "Desktopavizi ne povas aktivigesar pro ke vidilpermiso refuzesis", + "notifications.permission_required": "Desktopavizi esas nedisplonebla pro ke bezonata permiso ne donesis.", + "notifications_permission_banner.enable": "Aktivigez desktopavizi", + "notifications_permission_banner.how_to_control": "Por ganar avizi kande Mastodon ne esas apertita, aktivigez dekstopavizi. Vu povas precize regularar quale interakti facas deskstopavizi tra la supera {icon} butono pos oli aktivigesis.", + "notifications_permission_banner.title": "Irga kozo ne pasas vu", + "picture_in_picture.restore": "Retropozez", + "poll.closed": "Klozita", + "poll.refresh": "Rifreshez", + "poll.total_people": "{count, plural, one {# persono} other {# personi}}", + "poll.total_votes": "{count, plural, one {# voto} other {# voti}}", + "poll.vote": "Votez", + "poll.voted": "Vu ja votis ca respondo", + "poll.votes": "{votes, plural, one {# voto} other {# voti}}", + "poll_button.add_poll": "Insertez votposto", + "poll_button.remove_poll": "Efacez votposto", "privacy.change": "Aranjar privateso di mesaji", "privacy.direct.long": "Sendar nur a mencionata uzeri", - "privacy.direct.short": "Direct", + "privacy.direct.short": "Mencionita personi nur", "privacy.private.long": "Sendar nur a sequanti", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Visible for all", + "privacy.private.short": "Sequanti nur", + "privacy.public.long": "Videbla da omnu", "privacy.public.short": "Publike", - "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", + "privacy.unlisted.long": "Videbla da omnu ma voluntala ne inkluzas deskovrotraiti", "privacy.unlisted.short": "Ne enlistigota", - "refresh": "Refresh", - "regeneration_indicator.label": "Loading…", - "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "refresh": "Rifreshez", + "regeneration_indicator.label": "Chargas…", + "regeneration_indicator.sublabel": "Vua hemniuzeto preparesas!", "relative_time.days": "{number}d", - "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago", - "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago", - "relative_time.full.just_now": "just now", - "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago", - "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago", + "relative_time.full.days": "{number, plural, one {# dio} other {# dii}} ante nun", + "relative_time.full.hours": "{number, plural, one {# horo} other {# hori}} ante nun", + "relative_time.full.just_now": "jus nun", + "relative_time.full.minutes": "{number, plural, one {# minuto} other {# minuti}} ante nun", + "relative_time.full.seconds": "{number, plural, one {# sekundo} other {# sekundi}} ante nun", "relative_time.hours": "{number}h", - "relative_time.just_now": "now", + "relative_time.just_now": "nun", "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", - "relative_time.today": "today", + "relative_time.today": "hodie", "reply_indicator.cancel": "Nihiligar", - "report.block": "Block", - "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", - "report.categories.other": "Other", - "report.categories.spam": "Spam", - "report.categories.violation": "Content violates one or more server rules", - "report.category.subtitle": "Choose the best match", - "report.category.title": "Tell us what's going on with this {type}", - "report.category.title_account": "profile", - "report.category.title_status": "post", - "report.close": "Done", - "report.comment.title": "Is there anything else you think we should know?", - "report.forward": "Forward to {target}", - "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", - "report.mute": "Mute", - "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.", - "report.next": "Next", + "report.block": "Restriktez", + "report.block_explanation": "Vu ne vidos olia posti. Oli ne povas vidar vua posti o sequar vu. Oli savos ke oli restriktesis.", + "report.categories.other": "Altra", + "report.categories.spam": "Spamo", + "report.categories.violation": "Kontenaj nesequas servilregulo", + "report.category.subtitle": "Selektez maxim bona parigato", + "report.category.title": "Savigez ni pri quo eventas kun ca {type}", + "report.category.title_account": "profilo", + "report.category.title_status": "posto", + "report.close": "Fina", + "report.comment.title": "Ka altra irgo quon vu pensas ke ni debas savar?", + "report.forward": "Sendez a {target}", + "report.forward_hint": "La konto esas de altra servilo. Vu volas sendar raportkopiur sen nomo ibe anke?", + "report.mute": "Silencigez", + "report.mute_explanation": "Vu ne vidos olia posti. Oli povas ankore sequar vu e vidar vua posti e ne savar ke oli silencigesis.", + "report.next": "Nexta", "report.placeholder": "Plusa komenti", - "report.reasons.dislike": "I don't like it", - "report.reasons.dislike_description": "It is not something you want to see", - "report.reasons.other": "It's something else", - "report.reasons.other_description": "The issue does not fit into other categories", - "report.reasons.spam": "It's spam", - "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies", - "report.reasons.violation": "It violates server rules", - "report.reasons.violation_description": "You are aware that it breaks specific rules", - "report.rules.subtitle": "Select all that apply", - "report.rules.title": "Which rules are being violated?", - "report.statuses.subtitle": "Select all that apply", - "report.statuses.title": "Are there any posts that back up this report?", + "report.reasons.dislike": "Me ne amas", + "report.reasons.dislike_description": "Ol ne esas olo quon vu volas vidar", + "report.reasons.other": "Ol esas altra ulo", + "report.reasons.other_description": "La problemo ne fitas a altra kategorii", + "report.reasons.spam": "Ol esas spamo", + "report.reasons.spam_description": "Mala ligili, falsa interago o repetiva repliki", + "report.reasons.violation": "Ol nesequas servilreguli", + "report.reasons.violation_description": "Vu remarkas ke ol nesequas partikulara reguli", + "report.rules.subtitle": "Selektez relatata omno", + "report.rules.title": "Quala reguli nesequesas?", + "report.statuses.subtitle": "Selektez relatata omno", + "report.statuses.title": "Ka existas irga posti quo suportas ca raporto?", "report.submit": "Sendar", "report.target": "Denuncante", - "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:", - "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:", - "report.thanks.title": "Don't want to see this?", - "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.", - "report.unfollow": "Unfollow @{name}", - "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report.thanks.take_action": "Co esas vua opcioni por regularar quo vu vidas che Mastodon:", + "report.thanks.take_action_actionable": "Dum ke ni kontrolas co, vu povas demarshar kontra @{name}:", + "report.thanks.title": "Ka vu ne volas vidar co?", + "report.thanks.title_actionable": "Danko por raportizar, ni kontrolos co.", + "report.unfollow": "Desequez @{name}", + "report.unfollow_explanation": "Vu sequas ca konto. Por ne vidar olia posti en vua hemniuzeto pluse, desequez oli.", "search.placeholder": "Serchez", - "search_popout.search_format": "Advanced search format", + "search_popout.search_format": "Avancata trovformato", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", - "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.hashtag": "hashtago", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", - "search_popout.tips.user": "user", - "search_results.accounts": "People", - "search_results.all": "All", - "search_results.hashtags": "Hashtags", - "search_results.nothing_found": "Could not find anything for these search terms", + "search_popout.tips.text": "Simpla textoretrovenuri quo parigas trovnomi, uzantonomi e hashtagi", + "search_popout.tips.user": "uzanto", + "search_results.accounts": "Personi", + "search_results.all": "Omna", + "search_results.hashtags": "Hashtagi", + "search_results.nothing_found": "Ne povas ganar irgo per ca trovvorti", "search_results.statuses": "Toots", "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", "search_results.total": "{count, number} {count, plural, one {rezulto} other {rezulti}}", - "status.admin_account": "Open moderation interface for @{name}", + "status.admin_account": "Apertez jerintervizajo por @{name}", "status.admin_status": "Open this status in the moderation interface", - "status.block": "Block @{name}", - "status.bookmark": "Bookmark", - "status.cancel_reblog_private": "Unboost", - "status.cannot_reblog": "This post cannot be boosted", + "status.block": "Restriktez @{name}", + "status.bookmark": "Libromarko", + "status.cancel_reblog_private": "Debustez", + "status.cannot_reblog": "Ca posto ne povas bustesas", "status.copy": "Copy link to status", "status.delete": "Efacar", - "status.detailed_status": "Detailed conversation view", - "status.direct": "Direct message @{name}", - "status.edit": "Edit", - "status.edited": "Edited {date}", - "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}", - "status.embed": "Embed", + "status.detailed_status": "Detala konversvido", + "status.direct": "Direta mesajigez @{name}", + "status.edit": "Modifikez", + "status.edited": "Modifikesis ye {date}", + "status.edited_x_times": "Modifikesis {count, plural, one {{count} foyo} other {{count} foyi}}", + "status.embed": "Eninsertez", "status.favourite": "Favorizar", - "status.filtered": "Filtered", - "status.history.created": "{name} created {date}", - "status.history.edited": "{name} edited {date}", + "status.filtered": "Filtrita", + "status.history.created": "{name} kreis ye {date}", + "status.history.edited": "{name} modifikis ye {date}", "status.load_more": "Kargar pluse", "status.media_hidden": "Kontenajo celita", "status.mention": "Mencionar @{name}", - "status.more": "More", - "status.mute": "Mute @{name}", - "status.mute_conversation": "Mute conversation", + "status.more": "Pluse", + "status.mute": "Silencigez @{name}", + "status.mute_conversation": "Silencigez konverso", "status.open": "Detaligar ca mesajo", - "status.pin": "Pin on profile", + "status.pin": "Pinglagez che profilo", "status.pinned": "Pinned toot", - "status.read_more": "Read more", + "status.read_more": "Lektez pluse", "status.reblog": "Repetar", - "status.reblog_private": "Boost with original visibility", + "status.reblog_private": "Bustez kun originala videbleso", "status.reblogged_by": "{name} repetita", "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", - "status.redraft": "Delete & re-draft", - "status.remove_bookmark": "Remove bookmark", + "status.redraft": "Efacez e riskisigez", + "status.remove_bookmark": "Efacez libromarko", "status.reply": "Respondar", "status.replyAll": "Respondar a filo", "status.report": "Denuncar @{name}", "status.sensitive_warning": "Trubliva kontenajo", - "status.share": "Share", + "status.share": "Partigez", "status.show_less": "Montrar mine", - "status.show_less_all": "Show less for all", + "status.show_less_all": "Montrez min por omno", "status.show_more": "Montrar plue", - "status.show_more_all": "Show more for all", - "status.show_thread": "Show thread", - "status.uncached_media_warning": "Not available", - "status.unmute_conversation": "Unmute conversation", - "status.unpin": "Unpin from profile", - "suggestions.dismiss": "Dismiss suggestion", - "suggestions.header": "You might be interested in…", + "status.show_more_all": "Montrez pluse por omno", + "status.show_thread": "Montrez postaro", + "status.uncached_media_warning": "Nedisplonebla", + "status.unmute_conversation": "Desilencigez konverso", + "status.unpin": "Depinglagez de profilo", + "suggestions.dismiss": "Desklozez sugestajo", + "suggestions.header": "Vu forsan havas intereso pri…", "tabs_bar.federated_timeline": "Federata", "tabs_bar.home": "Hemo", "tabs_bar.local_timeline": "Lokala", "tabs_bar.notifications": "Savigi", - "tabs_bar.search": "Search", - "time_remaining.days": "{number, plural, one {# day} other {# days}} left", - "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", - "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", - "time_remaining.moments": "Moments remaining", - "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", - "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.", - "timeline_hint.resources.followers": "Followers", - "timeline_hint.resources.follows": "Follows", + "tabs_bar.search": "Trovez", + "time_remaining.days": "{number, plural, one {# dio} other {# dii}} restas", + "time_remaining.hours": "{number, plural, one {# horo} other {# hori}} restas", + "time_remaining.minutes": "{number, plural, one {# minuto} other {# minuti}} restas", + "time_remaining.moments": "Poka sekundi restas", + "time_remaining.seconds": "{number, plural, one {# sekundo} other {# sekundi}} restas", + "timeline_hint.remote_resource_not_displayed": "{resource} de altra servili ne montresas.", + "timeline_hint.resources.followers": "Sequanti", + "timeline_hint.resources.follows": "Sequati", "timeline_hint.resources.statuses": "Older toots", - "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking", - "trends.trending_now": "Trending now", - "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", - "units.short.billion": "{count}B", + "trends.counter_by_accounts": "{count, plural, one {{counter} persono} other {{counter} personi}} parolas", + "trends.trending_now": "Tendencigas nun", + "ui.beforeunload": "Vua skisato perdesos se vu ekiras Mastodon.", + "units.short.billion": "{count}G", "units.short.million": "{count}M", "units.short.thousand": "{count}K", "upload_area.title": "Tranar faligar por kargar", "upload_button.label": "Adjuntar kontenajo", - "upload_error.limit": "File upload limit exceeded.", - "upload_error.poll": "File upload not allowed with polls.", - "upload_form.audio_description": "Describe for people with hearing loss", - "upload_form.description": "Describe for the visually impaired", - "upload_form.description_missing": "No description added", - "upload_form.edit": "Edit", - "upload_form.thumbnail": "Change thumbnail", + "upload_error.limit": "Failadcharglimito ecesesis.", + "upload_error.poll": "Failadchargo ne permisesas kun votposti.", + "upload_form.audio_description": "Deskriptez por personi kun audnekapableso", + "upload_form.description": "Deskriptez por personi kun vidnekapableso", + "upload_form.description_missing": "Deskriptajo ne insertesis", + "upload_form.edit": "Modifikez", + "upload_form.thumbnail": "Chanjez imajeto", "upload_form.undo": "Desfacar", - "upload_form.video_description": "Describe for people with hearing loss or visual impairment", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.applying": "Applying…", - "upload_modal.choose_image": "Choose image", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preparing_ocr": "Preparing OCR…", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_form.video_description": "Deskriptez por personi kun audnekapableso o vidnekapableso", + "upload_modal.analyzing_picture": "Analizas imajo…", + "upload_modal.apply": "Aplikez", + "upload_modal.applying": "Aplikas…", + "upload_modal.choose_image": "Selektez imajo", + "upload_modal.description_placeholder": "Rapida bruna foxo saltas super la indolenta hundo", + "upload_modal.detect_text": "Deskovrez texto de imajo", + "upload_modal.edit_media": "Modifikez medii", + "upload_modal.hint": "Kliktez o tirez cirklo che prevido por selektar centrala punto quo sempre montresas kun omna imajeti.", + "upload_modal.preparing_ocr": "Preparas OCR…", + "upload_modal.preview_label": "Previdez ({ratio})", "upload_progress.label": "Kargante...", - "video.close": "Close video", - "video.download": "Download file", - "video.exit_fullscreen": "Exit full screen", - "video.expand": "Expand video", - "video.fullscreen": "Full screen", - "video.hide": "Hide video", - "video.mute": "Mute sound", - "video.pause": "Pause", - "video.play": "Play", - "video.unmute": "Unmute sound" + "video.close": "Klozez video", + "video.download": "Deschargez failo", + "video.exit_fullscreen": "Ekirez plena skreno", + "video.expand": "Expansez video", + "video.fullscreen": "Plena skreno", + "video.hide": "Celez video", + "video.mute": "Silencigez sono", + "video.pause": "Pauzez", + "video.play": "Pleez", + "video.unmute": "Desilencigez sono" } diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 053c18fcf..845d0f8d5 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -70,7 +70,7 @@ "column.blocks": "Útilokaðir notendur", "column.bookmarks": "Bókamerki", "column.community": "Staðvær tímalína", - "column.conversations": "Samtöl", + "column.direct": "Bein skilaboð", "column.directory": "Vafra notandasnið", "column.domain_blocks": "Útilokuð lén", "column.favourites": "Eftirlæti", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Einungis staðvært", "community.column_settings.media_only": "Einungis myndskrár", "community.column_settings.remote_only": "Einungis fjartengt", + "compose.language.change": "Skipta um tungumál", + "compose.language.search": "Leita að tungumálum...", "compose_form.direct_message_warning_learn_more": "Kanna nánar", "compose_form.encryption_warning": "Færslur á Mastodon eru ekki enda-í-enda dulritaðar. Ekki deila viðkvæmum upplýsingum á Mastodon.", "compose_form.hashtag_warning": "Þessi færsla verður ekki talin með undir nokkru myllumerki þar sem það er óskráð. Einungis er hægt að leita að opinberum færslum eftir myllumerkjum.", @@ -147,6 +149,7 @@ "embed.instructions": "Felldu þessa færslu inn í vefsvæðið þitt með því að afrita kóðann hér fyrir neðan.", "embed.preview": "Svona mun þetta líta út:", "emoji_button.activity": "Virkni", + "emoji_button.clear": "Hreinsa", "emoji_button.custom": "Sérsniðin", "emoji_button.flags": "Flögg", "emoji_button.food": "Matur og drykkur", @@ -166,7 +169,7 @@ "empty_column.blocks": "Þú hefur ekki ennþá útilokað neina notendur.", "empty_column.bookmarked_statuses": "Þú ert ekki ennþá með neinar bókamerktar færslur. Þegar þú bókamerkir færslu, mun það birtast hér.", "empty_column.community": "Staðværa tímalínan er tóm. Skrifaðu eitthvað opinberlega til að láta boltann fara að rúlla!", - "empty_column.conversations": "Þegar þú hefur sent eða móttekið færslu sem er aðeins sýnileg fólki sem nefnt er í henni þá birtist hún hér.", + "empty_column.direct": "Þú átt ennþá engin bein skilaboð. Þegar þú sendir eða tekur á móti slíkum skilaboðum, munu þau birtast hér.", "empty_column.domain_blocks": "Það eru ennþá engin útilokuð lén.", "empty_column.explore_statuses": "Ekkert er á uppleið í augnablikinu. Athugaðu aftur síðar!", "empty_column.favourited_statuses": "Þú ert ekki ennþá með neinar eftirlætisfærslur. Þegar þú setur færslu í eftirlæti, munu þau birtast hér.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Endurbirta færslu", "keyboard_shortcuts.column": "Setja virkni í dálk", "keyboard_shortcuts.compose": "Setja virkni á textainnsetningarreit", - "keyboard_shortcuts.conversations": "að opna samtalsdálka", "keyboard_shortcuts.description": "Lýsing", + "keyboard_shortcuts.direct": "að opna dálk með beinum skilaboðum", "keyboard_shortcuts.down": "Fara neðar í listanum", "keyboard_shortcuts.enter": "Opna færslu", "keyboard_shortcuts.favourite": "Eftirlætisfærsla", @@ -264,6 +267,8 @@ "lightbox.expand": "Fletta út myndskoðunarreit", "lightbox.next": "Næsta", "lightbox.previous": "Fyrra", + "limited_account_hint.action": "Birta notandasniðið samt", + "limited_account_hint.title": "Þetta notandasnið hefur verið falið af umsjónarmönnum netþjónsins þíns.", "lists.account.add": "Bæta á lista", "lists.account.remove": "Fjarlægja af lista", "lists.delete": "Eyða lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bókamerki", "navigation_bar.community_timeline": "Staðvær tímalína", "navigation_bar.compose": "Semja nýja færslu", + "navigation_bar.direct": "Bein skilaboð", "navigation_bar.discover": "Uppgötva", "navigation_bar.domain_blocks": "Útilokuð lén", "navigation_bar.edit_profile": "Breyta notandasniði", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Fjarlægja könnun", "privacy.change": "Aðlaga gagnaleynd færslu", "privacy.direct.long": "Senda einungis á notendur sem minnst er á", - "privacy.direct.short": "Aðeins fólk sem ég minnist á", + "privacy.direct.short": "Aðeins fólk sem minnst er á", "privacy.private.long": "Senda einungis á fylgjendur", "privacy.private.short": "Einungis fylgjendur", "privacy.public.long": "Sýnilegt fyrir alla", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 8e881e284..46e509b07 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -70,7 +70,7 @@ "column.blocks": "Utenti bloccati", "column.bookmarks": "Segnalibri", "column.community": "Timeline locale", - "column.conversations": "Conversazioni", + "column.direct": "Messaggi diretti", "column.directory": "Sfoglia profili", "column.domain_blocks": "Domini bloccati", "column.favourites": "Preferiti", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Solo Locale", "community.column_settings.media_only": "Solo Media", "community.column_settings.remote_only": "Solo Remoto", + "compose.language.change": "Cambia lingua", + "compose.language.search": "Ricerca lingue...", "compose_form.direct_message_warning_learn_more": "Scopri di più", "compose_form.encryption_warning": "I messaggi su Mastodon non sono crittografati end-to-end. Non condividere alcuna informazione sensibile su Mastodon.", "compose_form.hashtag_warning": "Questo post non sarà elencato sotto alcun hashtag poiché senza elenco. Solo i toot pubblici possono essere ricercati per hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Incorpora questo post sul tuo sito web copiando il codice sotto.", "embed.preview": "Ecco come apparirà:", "emoji_button.activity": "Attività", + "emoji_button.clear": "Cancella", "emoji_button.custom": "Personalizzato", "emoji_button.flags": "Bandiere", "emoji_button.food": "Cibo & Bevande", @@ -166,7 +169,7 @@ "empty_column.blocks": "Non hai ancora bloccato alcun utente.", "empty_column.bookmarked_statuses": "Non hai ancora segnato alcun post. Quando ne segni uno, sarà mostrato qui.", "empty_column.community": "La timeline locale è vuota. Condividi qualcosa pubblicamente per dare inizio alla festa!", - "empty_column.conversations": "Quando invii o ricevi un post visibile solo alle persone citate in esso, apparirà qui.", + "empty_column.direct": "Non hai ancora nessun messaggio diretto. Quando ne manderai o riceverai qualcuno, apparirà qui.", "empty_column.domain_blocks": "Non vi sono domini nascosti.", "empty_column.explore_statuses": "Nulla è in tendenza in questo momento. Riprova più tardi!", "empty_column.favourited_statuses": "Non hai ancora segnato nessun post come apprezzato. Quando lo farai, comparirà qui.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Condividi il post", "keyboard_shortcuts.column": "per portare il focus su uno status in una delle colonne", "keyboard_shortcuts.compose": "per portare il focus nell'area di composizione", - "keyboard_shortcuts.conversations": "per aprire la colonna conversazioni", "keyboard_shortcuts.description": "Descrizione", + "keyboard_shortcuts.direct": "per aprire la colonna dei messaggi diretti", "keyboard_shortcuts.down": "Spostati in basso nella lista", "keyboard_shortcuts.enter": "Apri il post", "keyboard_shortcuts.favourite": "Apprezza post", @@ -264,6 +267,8 @@ "lightbox.expand": "Espandi casella di visualizzazione immagine", "lightbox.next": "Successivo", "lightbox.previous": "Precedente", + "limited_account_hint.action": "Mostra comunque il profilo", + "limited_account_hint.title": "Questo profilo è stato nascosto dai moderatori del tuo server.", "lists.account.add": "Aggiungi alla lista", "lists.account.remove": "Togli dalla lista", "lists.delete": "Elimina lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Segnalibri", "navigation_bar.community_timeline": "Timeline locale", "navigation_bar.compose": "Componi nuovo toot", + "navigation_bar.direct": "Messaggi diretti", "navigation_bar.discover": "Scopri", "navigation_bar.domain_blocks": "Domini nascosti", "navigation_bar.edit_profile": "Modifica profilo", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Rimuovi sondaggio", "privacy.change": "Modifica privacy del post", "privacy.direct.long": "Invia solo a utenti menzionati", - "privacy.direct.short": "Solo le persone che menziono", + "privacy.direct.short": "Solo persone citate", "privacy.private.long": "Invia solo ai follower", "privacy.private.short": "Solo i seguaci", "privacy.public.long": "Visibile a tutti", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 075acab5d..72084d49d 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -70,7 +70,7 @@ "column.blocks": "ブロックしたユーザー", "column.bookmarks": "ブックマーク", "column.community": "ローカルタイムライン", - "column.conversations": "会話", + "column.direct": "ダイレクトメッセージ", "column.directory": "ディレクトリ", "column.domain_blocks": "ブロックしたドメイン", "column.favourites": "お気に入り", @@ -96,6 +96,8 @@ "community.column_settings.local_only": "ローカルのみ表示", "community.column_settings.media_only": "メディアのみ表示", "community.column_settings.remote_only": "リモートのみ表示", + "compose.language.change": "言語を変更", + "compose.language.search": "言語を検索...", "compose_form.direct_message_warning_learn_more": "もっと詳しく", "compose_form.encryption_warning": "Mastodonの投稿はエンドツーエンド暗号化に対応していません。安全に送受信されるべき情報をMastodonで共有しないでください。", "compose_form.hashtag_warning": "この投稿は公開設定ではないのでハッシュタグの一覧に表示されません。公開投稿だけがハッシュタグで検索できます。", @@ -151,6 +153,7 @@ "embed.instructions": "下記のコードをコピーしてウェブサイトに埋め込みます。", "embed.preview": "表示例:", "emoji_button.activity": "活動", + "emoji_button.clear": "クリア", "emoji_button.custom": "カスタム絵文字", "emoji_button.flags": "国旗", "emoji_button.food": "食べ物", @@ -170,7 +173,7 @@ "empty_column.blocks": "まだ誰もブロックしていません。", "empty_column.bookmarked_statuses": "まだ何もブックマーク登録していません。ブックマーク登録するとここに表示されます。", "empty_column.community": "ローカルタイムラインはまだ使われていません。何か書いてみましょう!", - "empty_column.conversations": "メンションした相手にだけ表示されるメッセージを一度でも送受信した場合、ここに表示されます。", + "empty_column.direct": "ダイレクトメッセージはまだありません。ダイレクトメッセージをやりとりすると、ここに表示されます。", "empty_column.domain_blocks": "ブロックしているドメインはありません。", "empty_column.explore_statuses": "まだ何もありません。後で確認してください。", "empty_column.favourited_statuses": "まだ何もお気に入り登録していません。お気に入り登録するとここに表示されます。", @@ -234,8 +237,8 @@ "keyboard_shortcuts.boost": "ブースト", "keyboard_shortcuts.column": "左からn番目のカラムの最新に移動", "keyboard_shortcuts.compose": "投稿の入力欄に移動", - "keyboard_shortcuts.conversations": "会話カラムを開く", "keyboard_shortcuts.description": "説明", + "keyboard_shortcuts.direct": "ダイレクトメッセージのカラムを開く", "keyboard_shortcuts.down": "カラム内一つ下に移動", "keyboard_shortcuts.enter": "投稿の詳細を表示", "keyboard_shortcuts.favourite": "お気に入り", @@ -268,6 +271,8 @@ "lightbox.expand": "画像ビューボックスを開く", "lightbox.next": "次", "lightbox.previous": "前", + "limited_account_hint.action": "構わず表示する", + "limited_account_hint.title": "このプロフィールはサーバーのモデレーターによって非表示になっています。", "lists.account.add": "リストに追加", "lists.account.remove": "リストから外す", "lists.delete": "リストを削除", @@ -294,6 +299,7 @@ "navigation_bar.bookmarks": "ブックマーク", "navigation_bar.community_timeline": "ローカルタイムライン", "navigation_bar.compose": "投稿の新規作成", + "navigation_bar.direct": "ダイレクトメッセージ", "navigation_bar.discover": "見つける", "navigation_bar.domain_blocks": "ブロックしたドメイン", "navigation_bar.edit_profile": "プロフィールを編集", @@ -370,8 +376,8 @@ "poll_button.add_poll": "アンケートを追加", "poll_button.remove_poll": "アンケートを削除", "privacy.change": "公開範囲を変更", - "privacy.direct.long": "送信した相手のみ閲覧可", - "privacy.direct.short": "メンションした相手のみ", + "privacy.direct.long": "指定された相手のみ閲覧可", + "privacy.direct.short": "指定された相手のみ", "privacy.private.long": "フォロワーのみ閲覧可", "privacy.private.short": "フォロワーのみ", "privacy.public.long": "誰でも閲覧可", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 6b5fa5c97..2ded9c350 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -70,7 +70,7 @@ "column.blocks": "დაბლოკილი მომხმარებლები", "column.bookmarks": "Bookmarks", "column.community": "ლოკალური თაიმლაინი", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "დამალული დომენები", "column.favourites": "ფავორიტები", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "მხოლოდ მედია", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "გაიგე მეტი", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "ეს ტუტი არ მოექცევა ჰეშტეგების ქვეს, რამეთუ ის არაა მითითებული. მხოლოდ ღია ტუტები მოიძებნება ჰეშტეგით.", @@ -147,6 +149,7 @@ "embed.instructions": "ეს სტატუსი ჩასვით თქვენს ვებ-საიტზე შემდეგი კოდის კოპირებით.", "embed.preview": "ესაა თუ როგორც გამოჩნდება:", "emoji_button.activity": "აქტივობა", + "emoji_button.clear": "Clear", "emoji_button.custom": "პერსონალიზირებული", "emoji_button.flags": "დროშები", "emoji_button.food": "საჭმელი და სასლმელი", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "ლოკალური თაიმლაინი ცარიელია. დაწერეთ რაიმე ღიად ან ქენით რაიმე სხვა!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no hidden domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "დასაბუსტად", "keyboard_shortcuts.column": "ერთ-ერთი სვეტში სტატუსზე ფოკუსირებისთვის", "keyboard_shortcuts.compose": "შედგენის ტექსტ-არეაზე ფოკუსირებისთვის", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "აღწერილობა", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "სიაში ქვემოთ გადასაადგილებლად", "keyboard_shortcuts.enter": "სტატუსის გასახსნელად", "keyboard_shortcuts.favourite": "ფავორიტად ქცევისთვის", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "შემდეგი", "lightbox.previous": "წინა", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "სიაში დამატება", "lists.account.remove": "სიიდან ამოშლა", "lists.delete": "სიის წაშლა", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "ლოკალური თაიმლაინი", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "აღმოაჩინე", "navigation_bar.domain_blocks": "დამალული დომენები", "navigation_bar.edit_profile": "შეცვალე პროფილი", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 48a1d6fa8..37c4c9d0b 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -70,7 +70,7 @@ "column.blocks": "Imiḍanen yettusḥebsen", "column.bookmarks": "Ticraḍ", "column.community": "Tasuddemt tadigant", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Inig deg imaɣnuten", "column.domain_blocks": "Taɣulin yeffren", "column.favourites": "Ismenyifen", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Adigan kan", "community.column_settings.media_only": "Allal n teywalt kan", "community.column_settings.remote_only": "Anmeggag kan", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Issin ugar", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Ẓẓu addad-agi deg usmel-inek s wenγal n tangalt yellan sdaw-agi.", "embed.preview": "Akka ara d-iban:", "emoji_button.activity": "Aqeddic", + "emoji_button.clear": "Clear", "emoji_button.custom": "Udmawan", "emoji_button.flags": "Innayen", "emoji_button.food": "Tegwella & Tissit", @@ -166,7 +169,7 @@ "empty_column.blocks": "Ur tesḥebseḍ ula yiwen n umseqdac ar tura.", "empty_column.bookmarked_statuses": "Ulac tijewwaqin i terniḍ ɣer yismenyifen-ik ar tura. Ticki terniḍ yiwet, ad d-tettwasken da.", "empty_column.community": "Tasuddemt tazayezt tadigant n yisallen d tilemt. Aru ihi kra akken ad tt-teččareḍ!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Ulac kra n taɣult yettwaffren ar tura.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Ulac ula yiwet n tjewwaqt deg yismenyifen-ik ar tura. Ticki Tella-d yiwet, ad d-ban da.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "i beṭṭu tikelt-nniḍen", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Aglam", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "i kennu ɣer wadda n tebdart", "keyboard_shortcuts.enter": "i tildin n tsuffeɣt", "keyboard_shortcuts.favourite": "akken ad ternuḍ ɣer yismenyifen", @@ -264,6 +267,8 @@ "lightbox.expand": "Simeɣer tamnaḍt n uskan n tugna", "lightbox.next": "Γer zdat", "lightbox.previous": "Γer deffir", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Rnu ɣer tebdart", "lists.account.remove": "Kkes seg tebdart", "lists.delete": "Kkes tabdart", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Ticraḍ", "navigation_bar.community_timeline": "Tasuddemt tadigant", "navigation_bar.compose": "Aru tajewwiqt tamaynut", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Ẓer", "navigation_bar.domain_blocks": "Tiɣula yeffren", "navigation_bar.edit_profile": "Ẓreg amaɣnu", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index fd9074afd..659c45db4 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -70,7 +70,7 @@ "column.blocks": "Бұғатталғандар", "column.bookmarks": "Бетбелгілер", "column.community": "Жергілікті желі", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Профильдерді аралау", "column.domain_blocks": "Жасырылған домендер", "column.favourites": "Таңдаулылар", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Тек жергілікті", "community.column_settings.media_only": "Тек медиа", "community.column_settings.remote_only": "Тек сыртқы", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Көбірек білу", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Бұл пост іздеуде хэштегпен шықпайды, өйткені ол бәріне ашық емес. Тек ашық жазбаларды ғана хэштег арқылы іздеп табуға болады.", @@ -147,6 +149,7 @@ "embed.instructions": "Төмендегі кодты көшіріп алу арқылы жазбаны басқа сайттарға да орналастыра аласыз.", "embed.preview": "Былай көрінетін болады:", "emoji_button.activity": "Белсенділік", + "emoji_button.clear": "Clear", "emoji_button.custom": "Жеке", "emoji_button.flags": "Тулар", "emoji_button.food": "Тамақ", @@ -166,7 +169,7 @@ "empty_column.blocks": "Ешкімді бұғаттамағансыз.", "empty_column.bookmarked_statuses": "Ешқандай жазба Бетбелгілер тізіміне қосылмапты. Қосылғаннан кейін осында жинала бастайды.", "empty_column.community": "Жергілікті желі бос. Сіз бастап жазыңыз!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Бұғатталған домен жоқ.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Ешқандай жазба 'Таңдаулылар' тізіміне қосылмапты. Қосылғаннан кейін осында жинала бастайды.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "жазба бөлісу", "keyboard_shortcuts.column": "бағандардағы жазбаны оқу", "keyboard_shortcuts.compose": "пост жазу", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Сипаттама", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "тізімде төмен түсу", "keyboard_shortcuts.enter": "жазбаны ашу", "keyboard_shortcuts.favourite": "таңдаулыға қосу", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Келесі", "lightbox.previous": "Алдыңғы", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Тізімге қосу", "lists.account.remove": "Тізімнен шығару", "lists.delete": "Тізімді өшіру", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Бетбелгілер", "navigation_bar.community_timeline": "Жергілікті желі", "navigation_bar.compose": "Жаңа жазба бастау", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "шарлау", "navigation_bar.domain_blocks": "Жабық домендер", "navigation_bar.edit_profile": "Профиль түзету", diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json index 222a62164..af99045bb 100644 --- a/app/javascript/mastodon/locales/kn.json +++ b/app/javascript/mastodon/locales/kn.json @@ -70,7 +70,7 @@ "column.blocks": "Blocked users", "column.bookmarks": "Bookmarks", "column.community": "Local timeline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Favourites", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", + "emoji_button.clear": "Clear", "emoji_button.custom": "Custom", "emoji_button.flags": "Flags", "emoji_button.food": "Food & Drink", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no hidden domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 4af91f569..37b7eb672 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -16,11 +16,11 @@ "account.endorse": "프로필에 추천하기", "account.follow": "팔로우", "account.followers": "팔로워", - "account.followers.empty": "아직 아무도 이 유저를 팔로우하고 있지 않습니다.", + "account.followers.empty": "아직 아무도 이 사용자를 팔로우하고 있지 않습니다.", "account.followers_counter": "{counter} 팔로워", "account.following": "팔로잉", "account.following_counter": "{counter} 팔로잉", - "account.follows.empty": "이 유저는 아직 아무도 팔로우하고 있지 않습니다.", + "account.follows.empty": "이 사용자는 아직 아무도 팔로우하고 있지 않습니다.", "account.follows_you": "날 팔로우합니다", "account.hide_reblogs": "@{name}의 부스트를 숨기기", "account.joined": "{date}에 가입함", @@ -28,7 +28,7 @@ "account.locked_info": "이 계정의 프라이버시 설정은 잠금으로 설정되어 있습니다. 계정 소유자가 수동으로 팔로워를 승인합니다.", "account.media": "미디어", "account.mention": "@{name}에게 글쓰기", - "account.moved_to": "{name}는 계정을 이동했습니다:", + "account.moved_to": "{name} 님은 계정을 이동했습니다:", "account.mute": "@{name} 뮤트", "account.mute_notifications": "@{name}의 알림을 뮤트", "account.muted": "뮤트 됨", @@ -70,7 +70,7 @@ "column.blocks": "차단한 사용자", "column.bookmarks": "보관함", "column.community": "로컬 타임라인", - "column.conversations": "대화", + "column.direct": "다이렉트 메시지", "column.directory": "프로필 둘러보기", "column.domain_blocks": "차단한 도메인", "column.favourites": "좋아요", @@ -92,8 +92,10 @@ "community.column_settings.local_only": "로컬만", "community.column_settings.media_only": "미디어만", "community.column_settings.remote_only": "원격만", + "compose.language.change": "언어 변경", + "compose.language.search": "언어 검색...", "compose_form.direct_message_warning_learn_more": "더 알아보기", - "compose_form.encryption_warning": "마스토돈의 게시물들은 종단간 암호화가 되지 않습니아. 위험한 정보를 마스토돈을 통해 전달하지 마세요.", + "compose_form.encryption_warning": "마스토돈의 게시물들은 종단간 암호화가 되지 않습니다. 위험한 정보를 마스토돈을 통해 전달하지 마세요.", "compose_form.hashtag_warning": "이 게시물은 어떤 해시태그로도 검색 되지 않습니다. 전체공개로 게시 된 게시물만이 해시태그로 검색 될 수 있습니다.", "compose_form.lock_disclaimer": "이 계정은 {locked}로 설정 되어 있지 않습니다. 누구나 이 계정을 팔로우 할 수 있으며, 팔로워 공개의 포스팅을 볼 수 있습니다.", "compose_form.lock_disclaimer.lock": "비공개", @@ -147,6 +149,7 @@ "embed.instructions": "아래의 코드를 복사하여 대화를 원하는 곳으로 공유하세요.", "embed.preview": "다음과 같이 표시됩니다:", "emoji_button.activity": "활동", + "emoji_button.clear": "지우기", "emoji_button.custom": "커스텀", "emoji_button.flags": "깃발", "emoji_button.food": "음식과 마실것", @@ -166,7 +169,7 @@ "empty_column.blocks": "아직 아무도 차단하지 않았습니다.", "empty_column.bookmarked_statuses": "아직 보관한 게시물이 없습니다. 게시물을 보관하면 여기에 나타납니다.", "empty_column.community": "로컬 타임라인에 아무 것도 없습니다. 아무거나 적어 보세요!", - "empty_column.conversations": "멘션한 사람만 볼 수 있는 게시물을 보내거나 받은 경우에, 여기에 나타납니다.", + "empty_column.direct": "아직 다이렉트 메시지가 없습니다. 다이렉트 메시지를 보내거나 받은 경우, 여기에 표시 됩니다.", "empty_column.domain_blocks": "아직 차단한 도메인이 없습니다.", "empty_column.explore_statuses": "아직 유행하는 것이 없습니다. 나중에 다시 확인하세요!", "empty_column.favourited_statuses": "아직 마음에 들어한 게시물이 없습니다. 게시물을 좋아요 하면 여기에 나타납니다.", @@ -180,7 +183,7 @@ "empty_column.lists": "아직 리스트가 없습니다. 리스트를 만들면 여기에 나타납니다.", "empty_column.mutes": "아직 아무도 뮤트하지 않았습니다.", "empty_column.notifications": "아직 알림이 없습니다. 다른 사람들이 당신에게 반응했을 때, 여기에서 볼 수 있습니다.", - "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 서버의 유저를 팔로우 해서 채워보세요", + "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 서버의 사용자를 팔로우 해서 채워보세요", "error.unexpected_crash.explanation": "버그 혹은 브라우저 호환성 문제로 이 페이지를 올바르게 표시할 수 없습니다.", "error.unexpected_crash.explanation_addons": "이 페이지는 올바르게 보여질 수 없습니다. 브라우저 애드온이나 자동 번역 도구 등으로 인해 발생된 에러일 수 있습니다.", "error.unexpected_crash.next_steps": "페이지를 새로고침 해보세요. 그래도 해결되지 않는 경우, 다른 브라우저나 네이티브 앱으로도 마스토돈을 이용하실 수 있습니다.", @@ -226,12 +229,12 @@ "intervals.full.hours": "{number} 시간", "intervals.full.minutes": "{number} 분", "keyboard_shortcuts.back": "뒤로가기", - "keyboard_shortcuts.blocked": "차단한 유저 리스트 열기", + "keyboard_shortcuts.blocked": "차단된 사용자 목록 열기", "keyboard_shortcuts.boost": "게시물 부스트", "keyboard_shortcuts.column": "해당 컬럼에 포커스", "keyboard_shortcuts.compose": "작성창에 포커스", - "keyboard_shortcuts.conversations": "대화 컬럼 열기", "keyboard_shortcuts.description": "설명", + "keyboard_shortcuts.direct": "다이렉트 메시지 컬럼 열기", "keyboard_shortcuts.down": "리스트에서 아래로 이동", "keyboard_shortcuts.enter": "게시물 열기", "keyboard_shortcuts.favourite": "관심글 지정", @@ -243,7 +246,7 @@ "keyboard_shortcuts.legend": "이 개요 표시", "keyboard_shortcuts.local": "로컬 타임라인 열기", "keyboard_shortcuts.mention": "작성자에게 멘션", - "keyboard_shortcuts.muted": "뮤트 된 유저 리스트 열기", + "keyboard_shortcuts.muted": "뮤트된 사용자 목록 열기", "keyboard_shortcuts.my_profile": "내 프로필 열기", "keyboard_shortcuts.notifications": "알림 컬럼 열기", "keyboard_shortcuts.open_media": "미디어 열기", @@ -264,6 +267,8 @@ "lightbox.expand": "이미지 박스 확장", "lightbox.next": "다음", "lightbox.previous": "이전", + "limited_account_hint.action": "그래도 프로필 보기", + "limited_account_hint.title": "이 프로필은 서버 운영진에 의해 숨겨진 상태입니다.", "lists.account.add": "리스트에 추가", "lists.account.remove": "리스트에서 제거", "lists.delete": "리스트 삭제", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "보관함", "navigation_bar.community_timeline": "로컬 타임라인", "navigation_bar.compose": "새 게시물 작성", + "navigation_bar.direct": "다이렉트 메시지", "navigation_bar.discover": "발견하기", "navigation_bar.domain_blocks": "차단한 도메인", "navigation_bar.edit_profile": "프로필 편집", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "투표 삭제", "privacy.change": "게시물의 프라이버시 설정을 변경", "privacy.direct.long": "멘션한 사용자에게만 공개", - "privacy.direct.short": "내가 멘션한 사람만", + "privacy.direct.short": "멘션한 사람들만", "privacy.private.long": "팔로워에게만 공개", "privacy.private.short": "팔로워 전용", "privacy.public.long": "모두가 볼 수 있음", @@ -427,11 +433,11 @@ "report.unfollow_explanation": "당신을 이 계정을 팔로우 하고 있습니다. 홈 피드에서 게시물을 보지 않으려면, 팔로우를 해제하세요.", "search.placeholder": "검색", "search_popout.search_format": "고급 검색 방법", - "search_popout.tips.full_text": "단순한 텍스트 검색은 당신이 작성했거나, 관심글로 지정했거나, 부스트했거나, 멘션을 받은 게시글, 그리고 유저네임, 디스플레이네임, 해시태그를 반환합니다.", + "search_popout.tips.full_text": "단순한 텍스트 검색은 당신이 작성했거나, 관심글로 지정했거나, 부스트했거나, 멘션을 받은 게시글, 그리고 사용자명, 표시되는 이름, 해시태그를 반환합니다.", "search_popout.tips.hashtag": "해시태그", "search_popout.tips.status": "게시물", - "search_popout.tips.text": "단순한 텍스트 검색은 관계된 프로필 이름, 유저 이름 그리고 해시태그를 표시합니다", - "search_popout.tips.user": "유저", + "search_popout.tips.text": "단순한 텍스트 검색은 관계된 프로필 이름, 사용자명 그리고 해시태그를 표시합니다", + "search_popout.tips.user": "사용자", "search_results.accounts": "사람", "search_results.all": "전부", "search_results.hashtags": "해시태그", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index 02df9eff6..6470e50ca 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -70,7 +70,7 @@ "column.blocks": "Bikarhênerên astengkirî", "column.bookmarks": "Şûnpel", "column.community": "Demnameya herêmî", - "column.conversations": "Axaftin", + "column.direct": "Peyamên rasterast", "column.directory": "Li profîlan bigere", "column.domain_blocks": "Navperên astengkirî", "column.favourites": "Bijarte", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Tenê herêmî", "community.column_settings.media_only": "Tenê media", "community.column_settings.remote_only": "Tenê ji dûr ve", + "compose.language.change": "Ziman biguherîne", + "compose.language.search": "Li zimanan bigere...", "compose_form.direct_message_warning_learn_more": "Bêtir fêr bibe", "compose_form.encryption_warning": "Şandiyên li ser Mastodon dawî-bi-dawî ne şîfrekirî ne. Li ser Mastodon zanyariyên talûke parve neke.", "compose_form.hashtag_warning": "Ev şandî ji ber ku nehatiye tomarkirin dê di binê hashtagê de neyê tomar kirin. Tenê peyamên gelemperî dikarin bi hashtagê werin lêgerîn.", @@ -147,6 +149,7 @@ "embed.instructions": "Bi jêgirtina koda jêrîn vê şandiyê li ser malpera xwe bicîh bikin.", "embed.preview": "Wa ye wê wusa xuya bike:", "emoji_button.activity": "Çalakî", + "emoji_button.clear": "Pak bike", "emoji_button.custom": "Kesanekirî", "emoji_button.flags": "Nîşankirî", "emoji_button.food": "Xwarin û vexwarin", @@ -166,7 +169,7 @@ "empty_column.blocks": "Te tu bikarhêner asteng nekiriye.", "empty_column.bookmarked_statuses": "Hîn tu peyamên şûnpelkirî tuneye. Gava ku hûn yek şûnpel bikin, ew ê li vir xûya bike.", "empty_column.community": "Demnameya herêmî vala ye. Tiştek ji raya giştî re binivsînin da ku rûpel biherike!", - "empty_column.conversations": "Dema tu şandiyekê bişîninî an jî bistînî ku tenê ji kesên qalkirî re xuyabar in, ew ê li vir xuya bibe.", + "empty_column.direct": "Hêj peyameke te yê rasterast tuneye. Gava ku tu yekî bişeynî an jî bigirî, ew ê li vir xûya bike.", "empty_column.domain_blocks": "Hê jî navperên hatine asteng kirin tune ne.", "empty_column.explore_statuses": "Tiştek niha di rojevê de tune. Paşê vegere!", "empty_column.favourited_statuses": "Hîn tu peyamên te yên bijare tunene. Gava ku te yekî bijart, ew ê li vir xûya bike.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Şandiyê bilind bike", "keyboard_shortcuts.column": "Stûna balkişandinê", "keyboard_shortcuts.compose": "Bal bikşîne cîhê nivîsê/textarea", - "keyboard_shortcuts.conversations": "ji bo vekirina stûna axaftinan", "keyboard_shortcuts.description": "Danasîn", + "keyboard_shortcuts.direct": "ji bo vekirina stûnê peyamên rasterast", "keyboard_shortcuts.down": "Di rêzokê de dakêşe jêr", "keyboard_shortcuts.enter": "Şandiyê veke", "keyboard_shortcuts.favourite": "Şandiya bijarte", @@ -264,6 +267,8 @@ "lightbox.expand": "Qutîya wêneya nîşan dike fireh bike", "lightbox.next": "Pêş", "lightbox.previous": "Paş", + "limited_account_hint.action": "Bi heman awayî profîlê nîşan bide", + "limited_account_hint.title": "Ev profîl ji aliyê çavêriya li ser rajekarê te hatiye veşartin.", "lists.account.add": "Tevlî rêzokê bike", "lists.account.remove": "Ji rêzokê rake", "lists.delete": "Rêzokê jê bibe", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Şûnpel", "navigation_bar.community_timeline": "Demnameya herêmî", "navigation_bar.compose": "Şandiyeke nû binivsîne", + "navigation_bar.direct": "Peyamên rasterast", "navigation_bar.discover": "Vekolê", "navigation_bar.domain_blocks": "Navparên astengkirî", "navigation_bar.edit_profile": "Profîl serrast bike", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Rapirsî yê rake", "privacy.change": "Nepênîtiya şandiyan biguherîne", "privacy.direct.long": "Tenê ji bo bikarhênerên qalkirî tê dîtin", - "privacy.direct.short": "Tenê mirovên ku min qalkirî", + "privacy.direct.short": "Tenê kesên qalkirî", "privacy.private.long": "Tenê bo şopîneran xuyabar e", "privacy.private.short": "Tenê şopîneran", "privacy.public.long": "Ji bo hemûyan xuyabar e", diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json index 7aa686a7a..555b39da5 100644 --- a/app/javascript/mastodon/locales/kw.json +++ b/app/javascript/mastodon/locales/kw.json @@ -70,7 +70,7 @@ "column.blocks": "Devnydhyoryon lettys", "column.bookmarks": "Folennosow", "column.community": "Amserlin leel", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Peuri profilys", "column.domain_blocks": "Gorfarthow lettys", "column.favourites": "Re drudh", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Leel hepken", "community.column_settings.media_only": "Myski hepken", "community.column_settings.remote_only": "A-bell hepken", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Dyski moy", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Ny vydh an post ma diskwedhys yn-dann vòlnos vyth awos y vos mes a rol. Ny yllir hwilas saw poblow postek dre vòlnos.", @@ -147,6 +149,7 @@ "embed.instructions": "Stagewgh an post ma a-berth yn agas gwiasva ow tasskrifa'n kod a-wòles.", "embed.preview": "Ottomma fatel hevel:", "emoji_button.activity": "Gwrians", + "emoji_button.clear": "Clear", "emoji_button.custom": "A-vusur", "emoji_button.flags": "Baneryow", "emoji_button.food": "Bòs & Diwes", @@ -166,7 +169,7 @@ "empty_column.blocks": "Ny wrussowgh lettya devnydhyoryon vyth hwath.", "empty_column.bookmarked_statuses": "Nyns eus dhywgh postow gans folennos hwath. Pan wrewgh gorra onan, ev a wra omdhiskwedhes omma.", "empty_column.community": "An amserlin leel yw gwag. Skrifewgh neppytn yn poblek dh'y lonchya!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Nyns eus gorfarthow lettys hwath.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Nyns eus dhywgh postow drudh hwath. Pan wrewgh merkya onan vel drudh, ev a wra omdhiskwedhes omma.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Kenertha post", "keyboard_shortcuts.column": "Fogella koloven", "keyboard_shortcuts.compose": "Fogella tekstva gomposya", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Deskrifans", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "Movya war-nans y'n rol", "keyboard_shortcuts.enter": "Ygeri post", "keyboard_shortcuts.favourite": "Merkya post vel drudh", @@ -264,6 +267,8 @@ "lightbox.expand": "Efani kist a weles aven", "lightbox.next": "Nessa", "lightbox.previous": "Kynsa", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Keworra dhe rol", "lists.account.remove": "Removya a rol", "lists.delete": "Dilea rol", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Folennosow", "navigation_bar.community_timeline": "Amserlin leel", "navigation_bar.compose": "Komposya post nowydh", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Diskudha", "navigation_bar.domain_blocks": "Gorfarthow lettys", "navigation_bar.edit_profile": "Golegi profil", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index ade4933f9..a37b946b4 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -70,7 +70,7 @@ "column.blocks": "Blocked users", "column.bookmarks": "Bookmarks", "column.community": "Local timeline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Mėgstamiausi", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", + "emoji_button.clear": "Clear", "emoji_button.custom": "Custom", "emoji_button.flags": "Flags", "emoji_button.food": "Food & Drink", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no hidden domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 3bfb7532a..7ef2c2c6f 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -70,7 +70,7 @@ "column.blocks": "Bloķētie lietotāji", "column.bookmarks": "Grāmatzīmes", "column.community": "Vietējā ziņu līnija", - "column.conversations": "Sarunas", + "column.direct": "Privātie ziņojumi", "column.directory": "Pārlūkot profilus", "column.domain_blocks": "Bloķētie domēni", "column.favourites": "Izlase", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Tikai vietējie", "community.column_settings.media_only": "Tikai mediji", "community.column_settings.remote_only": "Tikai attālinātie", + "compose.language.change": "Mainīt valodu", + "compose.language.search": "Meklēt valodas...", "compose_form.direct_message_warning_learn_more": "Uzzināt vairāk", "compose_form.encryption_warning": "Ziņas vietnē Mastodon nav pilnībā šifrētas. Nedalies ar bīstamu informāciju caur Mastodon.", "compose_form.hashtag_warning": "Ziņojumu nebūs iespējams atrast zem haštagiem jo tas nav publisks. Tikai publiskos ziņojumus ir iespējams meklēt pēc tiem.", @@ -147,6 +149,7 @@ "embed.instructions": "Iestrādā šo ziņu savā mājaslapā, kopējot zemāk redzmo kodu.", "embed.preview": "Tas izskatīsies šādi:", "emoji_button.activity": "Aktivitāte", + "emoji_button.clear": "Notīrīt", "emoji_button.custom": "Pielāgots", "emoji_button.flags": "Karogi", "emoji_button.food": "Ēdieni un dzērieni", @@ -166,7 +169,7 @@ "empty_column.blocks": "Patreiz tu neesi nevienu bloķējis.", "empty_column.bookmarked_statuses": "Patreiz tev nav neviena grāmatzīmēm pievienota ieraksta. Kad tādu pievienosi, tas parādīsies šeit.", "empty_column.community": "Vietējā ziņu lenta ir tukša. Uzraksti kaut ko publiski, lai viss notiktu!", - "empty_column.conversations": "Kad nosūtīsi vai saņemsi ziņu, kas ir redzama tikai tajā minētajām personām, tā tiks parādīta šeit.", + "empty_column.direct": "Patrez tev nav privātu ziņu. Tiklīdz tādu nosūtīsi vai saņemsi, tās parādīsies šeit.", "empty_column.domain_blocks": "Vēl nav neviena bloķēta domēna.", "empty_column.explore_statuses": "Pašlaik nekas nav tendēts. Pārbaudiet vēlāk!", "empty_column.favourited_statuses": "Patreiz tev nav neviena izceltā ieraksta. Kad kādu izcelsi, tas parādīsies šeit.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Palielināt ziņu", "keyboard_shortcuts.column": "Fokusēt kolonnu", "keyboard_shortcuts.compose": "Fokusēt veidojamā teksta lauku", - "keyboard_shortcuts.conversations": "lai atvērtu sarunu kolonnu", "keyboard_shortcuts.description": "Apraksts", + "keyboard_shortcuts.direct": "lai atvērtu privāto ziņojumu kolonnu", "keyboard_shortcuts.down": "Pārvietot sarakstā uz leju", "keyboard_shortcuts.enter": "Atvērt ziņu", "keyboard_shortcuts.favourite": "Pievienot izlasei", @@ -264,6 +267,8 @@ "lightbox.expand": "Paplašināt attēla ietvaru", "lightbox.next": "Tālāk", "lightbox.previous": "Iepriekš", + "limited_account_hint.action": "Tik un tā rādīt profilu", + "limited_account_hint.title": "Tava servera moderatori ir paslēpuši šo profilu.", "lists.account.add": "Pievienot sarakstam", "lists.account.remove": "Noņemt no saraksta", "lists.delete": "Dzēst sarakstu", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Grāmatzīmes", "navigation_bar.community_timeline": "Vietējā ziņu lenta", "navigation_bar.compose": "Veidot jaunu ziņu", + "navigation_bar.direct": "Privātie ziņojumi", "navigation_bar.discover": "Atklāt", "navigation_bar.domain_blocks": "Bloķētie domēni", "navigation_bar.edit_profile": "Rediģēt profilu", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Noņemt aptauju", "privacy.change": "Mainīt ziņas privātumu", "privacy.direct.long": "Redzams tikai pieminētajiem lietotājiem", - "privacy.direct.short": "Tikai cilvēki, kurus es pieminu", + "privacy.direct.short": "Tikai minētie cilvēki", "privacy.private.long": "Redzams tikai sekotājiem", "privacy.private.short": "Tikai sekotājiem", "privacy.public.long": "Redzama visiem", diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json index 72bb52adf..df7d84d4b 100644 --- a/app/javascript/mastodon/locales/mk.json +++ b/app/javascript/mastodon/locales/mk.json @@ -70,7 +70,7 @@ "column.blocks": "Блокирани корисници", "column.bookmarks": "Bookmarks", "column.community": "Локална временска зона", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Види профили", "column.domain_blocks": "Скриени домеини", "column.favourites": "Омилени", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Само медиа", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Научи повеќе", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Активност", + "emoji_button.clear": "Clear", "emoji_button.custom": "Custom", "emoji_button.flags": "Flags", "emoji_button.food": "Храна & Пијалаци", @@ -166,7 +169,7 @@ "empty_column.blocks": "Немате сеуште блокирано корисници.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "Локалниот времеплов е празен. Објавете нешто јавно за да може да почне шоуто!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Немате сокриени домеини уште.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Уреди профил", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index a1db3f5a5..69267f652 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -70,7 +70,7 @@ "column.blocks": "തടയപ്പെട്ട ഉപയോക്താക്കൾ", "column.bookmarks": "ബുക്ക്മാർക്കുകൾ", "column.community": "പ്രാദേശികമായ സമയരേഖ", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "പ്രൊഫൈലുകൾ മറിച്ചുനോക്കുക", "column.domain_blocks": "മറയ്ക്കപ്പെട്ട മേഖലകൾ", "column.favourites": "പ്രിയപ്പെട്ടവ", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "പ്രാദേശികം മാത്രം", "community.column_settings.media_only": "മാധ്യമങ്ങൾ മാത്രം", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "കൂടുതൽ പഠിക്കുക", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "ഈ ടൂട്ട് പട്ടികയിൽ ഇല്ലാത്തതിനാൽ ഒരു ചർച്ചാവിഷയത്തിന്റെ പട്ടികയിലും പെടുകയില്ല. പരസ്യമായ ടൂട്ടുകൾ മാത്രമേ ചർച്ചാവിഷയം അടിസ്ഥാനമാക്കി തിരയുവാൻ സാധിക്കുകയുള്ളു.", @@ -147,6 +149,7 @@ "embed.instructions": "ചുവടെയുള്ള കോഡ് പകർത്തിക്കൊണ്ട് നിങ്ങളുടെ വെബ്സൈറ്റിൽ ഈ ടൂട്ട് ഉൾച്ചേർക്കുക.", "embed.preview": "ഇത് ഇങ്ങനെ കാണപ്പെടും:", "emoji_button.activity": "പ്രവര്ത്തനം", + "emoji_button.clear": "Clear", "emoji_button.custom": "സ്വന്തമായ ഭേദഗതി", "emoji_button.flags": "കൊടികൾ", "emoji_button.food": "ഭക്ഷണവും പാനീയവും", @@ -166,7 +169,7 @@ "empty_column.blocks": "നിങ്ങൾ ഇതുവരെ ഒരു ഉപയോക്താക്കളെയും തടഞ്ഞിട്ടില്ല.", "empty_column.bookmarked_statuses": "നിങ്ങൾക് ഇതുവരെ അടയാളപ്പെടുത്തിയ ടൂട്ടുകൾ ഇല്ല. അടയാളപ്പെടുത്തിയാൽ അത് ഇവിടെ വരും.", "empty_column.community": "പ്രാദേശികമായ സമയരേഖ ശൂന്യമാണ്. എന്തെങ്കിലും പരസ്യമായി എഴുതി തുടക്കം കുറിക്കു!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "മറയ്ക്കപ്പെട്ടിരിക്കുന്ന മേഖലകൾ ഇതുവരെ ഇല്ല.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "നിങ്ങൾക്ക് ഇത് വരെ ഒരു പ്രിയപ്പെട്ട ടൂട്ടും ഇല്ല. നിങ്ങൾ അങ്ങനെ ഒന്ന് പ്രിയപ്പെടുന്ന പക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "ബൂസ്റ്റ് ചെയ്യുക", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "വിവരണം", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "ടൂട്ട് എടുക്കാൻ", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "അടുത്തത്", "lightbox.previous": "പുറകോട്ട്", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "പട്ടികയിലേക്ക് ചേർക്കുക", "lists.account.remove": "പട്ടികയിൽ നിന്ന് ഒഴിവാക്കുക", "lists.delete": "പട്ടിക ഒഴിവാക്കുക", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "ബുക്ക്മാർക്കുകൾ", "navigation_bar.community_timeline": "പ്രാദേശിക സമയരേഖ", "navigation_bar.compose": "പുതിയ ടൂട്ട് എഴുതുക", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "കണ്ടെത്തുക", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index 9c3500443..6728c0999 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -70,7 +70,7 @@ "column.blocks": "ब्लॉक केलेले खातेधारक", "column.bookmarks": "Bookmarks", "column.community": "Local timeline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "गुप्त डोमेन्स", "column.favourites": "आवडते", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "केवळ मीडिया", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "अधिक जाणून घ्या", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", + "emoji_button.clear": "Clear", "emoji_button.custom": "Custom", "emoji_button.flags": "Flags", "emoji_button.food": "Food & Drink", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no hidden domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 0c6996463..4cb6437f4 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -70,7 +70,7 @@ "column.blocks": "Pengguna yang disekat", "column.bookmarks": "Tanda buku", "column.community": "Garis masa tempatan", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Layari profil", "column.domain_blocks": "Domain disekat", "column.favourites": "Kegemaran", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Tempatan sahaja", "community.column_settings.media_only": "Media sahaja", "community.column_settings.remote_only": "Jauh sahaja", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Ketahui lebih lanjut", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Hantaran ini tidak akan disenaraikan di bawah mana-mana tanda pagar kerana ia tidak tersenarai. Hanya hantaran awam sahaja boleh dicari menggunakan tanda pagar.", @@ -147,6 +149,7 @@ "embed.instructions": "Benam hantaran ini di laman sesawang anda dengan menyalin kod berikut.", "embed.preview": "Begini rupanya nanti:", "emoji_button.activity": "Aktiviti", + "emoji_button.clear": "Clear", "emoji_button.custom": "Tersuai", "emoji_button.flags": "Bendera", "emoji_button.food": "Makanan & Minuman", @@ -166,7 +169,7 @@ "empty_column.blocks": "Anda belum menyekat sesiapa.", "empty_column.bookmarked_statuses": "Anda belum ada hantaran yang ditanda buku. Apabila anda menanda buku sesuatu, ia akan muncul di sini.", "empty_column.community": "Garis masa tempatan kosong. Tulislah secara awam untuk memulakan sesuatu!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Belum ada domain yang disekat.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Anda belum ada hantaran yang digemari. Apabila anda menggemari sesuatu, ia akan muncul di sini.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "Tumpu pada lajur", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Keterangan", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "Buka hantaran", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Besarkan kotak paparan imej", "lightbox.next": "Seterusnya", "lightbox.previous": "Sebelumnya", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Tambah ke senarai", "lists.account.remove": "Buang daripada senarai", "lists.delete": "Padam senarai", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Tanda buku", "navigation_bar.community_timeline": "Garis masa tempatan", "navigation_bar.compose": "Karang hantaran baharu", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Teroka", "navigation_bar.domain_blocks": "Domain disekat", "navigation_bar.edit_profile": "Sunting profil", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index ef09ca5e6..c2b611904 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -70,7 +70,7 @@ "column.blocks": "Geblokkeerde gebruikers", "column.bookmarks": "Bladwijzers", "column.community": "Lokale tijdlijn", - "column.conversations": "Gesprekken", + "column.direct": "Direct messages", "column.directory": "Gebruikersgids", "column.domain_blocks": "Geblokkeerde domeinen", "column.favourites": "Favorieten", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Alleen lokaal", "community.column_settings.media_only": "Alleen media", "community.column_settings.remote_only": "Alleen andere servers", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Meer leren", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Dit bericht valt niet onder een hashtag te bekijken, omdat deze niet op openbare tijdlijnen wordt getoond. Alleen openbare berichten kunnen via hashtags gevonden worden.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed dit bericht op jouw website door de onderstaande code te kopiëren.", "embed.preview": "Zo komt het eruit te zien:", "emoji_button.activity": "Activiteiten", + "emoji_button.clear": "Clear", "emoji_button.custom": "Lokale emoji’s", "emoji_button.flags": "Vlaggen", "emoji_button.food": "Eten en drinken", @@ -166,7 +169,7 @@ "empty_column.blocks": "Jij hebt nog geen enkele gebruiker geblokkeerd.", "empty_column.bookmarked_statuses": "Jij hebt nog geen berichten aan je bladwijzers toegevoegd. Wanneer je er een aan jouw bladwijzers toevoegt, valt deze hier te zien.", "empty_column.community": "De lokale tijdlijn is nog leeg. Plaats een openbaar bericht om de spits af te bijten!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Er zijn nog geen geblokkeerde domeinen.", "empty_column.explore_statuses": "Momenteel zijn er geen trends. Kom later terug!", "empty_column.favourited_statuses": "Jij hebt nog geen favoriete berichten. Wanneer je er een aan jouw favorieten toevoegt, valt deze hier te zien.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Bericht boosten", "keyboard_shortcuts.column": "Op één van de kolommen focussen", "keyboard_shortcuts.compose": "Tekstveld om een bericht te schrijven focussen", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Omschrijving", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "Naar beneden in de lijst bewegen", "keyboard_shortcuts.enter": "Volledig bericht tonen", "keyboard_shortcuts.favourite": "Aan jouw favorieten toevoegen", @@ -264,6 +267,8 @@ "lightbox.expand": "Afbeelding groot weergeven", "lightbox.next": "Volgende", "lightbox.previous": "Vorige", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Aan lijst toevoegen", "lists.account.remove": "Uit lijst verwijderen", "lists.delete": "Lijst verwijderen", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bladwijzers", "navigation_bar.community_timeline": "Lokale tijdlijn", "navigation_bar.compose": "Nieuw bericht schrijven", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Ontdekken", "navigation_bar.domain_blocks": "Geblokkeerde domeinen", "navigation_bar.edit_profile": "Profiel bewerken", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Poll verwijderen", "privacy.change": "Zichtbaarheid van bericht aanpassen", "privacy.direct.long": "Alleen aan vermelde gebruikers tonen", - "privacy.direct.short": "Alleen gebruikers die ik noem", + "privacy.direct.short": "Direct", "privacy.private.long": "Alleen aan volgers tonen", "privacy.private.short": "Alleen volgers", "privacy.public.long": "Voor iedereen zichtbaar", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 521403c51..24a4e98b7 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -70,7 +70,7 @@ "column.blocks": "Blokkerte brukarar", "column.bookmarks": "Bokmerke", "column.community": "Lokal tidsline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Sjå gjennom profilar", "column.domain_blocks": "Gøymde domene", "column.favourites": "Favorittar", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Berre lokalt", "community.column_settings.media_only": "Berre media", "community.column_settings.remote_only": "Berre eksternt", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Lær meir", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Dette tutet vert ikkje oppført under nokon emneknagg sidan det ikkje er oppført. Berre offentlege tut kan verta søkt etter med emneknagg.", @@ -147,6 +149,7 @@ "embed.instructions": "Bygg inn denne statusen på nettsida di ved å kopiera koden under.", "embed.preview": "Slik bid det å sjå ut:", "emoji_button.activity": "Aktivitet", + "emoji_button.clear": "Clear", "emoji_button.custom": "Eige", "emoji_button.flags": "Flagg", "emoji_button.food": "Mat & drikke", @@ -166,7 +169,7 @@ "empty_column.blocks": "Du har ikkje blokkert nokon brukarar enno.", "empty_column.bookmarked_statuses": "Du har ikkje nokon bokmerkte tut enno. Når du bokmerkjer eit, dukkar det opp her.", "empty_column.community": "Den lokale samtiden er tom. Skriv noko offentleg å få ballen til å rulle!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Det er ingen gøymde domene ennå.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Du har ingen favoritt-tut ennå. Når du merkjer ein som favoritt, så dukkar det opp her.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "for å framheva", "keyboard_shortcuts.column": "for å fokusera på ein status i ei av kolonnane", "keyboard_shortcuts.compose": "for å fokusera tekstfeltet for skriving", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Skildring", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "for å flytta seg opp og ned i lista", "keyboard_shortcuts.enter": "for å opna status", "keyboard_shortcuts.favourite": "for å merkja som favoritt", @@ -264,6 +267,8 @@ "lightbox.expand": "Ekspander bildevisning boks", "lightbox.next": "Neste", "lightbox.previous": "Førre", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Legg til i liste", "lists.account.remove": "Fjern frå liste", "lists.delete": "Slett liste", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bokmerke", "navigation_bar.community_timeline": "Lokal tidsline", "navigation_bar.compose": "Lag eit nytt tut", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Oppdag", "navigation_bar.domain_blocks": "Skjulte domene", "navigation_bar.edit_profile": "Rediger profil", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 707564404..78d145f55 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -70,7 +70,7 @@ "column.blocks": "Blokkerte brukere", "column.bookmarks": "Bokmerker", "column.community": "Lokal tidslinje", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Bla gjennom profiler", "column.domain_blocks": "Skjulte domener", "column.favourites": "Likt", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Kun lokalt", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Kun eksternt", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Lær mer", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Denne tuten blir ikke listet under noen emneknagger da den er ulistet. Kun offentlige tuter kan søktes etter med emneknagg.", @@ -147,6 +149,7 @@ "embed.instructions": "Kopier koden under for å bygge inn denne statusen på hjemmesiden din.", "embed.preview": "Slik kommer det til å se ut:", "emoji_button.activity": "Aktivitet", + "emoji_button.clear": "Clear", "emoji_button.custom": "Tilpasset", "emoji_button.flags": "Flagg", "emoji_button.food": "Mat og drikke", @@ -166,7 +169,7 @@ "empty_column.blocks": "Du har ikke blokkert noen brukere enda.", "empty_column.bookmarked_statuses": "Du har ikke bokmerket noen tuter enda. Når du bokmerker en, vil den dukke opp her.", "empty_column.community": "Den lokale tidslinjen er tom. Skriv noe offentlig for å få snøballen til å rulle!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Det er ingen skjulte domener enda.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Du har ikke likt noen tuter enda. Når du liker en, vil den dukke opp her.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "å fremheve", "keyboard_shortcuts.column": "å fokusere en status i en av kolonnene", "keyboard_shortcuts.compose": "å fokusere komponeringsfeltet", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Beskrivelse", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "for å flytte ned i listen", "keyboard_shortcuts.enter": "å åpne status", "keyboard_shortcuts.favourite": "for å favorittmarkere", @@ -264,6 +267,8 @@ "lightbox.expand": "Ekspander bildevisning boks", "lightbox.next": "Neste", "lightbox.previous": "Forrige", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Legg til i listen", "lists.account.remove": "Fjern fra listen", "lists.delete": "Slett listen", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bokmerker", "navigation_bar.community_timeline": "Lokal tidslinje", "navigation_bar.compose": "Skriv en ny tut", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Oppdag", "navigation_bar.domain_blocks": "Skjulte domener", "navigation_bar.edit_profile": "Rediger profil", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index e13c68c3f..c2041d10d 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -70,7 +70,7 @@ "column.blocks": "Personas blocadas", "column.bookmarks": "Marcadors", "column.community": "Flux public local", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Percórrer los perfils", "column.domain_blocks": "Domenis resconduts", "column.favourites": "Favorits", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Sonque local", "community.column_settings.media_only": "Solament los mèdias", "community.column_settings.remote_only": "Sonque alonhat", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Ne saber mai", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Aqueste tut serà pas ligat a cap d’etiqueta estant qu’es pas listat. Òm pòt pas cercar que los tuts publics per etiqueta.", @@ -147,6 +149,7 @@ "embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.", "embed.preview": "Semblarà aquò :", "emoji_button.activity": "Activitats", + "emoji_button.clear": "Clear", "emoji_button.custom": "Personalizats", "emoji_button.flags": "Drapèus", "emoji_button.food": "Beure e manjar", @@ -166,7 +169,7 @@ "empty_column.blocks": "Avètz pas blocat degun pel moment.", "empty_column.bookmarked_statuses": "Avètz pas cap de tuts marcats pel moment. Quand ne marquetz un, serà mostrat aquí.", "empty_column.community": "Lo flux public local es void. Escrivètz quicòm per lo garnir !", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "I a pas encara cap de domeni amagat.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Avètz pas encara cap de tut favorit. Quand n’auretz un, apareisserà aquí.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "partejar", "keyboard_shortcuts.column": "centrar un estatut a una colomna", "keyboard_shortcuts.compose": "anar al camp tèxte", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "descripcion", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "far davalar dins la lista", "keyboard_shortcuts.enter": "dobrir los estatuts", "keyboard_shortcuts.favourite": "apondre als favorits", @@ -264,6 +267,8 @@ "lightbox.expand": "Espandir la fenèstra de visualizacion d’imatge", "lightbox.next": "Seguent", "lightbox.previous": "Precedent", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Ajustar a la lista", "lists.account.remove": "Levar de la lista", "lists.delete": "Suprimir la lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Marcadors", "navigation_bar.community_timeline": "Flux public local", "navigation_bar.compose": "Escriure un nòu tut", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Trobar", "navigation_bar.domain_blocks": "Domenis resconduts", "navigation_bar.edit_profile": "Modificar lo perfil", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index 09d473ef4..7b041a208 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -70,7 +70,7 @@ "column.blocks": "Blocked users", "column.bookmarks": "Bookmarks", "column.community": "Local timeline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Blocked domains", "column.favourites": "Favourites", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", + "emoji_button.clear": "Clear", "emoji_button.custom": "Custom", "emoji_button.flags": "Flags", "emoji_button.food": "Food & Drink", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no blocked domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 978c3b840..5f410bbf5 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -70,7 +70,7 @@ "column.blocks": "Zablokowani użytkownicy", "column.bookmarks": "Zakładki", "column.community": "Lokalna oś czasu", - "column.conversations": "Konwersacje", + "column.direct": "Wiadomości bezpośrednie", "column.directory": "Przeglądaj profile", "column.domain_blocks": "Ukryte domeny", "column.favourites": "Ulubione", @@ -96,6 +96,8 @@ "community.column_settings.local_only": "Tylko Lokalne", "community.column_settings.media_only": "Tylko zawartość multimedialna", "community.column_settings.remote_only": "Tylko Zdalne", + "compose.language.change": "Zmień język", + "compose.language.search": "Szukaj języków...", "compose_form.direct_message_warning_learn_more": "Dowiedz się więcej", "compose_form.encryption_warning": "Posty na Mastodon nie są szyfrowane end-to-end. Nie udostępniaj żadnych wrażliwych informacji przez Mastodon.", "compose_form.hashtag_warning": "Ten wpis nie będzie widoczny pod podanymi hasztagami, ponieważ jest oznaczony jako niewidoczny. Tylko publiczne wpisy mogą zostać znalezione z użyciem hasztagów.", @@ -151,6 +153,7 @@ "embed.instructions": "Osadź ten wpis na swojej stronie wklejając poniższy kod.", "embed.preview": "Tak będzie to wyglądać:", "emoji_button.activity": "Aktywność", + "emoji_button.clear": "Wyczyść", "emoji_button.custom": "Niestandardowe", "emoji_button.flags": "Flagi", "emoji_button.food": "Żywność i napoje", @@ -170,7 +173,7 @@ "empty_column.blocks": "Nie zablokowałeś(-aś) jeszcze żadnego użytkownika.", "empty_column.bookmarked_statuses": "Nie dodałeś(-aś) żadnego wpisu do zakładek. Kiedy to zrobisz, pojawi się on tutaj.", "empty_column.community": "Lokalna oś czasu jest pusta. Napisz coś publicznie, aby zagaić!", - "empty_column.conversations": "Gdy wyślesz lub otrzymasz wpis, który jest widoczny tylko dla osób w nim wymienionych, pojawi się on tutaj.", + "empty_column.direct": "Nie masz żadnych wiadomości bezpośrednich. Kiedy dostaniesz lub wyślesz jakąś, pojawi się ona tutaj.", "empty_column.domain_blocks": "Brak ukrytych domen.", "empty_column.explore_statuses": "Nic nie jest w tej chwili popularne. Sprawdź później!", "empty_column.favourited_statuses": "Nie dodałeś(-aś) żadnego wpisu do ulubionych. Kiedy to zrobisz, pojawi się on tutaj.", @@ -234,8 +237,8 @@ "keyboard_shortcuts.boost": "aby podbić wpis", "keyboard_shortcuts.column": "aby przejść do wpisu z jednej z kolumn", "keyboard_shortcuts.compose": "aby przejść do pola tworzenia wpisu", - "keyboard_shortcuts.conversations": "aby otworzyć kolumnę konwersacji", "keyboard_shortcuts.description": "Opis", + "keyboard_shortcuts.direct": "aby otworzyć kolumnę wiadomości bezpośrednich", "keyboard_shortcuts.down": "aby przejść na dół listy", "keyboard_shortcuts.enter": "aby otworzyć wpis", "keyboard_shortcuts.favourite": "aby dodać do ulubionych", @@ -268,6 +271,8 @@ "lightbox.expand": "Rozwiń pole widoku obrazu", "lightbox.next": "Następne", "lightbox.previous": "Poprzednie", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Dodaj do listy", "lists.account.remove": "Usunąć z listy", "lists.delete": "Usuń listę", @@ -294,6 +299,7 @@ "navigation_bar.bookmarks": "Zakładki", "navigation_bar.community_timeline": "Lokalna oś czasu", "navigation_bar.compose": "Utwórz nowy wpis", + "navigation_bar.direct": "Wiadomości bezpośrednie", "navigation_bar.discover": "Odkrywaj", "navigation_bar.domain_blocks": "Ukryte domeny", "navigation_bar.edit_profile": "Edytuj profil", @@ -371,7 +377,7 @@ "poll_button.remove_poll": "Usuń głosowanie", "privacy.change": "Dostosuj widoczność wpisów", "privacy.direct.long": "Widoczny tylko dla wspomnianych", - "privacy.direct.short": "Tylko wspominane osoby", + "privacy.direct.short": "Tylko wspomniane osoby", "privacy.private.long": "Widoczny tylko dla osób, które Cię śledzą", "privacy.private.short": "Tylko śledzący", "privacy.public.long": "Widoczne dla każdego", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index c7f6238d0..be00f883c 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -70,7 +70,7 @@ "column.blocks": "Usuários bloqueados", "column.bookmarks": "Salvos", "column.community": "Linha local", - "column.conversations": "Conversations", + "column.direct": "Mensagens diretas", "column.directory": "Explorar perfis", "column.domain_blocks": "Domínios bloqueados", "column.favourites": "Favoritos", @@ -92,8 +92,10 @@ "community.column_settings.local_only": "Somente local", "community.column_settings.media_only": "Somente mídia", "community.column_settings.remote_only": "Somente global", + "compose.language.change": "Alterar idioma", + "compose.language.search": "Pesquisar idiomas...", "compose_form.direct_message_warning_learn_more": "Saiba mais", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.encryption_warning": "Postagens no Mastodon não são criptografados de ponta a ponta. Não compartilhe nenhuma informação perigosa sobre o Mastodon.", "compose_form.hashtag_warning": "Este toot não aparecerá em nenhuma hashtag porque está como não-listado. Somente toots públicos podem ser pesquisados por hashtag.", "compose_form.lock_disclaimer": "Seu perfil não está {locked}. Qualquer um pode te seguir e ver os toots privados.", "compose_form.lock_disclaimer.lock": "trancado", @@ -147,6 +149,7 @@ "embed.instructions": "Incorpore este toot no seu site ao copiar o código abaixo.", "embed.preview": "Aqui está como vai ficar:", "emoji_button.activity": "Atividade", + "emoji_button.clear": "Limpar", "emoji_button.custom": "Personalizados", "emoji_button.flags": "Bandeiras", "emoji_button.food": "Comida e Bebida", @@ -166,7 +169,7 @@ "empty_column.blocks": "Nada aqui.", "empty_column.bookmarked_statuses": "Nada aqui. Quando você salvar um toot, ele aparecerá aqui.", "empty_column.community": "A linha local está vazia. Publique algo para começar!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "Você ainda não tem mensagens diretas. Quando você enviar ou receber uma, será exibida aqui.", "empty_column.domain_blocks": "Nada aqui.", "empty_column.explore_statuses": "Nada está em alta no momento. Volte mais tarde!", "empty_column.favourited_statuses": "Nada aqui. Quando você favoritar um toot, ele aparecerá aqui.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "dar boost", "keyboard_shortcuts.column": "focar na coluna", "keyboard_shortcuts.compose": "focar no compositor", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Descrição", + "keyboard_shortcuts.direct": "para abrir a coluna de mensagens diretas", "keyboard_shortcuts.down": "mover para baixo", "keyboard_shortcuts.enter": "abrir toot", "keyboard_shortcuts.favourite": "favoritar toot", @@ -264,6 +267,8 @@ "lightbox.expand": "Abrir imagem", "lightbox.next": "Próximo", "lightbox.previous": "Anterior", + "limited_account_hint.action": "Exibir perfil mesmo assim", + "limited_account_hint.title": "Este perfil foi ocultado pelos moderadores do seu servidor.", "lists.account.add": "Adicionar à lista", "lists.account.remove": "Remover da lista", "lists.delete": "Excluir lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Salvos", "navigation_bar.community_timeline": "Linha do tempo local", "navigation_bar.compose": "Compor novo toot", + "navigation_bar.direct": "Mensagens diretas", "navigation_bar.discover": "Descobrir", "navigation_bar.domain_blocks": "Domínios bloqueados", "navigation_bar.edit_profile": "Editar perfil", @@ -337,7 +343,7 @@ "notifications.column_settings.status": "Novos toots:", "notifications.column_settings.unread_notifications.category": "Notificações não lidas", "notifications.column_settings.unread_notifications.highlight": "Destacar notificações não lidas", - "notifications.column_settings.update": "Edits:", + "notifications.column_settings.update": "Editar:", "notifications.filter.all": "Tudo", "notifications.filter.boosts": "Boosts", "notifications.filter.favourites": "Favoritos", @@ -366,22 +372,22 @@ "poll_button.remove_poll": "Remover enquete", "privacy.change": "Alterar privacidade do toot", "privacy.direct.long": "Postar só para usuários mencionados", - "privacy.direct.short": "Direct", + "privacy.direct.short": "Apenas pessoas mencionadas", "privacy.private.long": "Postar só para seguidores", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Visible for all", + "privacy.private.short": "Apenas seguidores", + "privacy.public.long": "Visível para todos", "privacy.public.short": "Público", - "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", + "privacy.unlisted.long": "Visível para todos, mas desativou os recursos de descoberta", "privacy.unlisted.short": "Não-listado", "refresh": "Atualizar", "regeneration_indicator.label": "Carregando…", "regeneration_indicator.sublabel": "Sua página inicial está sendo preparada!", "relative_time.days": "{number}d", - "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago", - "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago", + "relative_time.full.days": "{number, plural, one {# dia} other {# dias}} atrás", + "relative_time.full.hours": "{number, plural, one {# hora} other {# horas}} atrás", "relative_time.full.just_now": "agora mesmo", - "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago", - "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago", + "relative_time.full.minutes": "{number, plural, one {# minuto} other {# minutos}} atrás", + "relative_time.full.seconds": "{number, plural, one {# segundo} other {# segundos}} atrás", "relative_time.hours": "{number}h", "relative_time.just_now": "agora", "relative_time.minutes": "{number}m", @@ -451,7 +457,7 @@ "status.direct": "Enviar toot direto para @{name}", "status.edit": "Editar", "status.edited": "Editado em {date}", - "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}", + "status.edited_x_times": "Editado {count, plural, one {{count} hora} other {{count} vezes}}", "status.embed": "Incorporar", "status.favourite": "Favoritar", "status.filtered": "Filtrado", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index f36683346..89e6a68ee 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -70,7 +70,7 @@ "column.blocks": "Utilizadores Bloqueados", "column.bookmarks": "Itens salvos", "column.community": "Cronologia local", - "column.conversations": "Conversações", + "column.direct": "Mensagens diretas", "column.directory": "Procurar perfis", "column.domain_blocks": "Domínios escondidos", "column.favourites": "Favoritos", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local apenas", "community.column_settings.media_only": "Somente media", "community.column_settings.remote_only": "Remoto apenas", + "compose.language.change": "Alterar idioma", + "compose.language.search": "Pesquisar idiomas...", "compose_form.direct_message_warning_learn_more": "Conhecer mais", "compose_form.encryption_warning": "As publicações no Mastodon não são criptografadas de ponta a ponta. Não partilhe nenhuma informação sensível através do Mastodon.", "compose_form.hashtag_warning": "Este toot não será listado em nenhuma hashtag por ser não listado. Apenas toots públics podem ser pesquisados por hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Incorpore esta publicação no seu site copiando o código abaixo.", "embed.preview": "Podes ver aqui como irá ficar:", "emoji_button.activity": "Actividade", + "emoji_button.clear": "Limpar", "emoji_button.custom": "Personalizar", "emoji_button.flags": "Bandeiras", "emoji_button.food": "Comida & Bebida", @@ -166,7 +169,7 @@ "empty_column.blocks": "Ainda não bloqueaste qualquer utilizador.", "empty_column.bookmarked_statuses": "Ainda não adicionou nenhum toot aos Itens salvos. Quando adicionar, eles serão exibidos aqui.", "empty_column.community": "A timeline local está vazia. Escreve algo publicamente para começar!", - "empty_column.conversations": "Quando enviar ou receber uma publicação que seja visível apenas para as pessoas nela mencionadas, ela aparecerá aqui.", + "empty_column.direct": "Ainda não tem qualquer mensagem direta. Quando enviar ou receber alguma, ela irá aparecer aqui.", "empty_column.domain_blocks": "Ainda não há qualquer domínio escondido.", "empty_column.explore_statuses": "Nada em destaque por agora. Volte mais tarde!", "empty_column.favourited_statuses": "Ainda não tens quaisquer toots favoritos. Quando tiveres algum, ele irá aparecer aqui.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "para partilhar", "keyboard_shortcuts.column": "para focar uma publicação numa das colunas", "keyboard_shortcuts.compose": "para focar na área de publicação", - "keyboard_shortcuts.conversations": "para abrir a coluna de conversações", "keyboard_shortcuts.description": "Descrição", + "keyboard_shortcuts.direct": "para abrir a coluna das mensagens diretas", "keyboard_shortcuts.down": "para mover para baixo na lista", "keyboard_shortcuts.enter": "para expandir uma publicação", "keyboard_shortcuts.favourite": "para adicionar aos favoritos", @@ -264,6 +267,8 @@ "lightbox.expand": "Expandir caixa de visualização de imagem", "lightbox.next": "Próximo", "lightbox.previous": "Anterior", + "limited_account_hint.action": "Exibir perfil mesmo assim", + "limited_account_hint.title": "Este perfil foi ocultado pelos moderadores do seu servidor.", "lists.account.add": "Adicionar à lista", "lists.account.remove": "Remover da lista", "lists.delete": "Eliminar lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Itens salvos", "navigation_bar.community_timeline": "Cronologia local", "navigation_bar.compose": "Escrever novo toot", + "navigation_bar.direct": "Mensagens diretas", "navigation_bar.discover": "Descobrir", "navigation_bar.domain_blocks": "Domínios escondidos", "navigation_bar.edit_profile": "Editar perfil", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Remover votação", "privacy.change": "Ajustar a privacidade da publicação", "privacy.direct.long": "Apenas para utilizadores mencionados", - "privacy.direct.short": "Apenas pessoas que menciono", + "privacy.direct.short": "Apenas pessoas mencionadas", "privacy.private.long": "Apenas para os seguidores", "privacy.private.short": "Apenas seguidores", "privacy.public.long": "Visível para todos", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 5a0932f5b..0756608ab 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -70,7 +70,7 @@ "column.blocks": "Utilizatori blocați", "column.bookmarks": "Marcaje", "column.community": "Cronologie locală", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Explorează profiluri", "column.domain_blocks": "Domenii blocate", "column.favourites": "Favorite", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Doar local", "community.column_settings.media_only": "Doar media", "community.column_settings.remote_only": "Doar la distanţă", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Află mai multe", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Această postare nu va fi listată sub niciun hashtag deoarece este nelistată. Doar postările publice pot fi căutate cu un hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Integrează această postare în site-ul tău copiind codul de mai jos.", "embed.preview": "Iată cum va arăta:", "emoji_button.activity": "Activități", + "emoji_button.clear": "Clear", "emoji_button.custom": "Personalizați", "emoji_button.flags": "Steaguri", "emoji_button.food": "Alimente și băuturi", @@ -166,7 +169,7 @@ "empty_column.blocks": "Momentan nu ai blocat niciun utilizator.", "empty_column.bookmarked_statuses": "Momentan nu ai nicio postare marcată. Când vei marca una, va apărea aici.", "empty_column.community": "Nu există nimic în cronologia locală. Postează ceva public pentru a sparge gheața!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Momentan nu există domenii blocate.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Momentan nu ai nicio postare favorită. Când vei adăuga una, va apărea aici.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Distribuie postarea", "keyboard_shortcuts.column": "Focalizează pe coloană", "keyboard_shortcuts.compose": "Focalizează pe zona de text", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Descriere", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "Coboară în listă", "keyboard_shortcuts.enter": "Deschide postarea", "keyboard_shortcuts.favourite": "Adaugă postarea la favorite", @@ -264,6 +267,8 @@ "lightbox.expand": "Deschide panoul de vizualizare a imaginilor", "lightbox.next": "Înainte", "lightbox.previous": "Înapoi", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Adaugă în listă", "lists.account.remove": "Elimină din listă", "lists.delete": "Șterge lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Marcaje", "navigation_bar.community_timeline": "Cronologie locală", "navigation_bar.compose": "Compune o nouă postare", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Descoperă", "navigation_bar.domain_blocks": "Domenii blocate", "navigation_bar.edit_profile": "Modifică profilul", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 57ae4db85..0fa0fbd91 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -70,7 +70,7 @@ "column.blocks": "Заблокированные пользователи", "column.bookmarks": "Закладки", "column.community": "Локальная лента", - "column.conversations": "Диалоги", + "column.direct": "Личные сообщения", "column.directory": "Просмотр профилей", "column.domain_blocks": "Заблокированные домены", "column.favourites": "Избранное", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Только локальные", "community.column_settings.media_only": "Только с медиафайлами", "community.column_settings.remote_only": "Только удалённые", + "compose.language.change": "Изменить язык", + "compose.language.search": "Поиск языков...", "compose_form.direct_message_warning_learn_more": "Подробнее", "compose_form.encryption_warning": "Посты в Mastodon не защищены сквозным шифрованием. Не делитесь потенциально опасной информацией.", "compose_form.hashtag_warning": "Так как этот пост не публичный, он не отобразится в поиске по хэштегам.", @@ -122,7 +124,7 @@ "confirmations.delete_list.confirm": "Удалить", "confirmations.delete_list.message": "Вы действительно хотите навсегда удалить этот список?", "confirmations.discard_edit_media.confirm": "Отменить", - "confirmations.discard_edit_media.message": "У вас имеются несохранённые изменения превью и описания медиафайла, отменить их?", + "confirmations.discard_edit_media.message": "У вас есть несохранённые изменения описания мультимедиа или предпросмотра, отменить их?", "confirmations.domain_block.confirm": "Да, заблокировать узел", "confirmations.domain_block.message": "Вы точно уверены, что хотите скрыть все посты с узла {domain}? В большинстве случаев пары блокировок и скрытий вполне достаточно.\n\nПри блокировке узла, вы перестанете получать уведомления оттуда, все посты будут скрыты из публичных лент, а подписчики убраны.", "confirmations.logout.confirm": "Выйти", @@ -147,6 +149,7 @@ "embed.instructions": "Встройте этот пост на свой сайт, скопировав следующий код:", "embed.preview": "Так это будет выглядеть:", "emoji_button.activity": "Занятия", + "emoji_button.clear": "Очистить", "emoji_button.custom": "С этого узла", "emoji_button.flags": "Флаги", "emoji_button.food": "Еда и напитки", @@ -166,7 +169,7 @@ "empty_column.blocks": "Вы ещё никого не заблокировали.", "empty_column.bookmarked_statuses": "У вас пока нет постов в закладках. Как добавите один, он отобразится здесь.", "empty_column.community": "Локальная лента пуста. Напишите что-нибудь, чтобы разогреть народ!", - "empty_column.conversations": "Здесь отображаются адресованные посты. Как только вы отправите или получите один, он отобразится здесь.", + "empty_column.direct": "У вас пока нет личных сообщений. Как только вы отправите или получите одно, оно появится здесь.", "empty_column.domain_blocks": "Скрытых доменов пока нет.", "empty_column.explore_statuses": "Нет актуального. Проверьте позже!", "empty_column.favourited_statuses": "Вы не добавили ни один пост в «Избранное». Как только вы это сделаете, он появится здесь.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "продвинуть пост", "keyboard_shortcuts.column": "фокус на одном из столбцов", "keyboard_shortcuts.compose": "фокус на поле ввода", - "keyboard_shortcuts.conversations": "открыть колонку диалогов", "keyboard_shortcuts.description": "Описание", + "keyboard_shortcuts.direct": "чтобы открыть колонку с личными сообщениями", "keyboard_shortcuts.down": "вниз по списку", "keyboard_shortcuts.enter": "открыть пост", "keyboard_shortcuts.favourite": "в избранное", @@ -264,6 +267,8 @@ "lightbox.expand": "Развернуть окно просмотра изображений", "lightbox.next": "Далее", "lightbox.previous": "Назад", + "limited_account_hint.action": "Все равно показать профиль", + "limited_account_hint.title": "Этот профиль был скрыт модераторами вашего сервера.", "lists.account.add": "Добавить в список", "lists.account.remove": "Убрать из списка", "lists.delete": "Удалить список", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Закладки", "navigation_bar.community_timeline": "Локальная лента", "navigation_bar.compose": "Создать новый пост", + "navigation_bar.direct": "Личные сообщения", "navigation_bar.discover": "Изучайте", "navigation_bar.domain_blocks": "Скрытые домены", "navigation_bar.edit_profile": "Изменить профиль", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Удалить опрос", "privacy.change": "Изменить видимость поста", "privacy.direct.long": "Показать только упомянутым", - "privacy.direct.short": "Для упомянутых", + "privacy.direct.short": "Только упомянутые", "privacy.private.long": "Показать только подписчикам", "privacy.private.short": "Для подписчиков", "privacy.public.long": "Виден всем", diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index ed5dc9ebd..fef1913cf 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -70,7 +70,7 @@ "column.blocks": "निषिद्धभोक्तारः", "column.bookmarks": "पुटचिह्नानि", "column.community": "स्थानीयसमयतालिका", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "व्यक्तित्वानि दृश्यन्ताम्", "column.domain_blocks": "निषिद्धप्रदेशाः", "column.favourites": "प्रियाः", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "केवलं स्थानीयम्", "community.column_settings.media_only": "सामग्री केवलम्", "community.column_settings.remote_only": "दर्गमः केवलम्", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "अधिकं ज्ञायताम्", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "न कस्मिन्नपि प्रचलितवस्तुषु सूचितमिदं दौत्यम् । केवलं सार्वजनिकदौत्यानि प्रचलितवस्तुचिह्नेन अन्वेषयितुं शक्यते ।", @@ -147,6 +149,7 @@ "embed.instructions": "दौत्यमेतत् स्वीयजालस्थाने स्थापयितुमधो लिखितो विध्यादेशो युज्यताम्", "embed.preview": "अत्रैवं दृश्यते तत्:", "emoji_button.activity": "आचरणम्", + "emoji_button.clear": "Clear", "emoji_button.custom": "स्वीयानुकूलम्", "emoji_button.flags": "ध्वजाः", "emoji_button.food": "भोजनं पेयञ्च", @@ -166,7 +169,7 @@ "empty_column.blocks": "नैकोऽप्युपभोक्ता निषिद्धो वर्तते", "empty_column.bookmarked_statuses": "नैकमपि पुटचिह्नयुक्तदौत्यानि सन्ति । यदा भविष्यति तदत्र दृश्यते ।", "empty_column.community": "स्थानीयसमयतालिका रिक्ता । सार्वजनिकत्वेनाऽत्र किमपि लिख्यताम् ।", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "न निषिद्धप्रदेशाः सन्ति ।", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "न प्रियदौत्यानि सन्ति । यदा प्रीतिरित्यङ्क्यतेऽत्र दृश्यते ।", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index fe6dd22cf..4c3c485c6 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -70,7 +70,7 @@ "column.blocks": "Persones blocadas", "column.bookmarks": "Sinnalibros", "column.community": "Lìnia de tempus locale", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Nàviga in is profilos", "column.domain_blocks": "Domìnios blocados", "column.favourites": "Preferidos", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Isceti locale", "community.column_settings.media_only": "Isceti multimediale", "community.column_settings.remote_only": "Isceti remotu", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Àteras informatziones", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Custa publicatzione no at a èssere ammustrada in peruna eticheta, dae chi no est listada. Isceti is publicatziones pùblicas podent èssere chircadas cun etichetas.", @@ -147,6 +149,7 @@ "embed.instructions": "Inserta custa publicatzione in su situ web tuo copiende su còdighe de suta.", "embed.preview": "At a aparèssere aici:", "emoji_button.activity": "Atividade", + "emoji_button.clear": "Clear", "emoji_button.custom": "Personalizadu", "emoji_button.flags": "Banderas", "emoji_button.food": "Mandigòngiu e bufòngiu", @@ -166,7 +169,7 @@ "empty_column.blocks": "No as blocadu ancora nemos.", "empty_column.bookmarked_statuses": "Non tenes ancora peruna publicatzione in is marcadores. Cando nd'as a agiùnghere una, at a èssere ammustrada inoghe.", "empty_column.community": "Sa lìnia de tempus locale est bòida. Iscrie inoghe pro cumintzare sa festa!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Non tenes ancora perunu domìniu blocadu.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Non tenes ancora peruna publicatzione in is preferidos. Cando nd'as a agiùnghere una, at a èssere ammustrada inoghe.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "pro cumpartzire", "keyboard_shortcuts.column": "pro atzentrare una publicatzione in una de is colunnas", "keyboard_shortcuts.compose": "pro atzentrare in s'àrea de cumpositzione de testu", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Descritzione", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "pro mòere in bàsciu in sa lista", "keyboard_shortcuts.enter": "pro abèrrere una publicatzione", "keyboard_shortcuts.favourite": "pro marcare comente a preferidu", @@ -264,6 +267,8 @@ "lightbox.expand": "Ismànnia sa casella de visualizatzione de is immàgines", "lightbox.next": "Imbeniente", "lightbox.previous": "Pretzedente", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Agiunghe a sa lista", "lists.account.remove": "Boga dae sa lista", "lists.delete": "Cantzella sa lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Sinnalibros", "navigation_bar.community_timeline": "Lìnia de tempus locale", "navigation_bar.compose": "Cumpone una publicatzione noa", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Iscoberi", "navigation_bar.domain_blocks": "Domìnios blocados", "navigation_bar.edit_profile": "Modìfica profilu", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 1190bbe00..4c63e0eb4 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -70,7 +70,7 @@ "column.blocks": "අවහිර කළ පරිශීලකයින්", "column.bookmarks": "පොත් යොමු", "column.community": "Local timeline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "පැතිකඩයන් පිරික්සන්න", "column.domain_blocks": "අවහිර කළ වසම්", "column.favourites": "ප්රියතමයන්", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "ස්ථානීයව පමණයි", "community.column_settings.media_only": "මාධ්ය පමණයි", "community.column_settings.remote_only": "දුරස්ථව පමණයි", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "තව දැනගන්න", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "ක්රියාකාරකම", + "emoji_button.clear": "Clear", "emoji_button.custom": "අභිරුචි", "emoji_button.flags": "Flags", "emoji_button.food": "ආහාර සහ පාන", @@ -166,7 +169,7 @@ "empty_column.blocks": "ඔබ තවමත් කිසිදු පරිශීලකයෙකු අවහිර කර නැත.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "අවහිර කළ වසම් නොමැත.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "සවිස්තරය", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "ඊළඟ", "lightbox.previous": "පෙර", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "ලැයිස්තුවට එකතු කරන්න", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "පොත් යොමු", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "පැතිකඩ සංස්කරණය", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index aee720837..48d67de4c 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -70,7 +70,7 @@ "column.blocks": "Blokovaní užívatelia", "column.bookmarks": "Záložky", "column.community": "Miestna časová os", - "column.conversations": "Conversations", + "column.direct": "Priame správy", "column.directory": "Prehľadávaj profily", "column.domain_blocks": "Skryté domény", "column.favourites": "Obľúbené", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Iba miestna", "community.column_settings.media_only": "Iba médiá", "community.column_settings.remote_only": "Iba odľahlé", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Zisti viac", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Tento toot nebude zobrazený pod žiadným haštagom lebo nieje listovaný. Iba verejné tooty môžu byť nájdené podľa haštagu.", @@ -147,6 +149,7 @@ "embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.", "embed.preview": "Tu je ako to bude vyzerať:", "emoji_button.activity": "Aktivita", + "emoji_button.clear": "Clear", "emoji_button.custom": "Vlastné", "emoji_button.flags": "Vlajky", "emoji_button.food": "Jedlá a nápoje", @@ -166,7 +169,7 @@ "empty_column.blocks": "Ešte si nikoho nezablokoval/a.", "empty_column.bookmarked_statuses": "Ešte nemáš žiadné záložky. Keď si pridáš príspevok k záložkám, zobrazí sa tu.", "empty_column.community": "Lokálna časová os je prázdna. Napíšte niečo, aby sa to tu začalo hýbať!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Žiadne domény ešte niesú skryté.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Nemáš obľúbené ešte žiadne príspevky. Keď si nejaký obľúbiš, bude zobrazený práve tu.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "Vyzdvihni príspevok", "keyboard_shortcuts.column": "zameraj sa na príspevok v jednom zo stĺpcov", "keyboard_shortcuts.compose": "zameraj sa na písaciu plochu", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Popis", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "posunúť sa dole v zozname", "keyboard_shortcuts.enter": "Otvor príspevok", "keyboard_shortcuts.favourite": "pridaj do obľúbených", @@ -264,6 +267,8 @@ "lightbox.expand": "Rozšíriť náhľad obrázku", "lightbox.next": "Ďalšie", "lightbox.previous": "Predchádzajúci", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Pridaj do zoznamu", "lists.account.remove": "Odober zo zoznamu", "lists.delete": "Vymaž list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Záložky", "navigation_bar.community_timeline": "Miestna časová os", "navigation_bar.compose": "Napíš nový príspevok", + "navigation_bar.direct": "Priame správy", "navigation_bar.discover": "Objavuj", "navigation_bar.domain_blocks": "Skryté domény", "navigation_bar.edit_profile": "Uprav profil", @@ -455,8 +461,8 @@ "status.embed": "Vložiť", "status.favourite": "Páči sa mi", "status.filtered": "Filtrované", - "status.history.created": "{name} created {date}", - "status.history.edited": "{name} edited {date}", + "status.history.created": "{name} vytvoril/a {date}", + "status.history.edited": "{name} upravil/a {date}", "status.load_more": "Ukáž viac", "status.media_hidden": "Skryté médiá", "status.mention": "Spomeň @{name}", @@ -514,7 +520,7 @@ "upload_error.poll": "Nahrávanie súborov pri anketách nieje možné.", "upload_form.audio_description": "Popíš, pre ľudí so stratou sluchu", "upload_form.description": "Opis pre slabo vidiacich", - "upload_form.description_missing": "No description added", + "upload_form.description_missing": "Nepridaný žiadny popis", "upload_form.edit": "Uprav", "upload_form.thumbnail": "Zmeniť miniatúru", "upload_form.undo": "Vymaž", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 23061d152..b094abfff 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -18,11 +18,11 @@ "account.followers": "Sledilci", "account.followers.empty": "Nihče ne sledi temu uporabniku.", "account.followers_counter": "{count, plural, one {ima {count} sledilca} two {ima {count} sledilca} few {ima {count} sledilcev} other {ima {count} sledilce}}", - "account.following": "Following", + "account.following": "Sledim", "account.following_counter": "{count, plural, one {sledi {count} osebi} two {sledi {count} osebama} few {sledi {count} osebam} other {sledi {count} osebam}}", "account.follows.empty": "Ta uporabnik še ne sledi nikomur.", "account.follows_you": "Vam sledi", - "account.hide_reblogs": "Skrij spodbude od @{name}", + "account.hide_reblogs": "Skrij izpostavitve od @{name}", "account.joined": "Pridružen/a {date}", "account.link_verified_on": "Lastništvo te povezave je bilo preverjeno {date}", "account.locked_info": "Stanje zasebnosti računa je nastavljeno na zaklenjeno. Lastnik ročno pregleda, kdo ga lahko spremlja.", @@ -32,12 +32,12 @@ "account.mute": "Utišaj @{name}", "account.mute_notifications": "Utišaj obvestila od @{name}", "account.muted": "Utišan", - "account.posts": "Tuti", - "account.posts_with_replies": "Tuti in odgovori", + "account.posts": "Objave", + "account.posts_with_replies": "Objave in odgovori", "account.report": "Prijavi @{name}", "account.requested": "Čakanje na odobritev. Kliknite, da prekličete prošnjo za sledenje", "account.share": "Delite profil osebe @{name}", - "account.show_reblogs": "Pokaži spodbude osebe @{name}", + "account.show_reblogs": "Pokaži izpostavitve osebe @{name}", "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unblock": "Odblokiraj @{name}", "account.unblock_domain": "Razkrij {domain}", @@ -70,7 +70,7 @@ "column.blocks": "Blokirani uporabniki", "column.bookmarks": "Zaznamki", "column.community": "Lokalna časovnica", - "column.conversations": "Conversations", + "column.direct": "Neposredna sporočila", "column.directory": "Prebrskaj profile", "column.domain_blocks": "Skrite domene", "column.favourites": "Priljubljene", @@ -79,7 +79,7 @@ "column.lists": "Seznami", "column.mutes": "Utišani uporabniki", "column.notifications": "Obvestila", - "column.pins": "Pripeti tuti", + "column.pins": "Pripete objave", "column.public": "Združena časovnica", "column_back_button.label": "Nazaj", "column_header.hide_settings": "Skrij nastavitve", @@ -92,9 +92,11 @@ "community.column_settings.local_only": "Samo krajevno", "community.column_settings.media_only": "Samo mediji", "community.column_settings.remote_only": "Samo oddaljeno", - "compose_form.direct_message_warning_learn_more": "Nauči se več", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", - "compose_form.hashtag_warning": "Ta tut ne bo naveden pod nobenim ključnikom, ker ni javen. Samo javne tute lahko iščete s ključniki.", + "compose.language.change": "Spremeni jezik", + "compose.language.search": "Poišči jezik ...", + "compose_form.direct_message_warning_learn_more": "Izvej več", + "compose_form.encryption_warning": "Objave na Mastodonu niso šifrirane od kraja do kraja. Prek Mastodona ne delite nobenih občutljivih informacij.", + "compose_form.hashtag_warning": "Ta objava ne bo navedena pod nobenim ključnikom, ker ni javen. Samo javne objave lahko iščete s ključniki.", "compose_form.lock_disclaimer": "Vaš račun ni {locked}. Vsakdo vam lahko sledi in si ogleda objave, ki so namenjene samo sledilcem.", "compose_form.lock_disclaimer.lock": "zaklenjen", "compose_form.placeholder": "O čem razmišljaš?", @@ -104,7 +106,7 @@ "compose_form.poll.remove_option": "Odstrani to izbiro", "compose_form.poll.switch_to_multiple": "Spremenite anketo, da omogočite več izbir", "compose_form.poll.switch_to_single": "Spremenite anketo, da omogočite eno izbiro", - "compose_form.publish": "Tutni", + "compose_form.publish": "Objavi", "compose_form.publish_loud": "{publish}!", "compose_form.save_changes": "Shrani spremembe", "compose_form.sensitive.hide": "Označi medij kot občutljiv", @@ -118,7 +120,7 @@ "confirmations.block.confirm": "Blokiraj", "confirmations.block.message": "Ali ste prepričani, da želite blokirati {name}?", "confirmations.delete.confirm": "Izbriši", - "confirmations.delete.message": "Ali ste prepričani, da želite izbrisati to stanje?", + "confirmations.delete.message": "Ali ste prepričani, da želite izbrisati to objavo?", "confirmations.delete_list.confirm": "Izbriši", "confirmations.delete_list.message": "Ali ste prepričani, da želite trajno izbrisati ta seznam?", "confirmations.discard_edit_media.confirm": "Opusti", @@ -131,7 +133,7 @@ "confirmations.mute.explanation": "S tem boste skrili objave pred njimi in objave, ki jih omenjajo, še vedno pa bodo lahko videli vaše objave in vam sledili.", "confirmations.mute.message": "Ali ste prepričani, da želite utišati {name}?", "confirmations.redraft.confirm": "Izbriši in preoblikuj", - "confirmations.redraft.message": "Ali ste prepričani, da želite izbrisati ta status in ga preoblikovati? Vzljubi in spodbude bodo izgubljeni, odgovori na izvirno objavo pa bodo osiroteli.", + "confirmations.redraft.message": "Ali ste prepričani, da želite izbrisati ta status in ga preoblikovati? Vzljubi in izpostavitve bodo izgubljeni, odgovori na izvirno objavo pa bodo osiroteli.", "confirmations.reply.confirm": "Odgovori", "confirmations.reply.message": "Odgovarjanje bo prepisalo sporočilo, ki ga trenutno sestavljate. Ali ste prepričani, da želite nadaljevati?", "confirmations.unfollow.confirm": "Prenehaj slediti", @@ -147,6 +149,7 @@ "embed.instructions": "Vstavi ta status na svojo spletno stran tako, da kopirate spodnjo kodo.", "embed.preview": "Tako bo izgledalo:", "emoji_button.activity": "Dejavnost", + "emoji_button.clear": "Počisti", "emoji_button.custom": "Po meri", "emoji_button.flags": "Zastave", "emoji_button.food": "Hrana in Pijača", @@ -161,16 +164,16 @@ "emoji_button.symbols": "Simboli", "emoji_button.travel": "Potovanja in Kraji", "empty_column.account_suspended": "Račun je suspendiran", - "empty_column.account_timeline": "Tukaj ni tutov!", + "empty_column.account_timeline": "Tukaj ni objav!", "empty_column.account_unavailable": "Profil ni na voljo", "empty_column.blocks": "Niste še blokirali nobenega uporabnika.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "Lokalna časovnica je prazna. Napišite nekaj javnega, da se bo žoga zakotalila!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "Nimate še nobenih neposrednih sporočil. Ko ga boste poslali ali prejeli, se bo prikazal tukaj.", "empty_column.domain_blocks": "Še vedno ni skritih domen.", "empty_column.explore_statuses": "Trenutno ni nič v trendu. Preverite znova kasneje!", - "empty_column.favourited_statuses": "Nimate priljubljenih tutov. Ko boste vzljubili kakšnega, se bo prikazal tukaj.", - "empty_column.favourites": "Nihče še ni vzljubil tega tuta. Ko ga bo nekdo, se bo pojavil tukaj.", + "empty_column.favourited_statuses": "Nimate priljubljenih objav. Ko boste vzljubili kakšno, bo prikazana tukaj.", + "empty_column.favourites": "Nihče še ni vzljubil te objave. Ko jo bo nekdo, se bo pojavila tukaj.", "empty_column.follow_recommendations": "Kaže, da za vas ni mogoče pripraviti nobenih predlogov. Poskusite uporabiti iskanje, da poiščete osebe, ki jih poznate, ali raziščete ključnike, ki so v trendu.", "empty_column.follow_requests": "Nimate prošenj za sledenje. Ko boste prejeli kakšno, se bo prikazala tukaj.", "empty_column.hashtag": "V tem ključniku še ni nič.", @@ -218,7 +221,7 @@ "hashtag.column_settings.tag_mode.none": "Nič od naštetega", "hashtag.column_settings.tag_toggle": "Za ta stolpec vključi dodatne oznake", "home.column_settings.basic": "Osnovno", - "home.column_settings.show_reblogs": "Pokaži spodbude", + "home.column_settings.show_reblogs": "Pokaži izpostavitve", "home.column_settings.show_replies": "Pokaži odgovore", "home.hide_announcements": "Skrij objave", "home.show_announcements": "Prikaži objave", @@ -227,11 +230,11 @@ "intervals.full.minutes": "{number, plural, one {# minuta} two {# minuti} few {# minute} other {# minut}}", "keyboard_shortcuts.back": "pojdi nazaj", "keyboard_shortcuts.blocked": "odpri seznam blokiranih uporabnikov", - "keyboard_shortcuts.boost": "spodbudi", + "keyboard_shortcuts.boost": "Izpostavi objavo", "keyboard_shortcuts.column": "fokusiraj na status v enemu od stolpcev", "keyboard_shortcuts.compose": "fokusiraj na območje za sestavljanje besedila", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Opis", + "keyboard_shortcuts.direct": "odpri stolpec za neposredna sporočila", "keyboard_shortcuts.down": "premakni se navzdol po seznamu", "keyboard_shortcuts.enter": "odpri status", "keyboard_shortcuts.favourite": "vzljubi", @@ -241,13 +244,13 @@ "keyboard_shortcuts.home": "odpri domačo časovnico", "keyboard_shortcuts.hotkey": "Hitra tipka", "keyboard_shortcuts.legend": "pokaži to legendo", - "keyboard_shortcuts.local": "odpri lokalno časovnico", + "keyboard_shortcuts.local": "Odpri krajevno časovnico", "keyboard_shortcuts.mention": "omeni avtorja", "keyboard_shortcuts.muted": "odpri seznam utišanih uporabnikov", "keyboard_shortcuts.my_profile": "odpri svoj profil", "keyboard_shortcuts.notifications": "odpri stolpec z obvestili", "keyboard_shortcuts.open_media": "to open media", - "keyboard_shortcuts.pinned": "odpri seznam pripetih tutov", + "keyboard_shortcuts.pinned": "Odpri seznam pripetih objav", "keyboard_shortcuts.profile": "odpri avtorjev profil", "keyboard_shortcuts.reply": "odgovori", "keyboard_shortcuts.requests": "odpri seznam s prošnjami za sledenje", @@ -256,7 +259,7 @@ "keyboard_shortcuts.start": "odpri stolpec \"začni\"", "keyboard_shortcuts.toggle_hidden": "prikaži/skrij besedilo za CW", "keyboard_shortcuts.toggle_sensitivity": "prikaži/skrij medije", - "keyboard_shortcuts.toot": "začni povsem nov tut", + "keyboard_shortcuts.toot": "Začni povsem novo objavo", "keyboard_shortcuts.unfocus": "odfokusiraj območje za sestavljanje besedila/iskanje", "keyboard_shortcuts.up": "premakni se navzgor po seznamu", "lightbox.close": "Zapri", @@ -264,6 +267,8 @@ "lightbox.expand": "Razširi ogledno polje slike", "lightbox.next": "Naslednji", "lightbox.previous": "Prejšnji", + "limited_account_hint.action": "Vseeno pokaži profil", + "limited_account_hint.title": "Profil so moderatorji vašega strežnika skrili.", "lists.account.add": "Dodaj na seznam", "lists.account.remove": "Odstrani s seznama", "lists.delete": "Izbriši seznam", @@ -289,7 +294,8 @@ "navigation_bar.blocks": "Blokirani uporabniki", "navigation_bar.bookmarks": "Zaznamki", "navigation_bar.community_timeline": "Lokalna časovnica", - "navigation_bar.compose": "Sestavi nov tut", + "navigation_bar.compose": "Sestavi novo objavo", + "navigation_bar.direct": "Neposredna sporočila", "navigation_bar.discover": "Odkrijte", "navigation_bar.domain_blocks": "Skrite domene", "navigation_bar.edit_profile": "Uredi profil", @@ -304,7 +310,7 @@ "navigation_bar.logout": "Odjava", "navigation_bar.mutes": "Utišani uporabniki", "navigation_bar.personal": "Osebno", - "navigation_bar.pins": "Pripeti tuti", + "navigation_bar.pins": "Pripete objave", "navigation_bar.preferences": "Nastavitve", "navigation_bar.public_timeline": "Združena časovnica", "navigation_bar.security": "Varnost", @@ -315,7 +321,7 @@ "notification.mention": "{name} vas je omenil/a", "notification.own_poll": "Vaša anketa se je končala", "notification.poll": "Glasovanje, v katerem ste sodelovali, se je končalo", - "notification.reblog": "{name} je spodbudil/a vaš status", + "notification.reblog": "{name} je izpostavila/a vašo objavo", "notification.status": "{name} je pravkar objavil/a", "notification.update": "{name} je uredil(a) objavo", "notifications.clear": "Počisti obvestila", @@ -331,7 +337,7 @@ "notifications.column_settings.mention": "Omembe:", "notifications.column_settings.poll": "Rezultati glasovanja:", "notifications.column_settings.push": "Potisna obvestila", - "notifications.column_settings.reblog": "Spodbude:", + "notifications.column_settings.reblog": "Izpostavitve:", "notifications.column_settings.show": "Prikaži v stolpcu", "notifications.column_settings.sound": "Predvajaj zvok", "notifications.column_settings.status": "New toots:", @@ -339,7 +345,7 @@ "notifications.column_settings.unread_notifications.highlight": "Poudari neprebrana obvestila", "notifications.column_settings.update": "Urejanja:", "notifications.filter.all": "Vse", - "notifications.filter.boosts": "Spodbude", + "notifications.filter.boosts": "Izpostavitev", "notifications.filter.favourites": "Priljubljeni", "notifications.filter.follows": "Sledi", "notifications.filter.mentions": "Omembe", @@ -366,12 +372,12 @@ "poll_button.remove_poll": "Odstrani anketo", "privacy.change": "Prilagodi zasebnost statusa", "privacy.direct.long": "Objavi samo omenjenim uporabnikom", - "privacy.direct.short": "Direct", + "privacy.direct.short": "Samo omenjeni", "privacy.private.long": "Objavi samo sledilcem", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Visible for all", + "privacy.private.short": "Samo sledilci", + "privacy.public.long": "Vidno vsem", "privacy.public.short": "Javno", - "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", + "privacy.unlisted.long": "Vidno za vse, vendar izključeno iz funkcionalnosti odkrivanja", "privacy.unlisted.short": "Ni prikazano", "refresh": "Osveži", "regeneration_indicator.label": "Nalaganje…", @@ -427,24 +433,24 @@ "report.unfollow_explanation": "Temu računu sledite. Da ne boste več videli njegovih objav v svojem domačem viru, mu prenehajte slediti.", "search.placeholder": "Iskanje", "search_popout.search_format": "Napredna oblika iskanja", - "search_popout.tips.full_text": "Enostavno besedilo vrne statuse, ki ste jih napisali, vzljubili, spodbudili ali ste bili v njih omenjeni, kot tudi ujemajoča se uporabniška imena, prikazna imena in ključnike.", + "search_popout.tips.full_text": "Enostavno besedilo vrne objave, ki ste jih napisali, vzljubili, izpostavili ali ste bili v njih omenjeni, kot tudi ujemajoča se uporabniška imena, prikazna imena in ključnike.", "search_popout.tips.hashtag": "ključnik", - "search_popout.tips.status": "stanje", + "search_popout.tips.status": "objava", "search_popout.tips.text": "Enostavno besedilo vrne ujemajoča se prikazna imena, uporabniška imena in ključnike", "search_popout.tips.user": "uporabnik", "search_results.accounts": "Ljudje", "search_results.all": "Vse", "search_results.hashtags": "Ključniki", "search_results.nothing_found": "Za ta iskalni niz ni zadetkov", - "search_results.statuses": "Tuti", - "search_results.statuses_fts_disabled": "Iskanje tutov po njihovi vsebini ni omogočeno na tem strežniku Mastodon.", + "search_results.statuses": "Objave", + "search_results.statuses_fts_disabled": "Iskanje objav po njihovi vsebini ni omogočeno na tem strežniku Mastodon.", "search_results.total": "{count, number} {count, plural, one {rezultat} other {rezultatov}}", "status.admin_account": "Odpri vmesnik za moderiranje za @{name}", "status.admin_status": "Odpri status v vmesniku za moderiranje", "status.block": "Blokiraj @{name}", "status.bookmark": "Dodaj med zaznamke", - "status.cancel_reblog_private": "Prekini spodbudo", - "status.cannot_reblog": "Te objave ni mogoče spodbuditi", + "status.cancel_reblog_private": "Prekliči izpostavitev", + "status.cannot_reblog": "Te objave ni mogoče izpostaviti", "status.copy": "Kopiraj povezavo do statusa", "status.delete": "Izbriši", "status.detailed_status": "Podroben pogled pogovora", @@ -465,12 +471,12 @@ "status.mute_conversation": "Utišaj pogovor", "status.open": "Razširi ta status", "status.pin": "Pripni na profil", - "status.pinned": "Pripeti tut", + "status.pinned": "Pripeta objava", "status.read_more": "Preberi več", - "status.reblog": "Spodbudi", - "status.reblog_private": "Spodbudi izvirnemu občinstvu", - "status.reblogged_by": "{name} spodbuja", - "status.reblogs.empty": "Nihče še ni spodbudil tega tuta. Ko se bo to zgodilo, se bodo pojavili tukaj.", + "status.reblog": "Izpostavi", + "status.reblog_private": "Izpostavi z izvirno vidljivostjo", + "status.reblogged_by": "{name} je izpostavil/a", + "status.reblogs.empty": "Nihče še ni izpostavil te objave. Ko se bo to zgodilo, se bodo pojavile tukaj.", "status.redraft": "Izbriši in preoblikuj", "status.remove_bookmark": "Odstrani zaznamek", "status.reply": "Odgovori", @@ -490,7 +496,7 @@ "suggestions.header": "Morda bi vas zanimalo…", "tabs_bar.federated_timeline": "Združeno", "tabs_bar.home": "Domov", - "tabs_bar.local_timeline": "Lokalno", + "tabs_bar.local_timeline": "Krajevno", "tabs_bar.notifications": "Obvestila", "tabs_bar.search": "Iskanje", "time_remaining.days": "{number, plural, one {# dan} other {# dni}} je ostalo", @@ -514,7 +520,7 @@ "upload_error.poll": "Prenos datoteke z anketami ni dovoljen.", "upload_form.audio_description": "Opiši za osebe z okvaro sluha", "upload_form.description": "Opišite za slabovidne", - "upload_form.description_missing": "No description added", + "upload_form.description_missing": "Noben opis ni bil dodan", "upload_form.edit": "Uredi", "upload_form.thumbnail": "Spremeni sličico", "upload_form.undo": "Izbriši", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 3535d4ea2..2112e0f0c 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -70,7 +70,7 @@ "column.blocks": "Përdorues të bllokuar", "column.bookmarks": "Faqerojtës", "column.community": "Rrjedhë kohore vendore", - "column.conversations": "Biseda", + "column.direct": "Mesazhe të drejtpërdrejtë", "column.directory": "Shfletoni profile", "column.domain_blocks": "Përkatësi të bllokuara", "column.favourites": "Të parapëlqyer", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Vetëm vendore", "community.column_settings.media_only": "Vetëm Media", "community.column_settings.remote_only": "Vetëm të largëta", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Mësoni më tepër", "compose_form.encryption_warning": "Postimet në Mastodon nuk fshehtëzohen skaj-më-skaj. Mos ndani me të tjerë gjëra me spec në Mastodon.", "compose_form.hashtag_warning": "Ky mesazh s’do të paraqitet nën ndonjë hashtag, ngaqë s’i është caktuar ndonjë. Vetëm mesazhet publike mund të kërkohen sipas hashtagësh.", @@ -147,6 +149,7 @@ "embed.instructions": "Trupëzojeni këtë gjendje në sajtin tuaj duke kopjuar kodin më poshtë.", "embed.preview": "Ja si do të duket:", "emoji_button.activity": "Veprimtari", + "emoji_button.clear": "Clear", "emoji_button.custom": "Vetjak", "emoji_button.flags": "Flamuj", "emoji_button.food": "Ushqim & Pije", @@ -166,7 +169,7 @@ "empty_column.blocks": "S’keni bllokuar ende ndonjë përdorues.", "empty_column.bookmarked_statuses": "S’keni faqeruajtur ende ndonjë mesazh. Kur faqeruani një të tillë, ai do të shfaqet këtu.", "empty_column.community": "Rrjedha kohore vendore është e zbrazët. Shkruani diçka publikisht që t’i hyhet valles!", - "empty_column.conversations": "Pasi të dërgoni ose merrni një postim që është i dukshëm vetëm për personat e përmendur në të, do të shfaqet këtu.", + "empty_column.direct": "S’keni ende ndonjë mesazh të drejtpërdrejtë. Kur dërgoni ose merrni një të tillë, ai do të shfaqet këtu.", "empty_column.domain_blocks": "Ende s’ka përkatësi të fshehura.", "empty_column.explore_statuses": "Asgjë në modë tani. Kontrolloni më vonë!", "empty_column.favourited_statuses": "S’keni ende ndonjë mesazh të parapëlqyer. Kur parapëlqeni një të tillë, ai do të shfaqet këtu.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "për përforcim", "keyboard_shortcuts.column": "për kalim fokusi mbi një gjendje te një nga shtyllat", "keyboard_shortcuts.compose": "për kalim fokusi te fusha e hartimit të mesazheve", - "keyboard_shortcuts.conversations": "për të hapur shtyllë bisedash", "keyboard_shortcuts.description": "Përshkrim", + "keyboard_shortcuts.direct": "për hapje shtylle mesazhesh të drejtpërdrejtë", "keyboard_shortcuts.down": "për zbritje poshtë nëpër listë", "keyboard_shortcuts.enter": "për hapje gjendjeje", "keyboard_shortcuts.favourite": "për t’i vënë shenjë si të parapëlqyer", @@ -264,6 +267,8 @@ "lightbox.expand": "Zgjeroje kuadratin e parjes së figurave", "lightbox.next": "Pasuesja", "lightbox.previous": "E mëparshmja", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Shto në listë", "lists.account.remove": "Hiqe nga lista", "lists.delete": "Fshije listën", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Faqerojtës", "navigation_bar.community_timeline": "Rrjedhë kohore vendore", "navigation_bar.compose": "Hartoni mesazh të ri", + "navigation_bar.direct": "Mesazhe të drejtpërdrejtë", "navigation_bar.discover": "Zbuloni", "navigation_bar.domain_blocks": "Përkatësi të bllokuara", "navigation_bar.edit_profile": "Përpunoni profilin", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Hiqe pyetësorin", "privacy.change": "Rregulloni privatësi mesazhesh", "privacy.direct.long": "I dukshëm vetëm për përdorues të përmendur", - "privacy.direct.short": "Vetëm persona që përmend", + "privacy.direct.short": "Vetëm për personat e përmendur", "privacy.private.long": "I dukshëm vetëm për ndjekës", "privacy.private.short": "Vetëm ndjekës", "privacy.public.long": "I dukshëm për të tërë", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index e732873c4..b4e992a07 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -70,7 +70,7 @@ "column.blocks": "Blokirani korisnici", "column.bookmarks": "Bookmarks", "column.community": "Lokalna lajna", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Omiljeni", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Ugradi ovaj status na Vaš veb sajt kopiranjem koda ispod.", "embed.preview": "Ovako će da izgleda:", "emoji_button.activity": "Aktivnost", + "emoji_button.clear": "Clear", "emoji_button.custom": "Proizvoljno", "emoji_button.flags": "Zastave", "emoji_button.food": "Hrana & piće", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "Lokalna lajna je prazna. Napišite nešto javno da lajna produva!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no hidden domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "da podržite", "keyboard_shortcuts.column": "da se prebacite na status u jednoj od kolona", "keyboard_shortcuts.compose": "da se prebacite na pisanje novog tuta", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Opis", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "da se pomerite na dole u listi", "keyboard_shortcuts.enter": "da otvorite status", "keyboard_shortcuts.favourite": "da označite kao omiljeno", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Sledeći", "lightbox.previous": "Prethodni", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Dodaj na listu", "lists.account.remove": "Ukloni sa liste", "lists.delete": "Obriši listu", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Lokalna lajna", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Izmeni profil", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 15f8640c6..159628b6c 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -70,7 +70,7 @@ "column.blocks": "Блокирани корисници", "column.bookmarks": "Обележивачи", "column.community": "Локална временска линија", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Претражи налоге", "column.domain_blocks": "Скривени домени", "column.favourites": "Омиљене", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Само локално", "community.column_settings.media_only": "Само Медији", "community.column_settings.remote_only": "Само удаљено", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Сазнајте више", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "Ова труба неће бити излистана под било којом тарабом јер је сакривена. Само јавне трубе могу бити претражене тарабом.", @@ -147,6 +149,7 @@ "embed.instructions": "Угради овај статус на Ваш веб сајт копирањем кода испод.", "embed.preview": "Овако ће да изгледа:", "emoji_button.activity": "Активност", + "emoji_button.clear": "Clear", "emoji_button.custom": "Произвољно", "emoji_button.flags": "Заставе", "emoji_button.food": "Храна и пиће", @@ -166,7 +169,7 @@ "empty_column.blocks": "Још увек немате блокираних корисника.", "empty_column.bookmarked_statuses": "Још увек немате обележене трубе. Када их обележите, појавиће се овде.", "empty_column.community": "Локална временска линија је празна. Напишите нешто јавно да започнете!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "Још увек нема сакривених домена.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "Још увек немате труба које су вам се свиделе. Када вам се једна свиди, појавиће се овде.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "да подржите", "keyboard_shortcuts.column": "да се пребаците на статус у једној од колона", "keyboard_shortcuts.compose": "да се пребаците на писање новог тута", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Опис", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "да се померите на доле у листи", "keyboard_shortcuts.enter": "да отворите статус", "keyboard_shortcuts.favourite": "да означите као омиљено", @@ -264,6 +267,8 @@ "lightbox.expand": "Увећај преглед слике", "lightbox.next": "Следећи", "lightbox.previous": "Претходни", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Додај на листу", "lists.account.remove": "Уклони са листе", "lists.delete": "Обриши листу", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Маркери", "navigation_bar.community_timeline": "Локална временска линија", "navigation_bar.compose": "Саставите нову трубу", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Откриј", "navigation_bar.domain_blocks": "Сакривени домени", "navigation_bar.edit_profile": "Измени налог", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 1fd9d2fd2..436dc5b18 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -70,7 +70,7 @@ "column.blocks": "Blockerade användare", "column.bookmarks": "Bokmärken", "column.community": "Lokal tidslinje", - "column.conversations": "Konversationer", + "column.direct": "Direktmeddelanden", "column.directory": "Bläddra bland profiler", "column.domain_blocks": "Dolda domäner", "column.favourites": "Favoriter", @@ -80,7 +80,7 @@ "column.mutes": "Tystade användare", "column.notifications": "Aviseringar", "column.pins": "Nålade toots", - "column.public": "Förenad tidslinje", + "column.public": "Federerad tidslinje", "column_back_button.label": "Tillbaka", "column_header.hide_settings": "Dölj inställningar", "column_header.moveLeft_settings": "Flytta kolumnen åt vänster", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Endast lokalt", "community.column_settings.media_only": "Endast media", "community.column_settings.remote_only": "Endast fjärr", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Lär dig mer", "compose_form.encryption_warning": "Inlägg på Mastodon är inte end-to-end-krypterade. Dela inte någon känslig information över Mastodon.", "compose_form.hashtag_warning": "Denna toot kommer inte att visas under någon hashtag eftersom den är onoterad. Endast offentliga toots kan sökas med hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Lägg in denna status på din webbplats genom att kopiera koden nedan.", "embed.preview": "Så här kommer det att se ut:", "emoji_button.activity": "Aktivitet", + "emoji_button.clear": "Clear", "emoji_button.custom": "Anpassad", "emoji_button.flags": "Flaggor", "emoji_button.food": "Mat & dryck", @@ -166,7 +169,7 @@ "empty_column.blocks": "Du har ännu ej blockerat några användare.", "empty_column.bookmarked_statuses": "Du har inte bokmärkt några tutar än. När du gör ett bokmärke kommer det synas här.", "empty_column.community": "Den lokala tidslinjen är tom. Skriv något offentligt för att sätta bollen i rullning!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "Du har inga direktmeddelanden. När du skickar eller tar emot ett direktmeddelande kommer det att visas här.", "empty_column.domain_blocks": "Det finns ännu inga dolda domäner.", "empty_column.explore_statuses": "Ingenting är trendigt just nu. Kom tillbaka senare!", "empty_column.favourited_statuses": "Du har inga favoritmarkerade toots än. När du favoritmarkerar en kommer den visas här.", @@ -230,13 +233,13 @@ "keyboard_shortcuts.boost": "för att knuffa", "keyboard_shortcuts.column": "för att fokusera en status i en av kolumnerna", "keyboard_shortcuts.compose": "för att fokusera skrivfältet", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Beskrivning", + "keyboard_shortcuts.direct": "för att öppna Direktmeddelanden", "keyboard_shortcuts.down": "för att flytta nedåt i listan", "keyboard_shortcuts.enter": "för att öppna en status", "keyboard_shortcuts.favourite": "för att sätta som favorit", "keyboard_shortcuts.favourites": "för att öppna Favoriter", - "keyboard_shortcuts.federated": "för att öppna Förenad tidslinje", + "keyboard_shortcuts.federated": "Öppna federerad tidslinje", "keyboard_shortcuts.heading": "Tangentbordsgenvägar", "keyboard_shortcuts.home": "för att öppna Hem-tidslinjen", "keyboard_shortcuts.hotkey": "Kommando", @@ -264,6 +267,8 @@ "lightbox.expand": "Utöka bildvyrutan", "lightbox.next": "Nästa", "lightbox.previous": "Tidigare", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Lägg till i lista", "lists.account.remove": "Ta bort från lista", "lists.delete": "Radera lista", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bokmärken", "navigation_bar.community_timeline": "Lokal tidslinje", "navigation_bar.compose": "Författa ny toot", + "navigation_bar.direct": "Direktmeddelanden", "navigation_bar.discover": "Upptäck", "navigation_bar.domain_blocks": "Dolda domäner", "navigation_bar.edit_profile": "Redigera profil", @@ -306,7 +312,7 @@ "navigation_bar.personal": "Personligt", "navigation_bar.pins": "Nålade inlägg (toots)", "navigation_bar.preferences": "Inställningar", - "navigation_bar.public_timeline": "Förenad tidslinje", + "navigation_bar.public_timeline": "Federerad tidslinje", "navigation_bar.security": "Säkerhet", "notification.admin.sign_up": "{name} registrerade sig", "notification.favourite": "{name} favoriserade din status", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Ta bort omröstning", "privacy.change": "Justera sekretess", "privacy.direct.long": "Skicka endast till nämnda användare", - "privacy.direct.short": "Bara personer jag nämner", + "privacy.direct.short": "Direct", "privacy.private.long": "Endast synligt för följare", "privacy.private.short": "Endast följare", "privacy.public.long": "Synlig för alla", @@ -488,7 +494,7 @@ "status.unpin": "Ångra fäst i profil", "suggestions.dismiss": "Avfärda förslag", "suggestions.header": "Du kanske är intresserad av…", - "tabs_bar.federated_timeline": "Förenad", + "tabs_bar.federated_timeline": "Federerad", "tabs_bar.home": "Hem", "tabs_bar.local_timeline": "Lokal", "tabs_bar.notifications": "Aviseringar", diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json index 09d473ef4..7b041a208 100644 --- a/app/javascript/mastodon/locales/szl.json +++ b/app/javascript/mastodon/locales/szl.json @@ -70,7 +70,7 @@ "column.blocks": "Blocked users", "column.bookmarks": "Bookmarks", "column.community": "Local timeline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Blocked domains", "column.favourites": "Favourites", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", + "emoji_button.clear": "Clear", "emoji_button.custom": "Custom", "emoji_button.flags": "Flags", "emoji_button.food": "Food & Drink", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no blocked domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index e8c9757ad..43508be01 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -70,7 +70,7 @@ "column.blocks": "தடுக்கப்பட்ட பயனர்கள்", "column.bookmarks": "அடையாளக்குறிகள்", "column.community": "சுய நிகழ்வு காலவரிசை", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "சுயவிவரங்களை உலாவு", "column.domain_blocks": "மறைந்திருக்கும் திரளங்கள்", "column.favourites": "பிடித்தவைகள்", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "அருகிலிருந்து மட்டுமே", "community.column_settings.media_only": "படங்கள் மட்டுமே", "community.column_settings.remote_only": "தொலைவிலிருந்து மட்டுமே", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "மேலும் அறிய", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "இது ஒரு பட்டியலிடப்படாத டூட் என்பதால் எந்த ஹேஷ்டேகின் கீழும் வராது. ஹேஷ்டேகின் மூலம் பொதுவில் உள்ள டூட்டுகளை மட்டுமே தேட முடியும்.", @@ -147,6 +149,7 @@ "embed.instructions": "இந்தப் பதிவை உங்கள் வலைதளத்தில் பொதிக்கக் கீழே உள்ள வரிகளை காப்பி செய்யவும்.", "embed.preview": "பார்க்க இப்படி இருக்கும்:", "emoji_button.activity": "செயல்பாடு", + "emoji_button.clear": "Clear", "emoji_button.custom": "தனிப்பயன்", "emoji_button.flags": "கொடிகள்", "emoji_button.food": "உணவு மற்றும் பானம்", @@ -166,7 +169,7 @@ "empty_column.blocks": "நீங்கள் இதுவரை எந்தப் பயனர்களையும் முடக்கியிருக்கவில்லை.", "empty_column.bookmarked_statuses": "உங்களிடம் அடையாளக்குறியிட்ட டூட்டுகள் எவையும் இல்லை. அடையாளக்குறியிட்ட பிறகு அவை இங்கே காட்டப்படும்.", "empty_column.community": "உங்கள் மாஸ்டடான் முச்சந்தியில் யாரும் இல்லை. எதையேனும் எழுதி ஆட்டத்தைத் துவக்குங்கள்!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "தடுக்கப்பட்டக் களங்கள் இதுவரை இல்லை.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "உங்களுக்குப் பிடித்த டூட்டுகள் இதுவரை இல்லை. ஒரு டூட்டில் நீங்கள் விருப்பக்குறி இட்டால், அது இங்கே காண்பிக்கப்படும்.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "பகிர", "keyboard_shortcuts.column": "ஏதேனும் ஒரு நெடுவரிசையில் உள்ள டூட்டுல் கவனம் செலுத்த", "keyboard_shortcuts.compose": "பதிவு எழுதும் பெட்டியில் கவனம் செலுத்த", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "விவரம்", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "பட்டியலின் கீழே செல்ல", "keyboard_shortcuts.enter": "டூட்டைத் திறக்க", "keyboard_shortcuts.favourite": "விருப்பக்குறி இட", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "அடுத்த", "lightbox.previous": "சென்ற", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "பட்டியலில் சேர்", "lists.account.remove": "பட்டியலில் இருந்து அகற்று", "lists.delete": "பட்டியலை நீக்கு", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "அடையாளக்குறிகள்", "navigation_bar.community_timeline": "உள்ளூர் காலக்கெடு", "navigation_bar.compose": "புதியவற்றை எழுதுக toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "கண்டு பிடி", "navigation_bar.domain_blocks": "மறைந்த களங்கள்", "navigation_bar.edit_profile": "சுயவிவரத்தைத் திருத்தவும்", diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json index d76b9a451..2bc2a29da 100644 --- a/app/javascript/mastodon/locales/tai.json +++ b/app/javascript/mastodon/locales/tai.json @@ -70,7 +70,7 @@ "column.blocks": "Blocked users", "column.bookmarks": "Bookmarks", "column.community": "Local timeline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Blocked domains", "column.favourites": "Favourites", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", + "emoji_button.clear": "Clear", "emoji_button.custom": "Custom", "emoji_button.flags": "Flags", "emoji_button.food": "Food & Drink", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no blocked domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 8eb92f7ad..a25a019fb 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -70,7 +70,7 @@ "column.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు", "column.bookmarks": "Bookmarks", "column.community": "స్థానిక కాలక్రమం", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "దాచిన డొమైన్లు", "column.favourites": "ఇష్టపడినవి", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "మీడియా మాత్రమే", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "మరింత తెలుసుకోండి", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "ఈ టూట్ అన్లిస్టెడ్ కాబట్టి ఏ హాష్ ట్యాగ్ క్రిందకూ రాదు. పబ్లిక్ టూట్ లను మాత్రమే హాష్ ట్యాగ్ ద్వారా శోధించవచ్చు.", @@ -147,6 +149,7 @@ "embed.instructions": "దిగువ కోడ్ను కాపీ చేయడం ద్వారా మీ వెబ్సైట్లో ఈ స్టేటస్ ని పొందుపరచండి.", "embed.preview": "అది ఈ క్రింది విధంగా కనిపిస్తుంది:", "emoji_button.activity": "కార్యకలాపాలు", + "emoji_button.clear": "Clear", "emoji_button.custom": "అనుకూలీకరించిన", "emoji_button.flags": "ఫ్లాగ్స్", "emoji_button.food": "ఆహారం & పానీయం", @@ -166,7 +169,7 @@ "empty_column.blocks": "మీరు ఇంకా ఏ వినియోగదారులనూ బ్లాక్ చేయలేదు.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "స్థానిక కాలక్రమం ఖాళీగా ఉంది. మొదలుపెట్టడానికి బహిరంగంగా ఏదో ఒకటి వ్రాయండి!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "దాచబడిన డొమైన్లు ఇంకా ఏమీ లేవు.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "మీకు ఇష్టపడిన టూట్లు ఇంకా ఎమీ లేవు. మీరు ఒకదానిని ఇష్టపడినప్పుడు, అది ఇక్కడ కనిపిస్తుంది.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "బూస్ట్ చేయడానికి", "keyboard_shortcuts.column": "నిలువు వరుసలలో ఒకదానిపై దృష్టి పెట్టడానికి", "keyboard_shortcuts.compose": "కంపోజ్ టెక్స్ట్ఏరియా పై దృష్టి పెట్టడానికి", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "జాబితాలో క్రిందికి వెళ్ళడానికి", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "ఇష్టపడడానికి", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "తరువాత", "lightbox.previous": "మునుపటి", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "జాబితాకు జోడించు", "lists.account.remove": "జాబితా నుండి తొలగించు", "lists.delete": "జాబితాను తొలగించు", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "స్థానిక కాలక్రమం", "navigation_bar.compose": "కొత్త టూట్ను రాయండి", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "కనుగొను", "navigation_bar.domain_blocks": "దాచిన డొమైన్లు", "navigation_bar.edit_profile": "ప్రొఫైల్ని సవరించండి", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 423d3efd4..84faa0a1c 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -70,7 +70,7 @@ "column.blocks": "ผู้ใช้ที่ปิดกั้นอยู่", "column.bookmarks": "ที่คั่นหน้า", "column.community": "เส้นเวลาในเซิร์ฟเวอร์", - "column.conversations": "การสนทนา", + "column.direct": "ข้อความโดยตรง", "column.directory": "เรียกดูโปรไฟล์", "column.domain_blocks": "โดเมนที่ปิดกั้นอยู่", "column.favourites": "รายการโปรด", @@ -92,8 +92,10 @@ "community.column_settings.local_only": "ในเซิร์ฟเวอร์เท่านั้น", "community.column_settings.media_only": "สื่อเท่านั้น", "community.column_settings.remote_only": "ระยะไกลเท่านั้น", + "compose.language.change": "เปลี่ยนภาษา", + "compose.language.search": "ค้นหาภาษา...", "compose_form.direct_message_warning_learn_more": "เรียนรู้เพิ่มเติม", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", + "compose_form.encryption_warning": "โพสต์ใน Mastodon ไม่ได้เข้ารหัสแบบต้นทางถึงปลายทาง อย่าแบ่งปันข้อมูลที่เป็นอันตรายใด ๆ ผ่าน Mastodon", "compose_form.hashtag_warning": "จะไม่แสดงรายการโพสต์นี้ภายใต้แฮชแท็กใด ๆ เนื่องจากไม่อยู่ในรายการ เฉพาะโพสต์สาธารณะเท่านั้นที่สามารถค้นหาได้โดยแฮชแท็ก", "compose_form.lock_disclaimer": "บัญชีของคุณไม่ได้ {locked} ใครก็ตามสามารถติดตามคุณเพื่อดูโพสต์สำหรับผู้ติดตามเท่านั้นของคุณ", "compose_form.lock_disclaimer.lock": "ล็อคอยู่", @@ -147,6 +149,7 @@ "embed.instructions": "ฝังโพสต์นี้ในเว็บไซต์ของคุณโดยคัดลอกโค้ดด้านล่าง", "embed.preview": "นี่คือลักษณะที่จะปรากฏ:", "emoji_button.activity": "กิจกรรม", + "emoji_button.clear": "ล้าง", "emoji_button.custom": "กำหนดเอง", "emoji_button.flags": "ธง", "emoji_button.food": "อาหารและเครื่องดื่ม", @@ -166,7 +169,7 @@ "empty_column.blocks": "คุณยังไม่ได้ปิดกั้นผู้ใช้ใด ๆ", "empty_column.bookmarked_statuses": "คุณยังไม่มีโพสต์ที่เพิ่มที่คั่นหน้าไว้ใด ๆ เมื่อคุณเพิ่มที่คั่นหน้าโพสต์ โพสต์จะปรากฏที่นี่", "empty_column.community": "เส้นเวลาในเซิร์ฟเวอร์ว่างเปล่า เขียนบางอย่างเป็นสาธารณะเพื่อเริ่มต้น!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "คุณยังไม่มีข้อความโดยตรงใด ๆ เมื่อคุณส่งหรือรับข้อความ ข้อความจะปรากฏที่นี่", "empty_column.domain_blocks": "ยังไม่มีโดเมนที่ปิดกั้นอยู่", "empty_column.explore_statuses": "ไม่มีสิ่งใดที่กำลังนิยมในตอนนี้ กลับมาตรวจสอบในภายหลัง!", "empty_column.favourited_statuses": "คุณยังไม่มีโพสต์ที่ชื่นชอบใด ๆ เมื่อคุณชื่นชอบโพสต์ โพสต์จะปรากฏที่นี่", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "ดันโพสต์", "keyboard_shortcuts.column": "โฟกัสคอลัมน์", "keyboard_shortcuts.compose": "โฟกัสพื้นที่เขียนข้อความ", - "keyboard_shortcuts.conversations": "เพื่อเปิดคอลัมน์การสนทนา", "keyboard_shortcuts.description": "คำอธิบาย", + "keyboard_shortcuts.direct": "เพื่อเปิดคอลัมน์ข้อความโดยตรง", "keyboard_shortcuts.down": "ย้ายลงในรายการ", "keyboard_shortcuts.enter": "เปิดโพสต์", "keyboard_shortcuts.favourite": "ชื่นชอบโพสต์", @@ -264,6 +267,8 @@ "lightbox.expand": "ขยายกล่องดูภาพ", "lightbox.next": "ถัดไป", "lightbox.previous": "ก่อนหน้า", + "limited_account_hint.action": "แสดงโปรไฟล์ต่อไป", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "เพิ่มไปยังรายการ", "lists.account.remove": "เอาออกจากรายการ", "lists.delete": "ลบรายการ", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "ที่คั่นหน้า", "navigation_bar.community_timeline": "เส้นเวลาในเซิร์ฟเวอร์", "navigation_bar.compose": "เขียนโพสต์ใหม่", + "navigation_bar.direct": "ข้อความโดยตรง", "navigation_bar.discover": "ค้นพบ", "navigation_bar.domain_blocks": "โดเมนที่ปิดกั้นอยู่", "navigation_bar.edit_profile": "แก้ไขโปรไฟล์", @@ -348,9 +354,9 @@ "notifications.grant_permission": "ให้สิทธิอนุญาต", "notifications.group": "{count} การแจ้งเตือน", "notifications.mark_as_read": "ทำเครื่องหมายทุกการแจ้งเตือนว่าอ่านแล้ว", - "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", - "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", - "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", + "notifications.permission_denied": "การแจ้งเตือนบนเดสก์ท็อปไม่พร้อมใช้งานเนื่องจากมีการปฏิเสธคำขอสิทธิอนุญาตเบราว์เซอร์ก่อนหน้านี้", + "notifications.permission_denied_alert": "ไม่สามารถเปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป เนื่องจากมีการปฏิเสธสิทธิอนุญาตเบราว์เซอร์ก่อนหน้านี้", + "notifications.permission_required": "การแจ้งเตือนบนเดสก์ท็อปไม่พร้อมใช้งานเนื่องจากไม่ได้ให้สิทธิอนุญาตที่จำเป็น", "notifications_permission_banner.enable": "เปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป", "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", "notifications_permission_banner.title": "ไม่พลาดสิ่งใด", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "เอาการสำรวจความคิดเห็นออก", "privacy.change": "เปลี่ยนความเป็นส่วนตัวของโพสต์", "privacy.direct.long": "ปรากฏแก่ผู้ใช้ที่กล่าวถึงเท่านั้น", - "privacy.direct.short": "เฉพาะผู้คนที่ฉันกล่าวถึงเท่านั้น", + "privacy.direct.short": "ผู้คนที่กล่าวถึงเท่านั้น", "privacy.private.long": "ปรากฏแก่ผู้ติดตามเท่านั้น", "privacy.private.short": "ผู้ติดตามเท่านั้น", "privacy.public.long": "ปรากฏแก่ทั้งหมด", @@ -512,13 +518,13 @@ "upload_button.label": "เพิ่มไฟล์ภาพ, วิดีโอ หรือเสียง", "upload_error.limit": "เกินขีดจำกัดการอัปโหลดไฟล์", "upload_error.poll": "ไม่อนุญาตให้อัปโหลดไฟล์กับการลงคะแนน", - "upload_form.audio_description": "อธิบายสำหรับผู้สูญเสียการได้ยิน", + "upload_form.audio_description": "อธิบายสำหรับผู้ที่สูญเสียการได้ยิน", "upload_form.description": "อธิบายสำหรับผู้บกพร่องทางการมองเห็น", "upload_form.description_missing": "ไม่มีการเพิ่มคำอธิบาย", "upload_form.edit": "แก้ไข", "upload_form.thumbnail": "เปลี่ยนภาพขนาดย่อ", "upload_form.undo": "ลบ", - "upload_form.video_description": "อธิบายสำหรับผู้สูญเสียการได้ยินหรือบกพร่องทางการมองเห็น", + "upload_form.video_description": "อธิบายสำหรับผู้ที่สูญเสียการได้ยินหรือบกพร่องทางการมองเห็น", "upload_modal.analyzing_picture": "กำลังวิเคราะห์รูปภาพ…", "upload_modal.apply": "นำไปใช้", "upload_modal.applying": "กำลังนำไปใช้…", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index bc0e8f721..f98574e11 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -70,7 +70,7 @@ "column.blocks": "Engellenen kullanıcılar", "column.bookmarks": "Yer İmleri", "column.community": "Yerel zaman tüneli", - "column.conversations": "Sohbetler", + "column.direct": "Doğrudan iletiler", "column.directory": "Profillere göz at", "column.domain_blocks": "Engellenen alan adları", "column.favourites": "Favoriler", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Sadece yerel", "community.column_settings.media_only": "Sadece medya", "community.column_settings.remote_only": "Sadece uzak", + "compose.language.change": "Dili değiştir", + "compose.language.search": "Dilleri ara...", "compose_form.direct_message_warning_learn_more": "Daha fazla bilgi edinin", "compose_form.encryption_warning": "Mastodondaki gönderiler uçtan uca şifrelemeli değildir. Mastodon üzerinden hassas olabilecek bir bilginizi paylaşmayın.", "compose_form.hashtag_warning": "Bu gönderi liste dışı olduğu için hiç bir etikette yer almayacak. Sadece herkese açık gönderiler etiketlerde bulunabilir.", @@ -147,6 +149,7 @@ "embed.instructions": "Aşağıdaki kodu kopyalayarak bu durumu sitenize gömün.", "embed.preview": "İşte nasıl görüneceği:", "emoji_button.activity": "Aktivite", + "emoji_button.clear": "Temizle", "emoji_button.custom": "Özel", "emoji_button.flags": "Bayraklar", "emoji_button.food": "Yiyecek ve İçecek", @@ -166,7 +169,7 @@ "empty_column.blocks": "Henüz herhangi bir kullanıcıyı engellemedin.", "empty_column.bookmarked_statuses": "Henüz yer imine eklediğin toot yok. Bir tanesi yer imine eklendiğinde burada görünür.", "empty_column.community": "Yerel zaman çizelgesi boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın!", - "empty_column.conversations": "Sadece bahsedilen kişilere özel gönderi paylaştığında veya bu gizlilik seçeneğinde bir gönderi aldığında bu sayfada gözükecek.", + "empty_column.direct": "Henüz doğrudan iletiniz yok. Bir tane gönderdiğinizde veya aldığınız burada listelenecekler.", "empty_column.domain_blocks": "Henüz engellenmiş bir alan adı yok.", "empty_column.explore_statuses": "Şu an öne çıkan birşey yok. Daha sonra tekrar bakın!", "empty_column.favourited_statuses": "Favori tootun yok. Favori tootun olduğunda burada görünür.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "gönderiyi boostla", "keyboard_shortcuts.column": "sütunlardan birindeki duruma odaklanmak için", "keyboard_shortcuts.compose": "yazma alanına odaklanmak için", - "keyboard_shortcuts.conversations": "sohbetler sütununu açmak için", "keyboard_shortcuts.description": "Açıklama", + "keyboard_shortcuts.direct": "doğrudan iletiler sütununu açmak için", "keyboard_shortcuts.down": "listede aşağıya inmek için", "keyboard_shortcuts.enter": "gönderiyi aç", "keyboard_shortcuts.favourite": "gönderiyi favorilerine ekle", @@ -264,6 +267,8 @@ "lightbox.expand": "Resim görüntüleme kutusunu genişlet", "lightbox.next": "Sonraki", "lightbox.previous": "Önceki", + "limited_account_hint.action": "Yine de profili göster", + "limited_account_hint.title": "Bu profil sunucunuzun moderatörleri tarafından gizlendi.", "lists.account.add": "Listeye ekle", "lists.account.remove": "Listeden kaldır", "lists.delete": "Listeyi sil", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Yer İmleri", "navigation_bar.community_timeline": "Yerel Zaman Tüneli", "navigation_bar.compose": "Yeni gönderi yaz", + "navigation_bar.direct": "Doğrudan iletiler", "navigation_bar.discover": "Keşfet", "navigation_bar.domain_blocks": "Engellenen alan adları", "navigation_bar.edit_profile": "Profili düzenle", @@ -315,7 +321,7 @@ "notification.mention": "{name} senden bahsetti", "notification.own_poll": "Anketiniz sona erdi", "notification.poll": "Oy verdiğiniz bir anket sona erdi", - "notification.reblog": "{name} gönderini teşvik etti", + "notification.reblog": "{name} gönderini boostladı", "notification.status": "{name} az önce gönderdi", "notification.update": "{name} bir gönderiyi düzenledi", "notifications.clear": "Bildirimleri temizle", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Anketi kaldır", "privacy.change": "Gönderi gizliliğini değiştir", "privacy.direct.long": "Sadece bahsedilen kullanıcılar için görünür", - "privacy.direct.short": "Sadece bahsettiğim kişiler", + "privacy.direct.short": "Sadece bahsedilen kişiler", "privacy.private.long": "Sadece takipçiler için görünür", "privacy.private.short": "Sadece takipçiler", "privacy.public.long": "Herkese açık", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index bd20b1efe..e05804d93 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -7,13 +7,13 @@ "account.block_domain": "{domain} доменын блоклау", "account.blocked": "Блокланган", "account.browse_more_on_origin_server": "Тулырак оригинал профилендә карап була", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Язылуга сорауны бетерү", "account.direct": "@{name} өчен яңа хат", - "account.disable_notifications": "Stop notifying me when @{name} posts", - "account.domain_blocked": "Domain blocked", + "account.disable_notifications": "@{name} язулары өчен белдерүләр сүндерү", + "account.domain_blocked": "Домен блокланган", "account.edit_profile": "Профильны үзгәртү", "account.enable_notifications": "@{name} язулары өчен белдерүләр яндыру", - "account.endorse": "Feature on profile", + "account.endorse": "Профильдә рекомендацияләү", "account.follow": "Языл", "account.followers": "Язылучылар", "account.followers.empty": "Әле беркем дә язылмаган.", @@ -23,12 +23,12 @@ "account.follows.empty": "Беркемгә дә язылмаган әле.", "account.follows_you": "Сезгә язылган", "account.hide_reblogs": "Hide boosts from @{name}", - "account.joined": "Joined {date}", + "account.joined": "{date} көнендә теркәлде", "account.link_verified_on": "Ownership of this link was checked on {date}", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.locked_info": "Бу - ябык аккаунт. Аны язылучылар гына күрә ала.", "account.media": "Медиа", "account.mention": "@{name} искәртү", - "account.moved_to": "{name} has moved to:", + "account.moved_to": "{name} монда күчте:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", @@ -70,7 +70,7 @@ "column.blocks": "Blocked users", "column.bookmarks": "Кыстыргычлар", "column.community": "Local timeline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Blocked domains", "column.favourites": "Favourites", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Активлык", + "emoji_button.clear": "Clear", "emoji_button.custom": "Куелган", "emoji_button.flags": "Байраклар", "emoji_button.food": "Food & Drink", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no blocked domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Тасвирлама", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Киләсе", "lightbox.previous": "Алдагы", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Исемлектән бетерергә", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Кыстыргычлар", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Профильны үзгәртү", diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json index 09d473ef4..7b041a208 100644 --- a/app/javascript/mastodon/locales/ug.json +++ b/app/javascript/mastodon/locales/ug.json @@ -70,7 +70,7 @@ "column.blocks": "Blocked users", "column.bookmarks": "Bookmarks", "column.community": "Local timeline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Blocked domains", "column.favourites": "Favourites", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", + "emoji_button.clear": "Clear", "emoji_button.custom": "Custom", "emoji_button.flags": "Flags", "emoji_button.food": "Food & Drink", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no blocked domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "Edit profile", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 16d4e0b3b..d7e8a446f 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -6,30 +6,30 @@ "account.block": "Заблокувати @{name}", "account.block_domain": "Заблокувати домен {domain}", "account.blocked": "Заблоковані", - "account.browse_more_on_origin_server": "Переглянути більше в оригіналі", + "account.browse_more_on_origin_server": "Переглянути більше в оригінальному профілі", "account.cancel_follow_request": "Скасувати запит на підписку", - "account.direct": "Пряме повідомлення @{name}", + "account.direct": "Надіслати пряме повідомлення @{name}", "account.disable_notifications": "Не повідомляти мене про дописи @{name}", - "account.domain_blocked": "Домен приховано", + "account.domain_blocked": "Домен заблоковано", "account.edit_profile": "Редагувати профіль", "account.enable_notifications": "Повідомляти мене про дописи @{name}", - "account.endorse": "Публікувати у профілі", + "account.endorse": "Рекомендувати у профілі", "account.follow": "Підписатися", "account.followers": "Підписники", - "account.followers.empty": "Ніхто ще не підписався на цього користувача.", - "account.followers_counter": "{count, plural, one {{counter} Підписник} few {{counter} Підписники} many {{counter} Підписників} other {{counter} Підписники}}", - "account.following": "Стежите", - "account.following_counter": "{count, plural, one {{counter} Підписка} few {{counter} Підписки} many {{counter} Підписок} other {{counter} Підписки}}", + "account.followers.empty": "Ніхто ще не підписаний на цього користувача.", + "account.followers_counter": "{count, plural, one {{counter} підписник} few {{counter} підписника} many {{counter} підписників} other {{counter} підписники}}", + "account.following": "Ви стежите", + "account.following_counter": "{count, plural, one {{counter} підписка} few {{counter} підписки} many {{counter} підписок} other {{counter} підписки}}", "account.follows.empty": "Цей користувач ще ні на кого не підписався.", - "account.follows_you": "Підписаний(-а) на вас", - "account.hide_reblogs": "Сховати передмухи від @{name}", - "account.joined": "Долучення {date}", + "account.follows_you": "Підписані на вас", + "account.hide_reblogs": "Сховати поширення від @{name}", + "account.joined": "Долучилися {date}", "account.link_verified_on": "Права власності на це посилання були перевірені {date}", - "account.locked_info": "Статус конфіденційності цього облікового запису встановлено у заблокований. Власник вручну переглядає, хто може за ним стежити.", + "account.locked_info": "Це закритий обліковий запис. Власник вручну обирає, хто може на нього підписуватися.", "account.media": "Медіа", "account.mention": "Згадати @{name}", "account.moved_to": "{name} переїхав на:", - "account.mute": "Нехтувати @{name}", + "account.mute": "Приховати @{name}", "account.mute_notifications": "Не показувати сповіщення від @{name}", "account.muted": "Нехтується", "account.posts": "Дмухи", @@ -48,38 +48,38 @@ "account.unmute_notifications": "Показувати сповіщення від @{name}", "account.unmute_short": "Не нехтувати", "account_note.placeholder": "Коментарі відсутні", - "admin.dashboard.daily_retention": "User retention rate by day after sign-up", - "admin.dashboard.monthly_retention": "User retention rate by month after sign-up", + "admin.dashboard.daily_retention": "Щоденний показник утримання користувачів після реєстрації", + "admin.dashboard.monthly_retention": "Щомісячний показник утримання користувачів після реєстрації", "admin.dashboard.retention.average": "Середнє", "admin.dashboard.retention.cohort": "Місяць реєстрації", "admin.dashboard.retention.cohort_size": "Нові користувачі", "alert.rate_limited.message": "Спробуйте ще раз через {retry_time, time, medium}.", "alert.rate_limited.title": "Швидкість обмежена", - "alert.unexpected.message": "Трапилась неочікувана помилка.", + "alert.unexpected.message": "Сталася неочікувана помилка.", "alert.unexpected.title": "Ой!", "announcement.announcement": "Оголошення", "attachments_list.unprocessed": "(не оброблено)", "autosuggest_hashtag.per_week": "{count} в тиждень", "boost_modal.combo": "Ви можете натиснути {combo}, щоб пропустити це наступного разу", - "bundle_column_error.body": "Щось пішло не так під час завантаження компоненту.", + "bundle_column_error.body": "Щось пішло не так під час завантаження цього компоненту.", "bundle_column_error.retry": "Спробуйте ще раз", "bundle_column_error.title": "Помилка мережі", "bundle_modal_error.close": "Закрити", - "bundle_modal_error.message": "Щось пішло не так під час завантаження компоненту.", + "bundle_modal_error.message": "Щось пішло не так під час завантаження цього компоненту.", "bundle_modal_error.retry": "Спробувати ще раз", "column.blocks": "Заблоковані користувачі", "column.bookmarks": "Закладки", "column.community": "Локальна стрічка", - "column.conversations": "Бесіди", + "column.direct": "Прямі повідомлення", "column.directory": "Переглянути профілі", - "column.domain_blocks": "Приховані домени", + "column.domain_blocks": "Заблоковані домени", "column.favourites": "Вподобане", "column.follow_requests": "Запити на підписку", "column.home": "Головна", "column.lists": "Списки", "column.mutes": "Нехтувані користувачі", "column.notifications": "Сповіщення", - "column.pins": "Закріплені дмухи", + "column.pins": "Закріплені дописи", "column.public": "Глобальна стрічка", "column_back_button.label": "Назад", "column_header.hide_settings": "Приховати налаштування", @@ -89,22 +89,24 @@ "column_header.show_settings": "Показати налаштування", "column_header.unpin": "Відкріпити", "column_subheading.settings": "Налаштування", - "community.column_settings.local_only": "Тільки локальні", - "community.column_settings.media_only": "Тільки медіа", - "community.column_settings.remote_only": "Тільки видалені", + "community.column_settings.local_only": "Лише локальні", + "community.column_settings.media_only": "Лише з медіа", + "community.column_settings.remote_only": "Лише віддалені", + "compose.language.change": "Змінити мову", + "compose.language.search": "Шукати мови...", "compose_form.direct_message_warning_learn_more": "Дізнатися більше", - "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", - "compose_form.hashtag_warning": "Цей дмух не буде відображений у жодній стрічці хештеґу, оскільки він прихований. Тільки публічні дмухи можуть бути знайдені за хештеґом.", - "compose_form.lock_disclaimer": "Ваш акаунт не {locked}. Будь-який користувач може підписатися на вас та переглядати ваші приватні пости.", + "compose_form.encryption_warning": "Дописи на Mastodon не захищені шифруванням. Не поширюйте жодну потенційно небезпечну інформацію.", + "compose_form.hashtag_warning": "Цей допис не буде зображений у жодній стрічці гештеґу, оскільки він прихований. Тільки публічні дописи можуть бути знайдені за гештеґом.", + "compose_form.lock_disclaimer": "Ваш обліковий запис не {locked}. Будь-який користувач може підписатися на вас та переглядати ваші дописи для підписників.", "compose_form.lock_disclaimer.lock": "приватний", "compose_form.placeholder": "Що у вас на думці?", "compose_form.poll.add_option": "Додати варіант", "compose_form.poll.duration": "Тривалість опитування", "compose_form.poll.option_placeholder": "Варіант {number}", "compose_form.poll.remove_option": "Видалити цей варіант", - "compose_form.poll.switch_to_multiple": "Перемкнути у режим вибору декількох відповідей", + "compose_form.poll.switch_to_multiple": "Дозволити вибір декількох відповідей", "compose_form.poll.switch_to_single": "Перемкнути у режим вибору однієї відповіді", - "compose_form.publish": "Дмухнути", + "compose_form.publish": "Надіслати", "compose_form.publish_loud": "{publish}!", "compose_form.save_changes": "Зберегти зміни", "compose_form.sensitive.hide": "{count, plural, one {Позначити медіа делікатним} other {Позначити медіа делікатними}}", @@ -123,67 +125,68 @@ "confirmations.delete_list.message": "Ви впевнені, що хочете видалити цей список назавжди?", "confirmations.discard_edit_media.confirm": "Відкинути", "confirmations.discard_edit_media.message": "У вас є незбережені зміни в описі медіа або попереднього перегляду, все одно відкинути їх?", - "confirmations.domain_block.confirm": "Сховати весь домен", - "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати або нехтувати лише деяких користувачів. Ви не зможете бачити контент з цього домену у будь-яких стрічках або ваших сповіщеннях. Ваші підписники з цього домену будуть відписані від вас.", + "confirmations.domain_block.confirm": "Заблокувати весь домен", + "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати або приховати лише деяких користувачів. Ви не зможете бачити контент з цього домену у будь-яких стрічках або ваших сповіщеннях. Ваші підписники з цього домену будуть відписані від вас.", "confirmations.logout.confirm": "Вийти", "confirmations.logout.message": "Ви впевнені, що хочете вийти?", "confirmations.mute.confirm": "Нехтуавти", "confirmations.mute.explanation": "Це сховає дописи від них і дописи зі згадками про них, проте вони все одно матимуть змогу бачити ваші дописи й підписуватися на вас.", - "confirmations.mute.message": "Ви впевнені, що хочете нехтувати {name}?", - "confirmations.redraft.confirm": "Видалити та перестворити", - "confirmations.redraft.message": "Ви впевнені, що хочете видалити допис і перестворити його? Ви втратите всі відповіді, передмухи та вподобайки допису.", + "confirmations.mute.message": "Ви впевнені, що хочете приховати {name}?", + "confirmations.redraft.confirm": "Видалити та виправити", + "confirmations.redraft.message": "Ви впевнені, що хочете відредагувати допис? Ви втратите всі відповіді, поширення та вподобайки допису.", "confirmations.reply.confirm": "Відповісти", - "confirmations.reply.message": "Поточна відповідь перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?", + "confirmations.reply.message": "Нова відповідь перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?", "confirmations.unfollow.confirm": "Відписатися", "confirmations.unfollow.message": "Ви впевнені, що хочете відписатися від {name}?", - "conversation.delete": "Видалити цю бесіду", + "conversation.delete": "Видалити бесіду", "conversation.mark_as_read": "Позначити як прочитане", "conversation.open": "Переглянути бесіду", "conversation.with": "З {names}", "directory.federated": "З відомого федесвіту", - "directory.local": "Тільки з домену {domain}", + "directory.local": "Лише з домену {domain}", "directory.new_arrivals": "Нові надходження", - "directory.recently_active": "Активні нещодавно", - "embed.instructions": "Вбудуйте цей статус до вашого вебсайту, скопіювавши код нижче.", + "directory.recently_active": "Нещодавно активні", + "embed.instructions": "Вбудуйте цей допис до вашого вебсайту, скопіювавши код нижче.", "embed.preview": "Ось як він виглядатиме:", - "emoji_button.activity": "Заняття", - "emoji_button.custom": "Особливі", + "emoji_button.activity": "Діяльність", + "emoji_button.clear": "Очистити", + "emoji_button.custom": "Власні", "emoji_button.flags": "Прапори", "emoji_button.food": "Їжа та напої", - "emoji_button.label": "Вставити емодзі", + "emoji_button.label": "Вставити емоджі", "emoji_button.nature": "Природа", - "emoji_button.not_found": "Немає емодзі!! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "Немає емоджі!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "Предмети", "emoji_button.people": "Люди", "emoji_button.recent": "Часто використовувані", "emoji_button.search": "Шукати...", "emoji_button.search_results": "Результати пошуку", "emoji_button.symbols": "Символи", - "emoji_button.travel": "Подорожі", + "emoji_button.travel": "Подорожі та місця", "empty_column.account_suspended": "Обліковий запис заблоковано", - "empty_column.account_timeline": "Тут дмухалок немає!", + "empty_column.account_timeline": "Тут немає дописів!", "empty_column.account_unavailable": "Профіль недоступний", "empty_column.blocks": "Ви ще не заблокували жодного користувача.", - "empty_column.bookmarked_statuses": "У вас ще немає дмухів у закладках. Коли ви щось додасте до заклкдок, воно з'явиться тут.", + "empty_column.bookmarked_statuses": "У вас ще немає дописів у закладках. Коли ви щось додасте до закладок, воно з'явиться тут.", "empty_column.community": "Локальна стрічка пуста. Напишіть щось, щоб розігріти народ!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "У вас ще немає прямих повідомлень. Коли ви щось отримаєте чи надішлете, воно з'явиться тут.", "empty_column.domain_blocks": "Тут поки немає прихованих доменів.", - "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", - "empty_column.favourited_statuses": "У вас ще немає вподобаних дмухів. Коли ви щось вподобаєте, воно з'явиться тут.", - "empty_column.favourites": "Ніхто ще не вподобав цього дмуху. Коли хтось це зробить, вони з'являться тут.", - "empty_column.follow_recommendations": "Схоже, для вас не буде створено жодної пропозиції. Ви можете спробувати скористатися пошуком людей, яких ви можете знати або переглянути популярні хештеґи.", + "empty_column.explore_statuses": "Нема нічого популярного. Подивіться пізніше!", + "empty_column.favourited_statuses": "У вас ще немає вподобаних дописів. Коли ви щось вподобаєте, воно з'явиться тут.", + "empty_column.favourites": "Ніхто ще не вподобав цей допис. Коли хтось це зробить, він з'явиться тут.", + "empty_column.follow_recommendations": "Схоже, для вас не було створено жодної пропозиції. Ви можете спробувати скористатися пошуком людей, яких ви можете знати, або переглянути популярні гештеґи.", "empty_column.follow_requests": "У вас ще немає запитів на підписку. Коли ви їх отримаєте, вони з'являться тут.", - "empty_column.hashtag": "Дописів з цим хештегом поки не існує.", - "empty_column.home": "Ви поки ні на кого не підписані. Погортайте {public}, або скористуйтесь пошуком, щоб освоїтися та познайомитися з іншими користувачами.", + "empty_column.hashtag": "Дописів з цим гештеґом поки не існує.", + "empty_column.home": "Ваша стрічка порожня! Підпишіться на інших, щоб її заповнити. {suggestions}", "empty_column.home.suggestions": "Переглянути пропозиції", - "empty_column.list": "Немає нічого в цьому списку. Коли його учасники дмухнуть нові статуси, вони з'являться тут.", + "empty_column.list": "Цей список порожній. Коли його учасники додадуть нові дописи, вони з'являться тут.", "empty_column.lists": "У вас ще немає списків. Коли ви їх створите, вони з'являться тут.", "empty_column.mutes": "Ви ще не нехтуєте жодного користувача.", "empty_column.notifications": "У вас ще немає сповіщень. Переписуйтесь з іншими користувачами, щоб почати розмову.", - "empty_column.public": "Тут поки нічого немає! Опублікуйте щось, або вручну підпишіться на користувачів інших інстанцій, щоб заповнити стрічку", - "error.unexpected_crash.explanation": "Ця сторінка не може бути коректно відображена через баґ у нашому коді або через проблему сумісності браузера.", + "empty_column.public": "Тут поки нічого немає! Опублікуйте щось, або вручну підпишіться на користувачів інших серверів, щоб заповнити стрічку", + "error.unexpected_crash.explanation": "Через помилку у нашому коді або несумісність браузера, ця сторінка не може бути зображена коректно.", "error.unexpected_crash.explanation_addons": "Неможливо правильно показати цю сторінку. Ймовірно, цю помилку викликано додатком браузера або автоматичним засобом перекладу.", - "error.unexpected_crash.next_steps": "Спробуйте перезавантажити сторінку. Якщо це не допоможе, ви все ще зможете використовувати Mastodon через інший браузер або рідний додаток.", + "error.unexpected_crash.next_steps": "Спробуйте перезавантажити сторінку. Якщо це не допоможе, ви все ще зможете використовувати Mastodon через інший браузер або рідний застосунок.", "error.unexpected_crash.next_steps_addons": "Спробуйте їх вимкнути та оновити сторінку. Якщо це не допомагає, ви можете використовувати Mastodon через інший браузер або окремий застосунок.", "errors.unexpected_crash.copy_stacktrace": "Скопіювати трасування стека у буфер обміну", "errors.unexpected_crash.report_issue": "Повідомити про проблему", @@ -203,53 +206,53 @@ "getting_started.developers": "Розробникам", "getting_started.directory": "Каталог профілів", "getting_started.documentation": "Документація", - "getting_started.heading": "Ласкаво просимо", - "getting_started.invite": "Запросіть людей", - "getting_started.open_source_notice": "Mastodon — програма з відкритим сирцевим кодом. Ви можете допомогти проекту, або повідомити про проблеми на GitHub за адресою {github}.", - "getting_started.security": "Безпека", + "getting_started.heading": "Розпочати", + "getting_started.invite": "Запросити людей", + "getting_started.open_source_notice": "Mastodon — програма з відкритим сирцевим кодом. Ви можете допомогти проєкту, або повідомити про проблеми на GitHub: {github}.", + "getting_started.security": "Налаштування облікового запису", "getting_started.terms": "Умови використання", "hashtag.column_header.tag_mode.all": "та {additional}", "hashtag.column_header.tag_mode.any": "або {additional}", "hashtag.column_header.tag_mode.none": "без {additional}", - "hashtag.column_settings.select.no_options_message": "Не знайдено пропозицій", - "hashtag.column_settings.select.placeholder": "Введіть хештеґи…", - "hashtag.column_settings.tag_mode.all": "Усі ці", - "hashtag.column_settings.tag_mode.any": "Який-небудь з цих", - "hashtag.column_settings.tag_mode.none": "Жоден з цих", - "hashtag.column_settings.tag_toggle": "Додайте додаткові теґи до цього стовпчика", + "hashtag.column_settings.select.no_options_message": "Пропозицій не знайдено", + "hashtag.column_settings.select.placeholder": "Введіть гештеґи…", + "hashtag.column_settings.tag_mode.all": "Усе зі списку", + "hashtag.column_settings.tag_mode.any": "Який-небудь зі списку", + "hashtag.column_settings.tag_mode.none": "Жоден зі списку", + "hashtag.column_settings.tag_toggle": "Додати додаткові теґи до цього стовпчика", "home.column_settings.basic": "Основні", - "home.column_settings.show_reblogs": "Показувати передмухи", + "home.column_settings.show_reblogs": "Показувати поширення", "home.column_settings.show_replies": "Показувати відповіді", "home.hide_announcements": "Приховати оголошення", "home.show_announcements": "Показати оголошення", "intervals.full.days": "{number, plural, one {# день} few {# дні} other {# днів}}", "intervals.full.hours": "{number, plural, one {# година} few {# години} other {# годин}}", "intervals.full.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}}", - "keyboard_shortcuts.back": "переходити назад", - "keyboard_shortcuts.blocked": "відкрити список заблокованих користувачів", - "keyboard_shortcuts.boost": "передмухувати", - "keyboard_shortcuts.column": "фокусуватися на одній з колонок", - "keyboard_shortcuts.compose": "фокусуватися на полі введення", - "keyboard_shortcuts.conversations": "to open conversations column", + "keyboard_shortcuts.back": "Перейти назад", + "keyboard_shortcuts.blocked": "Відкрити список заблокованих користувачів", + "keyboard_shortcuts.boost": "Поширити допис", + "keyboard_shortcuts.column": "Фокусуватися на одній з колонок", + "keyboard_shortcuts.compose": "Фокусуватися на полі введення", "keyboard_shortcuts.description": "Опис", - "keyboard_shortcuts.down": "рухатися вниз стрічкою", - "keyboard_shortcuts.enter": "відкрити статус", - "keyboard_shortcuts.favourite": "вподобати", - "keyboard_shortcuts.favourites": "відкрити список улюбленого", - "keyboard_shortcuts.federated": "відкрити глобальну стрічку", - "keyboard_shortcuts.heading": "Гарячі клавіші", - "keyboard_shortcuts.home": "відкрити домашню стрічку", + "keyboard_shortcuts.direct": "щоб відкрити колонку прямих повідомлень", + "keyboard_shortcuts.down": "Рухатися вниз стрічкою", + "keyboard_shortcuts.enter": "Відкрити допис", + "keyboard_shortcuts.favourite": "Вподобати допис", + "keyboard_shortcuts.favourites": "Відкрити список вподобаного", + "keyboard_shortcuts.federated": "Відкрити глобальну стрічку", + "keyboard_shortcuts.heading": "Комбінації клавіш", + "keyboard_shortcuts.home": "Відкрити домашню стрічку", "keyboard_shortcuts.hotkey": "Гаряча клавіша", - "keyboard_shortcuts.legend": "показати підказку", - "keyboard_shortcuts.local": "відкрити локальну стрічку", - "keyboard_shortcuts.mention": "згадати автора", + "keyboard_shortcuts.legend": "Показати легенду", + "keyboard_shortcuts.local": "Відкрити локальну стрічку", + "keyboard_shortcuts.mention": "Згадати автора", "keyboard_shortcuts.muted": "Відкрити список нехтуваних користувачів", - "keyboard_shortcuts.my_profile": "відкрити ваш профіль", - "keyboard_shortcuts.notifications": "відкрити колонку сповіщень", - "keyboard_shortcuts.open_media": "відкрити медіа", - "keyboard_shortcuts.pinned": "відкрити список закріплених дмухів", - "keyboard_shortcuts.profile": "відкрити профіль автора", - "keyboard_shortcuts.reply": "відповісти", + "keyboard_shortcuts.my_profile": "Відкрити ваш профіль", + "keyboard_shortcuts.notifications": "Відкрити колонку сповіщень", + "keyboard_shortcuts.open_media": "Відкрити медіа", + "keyboard_shortcuts.pinned": "Відкрити список закріплених дописів", + "keyboard_shortcuts.profile": "Відкрити профіль автора", + "keyboard_shortcuts.reply": "Відповісти", "keyboard_shortcuts.requests": "відкрити список бажаючих підписатися", "keyboard_shortcuts.search": "сфокусуватися на пошуку", "keyboard_shortcuts.spoilers": "показати/приховати поле CW", @@ -264,6 +267,8 @@ "lightbox.expand": "Розгорнути поле перегляду зображень", "lightbox.next": "Далі", "lightbox.previous": "Назад", + "limited_account_hint.action": "Усе одно показати профіль", + "limited_account_hint.title": "Цей профіль прихований модераторами вашого сервера.", "lists.account.add": "Додати до списку", "lists.account.remove": "Видалити зі списку", "lists.delete": "Видалити список", @@ -285,41 +290,42 @@ "mute_modal.duration": "Тривалість", "mute_modal.hide_notifications": "Сховати сповіщення від користувача?", "mute_modal.indefinite": "Не визначено", - "navigation_bar.apps": "Мобільні додатки", + "navigation_bar.apps": "Мобільні застосунки", "navigation_bar.blocks": "Заблоковані користувачі", "navigation_bar.bookmarks": "Закладки", "navigation_bar.community_timeline": "Локальна стрічка", - "navigation_bar.compose": "Написати новий дмух", - "navigation_bar.discover": "Знайти", - "navigation_bar.domain_blocks": "Приховані домени", + "navigation_bar.compose": "Написати новий допис", + "navigation_bar.direct": "Прямі повідомлення", + "navigation_bar.discover": "Дослідити", + "navigation_bar.domain_blocks": "Заблоковані домени", "navigation_bar.edit_profile": "Редагувати профіль", "navigation_bar.explore": "Огляд", "navigation_bar.favourites": "Вподобане", "navigation_bar.filters": "Приховані слова", "navigation_bar.follow_requests": "Запити на підписку", - "navigation_bar.follows_and_followers": "Підписки і підписники", - "navigation_bar.info": "Про сайт", + "navigation_bar.follows_and_followers": "Підписки та підписники", + "navigation_bar.info": "Про цей сервер", "navigation_bar.keyboard_shortcuts": "Гарячі клавіші", "navigation_bar.lists": "Списки", "navigation_bar.logout": "Вийти", "navigation_bar.mutes": "Нехтувані користувачі", "navigation_bar.personal": "Особисте", - "navigation_bar.pins": "Закріплені дмухи", + "navigation_bar.pins": "Закріплені дописи", "navigation_bar.preferences": "Налаштування", "navigation_bar.public_timeline": "Глобальна стрічка", "navigation_bar.security": "Безпека", - "notification.admin.sign_up": "{name} приєднується", - "notification.favourite": "{name} вподобав(-ла) ваш допис", - "notification.follow": "{name} підписався(-лась) на вас", - "notification.follow_request": "{name} відправив(-ла) запит на підписку", - "notification.mention": "{name} згадав(-ла) вас", + "notification.admin.sign_up": "{name} приєдналися", + "notification.favourite": "{name} вподобали ваш допис", + "notification.follow": "{name} підписалися на вас", + "notification.follow_request": "{name} відправили запит на підписку", + "notification.mention": "{name} згадали вас", "notification.own_poll": "Ваше опитування завершено", "notification.poll": "Опитування, у якому ви голосували, закінчилося", - "notification.reblog": "{name} передмухнув(-ла) Ваш допис", + "notification.reblog": "{name} поширили ваш допис", "notification.status": "{name} щойно дописує", "notification.update": "{name} змінює допис", "notifications.clear": "Очистити сповіщення", - "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщеня?", + "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщення?", "notifications.column_settings.admin.sign_up": "Нові реєстрації:", "notifications.column_settings.alert": "Сповіщення на комп'ютері", "notifications.column_settings.favourite": "Вподобане:", @@ -360,22 +366,22 @@ "poll.total_people": "{count, plural, one {# особа} other {# осіб}}", "poll.total_votes": "{count, plural, one {# голос} few {# голоси} many {# голосів} other {# голосів}}", "poll.vote": "Проголосувати", - "poll.voted": "Ви голосували за цю відповідь", + "poll.voted": "Ви проголосували за цю відповідь", "poll.votes": "{votes, plural, one {# голос} few {# голоси} many {# голосів} other {# голоса}}", "poll_button.add_poll": "Додати опитування", "poll_button.remove_poll": "Видалити опитування", "privacy.change": "Змінити видимість допису", "privacy.direct.long": "Показати тільки згаданим користувачам", - "privacy.direct.short": "Лише люди, яких я згадую", + "privacy.direct.short": "Лише згадані люди", "privacy.private.long": "Показати тільки підписникам", "privacy.private.short": "Тільки для підписників", - "privacy.public.long": "Visible for all", + "privacy.public.long": "Видимий для всіх", "privacy.public.short": "Публічно", - "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", + "privacy.unlisted.long": "Видимий для всіх, але не через можливості виявлення", "privacy.unlisted.short": "Прихований", "refresh": "Оновити", "regeneration_indicator.label": "Завантаження…", - "regeneration_indicator.sublabel": "Ваша домашня стрічка готується!", + "regeneration_indicator.sublabel": "Хвилинку, ми готуємо вашу стрічку!", "relative_time.days": "{number}д", "relative_time.full.days": "{number, plural, one {# день} few {# дні} other {# днів}} тому", "relative_time.full.hours": "{number, plural, one {# година} few {# години} other {# годин}} тому", @@ -389,16 +395,16 @@ "relative_time.today": "сьогодні", "reply_indicator.cancel": "Відмінити", "report.block": "Заблокувати", - "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", + "report.block_explanation": "Ви не будете бачити дописи цього користувача, а вони не зможуть бачити ваші дописи або підписуватися на вас. Вони будуть бачити, що ви їх заблокували.", "report.categories.other": "Інше", "report.categories.spam": "Спам", "report.categories.violation": "Контент порушує одне або кілька правил сервера", "report.category.subtitle": "Оберіть найкращий збіг", - "report.category.title": "Tell us what's going on with this {type}", + "report.category.title": "Розкажіть нам, що не так з цим {type}", "report.category.title_account": "профіль", "report.category.title_status": "допис", "report.close": "Готово", - "report.comment.title": "Is there anything else you think we should know?", + "report.comment.title": "Чи є щось, що нам потрібно знати?", "report.forward": "Надіслати до {target}", "report.forward_hint": "Це акаунт з іншого серверу. Відправити анонімізовану копію скарги і туди?", "report.mute": "Нехтувати", @@ -406,25 +412,25 @@ "report.next": "Далі", "report.placeholder": "Додаткові коментарі", "report.reasons.dislike": "Мені це не подобається", - "report.reasons.dislike_description": "It is not something you want to see", + "report.reasons.dislike_description": "Вам би не хотілося це бачити", "report.reasons.other": "Це щось інше", - "report.reasons.other_description": "The issue does not fit into other categories", + "report.reasons.other_description": "Ця проблема не відповідає жодній іншій категорії", "report.reasons.spam": "Це спам", - "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies", + "report.reasons.spam_description": "Шкідливі посилання, фальшиві взаємодії, або повідомлення, що повторюються", "report.reasons.violation": "Порушує правила сервера", "report.reasons.violation_description": "Ви впевнені, що це порушує певні правила", "report.rules.subtitle": "Виберіть усі варіанти, що підходять", "report.rules.title": "Які правила порушено?", "report.statuses.subtitle": "Виберіть усі варіанти, що підходять", - "report.statuses.title": "Are there any posts that back up this report?", + "report.statuses.title": "Чи є дописи, які належать до цієї скарги?", "report.submit": "Відправити", "report.target": "Скаржимося на {target}", - "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:", - "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:", + "report.thanks.take_action": "Ось ваші варіанти управління тим, що ви бачите в Mastodon:", + "report.thanks.take_action_actionable": "Поки ми переглядаємо це, ви можете вжити власних заходів проти @{name}:", "report.thanks.title": "Не хочете це бачити?", "report.thanks.title_actionable": "Дякуємо за скаргу, ми розглянемо її.", "report.unfollow": "Відписатися від @{name}", - "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", + "report.unfollow_explanation": "Ви підписані на цього користувача. Щоб більше не бачити їхні дописи у вашій стрічці, відпишіться від них.", "search.placeholder": "Пошук", "search_popout.search_format": "Розширений формат пошуку", "search_popout.tips.full_text": "Пошук за текстом знаходить статуси, які ви написали, вподобали, передмухнули, або в яких вас згадували. Також він знаходить імена користувачів, реальні імена та хештеґи.", @@ -437,7 +443,7 @@ "search_results.hashtags": "Хештеґи", "search_results.nothing_found": "Нічого не вдалося знайти за цими пошуковими термінами", "search_results.statuses": "Дмухів", - "search_results.statuses_fts_disabled": "Пошук дмухів за вмістом недоступний на цьому сервері Mastodon.", + "search_results.statuses_fts_disabled": "Пошук дописів за вмістом недоступний на даному сервері Mastodon.", "search_results.total": "{count, number} {count, plural, one {результат} few {результати} many {результатів} other {результатів}}", "status.admin_account": "Відкрити інтерфейс модерації для @{name}", "status.admin_status": "Відкрити цей статус в інтерфейсі модерації", @@ -461,8 +467,8 @@ "status.media_hidden": "Медіа приховано", "status.mention": "Згадати @{name}", "status.more": "Більше", - "status.mute": "Нехтувати @{name}", - "status.mute_conversation": "Нехтувати діалог", + "status.mute": "Приховати @{name}", + "status.mute_conversation": "Ігнорувати діалог", "status.open": "Розгорнути допис", "status.pin": "Закріпити у профілі", "status.pinned": "Закріплений дмух", @@ -484,7 +490,7 @@ "status.show_more_all": "Показувати більше для всіх", "status.show_thread": "Показати ланцюжок", "status.uncached_media_warning": "Недоступно", - "status.unmute_conversation": "Не нехтувати діалог", + "status.unmute_conversation": "Не ігнорувати діалог", "status.unpin": "Відкріпити від профілю", "suggestions.dismiss": "Відхилити пропозицію", "suggestions.header": "Вас може зацікавити…", @@ -498,42 +504,42 @@ "time_remaining.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}}", "time_remaining.moments": "Залишилось секунд", "time_remaining.seconds": "{number, plural, one {# секунда} few {# секунди} other {# секунд}}", - "timeline_hint.remote_resource_not_displayed": "{resource} з інших серверів не відображається.", + "timeline_hint.remote_resource_not_displayed": "{resource} з інших серверів не зображується.", "timeline_hint.resources.followers": "Підписники", "timeline_hint.resources.follows": "Підписки", - "timeline_hint.resources.statuses": "Старіші дмухи", + "timeline_hint.resources.statuses": "Попередні дописи", "trends.counter_by_accounts": "{count, plural, one {{counter} особа обговорює} few {{counter} особи обговорюють} many {{counter} осіб обговорюють} other {{counter} особи обговорюють}}", "trends.trending_now": "Актуальні", "ui.beforeunload": "Вашу чернетку буде втрачено, якщо ви покинете Mastodon.", - "units.short.billion": "{count} млрд", - "units.short.million": "{count} млн", - "units.short.thousand": "{count} тис", + "units.short.billion": "{count} млрд.", + "units.short.million": "{count} млн.", + "units.short.thousand": "{count} тис.", "upload_area.title": "Перетягніть сюди, щоб завантажити", - "upload_button.label": "Додати медіа", + "upload_button.label": "Додати зображення, відео або аудіо", "upload_error.limit": "Ліміт завантаження файлів перевищено.", "upload_error.poll": "Не можна завантажувати файли до опитувань.", "upload_form.audio_description": "Опишіть для людей із вадами слуху", "upload_form.description": "Опишіть для людей з вадами зору", - "upload_form.description_missing": "Опису не додано", + "upload_form.description_missing": "Немає опису", "upload_form.edit": "Змінити", "upload_form.thumbnail": "Змінити мініатюру", "upload_form.undo": "Видалити", "upload_form.video_description": "Опишіть для людей із вадами слуху або зору", - "upload_modal.analyzing_picture": "Аналізуємо малюнок…", + "upload_modal.analyzing_picture": "Аналізуємо зображення…", "upload_modal.apply": "Застосувати", "upload_modal.applying": "Застосування…", "upload_modal.choose_image": "Вибрати зображення", "upload_modal.description_placeholder": "Щурячий бугай із їжаком-харцизом в'ючись підписали ґешефт у єнах", - "upload_modal.detect_text": "Виявити текст на малюнку", + "upload_modal.detect_text": "Виявити текст на зображенні", "upload_modal.edit_media": "Редагувати медіа", - "upload_modal.hint": "Клацніть або перетягніть коло на превью, щоб обрати точку, яку буде завжди видно на мініатюрах.", + "upload_modal.hint": "Клацніть або перетягніть коло на превʼю, щоб обрати точку, яку буде завжди видно на мініатюрах.", "upload_modal.preparing_ocr": "Підготовка OCR…", "upload_modal.preview_label": "Переглянути ({ratio})", "upload_progress.label": "Завантаження...", "video.close": "Закрити відео", - "video.download": "Завантаження файла", + "video.download": "Завантажити файл", "video.exit_fullscreen": "Вийти з повноекранного режиму", - "video.expand": "Розширити відео", + "video.expand": "Розгорнути відео", "video.fullscreen": "На весь екран", "video.hide": "Приховати відео", "video.mute": "Вимкнути звук", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index 42728af0f..d5ed07a9c 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -70,7 +70,7 @@ "column.blocks": "مسدود صارفین", "column.bookmarks": "بُک مارکس", "column.community": "مقامی زمانی جدول", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "مشخصات کا مطالعہ کریں", "column.domain_blocks": "پوشیدہ ڈومین", "column.favourites": "پسندیدہ", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "صرف مقامی", "community.column_settings.media_only": "وسائل فقط", "community.column_settings.remote_only": "صرف خارجی", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "مزید جانیں", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "چونکہ یہ ٹوٹ غیر مندرجہ ہے لہذا یہ کسی بھی ہیش ٹیگ کے تحت درج نہیں کیا جائے گا. ہیش ٹیگ کے تحت صرف \nعمومی ٹوٹ تلاش کئے جا سکتے ہیں.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "یہ اس طرح نظر آئے گا:", "emoji_button.activity": "سرگرمی", + "emoji_button.clear": "Clear", "emoji_button.custom": "حسب منشا", "emoji_button.flags": "پرچم", "emoji_button.food": "عذا و مشروب", @@ -166,7 +169,7 @@ "empty_column.blocks": "آپ نے ابھی کسی صارف کو مسدود نہیں کیا ہے.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "مقامی جدول خالی ہے. کچھ تحریر کریں تاکہ بات آگے بڑھے!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "ابھی تک کوئی چھپا ہوا ڈومین نہیں ہے.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "آپ کا کوئی پسندیدہ ٹوٹ نہیں ہے. جب آپ پسند کریں گے، یہاں نظر آئےگا.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "Add to list", "lists.account.remove": "Remove from list", "lists.delete": "Delete list", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "بُک مارکس", "navigation_bar.community_timeline": "مقامی ٹائم لائن", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "دریافت کریں", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "پروفائل میں ترمیم کریں", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 6692d2b21..e4e7c233b 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -70,7 +70,7 @@ "column.blocks": "Người đã chặn", "column.bookmarks": "Đã lưu", "column.community": "Máy chủ của bạn", - "column.conversations": "Thảo luận", + "column.direct": "Nhắn riêng", "column.directory": "Tìm người cùng sở thích", "column.domain_blocks": "Máy chủ đã chặn", "column.favourites": "Thích", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "Chỉ máy chủ của bạn", "community.column_settings.media_only": "Chỉ xem media", "community.column_settings.remote_only": "Chỉ người dùng ở máy chủ khác", + "compose.language.change": "Đổi ngôn ngữ", + "compose.language.search": "Tìm ngôn ngữ...", "compose_form.direct_message_warning_learn_more": "Tìm hiểu thêm", "compose_form.encryption_warning": "Các tút trên Mastodon không được mã hóa đầu cuối. Không chia sẻ bất kỳ thông tin nhạy cảm nào qua Mastodon.", "compose_form.hashtag_warning": "Tút này sẽ không xuất hiện công khai. Chỉ những tút công khai mới có thể được tìm kiếm thông qua hashtag.", @@ -118,7 +120,7 @@ "confirmations.block.confirm": "Chặn", "confirmations.block.message": "Bạn có thật sự muốn chặn {name}?", "confirmations.delete.confirm": "Xóa bỏ", - "confirmations.delete.message": "Bạn \bthật sự muốn xóa tút này?", + "confirmations.delete.message": "Bạn thật sự muốn xóa tút này?", "confirmations.delete_list.confirm": "Xóa bỏ", "confirmations.delete_list.message": "Bạn thật sự muốn xóa vĩnh viễn danh sách này?", "confirmations.discard_edit_media.confirm": "Bỏ qua", @@ -147,6 +149,7 @@ "embed.instructions": "Sao chép đoạn mã dưới đây và chèn vào trang web của bạn.", "embed.preview": "Nó sẽ hiển thị như vầy:", "emoji_button.activity": "Hoạt động", + "emoji_button.clear": "Xóa", "emoji_button.custom": "Độc đáo", "emoji_button.flags": "Cờ", "emoji_button.food": "Ăn uống", @@ -166,7 +169,7 @@ "empty_column.blocks": "Bạn chưa chặn bất cứ ai.", "empty_column.bookmarked_statuses": "Bạn chưa lưu tút nào. Nếu có, nó sẽ hiển thị ở đây.", "empty_column.community": "Máy chủ của bạn chưa có tút nào công khai. Bạn hãy thử viết gì đó đi!", - "empty_column.conversations": "Khi bạn gửi hoặc nhận một tút chỉ hiển thị với những người được nhắc đến trong đó, tút đó sẽ hiển thị ở đây.", + "empty_column.direct": "Bạn chưa có tin nhắn riêng nào. Khi bạn gửi hoặc nhận một tin nhắn riêng, nó sẽ xuất hiện ở đây.", "empty_column.domain_blocks": "Chưa ẩn bất kỳ máy chủ nào.", "empty_column.explore_statuses": "Chưa có xu hướng nào. Kiểm tra lại sau!", "empty_column.favourited_statuses": "Bạn chưa thích tút nào. Hãy thử đi, nó sẽ xuất hiện ở đây.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "đăng lại", "keyboard_shortcuts.column": "mở các mục", "keyboard_shortcuts.compose": "mở khung soạn tút", - "keyboard_shortcuts.conversations": "mở mục thảo luận", "keyboard_shortcuts.description": "Mô tả", + "keyboard_shortcuts.direct": "để mở cột tin nhắn", "keyboard_shortcuts.down": "di chuyển xuống dưới danh sách", "keyboard_shortcuts.enter": "viết tút mới", "keyboard_shortcuts.favourite": "thích", @@ -264,6 +267,8 @@ "lightbox.expand": "Phóng to hình", "lightbox.next": "Tiếp", "lightbox.previous": "Trước", + "limited_account_hint.action": "Vẫn cứ xem", + "limited_account_hint.title": "Người này bị ẩn bởi kiểm duyệt viên máy chủ.", "lists.account.add": "Thêm vào danh sách", "lists.account.remove": "Xóa khỏi danh sách", "lists.delete": "Xóa danh sách", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Đã lưu", "navigation_bar.community_timeline": "Cộng đồng", "navigation_bar.compose": "Viết tút mới", + "navigation_bar.direct": "Tin nhắn", "navigation_bar.discover": "Khám phá", "navigation_bar.domain_blocks": "Máy chủ đã ẩn", "navigation_bar.edit_profile": "Sửa hồ sơ", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "Hủy cuộc bình chọn", "privacy.change": "Thay đổi quyền riêng tư", "privacy.direct.long": "Chỉ người được nhắc đến mới thấy", - "privacy.direct.short": "Chỉ người tôi nhắc đến", + "privacy.direct.short": "Chỉ người được nhắc", "privacy.private.long": "Dành riêng cho người theo dõi", "privacy.private.short": "Chỉ người theo dõi", "privacy.public.long": "Hiển thị với mọi người", diff --git a/app/javascript/mastodon/locales/whitelist_en-GB.json b/app/javascript/mastodon/locales/whitelist_en-GB.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_en-GB.json @@ -0,0 +1,2 @@ +[ +] diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json index a6ddaab09..02b0ed563 100644 --- a/app/javascript/mastodon/locales/zgh.json +++ b/app/javascript/mastodon/locales/zgh.json @@ -70,7 +70,7 @@ "column.blocks": "ⵉⵏⵙⵙⵎⵔⵙⵏ ⵜⵜⵓⴳⴷⵍⵏⵉⵏ", "column.bookmarks": "Bookmarks", "column.community": "Local timeline", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "Browse profiles", "column.domain_blocks": "Blocked domains", "column.favourites": "ⵜⵓⴼⵓⵜⵉⵏ", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "ⵖⴰⵙ ⴰⴷⵖⴰⵔⴰⵏ", "community.column_settings.media_only": "ⵖⴰⵙ ⵉⵙⵏⵖⵎⵉⵙⵏ", "community.column_settings.remote_only": "Remote only", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "ⵙⵙⵏ ⵓⴳⴳⴰⵔ", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", @@ -147,6 +149,7 @@ "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", + "emoji_button.clear": "Clear", "emoji_button.custom": "Custom", "emoji_button.flags": "ⵉⵛⵏⵢⴰⵍⵏ", "emoji_button.food": "ⵓⵜⵛⵉ & ⵜⵉⵙⵙⵉ", @@ -166,7 +169,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "There are no blocked domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "to boost", "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -264,6 +267,8 @@ "lightbox.expand": "Expand image view box", "lightbox.next": "Next", "lightbox.previous": "Previous", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "ⵔⵏⵓ ⵖⵔ ⵜⵍⴳⴰⵎⵜ", "lists.account.remove": "ⴽⴽⵙ ⵙⴳ ⵜⵍⴳⴰⵎⵜ", "lists.delete": "ⴽⴽⵙ ⵜⴰⵍⴳⴰⵎⵜ", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "Bookmarks", "navigation_bar.community_timeline": "Local timeline", "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "ⵙⵏⴼⵍ ⵉⴼⵔⵙ", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 0195dee2e..d4b7db72a 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -24,19 +24,19 @@ "account.follows_you": "关注了你", "account.hide_reblogs": "隐藏来自 @{name} 的转贴", "account.joined": "加入于 {date}", - "account.link_verified_on": "此链接的所有权已在 {date} 被检查", - "account.locked_info": "此账户已锁嘟。账户所有者会手动审核关注申请。", + "account.link_verified_on": "此链接的所有权已在 {date} 检查", + "account.locked_info": "此账户已锁嘟。账户所有者会手动审核关注者。", "account.media": "媒体", "account.mention": "提及 @{name}", "account.moved_to": "{name} 已经迁移到:", "account.mute": "隐藏 @{name}", "account.mute_notifications": "隐藏来自 @{name} 的通知", "account.muted": "已隐藏", - "account.posts": "帖子", - "account.posts_with_replies": "帖子和回复", + "account.posts": "嘟文", + "account.posts_with_replies": "嘟文和回复", "account.report": "举报 @{name}", - "account.requested": "正在等待对方通过关注申请。点击以取消发送关注申请", - "account.share": "分享 @{name} 的用户简介", + "account.requested": "正在等待对方同意。点击以取消发送关注请求", + "account.share": "分享 @{name} 的个人资料页", "account.show_reblogs": "显示来自 @{name} 的转嘟", "account.statuses_counter": "{counter} 条嘟文", "account.unblock": "取消屏蔽 @{name}", @@ -46,7 +46,7 @@ "account.unfollow": "取消关注", "account.unmute": "不再隐藏 @{name}", "account.unmute_notifications": "不再隐藏来自 @{name} 的通知", - "account.unmute_short": "取消静音", + "account.unmute_short": "恢复消息提醒", "account_note.placeholder": "点击添加备注", "admin.dashboard.daily_retention": "注册后用户留存率(按日计算)", "admin.dashboard.monthly_retention": "注册后用户留存率(按月计算)", @@ -68,19 +68,19 @@ "bundle_modal_error.message": "载入这个组件时发生了错误。", "bundle_modal_error.retry": "重试", "column.blocks": "已屏蔽的用户", - "column.bookmarks": "收藏夹", + "column.bookmarks": "书签", "column.community": "本站时间轴", - "column.conversations": "会话", + "column.direct": "私信", "column.directory": "浏览用户资料", "column.domain_blocks": "已屏蔽的域名", "column.favourites": "喜欢", - "column.follow_requests": "关注申请", + "column.follow_requests": "关注请求", "column.home": "主页", "column.lists": "列表", "column.mutes": "已隐藏的用户", "column.notifications": "通知", - "column.pins": "置顶帖子", - "column.public": "跨站时间轴", + "column.pins": "置顶嘟文", + "column.public": "跨站公共时间轴", "column_back_button.label": "返回", "column_header.hide_settings": "隐藏设置", "column_header.moveLeft_settings": "将此栏左移", @@ -89,14 +89,16 @@ "column_header.show_settings": "显示设置", "column_header.unpin": "取消置顶", "column_subheading.settings": "设置", - "community.column_settings.local_only": "仅在本站显示", + "community.column_settings.local_only": "仅限本站", "community.column_settings.media_only": "仅限媒体", "community.column_settings.remote_only": "仅限外部", - "compose_form.direct_message_warning_learn_more": "了解更多", + "compose.language.change": "更改语言", + "compose.language.search": "搜索语言...", + "compose_form.direct_message_warning_learn_more": "了解详情", "compose_form.encryption_warning": "Mastodon 上的嘟文并未端到端加密。请不要在 Mastodon 上分享敏感信息。", - "compose_form.hashtag_warning": "此帖子被设置为“不公开”,因此它不会出现在任何话题标签的列表下。只有公开帖子才能通过话题标签进行搜索。", - "compose_form.lock_disclaimer": "你的账号没有{locked}。任何人在关注你后都能立即查看仅关注者可见的帖子。", - "compose_form.lock_disclaimer.lock": "锁嘟", + "compose_form.hashtag_warning": "这条嘟文被设置为“不公开”,因此它不会出现在任何话题标签的列表下。只有公开的嘟文才能通过话题标签进行搜索。", + "compose_form.lock_disclaimer": "你的帐户没有{locked}。任何人都可以在关注你后立即查看仅关注者可见的嘟文。", + "compose_form.lock_disclaimer.lock": "开启保护", "compose_form.placeholder": "在想些什么?", "compose_form.poll.add_option": "添加一个选项", "compose_form.poll.duration": "投票持续时间", @@ -107,46 +109,47 @@ "compose_form.publish": "嘟嘟", "compose_form.publish_loud": "{publish}!", "compose_form.save_changes": "保存更改", - "compose_form.sensitive.hide": "将媒体标记为敏感内容", - "compose_form.sensitive.marked": "媒体已被标记为敏感内容", + "compose_form.sensitive.hide": "{count, plural, one {将媒体标记为敏感内容} other {将媒体标记为敏感内容}}", + "compose_form.sensitive.marked": "{count, plural, one {媒体已被标记为敏感内容} other {媒体已被标记为敏感内容}}", "compose_form.sensitive.unmarked": "媒体未被标记为敏感内容", "compose_form.spoiler.marked": "移除内容警告", "compose_form.spoiler.unmarked": "添加内容警告", - "compose_form.spoiler_placeholder": "在此处写下内容警告", + "compose_form.spoiler_placeholder": "写下你的警告", "confirmation_modal.cancel": "取消", "confirmations.block.block_and_report": "屏蔽与举报", "confirmations.block.confirm": "屏蔽", "confirmations.block.message": "你确定要屏蔽 {name} 吗?", "confirmations.delete.confirm": "删除", - "confirmations.delete.message": "你确定要删除这个帖子吗?", + "confirmations.delete.message": "你确定要删除这条嘟文吗?", "confirmations.delete_list.confirm": "删除", "confirmations.delete_list.message": "你确定要永久删除此列表吗?", "confirmations.discard_edit_media.confirm": "丢弃", - "confirmations.discard_edit_media.message": "您还有未保存的媒体描述或预览修改,仍然要丢弃它们吗?", - "confirmations.domain_block.confirm": "隐藏所有来自此域名的内容", - "confirmations.domain_block.message": "你真的确定要屏蔽所有来自 {domain} 的内容吗?多数情况下,屏蔽或隐藏几个特定的用户就已经足够了。来自该域名的内容将不再出现在你的公共时间轴或通知列表里。来自该域名的关注者将会被移除。", + "confirmations.discard_edit_media.message": "您还有未保存的媒体描述或预览修改,仍然丢弃它们吗?", + "confirmations.domain_block.confirm": "屏蔽整个域名", + "confirmations.domain_block.message": "你真的确定要屏蔽所有来自 {domain} 的内容吗?多数情况下,屏蔽或隐藏几个特定的用户就已经足够了。来自该网站的内容将不再出现在你的任何公共时间轴或通知列表里。来自该网站的关注者将会被移除。", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "你确定要登出吗?", "confirmations.mute.confirm": "隐藏", - "confirmations.mute.explanation": "这将隐藏他们的嘟文以及提到他们的嘟文,但他们仍可以看到你的嘟文并关注你。", + "confirmations.mute.explanation": "这将隐藏来自他们的嘟文以及提到他们的嘟文,但他们仍可以看到你的嘟文并关注你。", "confirmations.mute.message": "你确定要隐藏 {name} 吗?", "confirmations.redraft.confirm": "删除并重新编辑", - "confirmations.redraft.message": "你确定要删除这条嘟文并重新编辑它吗?所有相关的转嘟和喜欢都会被清除,回复将失去与这条嘟文的关联。", + "confirmations.redraft.message": "你确定要删除这条嘟文并重新编辑它吗?所有相关的转嘟和喜欢都会被清除,回复将会失去关联。", "confirmations.reply.confirm": "回复", - "confirmations.reply.message": "回复此消息将会覆盖当前正在编辑的信息。仍要继续吗?", + "confirmations.reply.message": "回复此消息将会覆盖当前正在编辑的信息。确定继续吗?", "confirmations.unfollow.confirm": "取消关注", "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?", "conversation.delete": "删除对话", "conversation.mark_as_read": "标记为已读", "conversation.open": "查看对话", "conversation.with": "与 {names}", - "directory.federated": "来自联邦宇宙的已知部分", + "directory.federated": "来自已知联邦宇宙", "directory.local": "仅来自 {domain}", - "directory.new_arrivals": "新用户", + "directory.new_arrivals": "新来者", "directory.recently_active": "最近活跃", - "embed.instructions": "要在你的网站上嵌入此嘟文,请复制以下代码。", + "embed.instructions": "复制下列代码以在你的网站中嵌入此嘟文。", "embed.preview": "它会像这样显示出来:", "emoji_button.activity": "活动", + "emoji_button.clear": "清除", "emoji_button.custom": "自定义", "emoji_button.flags": "旗帜", "emoji_button.food": "食物和饮料", @@ -156,31 +159,31 @@ "emoji_button.objects": "物体", "emoji_button.people": "人物", "emoji_button.recent": "常用", - "emoji_button.search": "搜索……", + "emoji_button.search": "搜索…", "emoji_button.search_results": "搜索结果", "emoji_button.symbols": "符号", "emoji_button.travel": "旅行和地点", "empty_column.account_suspended": "账户已停用", - "empty_column.account_timeline": "这里没有帖子!", - "empty_column.account_unavailable": "用户资料不可用", + "empty_column.account_timeline": "这里没有嘟文!", + "empty_column.account_unavailable": "个人资料不可用", "empty_column.blocks": "你还未屏蔽任何用户。", - "empty_column.bookmarked_statuses": "你还未将任何帖子加入收藏夹。在你加入收藏夹后,帖子将显示在此。", + "empty_column.bookmarked_statuses": "你还没有给任何嘟文添加过书签。在你添加书签后,嘟文就会显示在这里。", "empty_column.community": "本站时间轴暂时没有内容,快写点什么让它动起来吧!", - "empty_column.conversations": "发送或收到仅对提及对象可见的嘟文后,就会显示在这里。", - "empty_column.domain_blocks": "目前没有被隐藏的站点。", + "empty_column.direct": "你还未使用过私信。当你发出或者收到私信时,它将显示在此。", + "empty_column.domain_blocks": "暂且没有被屏蔽的站点。", "empty_column.explore_statuses": "目前没有热门话题,稍后再来看看吧!", - "empty_column.favourited_statuses": "你还未喜欢过任何帖子。当你喜欢帖子时,它将显示在此。", + "empty_column.favourited_statuses": "你还没有喜欢过任何嘟文。喜欢过的嘟文会显示在这里。", "empty_column.favourites": "没有人喜欢过这条嘟文。如果有人喜欢了,就会显示在这里。", "empty_column.follow_recommendations": "似乎无法为你生成任何建议。你可以尝试使用搜索寻找你可能知道的人或探索热门标签。", - "empty_column.follow_requests": "你没有收到新的关注申请。收到后将显示在此。", + "empty_column.follow_requests": "你没有收到新的关注请求。收到后将显示在此。", "empty_column.hashtag": "这个话题标签下暂时没有内容。", "empty_column.home": "你的主页时间线是空的!快去关注更多人吧。 {suggestions}", "empty_column.home.suggestions": "查看一些建议", - "empty_column.list": "此列表中暂时没有内容。列表中用户所发送的的新嘟文将会显示在这里。", - "empty_column.lists": "你还没有创建过列表。你创建的列表会显示在这里。", + "empty_column.list": "此列表中暂时没有内容。列表中用户所发送的新嘟文将会在这里显示。", + "empty_column.lists": "你还没有创建过列表。你创建的列表会在这里显示。", "empty_column.mutes": "你没有隐藏任何用户。", "empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。", - "empty_column.public": "这里什么都没有!写一些公开帖子,或者关注来自其他服务器的用户后,这里就会有嘟文出现了", + "empty_column.public": "这里什么都没有!写一些公开的嘟文,或者关注其他服务器的用户后,这里就会有嘟文出现了", "error.unexpected_crash.explanation": "此页面无法正确显示,这可能是因为我们的代码中有错误,也可能是因为浏览器兼容问题。", "error.unexpected_crash.explanation_addons": "此页面无法正确显示,这个错误很可能是由浏览器附加组件或自动翻译工具造成的。", "error.unexpected_crash.next_steps": "刷新一下页面试试。如果没用,你可以换个浏览器或者用本地应用。", @@ -190,15 +193,15 @@ "explore.search_results": "搜索结果", "explore.suggested_follows": "为你推荐", "explore.title": "探索", - "explore.trending_links": "新闻", - "explore.trending_statuses": "帖子", + "explore.trending_links": "最新消息", + "explore.trending_statuses": "嘟文", "explore.trending_tags": "话题标签", "follow_recommendations.done": "完成", "follow_recommendations.heading": "关注你感兴趣的用户!这里有一些推荐。", - "follow_recommendations.lead": "你关注的人的帖子将按时间顺序显示在你的主页。 别担心,你可以随时取消关注!", + "follow_recommendations.lead": "你关注的人的嘟文将按时间顺序在你的主页上显示。 别担心,你可以随时取消关注!", "follow_request.authorize": "授权", "follow_request.reject": "拒绝", - "follow_requests.unlocked_explanation": "虽然你没有锁嘟,但是 {domain} 的管理人员觉得你可能想人工审核这些账号的关注申请。", + "follow_requests.unlocked_explanation": "尽管你没有锁嘟,但是 {domain} 的工作人员认为你也许会想手动审核审核这些账号的关注请求。", "generic.saved": "已保存", "getting_started.developers": "开发", "getting_started.directory": "用户目录", @@ -212,7 +215,7 @@ "hashtag.column_header.tag_mode.any": "或是 {additional}", "hashtag.column_header.tag_mode.none": "而不用 {additional}", "hashtag.column_settings.select.no_options_message": "没有找到建议", - "hashtag.column_settings.select.placeholder": "输入话题标签……", + "hashtag.column_settings.select.placeholder": "输入话题标签…", "hashtag.column_settings.tag_mode.all": "全部", "hashtag.column_settings.tag_mode.any": "任一", "hashtag.column_settings.tag_mode.none": "无一", @@ -226,37 +229,37 @@ "intervals.full.hours": "{number} 小时", "intervals.full.minutes": "{number} 分钟", "keyboard_shortcuts.back": "返回上一页", - "keyboard_shortcuts.blocked": "打开已屏蔽用户列表", + "keyboard_shortcuts.blocked": "打开被屏蔽用户列表", "keyboard_shortcuts.boost": "转嘟", "keyboard_shortcuts.column": "选择某栏", "keyboard_shortcuts.compose": "选择输入框", - "keyboard_shortcuts.conversations": "打开对话栏", "keyboard_shortcuts.description": "说明", + "keyboard_shortcuts.direct": "打开私信栏", "keyboard_shortcuts.down": "在列表中让光标下移", - "keyboard_shortcuts.enter": "展开帖子", - "keyboard_shortcuts.favourite": "喜欢帖子", - "keyboard_shortcuts.favourites": "打开喜欢的帖子列表", + "keyboard_shortcuts.enter": "展开嘟文", + "keyboard_shortcuts.favourite": "喜欢嘟文", + "keyboard_shortcuts.favourites": "打开喜欢的嘟文列表", "keyboard_shortcuts.federated": "打开跨站时间轴", "keyboard_shortcuts.heading": "快捷键列表", "keyboard_shortcuts.home": "打开主页时间轴", "keyboard_shortcuts.hotkey": "快捷键", "keyboard_shortcuts.legend": "显示此列表", "keyboard_shortcuts.local": "打开本站时间轴", - "keyboard_shortcuts.mention": "提及作者", - "keyboard_shortcuts.muted": "打开已隐藏用户列表", + "keyboard_shortcuts.mention": "提及嘟文作者", + "keyboard_shortcuts.muted": "打开已静音的用户列表", "keyboard_shortcuts.my_profile": "打开你的个人资料", "keyboard_shortcuts.notifications": "打开通知栏", "keyboard_shortcuts.open_media": "打开媒体", - "keyboard_shortcuts.pinned": "打开置顶帖子列表", + "keyboard_shortcuts.pinned": "打开置顶嘟文列表", "keyboard_shortcuts.profile": "打开作者的个人资料", - "keyboard_shortcuts.reply": "回复帖子", - "keyboard_shortcuts.requests": "打开关注申请列表", + "keyboard_shortcuts.reply": "回复嘟文", + "keyboard_shortcuts.requests": "打开关注请求列表", "keyboard_shortcuts.search": "选择搜索框", "keyboard_shortcuts.spoilers": "显示或隐藏被折叠的正文", "keyboard_shortcuts.start": "打开“开始使用”栏", "keyboard_shortcuts.toggle_hidden": "显示或隐藏被折叠的正文", "keyboard_shortcuts.toggle_sensitivity": "显示/隐藏媒体", - "keyboard_shortcuts.toot": "发布新帖子", + "keyboard_shortcuts.toot": "发送新嘟文", "keyboard_shortcuts.unfocus": "取消输入/搜索", "keyboard_shortcuts.up": "在列表中让光标上移", "lightbox.close": "关闭", @@ -264,6 +267,8 @@ "lightbox.expand": "放大查看图片", "lightbox.next": "下一个", "lightbox.previous": "上一个", + "limited_account_hint.action": "仍然显示个人资料", + "limited_account_hint.title": "此个人资料已被服务器监察员隐藏。", "lists.account.add": "添加到列表", "lists.account.remove": "从列表中移除", "lists.delete": "删除列表", @@ -283,41 +288,42 @@ "missing_indicator.label": "找不到内容", "missing_indicator.sublabel": "无法找到此资源", "mute_modal.duration": "持续时长", - "mute_modal.hide_notifications": "是否同时隐藏来自这个用户的通知?", + "mute_modal.hide_notifications": "同时隐藏来自这个用户的通知?", "mute_modal.indefinite": "无期限", "navigation_bar.apps": "移动应用", "navigation_bar.blocks": "已屏蔽的用户", - "navigation_bar.bookmarks": "收藏夹", + "navigation_bar.bookmarks": "书签", "navigation_bar.community_timeline": "本站时间轴", - "navigation_bar.compose": "撰写新帖子", + "navigation_bar.compose": "撰写新嘟文", + "navigation_bar.direct": "私信", "navigation_bar.discover": "发现", "navigation_bar.domain_blocks": "已屏蔽的域名", "navigation_bar.edit_profile": "修改个人资料", "navigation_bar.explore": "探索", "navigation_bar.favourites": "喜欢", "navigation_bar.filters": "隐藏关键词", - "navigation_bar.follow_requests": "关注申请", + "navigation_bar.follow_requests": "关注请求", "navigation_bar.follows_and_followers": "关注管理", - "navigation_bar.info": "关于此服务", + "navigation_bar.info": "关于本站", "navigation_bar.keyboard_shortcuts": "快捷键列表", "navigation_bar.lists": "列表", "navigation_bar.logout": "登出", "navigation_bar.mutes": "已隐藏的用户", "navigation_bar.personal": "个人", - "navigation_bar.pins": "置顶帖子", - "navigation_bar.preferences": "偏好", - "navigation_bar.public_timeline": "跨站时间轴", + "navigation_bar.pins": "置顶嘟文", + "navigation_bar.preferences": "首选项", + "navigation_bar.public_timeline": "跨站公共时间轴", "navigation_bar.security": "安全", - "notification.admin.sign_up": "{name} 已被注册", - "notification.favourite": "{name} 喜欢了你的帖子", + "notification.admin.sign_up": "{name} 注册了", + "notification.favourite": "{name} 喜欢了你的嘟文", "notification.follow": "{name} 开始关注你", "notification.follow_request": "{name} 向你发送了关注请求", "notification.mention": "{name} 提及了你", "notification.own_poll": "你的投票已经结束", "notification.poll": "你参与的一个投票已经结束", - "notification.reblog": "{name} 转发了你的帖子", - "notification.status": "{name} 刚刚发帖", - "notification.update": "{name} 编辑了帖子", + "notification.reblog": "{name} 转嘟了你的嘟文", + "notification.status": "{name} 刚刚发嘟", + "notification.update": "{name} 编辑了嘟文", "notifications.clear": "清空通知列表", "notifications.clear_confirmation": "你确定要永久清空通知列表吗?", "notifications.column_settings.admin.sign_up": "新注册:", @@ -327,19 +333,19 @@ "notifications.column_settings.filter_bar.category": "快速过滤栏", "notifications.column_settings.filter_bar.show_bar": "显示过滤栏", "notifications.column_settings.follow": "新关注者:", - "notifications.column_settings.follow_request": "新关注申请:", + "notifications.column_settings.follow_request": "新关注请求:", "notifications.column_settings.mention": "提及:", "notifications.column_settings.poll": "投票结果:", "notifications.column_settings.push": "推送通知", - "notifications.column_settings.reblog": "转发:", + "notifications.column_settings.reblog": "转嘟:", "notifications.column_settings.show": "在通知栏显示", "notifications.column_settings.sound": "播放音效", - "notifications.column_settings.status": "新帖:", + "notifications.column_settings.status": "新嘟文:", "notifications.column_settings.unread_notifications.category": "未读通知", "notifications.column_settings.unread_notifications.highlight": "高亮显示未读通知", "notifications.column_settings.update": "编辑:", "notifications.filter.all": "全部", - "notifications.filter.boosts": "转发", + "notifications.filter.boosts": "转嘟", "notifications.filter.favourites": "喜欢", "notifications.filter.follows": "关注", "notifications.filter.mentions": "提及", @@ -348,9 +354,9 @@ "notifications.grant_permission": "授予权限", "notifications.group": "{count} 条通知", "notifications.mark_as_read": "将所有通知标为已读", - "notifications.permission_denied": "由于权限不可用,无法启用桌面通知。", + "notifications.permission_denied": "由于权限被拒绝,无法启用桌面通知。", "notifications.permission_denied_alert": "由于在此之前浏览器权限请求就已被拒绝,所以启用桌面通知失败", - "notifications.permission_required": "未授予所需权限,所以桌面通知不可用", + "notifications.permission_required": "所需权限未被授予,所以桌面通知不可用", "notifications_permission_banner.enable": "启用桌面通知", "notifications_permission_banner.how_to_control": "启用桌面通知以在 Mastodon 未打开时接收通知。你可以通过交互通过上面的 {icon} 按钮来精细控制可以发送桌面通知的交互类型。", "notifications_permission_banner.title": "精彩不容错过", @@ -364,15 +370,15 @@ "poll.votes": "{votes, plural, one {# 票} other {# 票}}", "poll_button.add_poll": "发起投票", "poll_button.remove_poll": "移除投票", - "privacy.change": "设置帖子的可见范围", + "privacy.change": "设置嘟文的可见范围", "privacy.direct.long": "只有被提及的用户能看到", - "privacy.direct.short": "仅对提及的人可见", + "privacy.direct.short": "仅提到的人", "privacy.private.long": "仅关注者可见", "privacy.private.short": "仅对关注者可见", "privacy.public.long": "所有人可见", "privacy.public.short": "公开", "privacy.unlisted.long": "对所有人可见,但不加入探索功能", - "privacy.unlisted.short": "非公开", + "privacy.unlisted.short": "不公开", "refresh": "刷新", "regeneration_indicator.label": "加载中……", "regeneration_indicator.sublabel": "你的主页动态正在准备中!", @@ -389,20 +395,20 @@ "relative_time.today": "今天", "reply_indicator.cancel": "取消", "report.block": "屏蔽", - "report.block_explanation": "你将看不到他们的帖子。他们也将无法看到你的帖子或关注你。他们将能够判断他们被屏蔽了。", + "report.block_explanation": "你将无法看到他们的帖子。他们也将无法看到你的帖子或关注你。他们将能够判断出他们被屏蔽了。", "report.categories.other": "其他", "report.categories.spam": "垃圾信息", "report.categories.violation": "内容违反一条或多条服务器规则", "report.category.subtitle": "选择最佳匹配", "report.category.title": "告诉我们这个 {type} 的情况", "report.category.title_account": "个人资料", - "report.category.title_status": "帖子", + "report.category.title_status": "嘟文", "report.close": "完成", "report.comment.title": "还有什么你认为我们应该知道的吗?", "report.forward": "转发举报至 {target}", "report.forward_hint": "这名用户来自另一个服务器。是否要向那个服务器发送一条匿名的举报?", - "report.mute": "静音", - "report.mute_explanation": "你将不会看到他们的嘟文。他们仍然可以关注你并看到你的帖子,但他们不会知道他们被静音了。", + "report.mute": "隐藏", + "report.mute_explanation": "你将不会看到他们的嘟文。他们仍然可以关注你并看到你的嘟文,但他们不会知道你忽略了来自他们的信息。", "report.next": "下一步", "report.placeholder": "备注", "report.reasons.dislike": "我不喜欢它", @@ -429,14 +435,14 @@ "search_popout.search_format": "高级搜索格式", "search_popout.tips.full_text": "输入关键词检索所有你发送、喜欢、转嘟过或提及到你的帖子,以及其他用户公开的用户名、昵称和话题标签。", "search_popout.tips.hashtag": "话题标签", - "search_popout.tips.status": "帖子", + "search_popout.tips.status": "嘟文", "search_popout.tips.text": "输入关键词检索昵称、用户名和话题标签", "search_popout.tips.user": "用户", "search_results.accounts": "用户", "search_results.all": "全部", "search_results.hashtags": "话题标签", "search_results.nothing_found": "无法找到符合这些搜索词的任何内容", - "search_results.statuses": "帖子", + "search_results.statuses": "嘟文", "search_results.statuses_fts_disabled": "此 Mastodon 服务器未启用帖子内容搜索。", "search_results.total": "共 {count, number} 个结果", "status.admin_account": "打开 @{name} 的管理界面", @@ -444,8 +450,8 @@ "status.block": "屏蔽 @{name}", "status.bookmark": "添加到书签", "status.cancel_reblog_private": "取消转贴", - "status.cannot_reblog": "此贴不允许被转贴", - "status.copy": "复制帖子链接", + "status.cannot_reblog": "这条嘟文不允许被转嘟", + "status.copy": "复制嘟文链接", "status.delete": "删除", "status.detailed_status": "详细的对话视图", "status.direct": "私信 @{name}", @@ -462,15 +468,15 @@ "status.mention": "提及 @{name}", "status.more": "更多", "status.mute": "隐藏 @{name}", - "status.mute_conversation": "将此对话静音", - "status.open": "展开此贴", + "status.mute_conversation": "禁用此对话的消息提醒", + "status.open": "展开嘟文", "status.pin": "在个人资料页面置顶", - "status.pinned": "置顶帖子", + "status.pinned": "置顶嘟文", "status.read_more": "查看更多", - "status.reblog": "转贴", - "status.reblog_private": "转贴(可见者不变)", - "status.reblogged_by": "{name} 转贴了", - "status.reblogs.empty": "没有人转贴过此贴。如果有人转贴了将显示在此。", + "status.reblog": "转嘟", + "status.reblog_private": "转嘟(可见者不变)", + "status.reblogged_by": "{name} 转嘟了", + "status.reblogs.empty": "没有人转嘟过此条嘟文。如果有人转嘟了,就会显示在这里。", "status.redraft": "删除并重新编辑", "status.remove_bookmark": "移除书签", "status.reply": "回复", @@ -484,7 +490,7 @@ "status.show_more_all": "显示全部内容", "status.show_thread": "显示全部对话", "status.uncached_media_warning": "暂不可用", - "status.unmute_conversation": "将此对话解除静音", + "status.unmute_conversation": "恢复此对话的通知提醒", "status.unpin": "在个人资料页面取消置顶", "suggestions.dismiss": "关闭建议", "suggestions.header": "你可能会感兴趣…", @@ -501,7 +507,7 @@ "timeline_hint.remote_resource_not_displayed": "不会显示来自其它服务器的 {resource}", "timeline_hint.resources.followers": "关注者", "timeline_hint.resources.follows": "关注", - "timeline_hint.resources.statuses": "更早的帖子", + "timeline_hint.resources.statuses": "更早的嘟文", "trends.counter_by_accounts": "{count, plural, one {{counter} 人} other {{counter} 人}}正在讨论", "trends.trending_now": "现在流行", "ui.beforeunload": "如果你现在离开 Mastodon,你的草稿内容将会丢失。", @@ -539,5 +545,5 @@ "video.mute": "静音", "video.pause": "暂停", "video.play": "播放", - "video.unmute": "取消静音" + "video.unmute": "解除禁音" } diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 45e030833..dc0b794dd 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -70,7 +70,7 @@ "column.blocks": "封鎖名單", "column.bookmarks": "書籤", "column.community": "本站時間軸", - "column.conversations": "Conversations", + "column.direct": "Direct messages", "column.directory": "瀏覽個人資料", "column.domain_blocks": "封鎖的服務站", "column.favourites": "最愛的文章", @@ -92,6 +92,8 @@ "community.column_settings.local_only": "只顯示本站", "community.column_settings.media_only": "只顯示多媒體", "community.column_settings.remote_only": "只顯示外站", + "compose.language.change": "Change language", + "compose.language.search": "Search languages...", "compose_form.direct_message_warning_learn_more": "了解更多", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.hashtag_warning": "這文章因為不是公開,所以不會被標籤搜索。只有公開的文章才會被標籤搜索。", @@ -147,6 +149,7 @@ "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。", "embed.preview": "看上去會是這樣:", "emoji_button.activity": "活動", + "emoji_button.clear": "Clear", "emoji_button.custom": "自訂", "emoji_button.flags": "旗幟", "emoji_button.food": "飲飲食食", @@ -166,7 +169,7 @@ "empty_column.blocks": "你還沒有封鎖任何使用者。", "empty_column.bookmarked_statuses": "你還沒建立任何書籤。這裡將會顯示你建立的書籤。", "empty_column.community": "本站時間軸暫時未有內容,快寫一點東西來搶頭香啊!", - "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", "empty_column.domain_blocks": "尚未隱藏任何網域。", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "你還沒收藏任何文章。這裡將會顯示你收藏的嘟文。", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "轉推", "keyboard_shortcuts.column": "把標示移動到其中一列", "keyboard_shortcuts.compose": "把標示移動到文字輸入區", - "keyboard_shortcuts.conversations": "to open conversations column", "keyboard_shortcuts.description": "描述", + "keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.down": "在列表往下移動", "keyboard_shortcuts.enter": "打開文章", "keyboard_shortcuts.favourite": "收藏文章", @@ -264,6 +267,8 @@ "lightbox.expand": "擴大檢視", "lightbox.next": "下一頁", "lightbox.previous": "上一頁", + "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile has been hidden by the moderators of your server.", "lists.account.add": "新增到列表", "lists.account.remove": "從列表刪除", "lists.delete": "刪除列表", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "書籤", "navigation_bar.community_timeline": "本站時間軸", "navigation_bar.compose": "撰寫新文章", + "navigation_bar.direct": "Direct messages", "navigation_bar.discover": "探索", "navigation_bar.domain_blocks": "封鎖的服務站", "navigation_bar.edit_profile": "修改個人資料", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 811e998bb..17d0b9998 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -25,7 +25,7 @@ "account.hide_reblogs": "隱藏來自 @{name} 的轉嘟", "account.joined": "加入於 {date}", "account.link_verified_on": "已在 {date} 檢查此連結的擁有者權限", - "account.locked_info": "此帳戶的隱私狀態被設為鎖定。該擁有者會手動審核能跟隨此帳戶的人。", + "account.locked_info": "此帳戶的隱私狀態被設為鎖定。該擁有者會手動審核能跟隨此帳號的人。", "account.media": "媒體", "account.mention": "提及 @{name}", "account.moved_to": "{name} 已遷移至:", @@ -70,7 +70,7 @@ "column.blocks": "已封鎖的使用者", "column.bookmarks": "書籤", "column.community": "本站時間軸", - "column.conversations": "對話", + "column.direct": "私訊", "column.directory": "瀏覽個人檔案", "column.domain_blocks": "已封鎖的網域", "column.favourites": "最愛", @@ -92,10 +92,12 @@ "community.column_settings.local_only": "只有本站", "community.column_settings.media_only": "只有媒體", "community.column_settings.remote_only": "只有遠端", + "compose.language.change": "變更語言", + "compose.language.search": "搜尋語言...", "compose_form.direct_message_warning_learn_more": "了解更多", "compose_form.encryption_warning": "Mastodon 上的嘟文並未端到端加密。請不要透過 Mastodon 分享任何敏感資訊。", "compose_form.hashtag_warning": "由於這則嘟文設定為「不公開」,它將不會被列於任何主題標籤下。只有公開的嘟文才能藉由主題標籤找到。", - "compose_form.lock_disclaimer": "您的帳戶尚未 {locked}。任何人都能關注您並看到您設定成只有跟隨者能看的嘟文。", + "compose_form.lock_disclaimer": "您的帳號尚未 {locked}。任何人皆能跟隨您並看到您設定成只有跟隨者能看的嘟文。", "compose_form.lock_disclaimer.lock": "上鎖", "compose_form.placeholder": "正在想些什麼嗎?", "compose_form.poll.add_option": "新增選項", @@ -124,7 +126,7 @@ "confirmations.discard_edit_media.confirm": "捨棄", "confirmations.discard_edit_media.message": "您在媒體描述或預覽區塊有未儲存的變更。是否要捨棄這些變更?", "confirmations.domain_block.confirm": "隱藏整個域名", - "confirmations.domain_block.message": "真的非常確定封鎖整個 {domain} 網域嗎?大部分情況下,您只需要封鎖或靜音少數特定的帳帳戶能滿足需求了。您將不能在任何公開的時間軸及通知中看到來自此網域的內容。您來自該網域的跟隨者也將被移除。", + "confirmations.domain_block.message": "真的非常確定封鎖整個 {domain} 網域嗎?大部分情況下,您只需要封鎖或靜音少數特定的帳號能滿足需求了。您將不能在任何公開的時間軸及通知中看到來自此網域的內容。您來自該網域的跟隨者也將被移除。", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "您確定要登出嗎?", "confirmations.mute.confirm": "靜音", @@ -147,6 +149,7 @@ "embed.instructions": "要在您的網站嵌入此嘟文,請複製以下程式碼。", "embed.preview": "它將顯示成這樣:", "emoji_button.activity": "活動", + "emoji_button.clear": "清除", "emoji_button.custom": "自訂", "emoji_button.flags": "旗幟", "emoji_button.food": "食物 & 飲料", @@ -160,13 +163,13 @@ "emoji_button.search_results": "搜尋結果", "emoji_button.symbols": "符號", "emoji_button.travel": "旅遊與地點", - "empty_column.account_suspended": "帳戶被暫停", + "empty_column.account_suspended": "帳號被暫停", "empty_column.account_timeline": "這裡還沒有嘟文!", "empty_column.account_unavailable": "無法取得個人檔案", "empty_column.blocks": "您還沒有封鎖任何使用者。", "empty_column.bookmarked_statuses": "您還沒建立任何書籤。當您建立書簽時,它將於此顯示。", "empty_column.community": "本站時間軸是空的。快公開嘟些文搶頭香啊!", - "empty_column.conversations": "一旦您傳送或收到僅對其中提到之人可見的嘟文,就會在這邊顯示。", + "empty_column.direct": "您還沒有任何私訊。當您私訊別人或收到私訊時,它將於此顯示。", "empty_column.domain_blocks": "尚未封鎖任何網域。", "empty_column.explore_statuses": "目前沒有熱門討論,請稍候再回來看看!", "empty_column.favourited_statuses": "您還沒加過任何嘟文至最愛。當您收藏嘟文時,它將於此顯示。", @@ -198,7 +201,7 @@ "follow_recommendations.lead": "來自您跟隨的人之嘟文將會按時間順序顯示在您的首頁時間軸上。不要害怕犯錯,您隨時都可以取消跟隨其他人!", "follow_request.authorize": "授權", "follow_request.reject": "拒絕", - "follow_requests.unlocked_explanation": "即便您的帳戶未被鎖定,{domain} 的管理員認為您可能想要自己審核這些帳戶的跟隨請求。", + "follow_requests.unlocked_explanation": "即便您的帳號未被鎖定,{domain} 的管理員認為您可能想要自己審核這些帳號的跟隨請求。", "generic.saved": "已儲存", "getting_started.developers": "開發者", "getting_started.directory": "個人檔案目錄", @@ -206,7 +209,7 @@ "getting_started.heading": "開始使用", "getting_started.invite": "邀請使用者", "getting_started.open_source_notice": "Mastodon 是開源軟體。您可以在 GitHub {github} 上貢獻或是回報問題。", - "getting_started.security": "帳戶安全性設定", + "getting_started.security": "帳號安全性設定", "getting_started.terms": "服務條款", "hashtag.column_header.tag_mode.all": "以及 {additional}", "hashtag.column_header.tag_mode.any": "或是 {additional}", @@ -230,8 +233,8 @@ "keyboard_shortcuts.boost": "轉嘟", "keyboard_shortcuts.column": "將焦點放在其中一欄的嘟文", "keyboard_shortcuts.compose": "將焦點移至撰寫文字區塊", - "keyboard_shortcuts.conversations": "開啟對話欄", "keyboard_shortcuts.description": "說明", + "keyboard_shortcuts.direct": "開啟私訊欄", "keyboard_shortcuts.down": "在列表中往下移動", "keyboard_shortcuts.enter": "檢視嘟文", "keyboard_shortcuts.favourite": "加到最愛", @@ -264,6 +267,8 @@ "lightbox.expand": "展開圖片檢視框", "lightbox.next": "下一步", "lightbox.previous": "上一步", + "limited_account_hint.action": "一律顯示個人檔案", + "limited_account_hint.title": "此個人檔案已被您伺服器的管理員隱藏。", "lists.account.add": "新增至列表", "lists.account.remove": "從列表中移除", "lists.delete": "刪除列表", @@ -290,6 +295,7 @@ "navigation_bar.bookmarks": "書籤", "navigation_bar.community_timeline": "本站時間軸", "navigation_bar.compose": "撰寫新嘟文", + "navigation_bar.direct": "私訊", "navigation_bar.discover": "探索", "navigation_bar.domain_blocks": "隱藏的網域", "navigation_bar.edit_profile": "編輯個人檔案", @@ -366,7 +372,7 @@ "poll_button.remove_poll": "移除投票", "privacy.change": "調整嘟文隱私狀態", "privacy.direct.long": "只有被提及的使用者能看到", - "privacy.direct.short": "僅限於我提及的人", + "privacy.direct.short": "僅限提及的人", "privacy.private.long": "只有跟隨您的使用者能看到", "privacy.private.short": "僅限跟隨者", "privacy.public.long": "對所有人可見", @@ -400,7 +406,7 @@ "report.close": "已完成", "report.comment.title": "有什麼其他您想讓我們知道的嗎?", "report.forward": "轉寄到 {target}", - "report.forward_hint": "這個帳戶屬於其他伺服器。要像該伺服器發送匿名的檢舉訊息嗎?", + "report.forward_hint": "這個帳號屬於其他伺服器。要向該伺服器發送匿名的檢舉訊息嗎?", "report.mute": "靜音", "report.mute_explanation": "您將不再看到他們的嘟文。他們仍能可以跟隨您以及察看您的嘟文,並且不會知道他們已被靜音。", "report.next": "繼續", @@ -427,10 +433,10 @@ "report.unfollow_explanation": "您正在跟隨此帳號。如不欲於首頁時間軸再見到他們的嘟文,請取消跟隨。", "search.placeholder": "搜尋", "search_popout.search_format": "進階搜尋格式", - "search_popout.tips.full_text": "輸入簡單的文字,搜尋由您撰寫、最愛、轉嘟或提您的嘟文,以及與關鍵詞匹配的使用者名稱、帳戶顯示名稱和主題標籤。", + "search_popout.tips.full_text": "輸入簡單的文字,搜尋由您撰寫、最愛、轉嘟或提您的嘟文,以及與關鍵詞匹配的使用者名稱、帳號顯示名稱和主題標籤。", "search_popout.tips.hashtag": "主題標籤", "search_popout.tips.status": "嘟文", - "search_popout.tips.text": "輸入簡單的文字,搜尋符合的使用者名稱,帳戶名稱與標籤", + "search_popout.tips.text": "輸入簡單的文字,搜尋符合的使用者名稱,帳號名稱與標籤", "search_popout.tips.user": "使用者", "search_results.accounts": "使用者", "search_results.all": "全部", diff --git a/app/javascript/mastodon/reducers/accounts.js b/app/javascript/mastodon/reducers/accounts.js index 530ed8e60..b5589668c 100644 --- a/app/javascript/mastodon/reducers/accounts.js +++ b/app/javascript/mastodon/reducers/accounts.js @@ -1,4 +1,5 @@ -import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from '../actions/importer'; +import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from 'mastodon/actions/importer'; +import { ACCOUNT_REVEAL } from 'mastodon/actions/accounts'; import { Map as ImmutableMap, fromJS } from 'immutable'; const initialState = ImmutableMap(); @@ -10,6 +11,8 @@ const normalizeAccount = (state, account) => { delete account.following_count; delete account.statuses_count; + account.hidden = state.getIn([account.id, 'hidden']) === false ? false : account.limited; + return state.set(account.id, fromJS(account)); }; @@ -27,6 +30,8 @@ export default function accounts(state = initialState, action) { return normalizeAccount(state, action.account); case ACCOUNTS_IMPORT: return normalizeAccounts(state, action.accounts); + case ACCOUNT_REVEAL: + return state.setIn([action.id, 'hidden'], false); default: return state; } diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index ea882a71f..d7478c33d 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -28,6 +28,7 @@ import { COMPOSE_SPOILERNESS_CHANGE, COMPOSE_SPOILER_TEXT_CHANGE, COMPOSE_VISIBILITY_CHANGE, + COMPOSE_LANGUAGE_CHANGE, COMPOSE_COMPOSING_CHANGE, COMPOSE_EMOJI_INSERT, COMPOSE_UPLOAD_CHANGE_REQUEST, @@ -79,6 +80,7 @@ const initialState = ImmutableMap({ suggestions: ImmutableList(), default_privacy: 'public', default_sensitive: false, + default_language: 'en', resetFileKey: Math.floor((Math.random() * 0x10000)), idempotencyKey: null, tagHistory: ImmutableList(), @@ -117,7 +119,8 @@ function clearAll(state) { map.set('is_changing_upload', false); map.set('in_reply_to', null); map.set('privacy', state.get('default_privacy')); - map.set('sensitive', false); + map.set('sensitive', state.get('default_sensitive')); + map.set('language', state.get('default_language')); map.update('media_attachments', list => list.clear()); map.set('poll', null); map.set('idempotencyKey', uuid()); @@ -440,6 +443,7 @@ export default function compose(state = initialState, action) { map.set('caretPosition', null); map.set('idempotencyKey', uuid()); map.set('sensitive', action.status.get('sensitive')); + map.set('language', action.status.get('language')); if (action.status.get('spoiler_text').length > 0) { map.set('spoiler', true); @@ -468,6 +472,7 @@ export default function compose(state = initialState, action) { map.set('caretPosition', null); map.set('idempotencyKey', uuid()); map.set('sensitive', action.status.get('sensitive')); + map.set('language', action.status.get('language')); if (action.spoiler_text.length > 0) { map.set('spoiler', true); @@ -497,6 +502,8 @@ export default function compose(state = initialState, action) { return state.updateIn(['poll', 'options'], options => options.delete(action.index)); case COMPOSE_POLL_SETTINGS_CHANGE: return state.update('poll', poll => poll.set('expires_in', action.expiresIn).set('multiple', action.isMultiple)); + case COMPOSE_LANGUAGE_CHANGE: + return state.set('language', action.language); default: return state; } diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js index 39639f3dc..afffce917 100644 --- a/app/javascript/mastodon/reducers/settings.js +++ b/app/javascript/mastodon/reducers/settings.js @@ -3,6 +3,7 @@ import { NOTIFICATIONS_FILTER_SET } from '../actions/notifications'; import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE, COLUMN_PARAMS_CHANGE } from '../actions/columns'; import { STORE_HYDRATE } from '../actions/store'; import { EMOJI_USE } from '../actions/emojis'; +import { LANGUAGE_USE } from '../actions/languages'; import { LIST_DELETE_SUCCESS, LIST_FETCH_FAIL } from '../actions/lists'; import { Map as ImmutableMap, fromJS } from 'immutable'; import uuid from '../uuid'; @@ -129,6 +130,8 @@ const changeColumnParams = (state, uuid, path, value) => { const updateFrequentEmojis = (state, emoji) => state.update('frequentlyUsedEmojis', ImmutableMap(), map => map.update(emoji.id, 0, count => count + 1)).set('saved', false); +const updateFrequentLanguages = (state, language) => state.update('frequentlyUsedLanguages', ImmutableMap(), map => map.update(language, 0, count => count + 1)).set('saved', false); + const filterDeadListColumns = (state, listId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'LIST' && column.get('params').get('id') === listId)); export default function settings(state = initialState, action) { @@ -154,6 +157,8 @@ export default function settings(state = initialState, action) { return changeColumnParams(state, action.uuid, action.path, action.value); case EMOJI_USE: return updateFrequentEmojis(state, action.emoji); + case LANGUAGE_USE: + return updateFrequentLanguages(state, action.language); case SETTING_SAVE: return state.set('saved', true); case LIST_FETCH_FAIL: diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js index 1e19db65d..3121774b3 100644 --- a/app/javascript/mastodon/selectors/index.js +++ b/app/javascript/mastodon/selectors/index.js @@ -175,3 +175,11 @@ export const getAccountGallery = createSelector([ return medias; }); + +export const getAccountHidden = createSelector([ + (state, id) => state.getIn(['accounts', id, 'hidden']), + (state, id) => state.getIn(['relationships', id, 'following']) || state.getIn(['relationships', id, 'requested']), + (state, id) => id === me, +], (hidden, followingOrRequested, isSelf) => { + return hidden && !(isSelf || followingOrRequested); +}); diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index ed49333b9..c56338e23 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -330,6 +330,7 @@ html { .actions-modal ul li:not(:empty) a:focus button, .actions-modal ul li:not(:empty) a:hover, .actions-modal ul li:not(:empty) a:hover button, +.language-dropdown__dropdown__results__item.active, .admin-wrapper .sidebar ul .simple-navigation-active-leaf a, .simple_form .block-button, .simple_form .button, @@ -337,6 +338,14 @@ html { color: $white; } +.language-dropdown__dropdown__results__item .language-dropdown__dropdown__results__item__common-name { + color: lighten($ui-base-color, 8%); +} + +.language-dropdown__dropdown__results__item.active .language-dropdown__dropdown__results__item__common-name { + color: darken($ui-base-color, 12%); +} + .dropdown-menu__separator, .dropdown-menu__item.edited-timestamp__history__item, .dropdown-menu__container__header, @@ -371,12 +380,13 @@ html { border: 1px solid lighten($ui-base-color, 8%); } -.reactions-bar__item { - &:hover, - &:focus, - &:active { - background-color: $ui-base-color; - } +.reactions-bar__item:hover, +.reactions-bar__item:focus, +.reactions-bar__item:active, +.language-dropdown__dropdown__results__item:hover, +.language-dropdown__dropdown__results__item:focus, +.language-dropdown__dropdown__results__item:active { + background-color: $ui-base-color; } .reactions-bar__item.active { diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 694f5e928..71d6653d0 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2469,6 +2469,10 @@ a.account__display-name { .columns-area__panels__pane--compositional { display: none; } + + .with-fab .scrollable .item-list:last-child { + padding-bottom: 5.25rem; + } } @media screen and (min-width: 600px + (285px * 1) + (10px * 1)) { @@ -4033,6 +4037,15 @@ a.status-card.compact:hover { vertical-align: middle; } +.limited-account-hint { + p { + color: $secondary-text-color; + font-size: 15px; + font-weight: 500; + margin-bottom: 20px; + } +} + .empty-column-indicator, .error-column, .follow_requests-unlocked_explanation { @@ -4336,7 +4349,6 @@ a.status-card.compact:hover { background: $simple-background-color; box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); border-radius: 4px; - margin-left: 40px; overflow: hidden; z-index: 2; @@ -4437,6 +4449,71 @@ a.status-card.compact:hover { } } +.language-dropdown { + &__dropdown { + position: absolute; + background: $simple-background-color; + box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); + border-radius: 4px; + overflow: hidden; + z-index: 2; + + &.top { + transform-origin: 50% 100%; + } + + &.bottom { + transform-origin: 50% 0; + } + + .emoji-mart-search { + padding-right: 10px; + } + + .emoji-mart-search-icon { + right: 10px + 5px; + } + + .emoji-mart-scroll { + padding: 0 10px 10px; + } + + &__results { + &__item { + cursor: pointer; + color: $inverted-text-color; + font-weight: 500; + padding: 10px; + border-radius: 4px; + + &:focus, + &:active, + &:hover { + background: $ui-secondary-color; + } + + &__common-name { + color: $darker-text-color; + } + + &.active { + background: $ui-highlight-color; + color: $primary-text-color; + outline: 0; + + .language-dropdown__dropdown__results__item__common-name { + color: $secondary-text-color; + } + + &:hover { + background: lighten($ui-highlight-color, 4%); + } + } + } + } + } +} + .search { position: relative; } diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 3c51a7a51..7ff06ea39 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -3,6 +3,7 @@ class ActivityPub::Activity include JsonLdHelper include Redisable + include Lockable SUPPORTED_TYPES = %w(Note Question).freeze CONVERTED_TYPES = %w(Image Audio Video Article Page Event).freeze @@ -157,22 +158,6 @@ class ActivityPub::Activity end end - def lock_or_return(key, expire_after = 2.hours.seconds) - yield if redis.set(key, true, nx: true, ex: expire_after) - ensure - redis.del(key) - end - - def lock_or_fail(key, expire_after = 15.minutes.seconds) - RedisLock.acquire({ redis: redis, key: key, autorelease: expire_after }) do |lock| - if lock.acquired? - yield - else - raise Mastodon::RaceConditionError - end - end - end - def fetch? !@options[:delivery] end diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb index 0674b1083..e6674be8a 100644 --- a/app/lib/activitypub/activity/announce.rb +++ b/app/lib/activitypub/activity/announce.rb @@ -4,7 +4,7 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity def perform return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity? - lock_or_fail("announce:#{@object['id']}") do + with_lock("announce:#{value_or_id(@object)}") do original_status = status_from_object return reject_payload! if original_status.nil? || !announceable?(original_status) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 09fe08d45..ebae12973 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -47,7 +47,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def create_status return reject_payload! if unsupported_object_type? || invalid_origin?(object_uri) || tombstone_exists? || !related_to_local_activity? - lock_or_fail("create:#{object_uri}") do + with_lock("create:#{object_uri}") do return if delete_arrived_first?(object_uri) || poll_vote? @status = find_existing_status @@ -315,7 +315,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity poll = replied_to_status.preloadable_poll already_voted = true - lock_or_fail("vote:#{replied_to_status.poll_id}:#{@account.id}") do + with_lock("vote:#{replied_to_status.poll_id}:#{@account.id}") do already_voted = poll.votes.where(account: @account).exists? poll.votes.create!(account: @account, choice: poll.options.index(@object['name']), uri: object_uri) end diff --git a/app/lib/activitypub/activity/delete.rb b/app/lib/activitypub/activity/delete.rb index f5ef863f3..871eb3966 100644 --- a/app/lib/activitypub/activity/delete.rb +++ b/app/lib/activitypub/activity/delete.rb @@ -12,7 +12,7 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity private def delete_person - lock_or_return("delete_in_progress:#{@account.id}") do + with_lock("delete_in_progress:#{@account.id}", autorelease: 2.hours, raise_on_failure: false) do DeleteAccountService.new.call(@account, reserve_username: false, skip_activitypub: true) end end @@ -20,14 +20,14 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity def delete_note return if object_uri.nil? - lock_or_return("delete_status_in_progress:#{object_uri}", 5.minutes.seconds) do + with_lock("delete_status_in_progress:#{object_uri}", raise_on_failure: false) do unless invalid_origin?(object_uri) # This lock ensures a concurrent `ActivityPub::Activity::Create` either # does not create a status at all, or has finished saving it to the # database before we try to load it. # Without the lock, `delete_later!` could be called after `delete_arrived_first?` # and `Status.find` before `Status.create!` - lock_or_fail("create:#{object_uri}") { delete_later!(object_uri) } + with_lock("create:#{object_uri}") { delete_later!(object_uri) } Tombstone.find_or_create_by(uri: object_uri, account: @account) end diff --git a/app/lib/advanced_text_formatter.rb b/app/lib/advanced_text_formatter.rb index 728400819..dcaf34b91 100644 --- a/app/lib/advanced_text_formatter.rb +++ b/app/lib/advanced_text_formatter.rb @@ -8,7 +8,7 @@ class AdvancedTextFormatter < TextFormatter end def block_code(code, _language) - <<~HTML.squish + <<~HTML <pre><code>#{ERB::Util.h(code).gsub("\n", '<br/>')}</code></pre> HTML end diff --git a/app/lib/application_extension.rb b/app/lib/application_extension.rb index a1fea6430..d61ec0e6e 100644 --- a/app/lib/application_extension.rb +++ b/app/lib/application_extension.rb @@ -12,4 +12,8 @@ module ApplicationExtension def most_recently_used_access_token @most_recently_used_access_token ||= access_tokens.where.not(last_used_at: nil).order(last_used_at: :desc).first end + + def confirmation_redirect_uri + redirect_uri.lines.first.strip + end end diff --git a/app/lib/emoji_formatter.rb b/app/lib/emoji_formatter.rb index f808f3a22..194849c23 100644 --- a/app/lib/emoji_formatter.rb +++ b/app/lib/emoji_formatter.rb @@ -11,6 +11,7 @@ class EmojiFormatter # @param [Array<CustomEmoji>] custom_emojis # @param [Hash] options # @option options [Boolean] :animate + # @option options [String] :style def initialize(html, custom_emojis, options = {}) raise ArgumentError unless html.html_safe? @@ -85,14 +86,29 @@ class EmojiFormatter def image_for_emoji(shortcode, emoji) original_url, static_url = emoji - if animate? - image_tag(original_url, draggable: false, class: 'emojione', alt: ":#{shortcode}:", title: ":#{shortcode}:") - else - image_tag(original_url, draggable: false, class: 'emojione custom-emoji', alt: ":#{shortcode}:", title: ":#{shortcode}:", data: { original: original_url, static: static_url }) - end + image_tag( + animate? ? original_url : static_url, + image_attributes.merge(alt: ":#{shortcode}:", title: ":#{shortcode}:", data: image_data_attributes(original_url, static_url)) + ) + end + + def image_attributes + { rel: 'emoji', draggable: false, width: 16, height: 16, class: image_class_names, style: image_style } + end + + def image_data_attributes(original_url, static_url) + { original: original_url, static: static_url } unless animate? + end + + def image_class_names + animate? ? 'emojione' : 'emojione custom-emoji' + end + + def image_style + @options[:style] end def animate? - @options[:animate] + @options[:animate] || @options.key?(:style) end end diff --git a/app/lib/importer/accounts_index_importer.rb b/app/lib/importer/accounts_index_importer.rb new file mode 100644 index 000000000..792a31b1b --- /dev/null +++ b/app/lib/importer/accounts_index_importer.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +class Importer::AccountsIndexImporter < Importer::BaseImporter + def import! + scope.includes(:account_stat).find_in_batches(batch_size: @batch_size) do |tmp| + in_work_unit(tmp) do |accounts| + bulk = Chewy::Index::Import::BulkBuilder.new(index, to_index: accounts).bulk_body + + indexed = bulk.select { |entry| entry[:index] }.size + deleted = bulk.select { |entry| entry[:delete] }.size + + Chewy::Index::Import::BulkRequest.new(index).perform(bulk) + + [indexed, deleted] + end + end + + wait! + end + + private + + def index + AccountsIndex + end + + def scope + Account.searchable + end +end diff --git a/app/lib/importer/base_importer.rb b/app/lib/importer/base_importer.rb new file mode 100644 index 000000000..ea522c600 --- /dev/null +++ b/app/lib/importer/base_importer.rb @@ -0,0 +1,87 @@ +# frozen_string_literal: true + +class Importer::BaseImporter + # @param [Integer] batch_size + # @param [Concurrent::ThreadPoolExecutor] executor + def initialize(batch_size:, executor:) + @batch_size = batch_size + @executor = executor + @wait_for = Concurrent::Set.new + end + + # Callback to run when a concurrent work unit completes + # @param [Proc] + def on_progress(&block) + @on_progress = block + end + + # Callback to run when a concurrent work unit fails + # @param [Proc] + def on_failure(&block) + @on_failure = block + end + + # Reduce resource usage during and improve speed of indexing + def optimize_for_import! + Chewy.client.indices.put_settings index: index.index_name, body: { index: { refresh_interval: -1 } } + end + + # Restore original index settings + def optimize_for_search! + Chewy.client.indices.put_settings index: index.index_name, body: { index: { refresh_interval: index.settings_hash[:settings][:index][:refresh_interval] } } + end + + # Estimate the amount of documents that would be indexed. Not exact! + # @returns [Integer] + def estimate! + ActiveRecord::Base.connection_pool.with_connection { |connection| connection.select_one("SELECT reltuples AS estimate FROM pg_class WHERE relname = '#{index.adapter.target.table_name}'")['estimate'].to_i } + end + + # Import data from the database into the index + def import! + raise NotImplementedError + end + + # Remove documents from the index that no longer exist in the database + def clean_up! + index.scroll_batches do |documents| + ids = documents.map { |doc| doc['_id'] } + existence_map = index.adapter.target.where(id: ids).pluck(:id).each_with_object({}) { |id, map| map[id.to_s] = true } + tmp = ids.reject { |id| existence_map[id] } + + next if tmp.empty? + + in_work_unit(tmp) do |deleted_ids| + bulk = Chewy::Index::Import::BulkBuilder.new(index, delete: deleted_ids).bulk_body + + Chewy::Index::Import::BulkRequest.new(index).perform(bulk) + + [0, bulk.size] + end + end + + wait! + end + + protected + + def in_work_unit(*args, &block) + work_unit = Concurrent::Promises.future_on(@executor, *args, &block) + + work_unit.on_fulfillment!(&@on_progress) + work_unit.on_rejection!(&@on_failure) + work_unit.on_resolution! { @wait_for.delete(work_unit) } + + @wait_for << work_unit + rescue Concurrent::RejectedExecutionError + sleep(0.1) && retry # Backpressure + end + + def wait! + Concurrent::Promises.zip(*@wait_for).wait + end + + def index + raise NotImplementedError + end +end diff --git a/app/lib/importer/statuses_index_importer.rb b/app/lib/importer/statuses_index_importer.rb new file mode 100644 index 000000000..7c6532560 --- /dev/null +++ b/app/lib/importer/statuses_index_importer.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true + +class Importer::StatusesIndexImporter < Importer::BaseImporter + def import! + # The idea is that instead of iterating over all statuses in the database + # and calculating the searchable_by for each of them (majority of which + # would be empty), we approach the index from the other end + + scopes.each do |scope| + # We could be tempted to keep track of status IDs we have already processed + # from a different scope to avoid indexing them multiple times, but that + # could end up being a very large array + + scope.find_in_batches(batch_size: @batch_size) do |tmp| + in_work_unit(tmp.map(&:status_id)) do |status_ids| + bulk = ActiveRecord::Base.connection_pool.with_connection do + Chewy::Index::Import::BulkBuilder.new(index, to_index: Status.includes(:media_attachments, :preloadable_poll).where(id: status_ids)).bulk_body + end + + indexed = 0 + deleted = 0 + + # We can't use the delete_if proc to do the filtering because delete_if + # is called before rendering the data and we need to filter based + # on the results of the filter, so this filtering happens here instead + bulk.map! do |entry| + new_entry = begin + if entry[:index] && entry.dig(:index, :data, 'searchable_by').blank? + { delete: entry[:index].except(:data) } + else + entry + end + end + + if new_entry[:index] + indexed += 1 + else + deleted += 1 + end + + new_entry + end + + Chewy::Index::Import::BulkRequest.new(index).perform(bulk) + + [indexed, deleted] + end + end + end + + wait! + end + + private + + def index + StatusesIndex + end + + def scopes + [ + local_statuses_scope, + local_mentions_scope, + local_favourites_scope, + local_votes_scope, + local_bookmarks_scope, + ] + end + + def local_mentions_scope + Mention.where(account: Account.local, silent: false).select(:id, :status_id) + end + + def local_favourites_scope + Favourite.where(account: Account.local).select(:id, :status_id) + end + + def local_bookmarks_scope + Bookmark.select(:id, :status_id) + end + + def local_votes_scope + Poll.joins(:votes).where(votes: { account: Account.local }).select('polls.id, polls.status_id') + end + + def local_statuses_scope + Status.local.select('id, coalesce(reblog_of_id, id) as status_id') + end +end diff --git a/app/lib/importer/tags_index_importer.rb b/app/lib/importer/tags_index_importer.rb new file mode 100644 index 000000000..f5bd8f052 --- /dev/null +++ b/app/lib/importer/tags_index_importer.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +class Importer::TagsIndexImporter < Importer::BaseImporter + def import! + index.adapter.default_scope.find_in_batches(batch_size: @batch_size) do |tmp| + in_work_unit(tmp) do |tags| + bulk = Chewy::Index::Import::BulkBuilder.new(index, to_index: tags).bulk_body + + indexed = bulk.select { |entry| entry[:index] }.size + deleted = bulk.select { |entry| entry[:delete] }.size + + Chewy::Index::Import::BulkRequest.new(index).perform(bulk) + + [indexed, deleted] + end + end + + wait! + end + + private + + def index + TagsIndex + end +end diff --git a/app/lib/rss/builder.rb b/app/lib/rss/builder.rb new file mode 100644 index 000000000..a9b3f08c5 --- /dev/null +++ b/app/lib/rss/builder.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +class RSS::Builder + attr_reader :dsl + + def self.build + new.tap do |builder| + yield builder.dsl + end.to_xml + end + + def initialize + @dsl = RSS::Channel.new + end + + def to_xml + ('<?xml version="1.0" encoding="UTF-8"?>'.dup << Ox.dump(wrap_in_document, effort: :tolerant)).force_encoding('UTF-8') + end + + private + + def wrap_in_document + Ox::Document.new(version: '1.0').tap do |document| + document << Ox::Element.new('rss').tap do |rss| + rss['version'] = '2.0' + rss['xmlns:webfeeds'] = 'http://webfeeds.org/rss/1.0' + rss['xmlns:media'] = 'http://search.yahoo.com/mrss/' + + rss << @dsl.to_element + end + end + end +end diff --git a/app/lib/rss/channel.rb b/app/lib/rss/channel.rb new file mode 100644 index 000000000..1dba94e47 --- /dev/null +++ b/app/lib/rss/channel.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +class RSS::Channel < RSS::Element + def initialize + super() + + @root = create_element('channel') + end + + def title(str) + append_element('title', str) + end + + def link(str) + append_element('link', str) + end + + def last_build_date(date) + append_element('lastBuildDate', date.to_formatted_s(:rfc822)) + end + + def image(url, title, link) + append_element('image') do |image| + image << create_element('url', url) + image << create_element('title', title) + image << create_element('link', link) + end + end + + def description(str) + append_element('description', str) + end + + def generator(str) + append_element('generator', str) + end + + def icon(str) + append_element('webfeeds:icon', str) + end + + def logo(str) + append_element('webfeeds:logo', str) + end + + def item(&block) + @root << RSS::Item.with(&block) + end +end diff --git a/app/lib/rss/element.rb b/app/lib/rss/element.rb new file mode 100644 index 000000000..7142fa039 --- /dev/null +++ b/app/lib/rss/element.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +class RSS::Element + def self.with(*args, &block) + new(*args).tap(&block).to_element + end + + def create_element(name, content = nil) + Ox::Element.new(name).tap do |element| + yield element if block_given? + element << content if content.present? + end + end + + def append_element(name, content = nil) + @root << create_element(name, content).tap do |element| + yield element if block_given? + end + end + + def to_element + @root + end +end diff --git a/app/lib/rss/item.rb b/app/lib/rss/item.rb new file mode 100644 index 000000000..c02991ace --- /dev/null +++ b/app/lib/rss/item.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +class RSS::Item < RSS::Element + def initialize + super() + + @root = create_element('item') + end + + def title(str) + append_element('title', str) + end + + def link(str) + append_element('guid', str) do |guid| + guid['isPermaLink'] = 'true' + end + + append_element('link', str) + end + + def pub_date(date) + append_element('pubDate', date.to_formatted_s(:rfc822)) + end + + def description(str) + append_element('description', str) + end + + def category(str) + append_element('category', str) + end + + def enclosure(url, type, size) + append_element('enclosure') do |enclosure| + enclosure['url'] = url + enclosure['length'] = size + enclosure['type'] = type + end + end + + def media_content(url, type, size, &block) + @root << RSS::MediaContent.with(url, type, size, &block) + end +end diff --git a/app/lib/rss/media_content.rb b/app/lib/rss/media_content.rb new file mode 100644 index 000000000..f281fe29e --- /dev/null +++ b/app/lib/rss/media_content.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +class RSS::MediaContent < RSS::Element + def initialize(url, type, size) + super() + + @root = create_element('media:content') do |content| + content['url'] = url + content['type'] = type + content['fileSize'] = size + end + end + + def medium(str) + @root['medium'] = str + end + + def rating(str) + append_element('media:rating', str) do |rating| + rating['scheme'] = 'urn:simple' + end + end + + def description(str) + append_element('media:description', str) do |description| + description['type'] = 'plain' + end + end + + def thumbnail(str) + append_element('media:thumbnail') do |thumbnail| + thumbnail['url'] = str + end + end +end diff --git a/app/lib/rss/serializer.rb b/app/lib/rss/serializer.rb deleted file mode 100644 index d44e94221..000000000 --- a/app/lib/rss/serializer.rb +++ /dev/null @@ -1,55 +0,0 @@ -# frozen_string_literal: true - -class RSS::Serializer - include FormattingHelper - - private - - def render_statuses(builder, statuses) - statuses.each do |status| - builder.item do |item| - item.title(status_title(status)) - .link(ActivityPub::TagManager.instance.url_for(status)) - .pub_date(status.created_at) - .description(status_description(status)) - - status.ordered_media_attachments.each do |media| - item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size) - end - end - end - end - - def status_title(status) - preview = status.proper.spoiler_text.presence || status.proper.text - - if preview.length > 30 || preview[0, 30].include?("\n") - preview = preview[0, 30] - preview = preview[0, preview.index("\n").presence || 30] + '…' - end - - preview = "#{status.proper.spoiler_text.present? ? 'CW ' : ''}“#{preview}”#{status.proper.sensitive? ? ' (sensitive)' : ''}" - - if status.reblog? - "#{status.account.acct} boosted #{status.reblog.account.acct}: #{preview}" - else - "#{status.account.acct}: #{preview}" - end - end - - def status_description(status) - if status.proper.spoiler_text? - status.proper.spoiler_text - else - html = status_content_format(status.proper).to_str - after_html = '' - - if status.proper.preloadable_poll - poll_options_html = status.proper.preloadable_poll.options.map { |o| "[ ] #{o}" }.join('<br />') - after_html = "<p>#{poll_options_html}</p>" - end - - "#{html}#{after_html}" - end - end -end diff --git a/app/lib/rss_builder.rb b/app/lib/rss_builder.rb deleted file mode 100644 index 63ddba2e8..000000000 --- a/app/lib/rss_builder.rb +++ /dev/null @@ -1,130 +0,0 @@ -# frozen_string_literal: true - -class RSSBuilder - class ItemBuilder - def initialize - @item = Ox::Element.new('item') - end - - def title(str) - @item << (Ox::Element.new('title') << str) - - self - end - - def link(str) - @item << Ox::Element.new('guid').tap do |guid| - guid['isPermalink'] = 'true' - guid << str - end - - @item << (Ox::Element.new('link') << str) - - self - end - - def pub_date(date) - @item << (Ox::Element.new('pubDate') << date.to_formatted_s(:rfc822)) - - self - end - - def description(str) - @item << (Ox::Element.new('description') << str) - - self - end - - def enclosure(url, type, size) - @item << Ox::Element.new('enclosure').tap do |enclosure| - enclosure['url'] = url - enclosure['length'] = size - enclosure['type'] = type - end - - self - end - - def to_element - @item - end - end - - def initialize - @document = Ox::Document.new(version: '1.0') - @channel = Ox::Element.new('channel') - - @document << (rss << @channel) - end - - def title(str) - @channel << (Ox::Element.new('title') << str) - - self - end - - def link(str) - @channel << (Ox::Element.new('link') << str) - - self - end - - def image(str) - @channel << Ox::Element.new('image').tap do |image| - image << (Ox::Element.new('url') << str) - image << (Ox::Element.new('title') << '') - image << (Ox::Element.new('link') << '') - end - - @channel << (Ox::Element.new('webfeeds:icon') << str) - - self - end - - def cover(str) - @channel << Ox::Element.new('webfeeds:cover').tap do |cover| - cover['image'] = str - end - - self - end - - def logo(str) - @channel << (Ox::Element.new('webfeeds:logo') << str) - - self - end - - def accent_color(str) - @channel << (Ox::Element.new('webfeeds:accentColor') << str) - - self - end - - def description(str) - @channel << (Ox::Element.new('description') << str) - - self - end - - def item - @channel << ItemBuilder.new.tap do |item| - yield item - end.to_element - - self - end - - def to_xml - ('<?xml version="1.0" encoding="UTF-8"?>' + Ox.dump(@document, effort: :tolerant)).force_encoding('UTF-8') - end - - private - - def rss - Ox::Element.new('rss').tap do |rss| - rss['version'] = '2.0' - rss['xmlns:webfeeds'] = 'http://webfeeds.org/rss/1.0' - end - end -end diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb index d339e078c..1d70ed36a 100644 --- a/app/lib/user_settings_decorator.rb +++ b/app/lib/user_settings_decorator.rb @@ -34,7 +34,6 @@ class UserSettingsDecorator user.settings['noindex'] = noindex_preference if change?('setting_noindex') user.settings['flavour'] = flavour_preference if change?('setting_flavour') user.settings['skin'] = skin_preference if change?('setting_skin') - user.settings['hide_network'] = hide_network_preference if change?('setting_hide_network') user.settings['aggregate_reblogs'] = aggregate_reblogs_preference if change?('setting_aggregate_reblogs') user.settings['show_application'] = show_application_preference if change?('setting_show_application') user.settings['advanced_layout'] = advanced_layout_preference if change?('setting_advanced_layout') @@ -118,10 +117,6 @@ class UserSettingsDecorator settings['setting_skin'] end - def hide_network_preference - boolean_cast_setting 'setting_hide_network' - end - def show_application_preference boolean_cast_setting 'setting_show_application' end diff --git a/app/models/account.rb b/app/models/account.rb index 068ee7ae9..7c81e07d9 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -79,7 +79,7 @@ class Account < ApplicationRecord MAX_DISPLAY_NAME_LENGTH = (ENV['MAX_DISPLAY_NAME_CHARS'] || 30).to_i MAX_NOTE_LENGTH = (ENV['MAX_BIO_CHARS'] || 500).to_i - MAX_FIELDS = (ENV['MAX_PROFILE_FIELDS'] || 4).to_i + DEFAULT_FIELDS_SIZE = (ENV['MAX_PROFILE_FIELDS'] || 4).to_i enum protocol: [:ostatus, :activitypub] enum suspension_origin: [:local, :remote], _prefix: true @@ -95,7 +95,7 @@ class Account < ApplicationRecord validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? } validates :display_name, length: { maximum: MAX_DISPLAY_NAME_LENGTH }, if: -> { local? && will_save_change_to_display_name? } validates :note, note_length: { maximum: MAX_NOTE_LENGTH }, if: -> { local? && will_save_change_to_note? } - validates :fields, length: { maximum: MAX_FIELDS }, if: -> { local? && will_save_change_to_fields? } + validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? } scope :remote, -> { where.not(domain: nil) } scope :local, -> { where(domain: nil) } @@ -113,7 +113,8 @@ class Account < ApplicationRecord scope :matches_username, ->(value) { where(arel_table[:username].matches("#{value}%")) } scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) } scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) } - scope :searchable, -> { without_suspended.where(moved_to_account_id: nil) } + scope :without_unapproved, -> { left_outer_joins(:user).remote.or(left_outer_joins(:user).merge(User.approved.confirmed)) } + scope :searchable, -> { without_unapproved.without_suspended.where(moved_to_account_id: nil) } scope :discoverable, -> { searchable.without_silenced.where(discoverable: true).left_outer_joins(:account_stat) } scope :followable_by, ->(account) { joins(arel_table.join(Follow.arel_table, Arel::Nodes::OuterJoin).on(arel_table[:id].eq(Follow.arel_table[:target_account_id]).and(Follow.arel_table[:account_id].eq(account.id))).join_sources).where(Follow.arel_table[:id].eq(nil)).joins(arel_table.join(FollowRequest.arel_table, Arel::Nodes::OuterJoin).on(arel_table[:id].eq(FollowRequest.arel_table[:target_account_id]).and(FollowRequest.arel_table[:account_id].eq(account.id))).join_sources).where(FollowRequest.arel_table[:id].eq(nil)) } scope :by_recent_status, -> { order(Arel.sql('(case when account_stats.last_status_at is null then 1 else 0 end) asc, account_stats.last_status_at desc, accounts.id desc')) } @@ -197,7 +198,7 @@ class Account < ApplicationRecord end def searchable? - !(suspended? || moved?) + !(suspended? || moved?) && (!local? || (approved? && confirmed?)) end def possibly_stale? @@ -329,12 +330,12 @@ class Account < ApplicationRecord end def build_fields - return if fields.size >= MAX_FIELDS + return if fields.size >= DEFAULT_FIELDS_SIZE tmp = self[:fields] || [] tmp = [] if tmp.is_a?(Hash) - (MAX_FIELDS - tmp.size).times do + (DEFAULT_FIELDS_SIZE - tmp.size).times do tmp << { name: '', value: '' } end @@ -463,9 +464,11 @@ class Account < ApplicationRecord accounts.*, ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank FROM accounts + LEFT JOIN users ON accounts.id = users.account_id WHERE to_tsquery('simple', :tsquery) @@ #{TEXTSEARCH} AND accounts.suspended_at IS NULL AND accounts.moved_to_account_id IS NULL + AND (accounts.domain IS NOT NULL OR (users.approved = TRUE AND users.confirmed_at IS NOT NULL)) ORDER BY rank DESC LIMIT :limit OFFSET :offset SQL @@ -541,9 +544,11 @@ class Account < ApplicationRecord (count(f.id) + 1) * ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank FROM accounts LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = :id) OR (accounts.id = f.target_account_id AND f.account_id = :id) + LEFT JOIN users ON accounts.id = users.account_id WHERE to_tsquery('simple', :tsquery) @@ #{TEXTSEARCH} AND accounts.suspended_at IS NULL AND accounts.moved_to_account_id IS NULL + AND (accounts.domain IS NOT NULL OR (users.approved = TRUE AND users.confirmed_at IS NOT NULL)) GROUP BY accounts.id ORDER BY rank DESC LIMIT :limit OFFSET :offset diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb index ded32c9c6..06291c9f3 100644 --- a/app/models/account_migration.rb +++ b/app/models/account_migration.rb @@ -15,6 +15,7 @@ class AccountMigration < ApplicationRecord include Redisable + include Lockable COOLDOWN_PERIOD = 30.days.freeze @@ -41,12 +42,8 @@ class AccountMigration < ApplicationRecord return false unless errors.empty? - RedisLock.acquire(lock_options) do |lock| - if lock.acquired? - save - else - raise Mastodon::RaceConditionError - end + with_lock("account_migration:#{account.id}") do + save end end @@ -83,8 +80,4 @@ class AccountMigration < ApplicationRecord def validate_migration_cooldown errors.add(:base, I18n.t('migrations.errors.on_cooldown')) if account.migrations.within_cooldown.exists? end - - def lock_options - { redis: redis, key: "account_migration:#{account.id}" } - end end diff --git a/app/models/account_stat.rb b/app/models/account_stat.rb index b49827267..a5d71a5b8 100644 --- a/app/models/account_stat.rb +++ b/app/models/account_stat.rb @@ -20,4 +20,16 @@ class AccountStat < ApplicationRecord belongs_to :account, inverse_of: :account_stat update_index('accounts', :account) + + def following_count + [attributes['following_count'], 0].max + end + + def followers_count + [attributes['followers_count'], 0].max + end + + def statuses_count + [attributes['statuses_count'], 0].max + end end diff --git a/app/models/admin/account_action.rb b/app/models/admin/account_action.rb index 850ea6d82..aed3bc0c7 100644 --- a/app/models/admin/account_action.rb +++ b/app/models/admin/account_action.rb @@ -92,6 +92,10 @@ class Admin::AccountAction text: text_for_warning, status_ids: status_ids ) + + # A log entry is only interesting if the warning contains + # custom text from someone. Otherwise it's just noise. + log_action(:create, @warning) if @warning.text.present? && type == 'none' end def process_reports! @@ -160,8 +164,8 @@ class Admin::AccountAction def reports @reports ||= begin - if type == 'none' && with_report? - [report] + if type == 'none' + with_report? ? [report] : [] else Report.where(target_account: target_account).unresolved end diff --git a/app/models/admin/import.rb b/app/models/admin/import.rb new file mode 100644 index 000000000..c305be237 --- /dev/null +++ b/app/models/admin/import.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +# A non-activerecord helper class for csv upload +class Admin::Import + extend ActiveModel::Callbacks + include ActiveModel::Model + include Paperclip::Glue + + FILE_TYPES = %w(text/plain text/csv application/csv).freeze + + # Paperclip required callbacks + define_model_callbacks :save, only: [:after] + define_model_callbacks :destroy, only: [:before, :after] + + attr_accessor :data_file_name, :data_content_type + + has_attached_file :data + validates_attachment_content_type :data, content_type: FILE_TYPES + validates_attachment_presence :data + validates_with AdminImportValidator, on: :create + + def save + run_callbacks :save + end + + def destroy + run_callbacks :destroy + end +end diff --git a/app/models/admin/status_batch_action.rb b/app/models/admin/status_batch_action.rb index 631af183c..7bf6fa6da 100644 --- a/app/models/admin/status_batch_action.rb +++ b/app/models/admin/status_batch_action.rb @@ -103,7 +103,7 @@ class Admin::StatusBatchAction def handle_report! @report = Report.new(report_params) unless with_report? - @report.status_ids = (@report.status_ids + status_ids.map(&:to_i)).uniq + @report.status_ids = (@report.status_ids + allowed_status_ids).uniq @report.save! @report_id = @report.id @@ -135,4 +135,8 @@ class Admin::StatusBatchAction def report_params { account: current_account, target_account: target_account } end + + def allowed_status_ids + AccountStatusesFilter.new(@report.target_account, current_account).results.with_discarded.where(id: status_ids).pluck(:id) + end end diff --git a/app/models/concerns/lockable.rb b/app/models/concerns/lockable.rb new file mode 100644 index 000000000..55a9714ca --- /dev/null +++ b/app/models/concerns/lockable.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Lockable + # @param [String] lock_name + # @param [ActiveSupport::Duration] autorelease Automatically release the lock after this time + # @param [Boolean] raise_on_failure Raise an error if a lock cannot be acquired, or fail silently + # @raise [Mastodon::RaceConditionError] + def with_lock(lock_name, autorelease: 15.minutes, raise_on_failure: true) + with_redis do |redis| + RedisLock.acquire(redis: redis, key: "lock:#{lock_name}", autorelease: autorelease.seconds) do |lock| + if lock.acquired? + yield + elsif raise_on_failure + raise Mastodon::RaceConditionError, "Could not acquire lock for #{lock_name}, try again later" + end + end + end + end +end diff --git a/app/models/concerns/redisable.rb b/app/models/concerns/redisable.rb index 8d76b6b82..0dad3abb2 100644 --- a/app/models/concerns/redisable.rb +++ b/app/models/concerns/redisable.rb @@ -1,11 +1,11 @@ # frozen_string_literal: true module Redisable - extend ActiveSupport::Concern - - private - def redis Thread.current[:redis] ||= RedisConfiguration.pool.checkout end + + def with_redis(&block) + RedisConfiguration.with(&block) + end end diff --git a/app/models/domain_allow.rb b/app/models/domain_allow.rb index 4b0a89c18..2e14fce25 100644 --- a/app/models/domain_allow.rb +++ b/app/models/domain_allow.rb @@ -23,6 +23,10 @@ class DomainAllow < ApplicationRecord !rule_for(domain).nil? end + def allowed_domains + select(:domain) + end + def rule_for(domain) return if domain.blank? diff --git a/app/models/form/domain_block_batch.rb b/app/models/form/domain_block_batch.rb new file mode 100644 index 000000000..39012df51 --- /dev/null +++ b/app/models/form/domain_block_batch.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +class Form::DomainBlockBatch + include ActiveModel::Model + include Authorization + include AccountableConcern + + attr_accessor :domain_blocks_attributes, :action, :current_account + + def save + case action + when 'save' + save! + end + end + + private + + def domain_blocks + @domain_blocks ||= domain_blocks_attributes.values.filter_map do |attributes| + DomainBlock.new(attributes.without('enabled')) if ActiveModel::Type::Boolean.new.cast(attributes['enabled']) + end + end + + def save! + domain_blocks.each do |domain_block| + authorize(domain_block, :create?) + next if DomainBlock.rule_for(domain_block.domain).present? + + domain_block.save! + DomainBlockWorker.perform_async(domain_block.id) + log_action :create, domain_block + end + end +end diff --git a/app/models/mute.rb b/app/models/mute.rb index fe8b6f42c..578345ef6 100644 --- a/app/models/mute.rb +++ b/app/models/mute.rb @@ -6,7 +6,6 @@ # id :bigint(8) not null, primary key # created_at :datetime not null # updated_at :datetime not null -# hide_notifications :boolean default(TRUE), not null # account_id :bigint(8) not null # target_account_id :bigint(8) not null # hide_notifications :boolean default(TRUE), not null diff --git a/app/models/poll.rb b/app/models/poll.rb index ba08309a1..1a326e452 100644 --- a/app/models/poll.rb +++ b/app/models/poll.rb @@ -39,13 +39,12 @@ class Poll < ApplicationRecord before_validation :prepare_options, if: :local? before_validation :prepare_votes_count - - after_initialize :prepare_cached_tallies + before_validation :prepare_cached_tallies after_commit :reset_parent_cache, on: :update def loaded_options - options.map.with_index { |title, key| Option.new(self, key.to_s, title, show_totals_now? ? cached_tallies[key] : nil) } + options.map.with_index { |title, key| Option.new(self, key.to_s, title, show_totals_now? ? (cached_tallies[key] || 0) : nil) } end def possibly_stale? diff --git a/app/models/status.rb b/app/models/status.rb index 75b464a70..3efa23ae2 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -322,10 +322,6 @@ class Status < ApplicationRecord visibilities.keys - %w(direct limited) end - def in_chosen_languages(account) - where(language: nil).or where(language: account.chosen_languages) - end - def as_direct_timeline(account, limit = 20, max_id = nil, since_id = nil, cache_ids = false) # direct timeline is mix of direct message from_me and to_me. # 2 queries are executed with pagination. @@ -515,7 +511,7 @@ class Status < ApplicationRecord end def set_poll_id - update_column(:poll_id, poll.id) unless poll.nil? + update_column(:poll_id, poll.id) if association(:poll).loaded? && poll.present? end def set_visibility diff --git a/app/models/status_stat.rb b/app/models/status_stat.rb index 024c467e7..437861d1c 100644 --- a/app/models/status_stat.rb +++ b/app/models/status_stat.rb @@ -17,6 +17,18 @@ class StatusStat < ApplicationRecord after_commit :reset_parent_cache + def replies_count + [attributes['replies_count'], 0].max + end + + def reblogs_count + [attributes['reblogs_count'], 0].max + end + + def favourites_count + [attributes['favourites_count'], 0].max + end + private def reset_parent_cache diff --git a/app/models/trends.rb b/app/models/trends.rb index 0be900b04..0fff66a9f 100644 --- a/app/models/trends.rb +++ b/app/models/trends.rb @@ -33,8 +33,8 @@ module Trends statuses_requiring_review = statuses.request_review User.staff.includes(:account).find_each do |user| - links = user.allows_trending_tags_review_emails? ? links_requiring_review : [] - tags = user.allows_trending_links_review_emails? ? tags_requiring_review : [] + links = user.allows_trending_links_review_emails? ? links_requiring_review : [] + tags = user.allows_trending_tags_review_emails? ? tags_requiring_review : [] statuses = user.allows_trending_statuses_review_emails? ? statuses_requiring_review : [] next if links.empty? && tags.empty? && statuses.empty? diff --git a/app/models/trends/history.rb b/app/models/trends/history.rb index 608e33792..74723e35c 100644 --- a/app/models/trends/history.rb +++ b/app/models/trends/history.rb @@ -11,11 +11,11 @@ class Trends::History end def uses - redis.mget(*@days.map { |day| day.key_for(:uses) }).map(&:to_i).sum + with_redis { |redis| redis.mget(*@days.map { |day| day.key_for(:uses) }).map(&:to_i).sum } end def accounts - redis.pfcount(*@days.map { |day| day.key_for(:accounts) }) + with_redis { |redis| redis.pfcount(*@days.map { |day| day.key_for(:accounts) }) } end end @@ -33,19 +33,21 @@ class Trends::History attr_reader :day def accounts - redis.pfcount(key_for(:accounts)) + with_redis { |redis| redis.pfcount(key_for(:accounts)) } end def uses - redis.get(key_for(:uses))&.to_i || 0 + with_redis { |redis| redis.get(key_for(:uses))&.to_i || 0 } end def add(account_id) - redis.pipelined do - redis.incrby(key_for(:uses), 1) - redis.pfadd(key_for(:accounts), account_id) - redis.expire(key_for(:uses), EXPIRE_AFTER) - redis.expire(key_for(:accounts), EXPIRE_AFTER) + with_redis do |redis| + redis.pipelined do |pipeline| + pipeline.incrby(key_for(:uses), 1) + pipeline.pfadd(key_for(:accounts), account_id) + pipeline.expire(key_for(:uses), EXPIRE_AFTER) + pipeline.expire(key_for(:accounts), EXPIRE_AFTER) + end end end diff --git a/app/models/user.rb b/app/models/user.rb index b38de74b8..f7a35eeb5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -53,6 +53,7 @@ class User < ApplicationRecord include Settings::Extend include UserRoles include Redisable + include LanguagesHelper # The home and list feeds will be stored in Redis for this amount # of time, and status fan-out to followers will include only people @@ -248,7 +249,7 @@ class User < ApplicationRecord end def preferred_posting_language - settings.default_language || locale + valid_locale_cascade(settings.default_language, locale) end def setting_default_privacy diff --git a/app/policies/status_policy.rb b/app/policies/status_policy.rb index d3a3b36c0..75d95a90b 100644 --- a/app/policies/status_policy.rb +++ b/app/policies/status_policy.rb @@ -97,7 +97,7 @@ class StatusPolicy < ApplicationPolicy def author record.account end - + def local_only? record.local_only? end diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb index a0f1ebd0a..3e85faa92 100644 --- a/app/presenters/instance_presenter.rb +++ b/app/presenters/instance_presenter.rb @@ -44,15 +44,6 @@ class InstancePresenter Mastodon::Version end - def commit_hash - current_release_file = Pathname.new('CURRENT_RELEASE').expand_path - if current_release_file.file? - IO.read(current_release_file).strip! - else - '' - end - end - def source_url Mastodon::Version.source_url end diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index a05164641..5eab02dbc 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -3,7 +3,8 @@ class InitialStateSerializer < ActiveModel::Serializer attributes :meta, :compose, :accounts, :media_attachments, :settings, - :max_toot_chars, :poll_limits + :max_toot_chars, :poll_limits, + :languages has_one :push_subscription, serializer: REST::WebPushSubscriptionSerializer @@ -76,6 +77,7 @@ class InitialStateSerializer < ActiveModel::Serializer store[:me] = object.current_account.id.to_s store[:default_privacy] = object.visibility || object.current_account.user.setting_default_privacy store[:default_sensitive] = object.current_account.user.setting_default_sensitive + store[:default_language] = object.current_account.user.preferred_posting_language end store[:text] = object.text if object.text @@ -94,6 +96,10 @@ class InitialStateSerializer < ActiveModel::Serializer { accept_content_types: MediaAttachment.supported_file_extensions + MediaAttachment.supported_mime_types } end + def languages + LanguagesHelper::SUPPORTED_LOCALES.map { |(key, value)| [key, value[0], value[1]] } + end + private def instance_presenter diff --git a/app/serializers/rest/account_serializer.rb b/app/serializers/rest/account_serializer.rb index 113e0cca7..e644a3f91 100644 --- a/app/serializers/rest/account_serializer.rb +++ b/app/serializers/rest/account_serializer.rb @@ -13,6 +13,7 @@ class REST::AccountSerializer < ActiveModel::Serializer has_many :emojis, serializer: REST::CustomEmojiSerializer attribute :suspended, if: :suspended? + attribute :silenced, key: :limited, if: :silenced? class FieldSerializer < ActiveModel::Serializer include FormattingHelper @@ -102,7 +103,11 @@ class REST::AccountSerializer < ActiveModel::Serializer object.suspended? end - delegate :suspended?, to: :object + def silenced + object.silenced? + end + + delegate :suspended?, :silenced?, to: :object def moved_and_not_nested? object.moved? && object.moved_to_account.moved_to_account_id.nil? diff --git a/app/serializers/rest/preferences_serializer.rb b/app/serializers/rest/preferences_serializer.rb index 119f0e06d..874bd990d 100644 --- a/app/serializers/rest/preferences_serializer.rb +++ b/app/serializers/rest/preferences_serializer.rb @@ -17,7 +17,7 @@ class REST::PreferencesSerializer < ActiveModel::Serializer end def posting_default_language - object.user.setting_default_language.presence + object.user.preferred_posting_language end def reading_default_sensitive_media diff --git a/app/serializers/rss/account_serializer.rb b/app/serializers/rss/account_serializer.rb deleted file mode 100644 index 81e24af0d..000000000 --- a/app/serializers/rss/account_serializer.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true - -class RSS::AccountSerializer < RSS::Serializer - include ActionView::Helpers::NumberHelper - include AccountsHelper - include RoutingHelper - - def render(account, statuses, tag) - builder = RSSBuilder.new - - builder.title("#{display_name(account)} (@#{account.local_username_and_domain})") - .description(account_description(account)) - .link(tag.present? ? short_account_tag_url(account, tag) : short_account_url(account)) - .logo(full_pack_url('media/images/logo.svg')) - .accent_color('2b90d9') - - builder.image(full_asset_url(account.avatar.url(:original))) if account.avatar? - builder.cover(full_asset_url(account.header.url(:original))) if account.header? - - render_statuses(builder, statuses) - - builder.to_xml - end - - def self.render(account, statuses, tag) - new.render(account, statuses, tag) - end -end diff --git a/app/serializers/rss/tag_serializer.rb b/app/serializers/rss/tag_serializer.rb deleted file mode 100644 index e549ac367..000000000 --- a/app/serializers/rss/tag_serializer.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -class RSS::TagSerializer < RSS::Serializer - include ActionView::Helpers::NumberHelper - include ActionView::Helpers::SanitizeHelper - include RoutingHelper - - def render(tag, statuses) - builder = RSSBuilder.new - - builder.title("##{tag.name}") - .description(strip_tags(I18n.t('about.about_hashtag_html', hashtag: tag.name))) - .link(tag_url(tag)) - .logo(full_pack_url('media/images/logo.svg')) - .accent_color('2b90d9') - - render_statuses(builder, statuses) - - builder.to_xml - end - - def self.render(tag, statuses) - new.render(tag, statuses) - end -end diff --git a/app/services/activitypub/fetch_remote_status_service.rb b/app/services/activitypub/fetch_remote_status_service.rb index 9672b3d2b..803098245 100644 --- a/app/services/activitypub/fetch_remote_status_service.rb +++ b/app/services/activitypub/fetch_remote_status_service.rb @@ -30,6 +30,7 @@ class ActivityPub::FetchRemoteStatusService < BaseService end return if activity_json.nil? || object_uri.nil? || !trustworthy_attribution?(@json['id'], actor_uri) + return ActivityPub::TagManager.instance.uri_to_resource(object_uri, Status) if ActivityPub::TagManager.instance.local_uri?(object_uri) actor = account_from_uri(actor_uri) diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index 5649153ee..4449a5427 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -4,6 +4,7 @@ class ActivityPub::ProcessAccountService < BaseService include JsonLdHelper include DomainControlHelper include Redisable + include Lockable # Should be called with confirmed valid JSON # and WebFinger-resolved username and domain @@ -17,22 +18,18 @@ class ActivityPub::ProcessAccountService < BaseService @domain = domain @collections = {} - RedisLock.acquire(lock_options) do |lock| - if lock.acquired? - @account = Account.remote.find_by(uri: @uri) if @options[:only_key] - @account ||= Account.find_remote(@username, @domain) - @old_public_key = @account&.public_key - @old_protocol = @account&.protocol - @suspension_changed = false - - create_account if @account.nil? - update_account - process_tags - - process_duplicate_accounts! if @options[:verified_webfinger] - else - raise Mastodon::RaceConditionError - end + with_lock("process_account:#{@uri}") do + @account = Account.remote.find_by(uri: @uri) if @options[:only_key] + @account ||= Account.find_remote(@username, @domain) + @old_public_key = @account&.public_key + @old_protocol = @account&.protocol + @suspension_changed = false + + create_account if @account.nil? + update_account + process_tags + + process_duplicate_accounts! if @options[:verified_webfinger] end return if @account.nil? @@ -289,10 +286,6 @@ class ActivityPub::ProcessAccountService < BaseService !@old_protocol.nil? && @old_protocol != @account.protocol end - def lock_options - { redis: redis, key: "process_account:#{@uri}", autorelease: 15.minutes.seconds } - end - def process_tags return if @json['tag'].blank? diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index fb6e44c6d..addd5fc27 100644 --- a/app/services/activitypub/process_status_update_service.rb +++ b/app/services/activitypub/process_status_update_service.rb @@ -3,6 +3,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService include JsonLdHelper include Redisable + include Lockable def call(status, json) raise ArgumentError, 'Status has unsaved changes' if status.changed? @@ -33,41 +34,32 @@ class ActivityPub::ProcessStatusUpdateService < BaseService last_edit_date = @status.edited_at.presence || @status.created_at # Only allow processing one create/update per status at a time - RedisLock.acquire(lock_options) do |lock| - if lock.acquired? - Status.transaction do - record_previous_edit! - update_media_attachments! - update_poll! - update_immediate_attributes! - update_metadata! - create_edits! - end + with_lock("create:#{@uri}") do + Status.transaction do + record_previous_edit! + update_media_attachments! + update_poll! + update_immediate_attributes! + update_metadata! + create_edits! + end - queue_poll_notifications! + queue_poll_notifications! - next unless significant_changes? + next unless significant_changes? - reset_preview_card! - broadcast_updates! - else - raise Mastodon::RaceConditionError - end + reset_preview_card! + broadcast_updates! end forward_activity! if significant_changes? && @status_parser.edited_at > last_edit_date end def handle_implicit_update! - RedisLock.acquire(lock_options) do |lock| - if lock.acquired? - update_poll!(allow_significant_changes: false) - else - raise Mastodon::RaceConditionError - end + with_lock("create:#{@uri}") do + update_poll!(allow_significant_changes: false) + queue_poll_notifications! end - - queue_poll_notifications! end def update_media_attachments! @@ -241,10 +233,6 @@ class ActivityPub::ProcessStatusUpdateService < BaseService equals_or_includes_any?(@json['type'], %w(Note Question)) end - def lock_options - { redis: redis, key: "create:#{@uri}", autorelease: 15.minutes.seconds } - end - def record_previous_edit! @previous_edit = @status.build_snapshot(at_time: @status.created_at, rate_limit: false) if @status.edits.empty? end diff --git a/app/services/appeal_service.rb b/app/services/appeal_service.rb index 1397c50f5..cef9be05f 100644 --- a/app/services/appeal_service.rb +++ b/app/services/appeal_service.rb @@ -14,7 +14,8 @@ class AppealService < BaseService private def create_appeal! - @appeal = @strike.create_appeal!( + @appeal = Appeal.create!( + strike: @strike, text: @text, account: @strike.target_account ) diff --git a/app/services/approve_appeal_service.rb b/app/services/approve_appeal_service.rb index 37a08b46e..96aaaa7d0 100644 --- a/app/services/approve_appeal_service.rb +++ b/app/services/approve_appeal_service.rb @@ -52,8 +52,9 @@ class ApproveAppealService < BaseService end def undo_mark_statuses_as_sensitive! + representative_account = Account.representative @strike.statuses.includes(:media_attachments).each do |status| - UpdateStatusService.new.call(status, @current_account.id, sensitive: false) if status.with_media? + UpdateStatusService.new.call(status, representative_account.id, sensitive: false) if status.with_media? end end diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index 868796a6b..e5b5b730e 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -2,6 +2,7 @@ class FetchLinkCardService < BaseService include Redisable + include Lockable URL_PATTERN = %r{ (#{Twitter::TwitterText::Regex[:valid_url_preceding_chars]}) # $1 preceding chars @@ -22,13 +23,9 @@ class FetchLinkCardService < BaseService @url = @original_url.to_s - RedisLock.acquire(lock_options) do |lock| - if lock.acquired? - @card = PreviewCard.find_by(url: @url) - process_url if @card.nil? || @card.updated_at <= 2.weeks.ago || @card.missing_image? - else - raise Mastodon::RaceConditionError - end + with_lock("fetch:#{@original_url}") do + @card = PreviewCard.find_by(url: @url) + process_url if @card.nil? || @card.updated_at <= 2.weeks.ago || @card.missing_image? end attach_card if @card&.persisted? @@ -155,8 +152,4 @@ class FetchLinkCardService < BaseService @card.assign_attributes(link_details_extractor.to_preview_card_attributes) @card.save_with_optional_image! unless @card.title.blank? && @card.html.blank? end - - def lock_options - { redis: redis, key: "fetch:#{@original_url}", autorelease: 15.minutes.seconds } - end end diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb index 9d239fc65..8c63b611d 100644 --- a/app/services/process_mentions_service.rb +++ b/app/services/process_mentions_service.rb @@ -37,6 +37,9 @@ class ProcessMentionsService < BaseService mentioned_account = Account.find_remote(username, domain) + # Unapproved and unconfirmed accounts should not be mentionable + next if mentioned_account&.local? && !(mentioned_account.user_confirmed? && mentioned_account.user_approved?) + # If the account cannot be found or isn't the right protocol, # first try to resolve it if mention_undeliverable?(mentioned_account) diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb index c31d89776..97afc3f61 100644 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@ -3,6 +3,7 @@ class RemoveStatusService < BaseService include Redisable include Payloadable + include Lockable # Delete a status # @param [Status] status @@ -17,38 +18,34 @@ class RemoveStatusService < BaseService @account = status.account @options = options - RedisLock.acquire(lock_options) do |lock| - if lock.acquired? - @status.discard - - remove_from_self if @account.local? - remove_from_followers - remove_from_lists - - # There is no reason to send out Undo activities when the - # cause is that the original object has been removed, since - # original object being removed implicitly removes reblogs - # of it. The Delete activity of the original is forwarded - # separately. - remove_from_remote_reach if @account.local? && !@options[:original_removed] - - # Since reblogs don't mention anyone, don't get reblogged, - # favourited and don't contain their own media attachments - # or hashtags, this can be skipped - unless @status.reblog? - remove_from_mentions - remove_reblogs - remove_from_hashtags - remove_from_public - remove_from_media if @status.with_media? - remove_from_direct if status.direct_visibility? - remove_media - end - - @status.destroy! if permanently? - else - raise Mastodon::RaceConditionError + with_lock("distribute:#{@status.id}") do + @status.discard + + remove_from_self if @account.local? + remove_from_followers + remove_from_lists + + # There is no reason to send out Undo activities when the + # cause is that the original object has been removed, since + # original object being removed implicitly removes reblogs + # of it. The Delete activity of the original is forwarded + # separately. + remove_from_remote_reach if @account.local? && !@options[:original_removed] + + # Since reblogs don't mention anyone, don't get reblogged, + # favourited and don't contain their own media attachments + # or hashtags, this can be skipped + unless @status.reblog? + remove_from_mentions + remove_reblogs + remove_from_hashtags + remove_from_public + remove_from_media if @status.with_media? + remove_from_direct if status.direct_visibility? + remove_media end + + @status.destroy! if permanently? end end @@ -152,8 +149,4 @@ class RemoveStatusService < BaseService def permanently? @options[:immediate] || !(@options[:preserve] || @status.reported?) end - - def lock_options - { redis: redis, key: "distribute:#{@status.id}", autorelease: 5.minutes.seconds } - end end diff --git a/app/services/report_service.rb b/app/services/report_service.rb index 9d784c341..d251bb33f 100644 --- a/app/services/report_service.rb +++ b/app/services/report_service.rb @@ -57,7 +57,7 @@ class ReportService < BaseService end def reported_status_ids - @target_account.statuses.with_discarded.find(Array(@status_ids)).pluck(:id) + AccountStatusesFilter.new(@target_account, @source_account).results.with_discarded.find(Array(@status_ids)).pluck(:id) end def payload diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb index 387e2e09b..b55e45409 100644 --- a/app/services/resolve_account_service.rb +++ b/app/services/resolve_account_service.rb @@ -5,6 +5,7 @@ class ResolveAccountService < BaseService include DomainControlHelper include WebfingerHelper include Redisable + include Lockable # Find or create an account record for a remote user. When creating, # look up the user's webfinger and fetch ActivityPub data @@ -108,12 +109,8 @@ class ResolveAccountService < BaseService def fetch_account! return unless activitypub_ready? - RedisLock.acquire(lock_options) do |lock| - if lock.acquired? - @account = ActivityPub::FetchRemoteAccountService.new.call(actor_url) - else - raise Mastodon::RaceConditionError - end + with_lock("resolve:#{@username}@#{@domain}") do + @account = ActivityPub::FetchRemoteAccountService.new.call(actor_url) end @account @@ -146,8 +143,4 @@ class ResolveAccountService < BaseService @account.suspend!(origin: :remote) AccountDeletionWorker.perform_async(@account.id, { 'reserve_username' => false, 'skip_activitypub' => true }) end - - def lock_options - { redis: redis, key: "resolve:#{@username}@#{@domain}", autorelease: 15.minutes.seconds } - end end diff --git a/app/services/unfollow_service.rb b/app/services/unfollow_service.rb index 151f3674f..d83a60e4e 100644 --- a/app/services/unfollow_service.rb +++ b/app/services/unfollow_service.rb @@ -2,6 +2,8 @@ class UnfollowService < BaseService include Payloadable + include Redisable + include Lockable # Unfollow and notify the remote user # @param [Account] source_account Where to unfollow from @@ -13,7 +15,9 @@ class UnfollowService < BaseService @target_account = target_account @options = options - unfollow! || undo_follow_request! + with_lock("relationship:#{[source_account.id, target_account.id].sort.join(':')}") do + unfollow! || undo_follow_request! + end end private diff --git a/app/services/verify_link_service.rb b/app/services/verify_link_service.rb index 878a2188d..0a39d7f26 100644 --- a/app/services/verify_link_service.rb +++ b/app/services/verify_link_service.rb @@ -28,7 +28,7 @@ class VerifyLinkService < BaseService links = Nokogiri::HTML(@body).xpath('//a[contains(concat(" ", normalize-space(@rel), " "), " me ")]|//link[contains(concat(" ", normalize-space(@rel), " "), " me ")]') - if links.any? { |link| link['href'] == @link_back } + if links.any? { |link| link['href'].downcase == @link_back.downcase } true elsif links.empty? false diff --git a/app/services/vote_service.rb b/app/services/vote_service.rb index b77812970..114ec285c 100644 --- a/app/services/vote_service.rb +++ b/app/services/vote_service.rb @@ -4,8 +4,11 @@ class VoteService < BaseService include Authorization include Payloadable include Redisable + include Lockable def call(account, poll, choices) + return if choices.empty? + authorize_with account, poll, :vote? @account = account @@ -15,17 +18,13 @@ class VoteService < BaseService already_voted = true - RedisLock.acquire(lock_options) do |lock| - if lock.acquired? - already_voted = @poll.votes.where(account: @account).exists? + with_lock("vote:#{@poll.id}:#{@account.id}") do + already_voted = @poll.votes.where(account: @account).exists? - ApplicationRecord.transaction do - @choices.each do |choice| - @votes << @poll.votes.create!(account: @account, choice: Integer(choice)) - end + ApplicationRecord.transaction do + @choices.each do |choice| + @votes << @poll.votes.create!(account: @account, choice: Integer(choice)) end - else - raise Mastodon::RaceConditionError end end @@ -76,8 +75,4 @@ class VoteService < BaseService @poll.reload retry end - - def lock_options - { redis: redis, key: "vote:#{@poll.id}:#{@account.id}" } - end end diff --git a/app/validators/admin_import_validator.rb b/app/validators/admin_import_validator.rb new file mode 100644 index 000000000..338ceb3a7 --- /dev/null +++ b/app/validators/admin_import_validator.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class AdminImportValidator < ActiveModel::Validator + FIRST_HEADER = '#domain' + + def validate(import) + return if import.type.blank? || import.data.blank? + + # We parse because newlines could be part of individual rows. This + # runs on create so we should be reading the local file here before + # it is uploaded to object storage or moved anywhere... + csv_data = CSV.parse(import.data.queued_for_write[:original].read) + + row_count = csv_data.size + row_count -= 1 if csv_data.first&.first == FIRST_HEADER + + import.errors.add(:data, I18n.t('imports.errors.over_rows_processing_limit', count: Admin::DomainBlocksController::ROWS_PROCESSING_LIMIT)) if row_count > Admin::DomainBlocksController::ROWS_PROCESSING_LIMIT + end +end diff --git a/app/validators/status_pin_validator.rb b/app/validators/status_pin_validator.rb index 35a101f1d..9466a81fe 100644 --- a/app/validators/status_pin_validator.rb +++ b/app/validators/status_pin_validator.rb @@ -2,7 +2,7 @@ class StatusPinValidator < ActiveModel::Validator MAX_PINNED = (ENV['MAX_PINNED_TOOTS'] || 5).to_i - + def validate(pin) 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 diff --git a/app/views/accounts/show.rss.ruby b/app/views/accounts/show.rss.ruby new file mode 100644 index 000000000..73c1c51e0 --- /dev/null +++ b/app/views/accounts/show.rss.ruby @@ -0,0 +1,37 @@ +RSS::Builder.build do |doc| + doc.title(display_name(@account)) + doc.description(I18n.t('rss.descriptions.account', acct: @account.local_username_and_domain)) + doc.link(params[:tag].present? ? short_account_tag_url(@account, params[:tag]) : short_account_url(@account)) + doc.image(full_asset_url(@account.avatar.url(:original)), display_name(@account), params[:tag].present? ? short_account_tag_url(@account, params[:tag]) : short_account_url(@account)) + doc.last_build_date(@statuses.first.created_at) if @statuses.any? + doc.icon(full_asset_url(@account.avatar.url(:original))) + doc.logo(full_pack_url('media/images/logo_transparent_white.svg')) + doc.generator("Mastodon v#{Mastodon::Version.to_s}") + + @statuses.each do |status| + doc.item do |item| + item.title(l(status.created_at)) + item.link(ActivityPub::TagManager.instance.url_for(status)) + item.pub_date(status.created_at) + item.description(rss_status_content_format(status)) + + if status.ordered_media_attachments.first&.audio? + media = status.ordered_media_attachments.first + item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size) + end + + status.ordered_media_attachments.each do |media| + item.media_content(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size) do |media_content| + media_content.medium(media.gifv? ? 'image' : media.type.to_s) + media_content.rating(status.sensitive? ? 'adult' : 'nonadult') + media_content.description(media.description) if media.description.present? + media_content.thumbnail(media.thumbnail.url(:original, false)) if media.thumbnail? + end + end + + status.tags.each do |tag| + item.category(tag.name) + end + end + end +end diff --git a/app/views/admin/custom_emojis/new.html.haml b/app/views/admin/custom_emojis/new.html.haml index 95996dec8..1ea931a2f 100644 --- a/app/views/admin/custom_emojis/new.html.haml +++ b/app/views/admin/custom_emojis/new.html.haml @@ -7,7 +7,7 @@ .fields-group = f.input :shortcode, wrapper: :with_label, label: t('admin.custom_emojis.shortcode'), hint: t('admin.custom_emojis.shortcode_hint') .fields-group - = f.input :image, wrapper: :with_label, input_html: { accept: CustomEmoji::IMAGE_MIME_TYPES.join(' ') }, hint: t('admin.custom_emojis.image_hint', size: number_to_human_size(CustomEmoji::LIMIT)) + = f.input :image, wrapper: :with_label, input_html: { accept: CustomEmoji::IMAGE_MIME_TYPES.join(' ') }, hint: t('admin.custom_emojis.image_hint', size: number_to_human_size(CustomEmoji::LOCAL_LIMIT)) .actions = f.button :button, t('admin.custom_emojis.upload'), type: :submit diff --git a/app/views/admin/export_domain_allows/new.html.haml b/app/views/admin/export_domain_allows/new.html.haml new file mode 100644 index 000000000..dc0cf8c52 --- /dev/null +++ b/app/views/admin/export_domain_allows/new.html.haml @@ -0,0 +1,10 @@ +- content_for :page_title do + = t('.title') + += simple_form_for @import, url: import_admin_export_domain_allows_path, html: { multipart: true } do |f| + .fields-row + .fields-group.fields-row__column.fields-row__column-6 + = f.input :data, wrapper: :with_block_label, hint: t('simple_form.hints.imports.data'), as: :file + + .actions + = f.button :button, t('imports.upload'), type: :submit diff --git a/app/views/admin/export_domain_blocks/_domain_block.html.haml b/app/views/admin/export_domain_blocks/_domain_block.html.haml new file mode 100644 index 000000000..5d4b6c4d0 --- /dev/null +++ b/app/views/admin/export_domain_blocks/_domain_block.html.haml @@ -0,0 +1,27 @@ +- existing_relationships ||= false + +.batch-table__row{ class: [existing_relationships && 'batch-table__row--attention'] } + %label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox + = f.check_box :enabled, checked: !existing_relationships + .batch-table__row__content.pending-account + .pending-account__header + %strong + = f.object.domain + = f.hidden_field :domain + = f.hidden_field :severity + = f.hidden_field :reject_media + = f.hidden_field :reject_reports + = f.hidden_field :obfuscate + = f.hidden_field :private_comment + = f.hidden_field :public_comment + + %br/ + + = f.object.policies.map { |policy| t(policy, scope: 'admin.instances.content_policies.policies') }.join(' • ') + - if f.object.public_comment.present? + • + = f.object.public_comment + - if existing_relationships + • + = fa_icon 'warning fw' + = t('admin.export_domain_blocks.import.existing_relationships_warning') diff --git a/app/views/admin/export_domain_blocks/import.html.haml b/app/views/admin/export_domain_blocks/import.html.haml new file mode 100644 index 000000000..01add232d --- /dev/null +++ b/app/views/admin/export_domain_blocks/import.html.haml @@ -0,0 +1,21 @@ +- content_for :page_title do + = t('admin.export_domain_blocks.import.title') + +%p= t('admin.export_domain_blocks.import.description_html') + +- if defined?(@global_private_comment) && @global_private_comment.present? + %p= t('admin.export_domain_blocks.import.private_comment_description_html', comment: @global_private_comment) + += form_for(@form, url: batch_admin_domain_blocks_path) do |f| + .batch-table + .batch-table__toolbar + %label.batch-table__toolbar__select.batch-checkbox-all + = check_box_tag :batch_checkbox_all, nil, false + .batch-table__toolbar__actions + = f.button safe_join([fa_icon('copy'), t('admin.domain_blocks.import')]), name: :save, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } + .batch-table__body + - if @domain_blocks.empty? + = nothing_here 'nothing-here--under-tabs' + - else + = f.simple_fields_for :domain_blocks, @domain_blocks do |ff| + = render 'domain_block', f: ff, existing_relationships: @warning_domains.include?(ff.object.domain) diff --git a/app/views/admin/export_domain_blocks/new.html.haml b/app/views/admin/export_domain_blocks/new.html.haml new file mode 100644 index 000000000..0291aeed7 --- /dev/null +++ b/app/views/admin/export_domain_blocks/new.html.haml @@ -0,0 +1,10 @@ +- content_for :page_title do + = t('.title') + += simple_form_for @import, url: import_admin_export_domain_blocks_path, html: { multipart: true } do |f| + .fields-row + .fields-group.fields-row__column.fields-row__column-6 + = f.input :data, wrapper: :with_block_label, hint: t('simple_form.hints.imports.data'), as: :file + + .actions + = f.button :button, t('imports.upload'), type: :submit diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml index ee1b3d0ce..abb2d8c0e 100644 --- a/app/views/admin/instances/index.html.haml +++ b/app/views/admin/instances/index.html.haml @@ -4,8 +4,12 @@ - content_for :heading_actions do - if whitelist_mode? = link_to t('admin.domain_allows.add_new'), new_admin_domain_allow_path, class: 'button', id: 'add-instance-button' + = link_to t('admin.domain_allows.export'), export_admin_export_domain_allows_path(format: :csv), class: 'button' + = link_to t('admin.domain_allows.import'), new_admin_export_domain_allow_path, class: 'button' - else = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path, class: 'button', id: 'add-instance-button' + = link_to t('admin.domain_blocks.export'), export_admin_export_domain_blocks_path(format: :csv), class: 'button' + = link_to t('admin.domain_blocks.import'), new_admin_export_domain_block_path, class: 'button' .filters .filter-subset diff --git a/app/views/disputes/strikes/show.html.haml b/app/views/disputes/strikes/show.html.haml index 0b71e14a3..1be50331a 100644 --- a/app/views/disputes/strikes/show.html.haml +++ b/app/views/disputes/strikes/show.html.haml @@ -3,8 +3,8 @@ - content_for :heading_actions do - if @appeal.persisted? - = link_to t('admin.accounts.approve'), approve_admin_disputes_appeal_path(@appeal), method: :post, class: 'button' if can?(:approve, @appeal) - = link_to t('admin.accounts.reject'), reject_admin_disputes_appeal_path(@appeal), method: :post, class: 'button button--destructive' if can?(:reject, @appeal) + = link_to t('disputes.strikes.approve_appeal'), approve_admin_disputes_appeal_path(@appeal), method: :post, class: 'button' if can?(:approve, @appeal) + = link_to t('disputes.strikes.reject_appeal'), reject_admin_disputes_appeal_path(@appeal), method: :post, class: 'button button--destructive' if can?(:reject, @appeal) - if @strike.overruled? %p.hint diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml index 7b672bda7..6192f293a 100644 --- a/app/views/statuses/_simple_status.html.haml +++ b/app/views/statuses/_simple_status.html.haml @@ -65,6 +65,6 @@ - elsif status.private_visibility? || status.limited_visibility? = fa_icon 'lock fw' - else - = fa_icon 'envelope fw' + = fa_icon 'at fw' = link_to remote_interaction_path(status, type: :favourite), class: 'status__action-bar-button icon-button modal-button' do = fa_icon 'star fw' diff --git a/app/views/tags/show.rss.ruby b/app/views/tags/show.rss.ruby new file mode 100644 index 000000000..f4481b81c --- /dev/null +++ b/app/views/tags/show.rss.ruby @@ -0,0 +1,35 @@ +RSS::Builder.build do |doc| + doc.title("##{@tag.name}") + doc.description(I18n.t('rss.descriptions.tag', hashtag: @tag.name)) + doc.link(tag_url(@tag)) + doc.last_build_date(@statuses.first.created_at) if @statuses.any? + doc.logo(full_pack_url('media/images/logo_transparent_white.svg')) + doc.generator("Mastodon v#{Mastodon::Version.to_s}") + + @statuses.each do |status| + doc.item do |item| + item.title(l(status.created_at)) + item.link(ActivityPub::TagManager.instance.url_for(status)) + item.pub_date(status.created_at) + item.description(rss_status_content_format(status)) + + if status.ordered_media_attachments.first&.audio? + media = status.ordered_media_attachments.first + item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size) + end + + status.ordered_media_attachments.each do |media| + item.media_content(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size) do |media_content| + media_content.medium(media.gifv? ? 'image' : media.type.to_s) + media_content.rating(status.sensitive? ? 'adult' : 'nonadult') + media_content.description(media.description) if media.description.present? + media_content.thumbnail(media.thumbnail.url(:original, false)) if media.thumbnail? + end + end + + status.tags.each do |tag| + item.category(tag.name) + end + end + end +end diff --git a/app/workers/distribution_worker.rb b/app/workers/distribution_worker.rb index 474b4daaf..59cdbc7b2 100644 --- a/app/workers/distribution_worker.rb +++ b/app/workers/distribution_worker.rb @@ -3,14 +3,11 @@ class DistributionWorker include Sidekiq::Worker include Redisable + include Lockable def perform(status_id, options = {}) - RedisLock.acquire(redis: redis, key: "distribute:#{status_id}", autorelease: 5.minutes.seconds) do |lock| - if lock.acquired? - FanOutOnWriteService.new.call(Status.find(status_id), **options.symbolize_keys) - else - raise Mastodon::RaceConditionError - end + with_lock("distribute:#{status_id}") do + FanOutOnWriteService.new.call(Status.find(status_id), **options.symbolize_keys) end rescue ActiveRecord::RecordNotFound true diff --git a/app/workers/scheduler/indexing_scheduler.rb b/app/workers/scheduler/indexing_scheduler.rb new file mode 100644 index 000000000..3a6f47a29 --- /dev/null +++ b/app/workers/scheduler/indexing_scheduler.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +class Scheduler::IndexingScheduler + include Sidekiq::Worker + include Redisable + + sidekiq_options retry: 0 + + def perform + indexes.each do |type| + with_redis do |redis| + ids = redis.smembers("chewy:queue:#{type.name}") + + type.import!(ids) + + redis.pipelined do |pipeline| + ids.each { |id| pipeline.srem("chewy:queue:#{type.name}", id) } + end + end + end + end + + def indexes + [AccountsIndex, TagsIndex, StatusesIndex] + end +end |